blob: 8ff64c011eb1b78df5747f0accf786cb93ade707 [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",
803 __FUNCTION__, pCommand->u.scanCmd.reason, (unsigned int)pCommand->u.scanCmd.callback);
804 if (NULL != pCommand->u.scanCmd.callback)
805 {
806 smsLog( pMac, LOGW, "%s callback scan requester\n", __FUNCTION__);
807 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;
Jeff Johnson295189b2012-06-20 16:38:30 -0700921 pMac->roam.configParam.IsIdleScanEnabled = TRUE; //enable the idle scan by default
922 pMac->roam.configParam.nTxPowerCap = CSR_MAX_TX_POWER;
923 pMac->roam.configParam.statsReqPeriodicity = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD;
924 pMac->roam.configParam.statsReqPeriodicityInPS = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700925#ifdef WLAN_FEATURE_VOWIFI_11R
926 pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported = 0;
927#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700928#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
929 pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries = 3;
930 pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold = 120;
931 pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold = 125;
932 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime = 20;
933 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = 40;
934 pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod = 200;
935 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels = 3;
936 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[0] = 1;
937 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[1] = 6;
938 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[2] = 11;
939 pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod = 20000; //20 seconds
940#endif
Jeff Johnsone7245742012-09-05 17:12:55 -0700941#ifdef WLAN_FEATURE_11AC
942 pMac->roam.configParam.nVhtChannelWidth = WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1;
943#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700944
945 pMac->roam.configParam.addTSWhenACMIsOff = 0;
946 pMac->roam.configParam.fScanTwice = eANI_BOOLEAN_FALSE;
Mohit Khanna349bc392012-09-11 17:24:52 -0700947
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -0700948 //Remove this code once SLM_Sessionization is supported
949 //BMPS_WORKAROUND_NOT_NEEDED
Jeff Johnsone7245742012-09-05 17:12:55 -0700950 pMac->roam.configParam.doBMPSWorkaround = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700951
Jeff Johnsone7245742012-09-05 17:12:55 -0700952}
Jeff Johnson295189b2012-06-20 16:38:30 -0700953eCsrBand csrGetCurrentBand(tHalHandle hHal)
954{
955 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
956 return pMac->roam.configParam.bandCapability;
957}
Jeff Johnson295189b2012-06-20 16:38:30 -0700958eHalStatus csrSetBand(tHalHandle hHal, eCsrBand eBand)
959{
960 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
961 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700962 if (CSR_IS_PHY_MODE_A_ONLY(pMac) &&
963 (eBand == eCSR_BAND_24))
964 {
965 /* DOT11 mode configured to 11a only and received
966 request to change the band to 2.4 GHz */
967 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
968 "failed to set band cfg80211 = %u, band = %u\n",
969 pMac->roam.configParam.uCfgDot11Mode, eBand);
970 return eHAL_STATUS_INVALID_PARAMETER;
971 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700972 if ((CSR_IS_PHY_MODE_B_ONLY(pMac) ||
973 CSR_IS_PHY_MODE_G_ONLY(pMac)) &&
974 (eBand == eCSR_BAND_5G))
975 {
976 /* DOT11 mode configured to 11b/11g only and received
977 request to change the band to 5 GHz */
978 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
979 "failed to set band dot11mode = %u, band = %u\n",
980 pMac->roam.configParam.uCfgDot11Mode, eBand);
981 return eHAL_STATUS_INVALID_PARAMETER;
982 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700983 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
984 "Band changed to %u (0 - ALL, 1 - 2.4 GHZ, 2 - 5GHZ)\n", eBand);
985 pMac->roam.configParam.eBand = eBand;
986 pMac->roam.configParam.bandCapability = eBand;
987 csrScanGetSupportedChannels( pMac );
988 status = csrInitGetChannels( pMac );
989 if (eHAL_STATUS_SUCCESS == status)
990 csrInitChannelList( hHal );
991 return status;
992}
Jeff Johnsone7245742012-09-05 17:12:55 -0700993/* The funcns csrConvertCBIniValueToPhyCBState and csrConvertPhyCBStateToIniValue have been
994 * introduced to convert the ini value to the ENUM used in csr and MAC for CB state
995 * Ideally we should have kept the ini value and enum value same and representing the same
996 * cb values as in 11n standard i.e.
997 * Set to 1 (SCA) if the secondary channel is above the primary channel
998 * Set to 3 (SCB) if the secondary channel is below the primary channel
999 * Set to 0 (SCN) if no secondary channel is present
1000 * However, since our driver is already distributed we will keep the ini definition as it is which is:
1001 * 0 - secondary none
1002 * 1 - secondary LOW
1003 * 2 - secondary HIGH
1004 * and convert to enum value used within the driver in csrChangeDefaultConfigParam using this funcn
1005 * The enum values are as follows:
1006 * PHY_SINGLE_CHANNEL_CENTERED = 0
1007 * PHY_DOUBLE_CHANNEL_LOW_PRIMARY = 1
1008 * PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3
1009 */
1010ePhyChanBondState csrConvertCBIniValueToPhyCBState(v_U32_t cbIniValue)
1011{
1012
1013 ePhyChanBondState phyCbState;
1014 switch (cbIniValue) {
1015 // secondary none
1016 case 0:
1017 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1018 break;
1019 // secondary LOW
1020 case 1:
1021 phyCbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
1022 break;
1023 // secondary HIGH
1024 case 2:
1025 phyCbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
1026 break;
1027#ifdef WLAN_FEATURE_11AC
1028 case 3:
1029 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
1030 break;
1031 case 4:
1032 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1033 break;
1034 case 5:
1035 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1036 break;
1037 case 6:
1038 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
1039 break;
1040 case 7:
1041 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
1042 break;
1043 case 8:
1044 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
1045 break;
1046 case 9:
1047 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
1048 break;
1049#endif
1050 default:
1051 // If an invalid value is passed, disable CHANNEL BONDING
1052 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1053 break;
1054 }
1055 return phyCbState;
1056}
1057
1058v_U32_t csrConvertPhyCBStateToIniValue(ePhyChanBondState phyCbState)
1059{
1060
1061 v_U32_t cbIniValue;
1062 switch (phyCbState) {
1063 // secondary none
1064 case PHY_SINGLE_CHANNEL_CENTERED:
1065 cbIniValue = 0;
1066 break;
1067 // secondary LOW
1068 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1069 cbIniValue = 1;
1070 break;
1071 // secondary HIGH
1072 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1073 cbIniValue = 2;
1074 break;
1075#ifdef WLAN_FEATURE_11AC
1076 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
1077 cbIniValue = 3;
1078 break;
1079 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
1080 cbIniValue = 4;
1081 break;
1082 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
1083 cbIniValue = 5;
1084 break;
1085 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1086 cbIniValue = 6;
1087 break;
1088 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1089 cbIniValue = 7;
1090 break;
1091 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1092 cbIniValue = 8;
1093 break;
1094 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1095 cbIniValue = 9;
1096 break;
1097#endif
1098 default:
1099 // return some invalid value
1100 cbIniValue = 10;
1101 break;
1102 }
1103 return cbIniValue;
1104}
Jeff Johnson295189b2012-06-20 16:38:30 -07001105
1106eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1107{
1108 eHalStatus status = eHAL_STATUS_SUCCESS;
1109
1110 if(pParam)
1111 {
1112 pMac->roam.configParam.WMMSupportMode = pParam->WMMSupportMode;
1113 pMac->roam.configParam.Is11eSupportEnabled = pParam->Is11eSupportEnabled;
1114 pMac->roam.configParam.FragmentationThreshold = pParam->FragmentationThreshold;
1115 pMac->roam.configParam.Is11dSupportEnabled = pParam->Is11dSupportEnabled;
1116 pMac->roam.configParam.Is11dSupportEnabledOriginal = pParam->Is11dSupportEnabled;
1117 pMac->roam.configParam.Is11hSupportEnabled = pParam->Is11hSupportEnabled;
1118
1119 pMac->roam.configParam.fenableMCCMode = pParam->fEnableMCCMode;
Mohit Khanna7ed53f02012-09-11 17:52:10 -07001120 pMac->roam.configParam.fAllowMCCGODiffBI = pParam->fAllowMCCGODiffBI;
1121
Jeff Johnsone7245742012-09-05 17:12:55 -07001122 /* channelBondingMode5GHz plays a dual role right now
1123 * 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
1124 * This is how channelBondingMode5GHz works now and this is kept intact to avoid any cfg.ini change
1125 */
1126 if (pParam->channelBondingMode24GHz > MAX_CB_VALUE_IN_INI)
1127 {
1128 smsLog( pMac, LOGW, "Invalid CB value from ini in 2.4GHz band %d, CB DISABLED\n", pParam->channelBondingMode24GHz);
1129 }
1130 pMac->roam.configParam.channelBondingMode24GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode24GHz);
1131 if (pParam->channelBondingMode5GHz > MAX_CB_VALUE_IN_INI)
1132 {
1133 smsLog( pMac, LOGW, "Invalid CB value from ini in 5GHz band %d, CB DISABLED\n", pParam->channelBondingMode5GHz);
1134 }
1135 pMac->roam.configParam.channelBondingMode5GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001136 pMac->roam.configParam.RTSThreshold = pParam->RTSThreshold;
1137 pMac->roam.configParam.phyMode = pParam->phyMode;
1138 pMac->roam.configParam.shortSlotTime = pParam->shortSlotTime;
1139 pMac->roam.configParam.HeartbeatThresh24 = pParam->HeartbeatThresh24;
1140 pMac->roam.configParam.HeartbeatThresh50 = pParam->HeartbeatThresh50;
1141 pMac->roam.configParam.ProprietaryRatesEnabled = pParam->ProprietaryRatesEnabled;
1142 pMac->roam.configParam.TxRate = pParam->TxRate;
1143 pMac->roam.configParam.AdHocChannel24 = pParam->AdHocChannel24;
1144 pMac->roam.configParam.AdHocChannel5G = pParam->AdHocChannel5G;
1145 pMac->roam.configParam.bandCapability = pParam->bandCapability;
1146 pMac->roam.configParam.cbChoice = pParam->cbChoice;
1147 pMac->roam.configParam.bgScanInterval = pParam->bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001148 //if HDD passed down non zero values then only update,
1149 //otherwise keep using the defaults
1150 if(pParam->nActiveMaxChnTime)
1151 {
1152 pMac->roam.configParam.nActiveMaxChnTime = pParam->nActiveMaxChnTime;
1153 }
1154 if(pParam->nActiveMinChnTime)
1155 {
1156 pMac->roam.configParam.nActiveMinChnTime = pParam->nActiveMinChnTime;
1157 }
1158 if(pParam->nPassiveMaxChnTime)
1159 {
1160 pMac->roam.configParam.nPassiveMaxChnTime = pParam->nPassiveMaxChnTime;
1161 }
1162 if(pParam->nPassiveMinChnTime)
1163 {
1164 pMac->roam.configParam.nPassiveMinChnTime = pParam->nPassiveMinChnTime;
1165 }
1166 //if upper layer wants to disable idle scan altogether set it to 0
1167 if(pParam->impsSleepTime)
1168 {
1169 //Change the unit from second to microsecond
1170 tANI_U32 impsSleepTime = pParam->impsSleepTime * PAL_TIMER_TO_SEC_UNIT;
Jeff Johnson295189b2012-06-20 16:38:30 -07001171 if(CSR_IDLE_SCAN_NO_PS_INTERVAL_MIN <= impsSleepTime)
1172 {
1173 pMac->roam.configParam.impsSleepTime = impsSleepTime;
1174 }
1175 else
1176 {
1177 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
1178 }
1179 }
1180 else
1181 {
1182 pMac->roam.configParam.impsSleepTime = 0;
1183 }
1184 pMac->roam.configParam.eBand = pParam->eBand;
1185#ifdef WLAN_SOFTAP_FEATURE
1186 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(NULL, pMac->roam.configParam.phyMode,
1187 pMac->roam.configParam.ProprietaryRatesEnabled);
1188#else
1189 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pMac->roam.configParam.phyMode,
1190 pMac->roam.configParam.ProprietaryRatesEnabled);
1191#endif
1192 //if HDD passed down non zero values for age params, then only update,
1193 //otherwise keep using the defaults
1194 if(pParam->nScanResultAgeCount)
1195 {
1196 pMac->roam.configParam.agingCount = pParam->nScanResultAgeCount;
1197 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001198 if(pParam->scanAgeTimeNCNPS)
1199 {
1200 pMac->roam.configParam.scanAgeTimeNCNPS = pParam->scanAgeTimeNCNPS;
1201 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001202 if(pParam->scanAgeTimeNCPS)
1203 {
1204 pMac->roam.configParam.scanAgeTimeNCPS = pParam->scanAgeTimeNCPS;
1205 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001206 if(pParam->scanAgeTimeCNPS)
1207 {
1208 pMac->roam.configParam.scanAgeTimeCNPS = pParam->scanAgeTimeCNPS;
1209 }
1210 if(pParam->scanAgeTimeCPS)
1211 {
1212 pMac->roam.configParam.scanAgeTimeCPS = pParam->scanAgeTimeCPS;
1213 }
1214
1215 csrAssignRssiForCategory(pMac, pParam->bCatRssiOffset);
1216 pMac->roam.configParam.nRoamingTime = pParam->nRoamingTime;
1217 pMac->roam.configParam.fEnforce11dChannels = pParam->fEnforce11dChannels;
1218 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = pParam->fSupplicantCountryCodeHasPriority;
1219 pMac->roam.configParam.fEnforceCountryCodeMatch = pParam->fEnforceCountryCodeMatch;
1220 pMac->roam.configParam.fEnforceDefaultDomain = pParam->fEnforceDefaultDomain;
Jeff Johnson295189b2012-06-20 16:38:30 -07001221 pMac->roam.configParam.vccRssiThreshold = pParam->vccRssiThreshold;
1222 pMac->roam.configParam.vccUlMacLossThreshold = pParam->vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001223 pMac->roam.configParam.IsIdleScanEnabled = pParam->IsIdleScanEnabled;
1224 pMac->roam.configParam.statsReqPeriodicity = pParam->statsReqPeriodicity;
1225 pMac->roam.configParam.statsReqPeriodicityInPS = pParam->statsReqPeriodicityInPS;
1226 //Assign this before calling CsrInit11dInfo
1227 pMac->roam.configParam.nTxPowerCap = pParam->nTxPowerCap;
Jeff Johnson295189b2012-06-20 16:38:30 -07001228 if( csrIs11dSupported( pMac ) )
1229 {
1230 status = CsrInit11dInfo(pMac, &pParam->Csr11dinfo);
1231 }
1232 else
1233 {
1234 pMac->scan.curScanType = eSIR_ACTIVE_SCAN;
1235 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001236
1237 /* Initialize the power + channel information if 11h is enabled.
1238 If 11d is enabled this information has already been initialized */
1239 if( csrIs11hSupported( pMac ) && !csrIs11dSupported( pMac ) )
1240 {
1241 csrInitChannelPowerList(pMac, &pParam->Csr11dinfo);
1242 }
1243
1244
Jeff Johnson295189b2012-06-20 16:38:30 -07001245#ifdef WLAN_FEATURE_VOWIFI_11R
1246 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.csr11rConfig, &pParam->csr11rConfig, sizeof(tCsr11rConfigParams) );
1247 smsLog( pMac, LOG1, "IsFTResourceReqSupp = %d\n", pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported);
1248#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001249#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -07001250 pMac->roam.configParam.isFastTransitionEnabled = pParam->isFastTransitionEnabled;
Jeff Johnson43971f52012-07-17 12:26:56 -07001251 pMac->roam.configParam.RoamRssiDiff = pParam->RoamRssiDiff;
Jeff Johnson295189b2012-06-20 16:38:30 -07001252#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001253#ifdef FEATURE_WLAN_LFR
1254 pMac->roam.configParam.isFastRoamIniFeatureEnabled = pParam->isFastRoamIniFeatureEnabled;
1255#endif
1256
Jeff Johnson295189b2012-06-20 16:38:30 -07001257#ifdef FEATURE_WLAN_CCX
1258 pMac->roam.configParam.isCcxIniFeatureEnabled = pParam->isCcxIniFeatureEnabled;
1259#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001260#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1261 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.neighborRoamConfig, &pParam->neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
Jeff Johnson295189b2012-06-20 16:38:30 -07001262 smsLog( pMac, LOG1, "nNeighborScanTimerPerioid = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod);
1263 smsLog( pMac, LOG1, "nNeighborReassocRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold);
1264 smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);
1265 smsLog( pMac, LOG1, "nNeighborScanMinChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime);
1266 smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
1267 smsLog( pMac, LOG1, "nMaxNeighborRetries = %d\n", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
1268 smsLog( pMac, LOG1, "nNeighborResultsRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod);
Jeff Johnson295189b2012-06-20 16:38:30 -07001269 {
1270 int i;
1271 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 -07001272 for( i=0; i< pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels; i++)
1273 {
1274 smsLog( pMac, LOG1, "%d ", pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[i] );
1275 }
1276 smsLog( pMac, LOG1, "\n");
1277 }
1278#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001279 pMac->roam.configParam.addTSWhenACMIsOff = pParam->addTSWhenACMIsOff;
1280 pMac->scan.fValidateList = pParam->fValidateList;
1281 pMac->scan.fEnableBypass11d = pParam->fEnableBypass11d;
1282 pMac->scan.fEnableDFSChnlScan = pParam->fEnableDFSChnlScan;
1283 pMac->roam.configParam.fScanTwice = pParam->fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001284 pMac->scan.fFirstScanOnly2GChnl = pParam->fFirstScanOnly2GChnl;
1285 /* This parameter is not available in cfg and not passed from upper layers. Instead it is initialized here
1286 * This paramtere is used in concurrency to determine if there are concurrent active sessions.
1287 * Is used as a temporary fix to disconnect all active sessions when BMPS enabled so the active session if Infra STA
1288 * will automatically connect back and resume BMPS since resume BMPS is not working when moving from concurrent to
1289 * single session
1290 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07001291 //Remove this code once SLM_Sessionization is supported
1292 //BMPS_WORKAROUND_NOT_NEEDED
Mohit Khanna349bc392012-09-11 17:24:52 -07001293 pMac->roam.configParam.doBMPSWorkaround = 0;
1294
Jeff Johnsone7245742012-09-05 17:12:55 -07001295#ifdef WLAN_FEATURE_11AC
1296 pMac->roam.configParam.nVhtChannelWidth = pParam->nVhtChannelWidth;
1297#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001298 }
1299
1300 return status;
1301}
1302
Jeff Johnson295189b2012-06-20 16:38:30 -07001303eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1304{
1305 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07001306 if(pParam)
1307 {
1308 pParam->WMMSupportMode = pMac->roam.configParam.WMMSupportMode;
1309 pParam->Is11eSupportEnabled = pMac->roam.configParam.Is11eSupportEnabled;
1310 pParam->FragmentationThreshold = pMac->roam.configParam.FragmentationThreshold;
1311 pParam->Is11dSupportEnabled = pMac->roam.configParam.Is11dSupportEnabled;
1312 pParam->Is11dSupportEnabledOriginal = pMac->roam.configParam.Is11dSupportEnabledOriginal;
1313 pParam->Is11hSupportEnabled = pMac->roam.configParam.Is11hSupportEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001314 pParam->channelBondingMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode24GHz);
1315 pParam->channelBondingMode5GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001316 pParam->RTSThreshold = pMac->roam.configParam.RTSThreshold;
1317 pParam->phyMode = pMac->roam.configParam.phyMode;
1318 pParam->shortSlotTime = pMac->roam.configParam.shortSlotTime;
1319 pParam->HeartbeatThresh24 = pMac->roam.configParam.HeartbeatThresh24;
1320 pParam->HeartbeatThresh50 = pMac->roam.configParam.HeartbeatThresh50;
1321 pParam->ProprietaryRatesEnabled = pMac->roam.configParam.ProprietaryRatesEnabled;
1322 pParam->TxRate = pMac->roam.configParam.TxRate;
1323 pParam->AdHocChannel24 = pMac->roam.configParam.AdHocChannel24;
1324 pParam->AdHocChannel5G = pMac->roam.configParam.AdHocChannel5G;
1325 pParam->bandCapability = pMac->roam.configParam.bandCapability;
1326 pParam->cbChoice = pMac->roam.configParam.cbChoice;
1327 pParam->bgScanInterval = pMac->roam.configParam.bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001328 pParam->nActiveMaxChnTime = pMac->roam.configParam.nActiveMaxChnTime;
1329 pParam->nActiveMinChnTime = pMac->roam.configParam.nActiveMinChnTime;
1330 pParam->nPassiveMaxChnTime = pMac->roam.configParam.nPassiveMaxChnTime;
1331 pParam->nPassiveMinChnTime = pMac->roam.configParam.nPassiveMinChnTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07001332 //Change the unit from microsecond to second
1333 pParam->impsSleepTime = pMac->roam.configParam.impsSleepTime / PAL_TIMER_TO_SEC_UNIT;
1334 pParam->eBand = pMac->roam.configParam.eBand;
1335 pParam->nScanResultAgeCount = pMac->roam.configParam.agingCount;
1336 pParam->scanAgeTimeNCNPS = pMac->roam.configParam.scanAgeTimeNCNPS;
1337 pParam->scanAgeTimeNCPS = pMac->roam.configParam.scanAgeTimeNCPS;
1338 pParam->scanAgeTimeCNPS = pMac->roam.configParam.scanAgeTimeCNPS;
1339 pParam->scanAgeTimeCPS = pMac->roam.configParam.scanAgeTimeCPS;
1340 pParam->bCatRssiOffset = pMac->roam.configParam.bCatRssiOffset;
1341 pParam->nRoamingTime = pMac->roam.configParam.nRoamingTime;
1342 pParam->fEnforce11dChannels = pMac->roam.configParam.fEnforce11dChannels;
1343 pParam->fSupplicantCountryCodeHasPriority = pMac->roam.configParam.fSupplicantCountryCodeHasPriority;
1344 pParam->fEnforceCountryCodeMatch = pMac->roam.configParam.fEnforceCountryCodeMatch;
1345 pParam->fEnforceDefaultDomain = pMac->roam.configParam.fEnforceDefaultDomain;
1346 pParam->vccRssiThreshold = pMac->roam.configParam.vccRssiThreshold;
1347 pParam->vccUlMacLossThreshold = pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001348 pParam->IsIdleScanEnabled = pMac->roam.configParam.IsIdleScanEnabled;
1349 pParam->nTxPowerCap = pMac->roam.configParam.nTxPowerCap;
1350 pParam->statsReqPeriodicity = pMac->roam.configParam.statsReqPeriodicity;
1351 pParam->statsReqPeriodicityInPS = pMac->roam.configParam.statsReqPeriodicityInPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001352 pParam->addTSWhenACMIsOff = pMac->roam.configParam.addTSWhenACMIsOff;
1353 pParam->fValidateList = pMac->roam.configParam.fValidateList;
1354 pParam->fEnableBypass11d = pMac->scan.fEnableBypass11d;
1355 pParam->fEnableDFSChnlScan = pMac->scan.fEnableDFSChnlScan;
1356 pParam->fScanTwice = pMac->roam.configParam.fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001357 pParam->fFirstScanOnly2GChnl = pMac->scan.fFirstScanOnly2GChnl;
Jeff Johnson295189b2012-06-20 16:38:30 -07001358
1359#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1360 palCopyMemory( pMac->hHdd, &pParam->neighborRoamConfig, &pMac->roam.configParam.neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
1361#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001362#ifdef WLAN_FEATURE_11AC
1363 pParam->nVhtChannelWidth = pMac->roam.configParam.nVhtChannelWidth;
1364#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001365
1366 csrSetChannels(pMac, pParam);
1367
1368 status = eHAL_STATUS_SUCCESS;
1369 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001370 return (status);
1371}
1372
Jeff Johnson295189b2012-06-20 16:38:30 -07001373eHalStatus csrSetPhyMode(tHalHandle hHal, tANI_U32 phyMode, eCsrBand eBand, tANI_BOOLEAN *pfRestartNeeded)
1374{
1375 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
1376 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1377 tANI_BOOLEAN fRestartNeeded = eANI_BOOLEAN_FALSE;
1378 eCsrPhyMode newPhyMode = eCSR_DOT11_MODE_AUTO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001379 do
1380 {
1381 if(eCSR_BAND_24 == eBand)
1382 {
1383 if(CSR_IS_RADIO_A_ONLY(pMac)) break;
1384 if((eCSR_DOT11_MODE_11a & phyMode) || (eCSR_DOT11_MODE_11a_ONLY & phyMode)) break;
1385 }
1386 if(eCSR_BAND_5G == eBand)
1387 {
1388 if(CSR_IS_RADIO_BG_ONLY(pMac)) break;
1389 if((eCSR_DOT11_MODE_11b & phyMode) || (eCSR_DOT11_MODE_11b_ONLY & phyMode) ||
1390 (eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11g_ONLY & phyMode)
1391 )
1392 {
1393 break;
1394 }
1395 }
1396 if((0 == phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode))
1397 {
1398 newPhyMode = eCSR_DOT11_MODE_TAURUS;
1399 }
1400 else if(eCSR_DOT11_MODE_AUTO & phyMode)
1401 {
1402 newPhyMode = eCSR_DOT11_MODE_AUTO;
1403 }
1404 else
1405 {
1406 //Check for dual band and higher capability first
1407 if(eCSR_DOT11_MODE_11n_ONLY & phyMode)
1408 {
1409 if(eCSR_DOT11_MODE_11n_ONLY != phyMode) break;
1410 newPhyMode = eCSR_DOT11_MODE_11n_ONLY;
1411 }
1412 else if(eCSR_DOT11_MODE_11a_ONLY & phyMode)
1413 {
1414 if(eCSR_DOT11_MODE_11a_ONLY != phyMode) break;
1415 if(eCSR_BAND_24 == eBand) break;
1416 newPhyMode = eCSR_DOT11_MODE_11a_ONLY;
1417 eBand = eCSR_BAND_5G;
1418 }
1419 else if(eCSR_DOT11_MODE_11g_ONLY & phyMode)
1420 {
1421 if(eCSR_DOT11_MODE_11g_ONLY != phyMode) break;
1422 if(eCSR_BAND_5G == eBand) break;
1423 newPhyMode = eCSR_DOT11_MODE_11g_ONLY;
1424 eBand = eCSR_BAND_24;
1425 }
1426 else if(eCSR_DOT11_MODE_11b_ONLY & phyMode)
1427 {
1428 if(eCSR_DOT11_MODE_11b_ONLY != phyMode) break;
1429 if(eCSR_BAND_5G == eBand) break;
1430 newPhyMode = eCSR_DOT11_MODE_11b_ONLY;
1431 eBand = eCSR_BAND_24;
1432 }
1433 else if(eCSR_DOT11_MODE_11n & phyMode)
1434 {
1435 newPhyMode = eCSR_DOT11_MODE_11n;
1436 }
1437 else if(eCSR_DOT11_MODE_abg & phyMode)
1438 {
1439 newPhyMode = eCSR_DOT11_MODE_abg;
1440 }
1441 else if(eCSR_DOT11_MODE_11a & phyMode)
1442 {
1443 if((eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11b & phyMode))
1444 {
1445 if(eCSR_BAND_ALL == eBand)
1446 {
1447 newPhyMode = eCSR_DOT11_MODE_abg;
1448 }
1449 else
1450 {
1451 //bad setting
1452 break;
1453 }
1454 }
1455 else
1456 {
1457 newPhyMode = eCSR_DOT11_MODE_11a;
1458 eBand = eCSR_BAND_5G;
1459 }
1460 }
1461 else if(eCSR_DOT11_MODE_11g & phyMode)
1462 {
1463 newPhyMode = eCSR_DOT11_MODE_11g;
1464 eBand = eCSR_BAND_24;
1465 }
1466 else if(eCSR_DOT11_MODE_11b & phyMode)
1467 {
1468 newPhyMode = eCSR_DOT11_MODE_11b;
1469 eBand = eCSR_BAND_24;
1470 }
1471 else
1472 {
1473 //We will never be here
1474 smsLog( pMac, LOGE, FL(" cannot recognize the phy mode 0x%08X\n"), phyMode );
1475 newPhyMode = eCSR_DOT11_MODE_AUTO;
1476 }
1477 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001478 //Done validating
1479 status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001480 //Now we need to check whether a restart is needed.
1481 if(eBand != pMac->roam.configParam.eBand)
1482 {
1483 fRestartNeeded = eANI_BOOLEAN_TRUE;
1484 break;
1485 }
1486 if(newPhyMode != pMac->roam.configParam.phyMode)
1487 {
1488 fRestartNeeded = eANI_BOOLEAN_TRUE;
1489 break;
1490 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001491 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001492 if(HAL_STATUS_SUCCESS(status))
1493 {
1494 pMac->roam.configParam.eBand = eBand;
1495 pMac->roam.configParam.phyMode = newPhyMode;
1496 if(pfRestartNeeded)
1497 {
1498 *pfRestartNeeded = fRestartNeeded;
1499 }
1500 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001501 return (status);
1502}
1503
Jeff Johnson295189b2012-06-20 16:38:30 -07001504void csrPruneChannelListForMode( tpAniSirGlobal pMac, tCsrChannel *pChannelList )
1505{
1506 tANI_U8 Index;
1507 tANI_U8 cChannels;
Jeff Johnson295189b2012-06-20 16:38:30 -07001508 // for dual band NICs, don't need to trim the channel list....
1509 if ( !CSR_IS_OPEARTING_DUAL_BAND( pMac ) )
1510 {
1511 // 2.4 GHz band operation requires the channel list to be trimmed to
1512 // the 2.4 GHz channels only...
1513 if ( CSR_IS_24_BAND_ONLY( pMac ) )
1514 {
1515 for( Index = 0, cChannels = 0; Index < pChannelList->numChannels;
1516 Index++ )
1517 {
1518 if ( CSR_IS_CHANNEL_24GHZ(pChannelList->channelList[ Index ]) )
1519 {
1520 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1521 cChannels++;
1522 }
1523 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001524 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1525 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1526 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1527 // only if we need to.
1528 //
1529 // The amount of memory to clear is the number of channesl that we trimmed
1530 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1531
1532 if ( pChannelList->numChannels > cChannels )
1533 {
1534 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1535 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1536
1537 }
1538
1539 pChannelList->numChannels = cChannels;
1540 }
1541 else if ( CSR_IS_5G_BAND_ONLY( pMac ) )
1542 {
1543 for ( Index = 0, cChannels = 0; Index < pChannelList->numChannels; Index++ )
1544 {
1545 if ( CSR_IS_CHANNEL_5GHZ(pChannelList->channelList[ Index ]) )
1546 {
1547 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1548 cChannels++;
1549 }
1550 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001551 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1552 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1553 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1554 // only if we need to.
1555 //
1556 // The amount of memory to clear is the number of channesl that we trimmed
1557 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1558 if ( pChannelList->numChannels > cChannels )
1559 {
1560 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1561 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1562 }
1563
1564 pChannelList->numChannels = cChannels;
1565 }
1566 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001567}
Jeff Johnson295189b2012-06-20 16:38:30 -07001568#ifdef WLAN_SOFTAP_FEATURE
1569#define INFRA_AP_DEFAULT_CHANNEL 6
1570eHalStatus csrIsValidChannel(tpAniSirGlobal pMac, tANI_U8 chnNum)
1571{
1572 tANI_U8 index= 0;
1573 eHalStatus status = eHAL_STATUS_FAILURE;
1574 for (index=0; index < pMac->scan.base20MHzChannels.numChannels ;index++)
1575 {
1576 if(pMac->scan.base20MHzChannels.channelList[ index ] == chnNum){
1577 status = eHAL_STATUS_SUCCESS;
1578 break;
1579 }
1580 }
1581 return status;
1582}
1583#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001584eHalStatus csrInitGetChannels(tpAniSirGlobal pMac)
1585{
1586 eHalStatus status = eHAL_STATUS_SUCCESS;
1587 tANI_U8 num20MHzChannelsFound = 0;
1588 VOS_STATUS vosStatus;
1589 tANI_U8 Index = 0;
1590 tANI_U8 num40MHzChannelsFound = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001591
Jeff Johnson295189b2012-06-20 16:38:30 -07001592
1593 //TODO: this interface changed to include the 40MHz channel list
1594 // this needs to be tied into the adapter structure somehow and referenced appropriately for CB operation
1595 // Read the scan channel list (including the power limit) from EEPROM
1596 vosStatus = vos_nv_getChannelListWithPower( pMac->scan.defaultPowerTable, &num20MHzChannelsFound,
1597 pMac->scan.defaultPowerTable40MHz, &num40MHzChannelsFound);
1598 if ( (VOS_STATUS_SUCCESS != vosStatus) || (num20MHzChannelsFound == 0) )
1599 {
1600 smsLog( pMac, LOGE, FL("failed to get channels \n"));
1601 status = eHAL_STATUS_FAILURE;
1602 }
1603 else
1604 {
1605 if ( num20MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN )
1606 {
1607 num20MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1608 }
1609 pMac->scan.numChannelsDefault = num20MHzChannelsFound;
1610 // Move the channel list to the global data
1611 // structure -- this will be used as the scan list
1612 for ( Index = 0; Index < num20MHzChannelsFound; Index++)
1613 {
1614#ifdef FEATURE_WLAN_INTEGRATED_SOC /* Need to fix this while dealing with NV item */
1615 pMac->scan.base20MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable[ Index ].chanId;
1616#else
1617 pMac->scan.base20MHzChannels.channelList[ Index ] = Index + 1;
1618 pMac->scan.defaultPowerTable[Index].chanId = Index + 1;
1619 pMac->scan.defaultPowerTable[Index].pwr = 25;
1620#endif
1621 }
1622 pMac->scan.base20MHzChannels.numChannels = num20MHzChannelsFound;
1623 if(num40MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN)
1624 {
1625 num40MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1626 }
1627 for ( Index = 0; Index < num40MHzChannelsFound; Index++)
1628 {
1629 pMac->scan.base40MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable40MHz[ Index ].chanId;
1630 }
1631 pMac->scan.base40MHzChannels.numChannels = num40MHzChannelsFound;
1632 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001633 return (status);
1634}
1635
Jeff Johnson295189b2012-06-20 16:38:30 -07001636eHalStatus csrInitChannelList( tHalHandle hHal )
1637{
1638 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1639 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001640 csrPruneChannelListForMode(pMac, &pMac->scan.baseChannels);
1641 csrPruneChannelListForMode(pMac, &pMac->scan.base20MHzChannels);
1642 // Apply the base channel list, power info, and set the Country code...
1643 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1644
1645 return (status);
1646}
Jeff Johnson295189b2012-06-20 16:38:30 -07001647eHalStatus csrChangeConfigParams(tpAniSirGlobal pMac,
1648 tCsrUpdateConfigParam *pUpdateConfigParam)
1649{
1650 eHalStatus status = eHAL_STATUS_FAILURE;
1651 tCsr11dinfo *ps11dinfo = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001652 ps11dinfo = &pUpdateConfigParam->Csr11dinfo;
1653 status = CsrInit11dInfo(pMac, ps11dinfo);
1654 return status;
1655}
1656
Jeff Johnson295189b2012-06-20 16:38:30 -07001657static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1658{
1659 eHalStatus status = eHAL_STATUS_FAILURE;
1660 tANI_U8 index;
1661 tANI_U32 count=0;
1662 tSirMacChanInfo *pChanInfo;
1663 tSirMacChanInfo *pChanInfoStart;
1664 tANI_BOOLEAN applyConfig = TRUE;
1665
1666 if(!ps11dinfo)
1667 {
1668 return (status);
1669 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001670 if ( ps11dinfo->Channels.numChannels && ( WNI_CFG_VALID_CHANNEL_LIST_LEN >= ps11dinfo->Channels.numChannels ) )
1671 {
1672 pMac->scan.base20MHzChannels.numChannels = ps11dinfo->Channels.numChannels;
1673 status = palCopyMemory(pMac->hHdd, pMac->scan.base20MHzChannels.channelList,
1674 ps11dinfo->Channels.channelList, ps11dinfo->Channels.numChannels);
1675 if(!HAL_STATUS_SUCCESS(status)) return (status);
1676 }
1677 else
1678 {
1679 //No change
1680 return (eHAL_STATUS_SUCCESS);
1681 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001682 //legacy maintenance
1683 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeDefault,
1684 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1685 if(!HAL_STATUS_SUCCESS(status)) return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -07001686 //Tush: at csropen get this initialized with default, during csr reset if this
1687 // already set with some value no need initilaize with default again
1688 if(0 == pMac->scan.countryCodeCurrent[0])
1689 {
1690 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
1691 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1692 if(!HAL_STATUS_SUCCESS(status)) return (status);
1693 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001694 // need to add the max power channel list
1695 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1696 {
1697 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1698 pChanInfoStart = pChanInfo;
Jeff Johnsone7245742012-09-05 17:12:55 -07001699 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1700 {
1701 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1702 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1703 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1704 pChanInfo++;
1705 count++;
1706 }
1707 if(count)
1708 {
1709 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1710 }
1711 palFreeMemory(pMac->hHdd, pChanInfoStart);
1712 }
1713 //Only apply them to CFG when not in STOP state. Otherwise they will be applied later
1714 if( HAL_STATUS_SUCCESS(status) )
1715 {
1716 for( index = 0; index < CSR_ROAM_SESSION_MAX; index++ )
1717 {
1718 if((CSR_IS_SESSION_VALID(pMac, index)) && CSR_IS_ROAM_STOP(pMac, index))
1719 {
1720 applyConfig = FALSE;
1721 }
1722 }
1723
1724 if(TRUE == applyConfig)
1725 {
1726 // Apply the base channel list, power info, and set the Country code...
1727 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1728 }
1729
1730 }
1731 return (status);
1732}
1733/* Initialize the Channel + Power List in the local cache and in the CFG */
1734eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1735{
1736 tANI_U8 index;
1737 tANI_U32 count=0;
1738 tSirMacChanInfo *pChanInfo;
1739 tSirMacChanInfo *pChanInfoStart;
1740
1741 if(!ps11dinfo || !pMac)
1742 {
1743 return eHAL_STATUS_FAILURE;
1744 }
1745
1746 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1747 {
1748 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1749 pChanInfoStart = pChanInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07001750
1751 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1752 {
1753 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1754 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1755 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1756 pChanInfo++;
1757 count++;
1758 }
1759 if(count)
1760 {
1761 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1762 }
1763 palFreeMemory(pMac->hHdd, pChanInfoStart);
1764 }
1765
Jeff Johnsone7245742012-09-05 17:12:55 -07001766 return eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001767}
1768
1769//pCommand may be NULL
1770//Pass in sessionId in case pCommand is NULL. sessionId is not used in case pCommand is not NULL.
1771void csrRoamRemoveDuplicateCommand(tpAniSirGlobal pMac, tANI_U32 sessionId, tSmeCmd *pCommand, eCsrRoamReason eRoamReason)
1772{
1773 tListElem *pEntry, *pNextEntry;
1774 tSmeCmd *pDupCommand;
1775 tDblLinkList localList;
1776
1777 vos_mem_zero(&localList, sizeof(tDblLinkList));
1778 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
1779 {
1780 smsLog(pMac, LOGE, FL(" failed to open list"));
1781 return;
1782 }
1783 csrLLLock( &pMac->sme.smeCmdPendingList );
1784 pEntry = csrLLPeekHead( &pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK );
1785 while( pEntry )
1786 {
1787 pNextEntry = csrLLNext( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK );
1788 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07001789 // Remove the previous command if..
1790 // - the new roam command is for the same RoamReason...
1791 // - the new roam command is a NewProfileList.
1792 // - the new roam command is a Forced Dissoc
1793 // - the new roam command is from an 802.11 OID (OID_SSID or OID_BSSID).
1794 if (
1795 (pCommand && ( pCommand->sessionId == pDupCommand->sessionId ) &&
1796 ((pCommand->command == pDupCommand->command) &&
1797 (pCommand->u.roamCmd.roamReason == pDupCommand->u.roamCmd.roamReason ||
1798 eCsrForcedDisassoc == pCommand->u.roamCmd.roamReason ||
1799 eCsrHddIssued == pCommand->u.roamCmd.roamReason)))
1800 ||
1801 //below the pCommand is NULL
Jeff Johnson43971f52012-07-17 12:26:56 -07001802 ( (sessionId == pDupCommand->sessionId) &&
1803 (eSmeCommandRoam == pDupCommand->command) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07001804 ((eCsrForcedDisassoc == eRoamReason) ||
1805 (eCsrHddIssued == eRoamReason))
1806 )
1807 )
1808 {
1809 smsLog(pMac, LOGW, FL(" roamReason = %d\n"), pDupCommand->u.roamCmd.roamReason);
1810 // Remove the 'stale' roam command from the pending list...
1811 if(csrLLRemoveEntry( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK ))
1812 {
1813 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
1814 }
1815 }
1816 pEntry = pNextEntry;
1817 }
1818 csrLLUnlock( &pMac->sme.smeCmdPendingList );
1819
1820 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
1821 {
1822 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
1823 //Tell caller that the command is cancelled
1824 csrRoamCallCallback(pMac, pDupCommand->sessionId, NULL, pDupCommand->u.roamCmd.roamId,
1825 eCSR_ROAM_CANCELLED, eCSR_ROAM_RESULT_NONE);
1826 csrReleaseCommandRoam(pMac, pDupCommand);
1827 }
1828 csrLLClose(&localList);
1829}
Jeff Johnson295189b2012-06-20 16:38:30 -07001830eHalStatus csrRoamCallCallback(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo,
1831 tANI_U32 roamId, eRoamCmdStatus u1, eCsrRoamResult u2)
1832{
1833 eHalStatus status = eHAL_STATUS_SUCCESS;
1834#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1835 WLAN_VOS_DIAG_EVENT_DEF(connectionStatus, vos_event_wlan_status_payload_type);
1836#endif
1837 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07001838 if( CSR_IS_SESSION_VALID( pMac, sessionId) )
1839 {
1840 pSession = CSR_GET_SESSION( pMac, sessionId );
1841 }
1842 else
1843 {
1844 smsLog(pMac, LOGE, "Session ID:%d is not valid\n", sessionId);
1845 VOS_ASSERT(0);
1846 return eHAL_STATUS_FAILURE;
1847 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001848 if(eCSR_ROAM_ASSOCIATION_COMPLETION == u1 && pRoamInfo)
1849 {
1850 smsLog(pMac, LOGW, " Assoc complete result = %d statusCode = %d reasonCode = %d\n", u2, pRoamInfo->statusCode, pRoamInfo->reasonCode);
1851 }
Madan Mohan Koyyalamudi85d140a2012-10-18 20:23:01 -07001852 if ((u1 == eCSR_ROAM_FT_REASSOC_FAILED) && (pSession->bRefAssocStartCnt)) {
1853 /*
1854 * Decrement bRefAssocStartCnt for FT reassoc failure.
1855 * Reason: For FT reassoc failures, we first call
1856 * csrRoamCallCallback before notifying a failed roam
1857 * completion through csrRoamComplete. The latter in
1858 * turn calls csrRoamProcessResults which tries to
1859 * once again call csrRoamCallCallback if bRefAssocStartCnt
1860 * is non-zero. Since this is redundant for FT reassoc
1861 * failure, decrement bRefAssocStartCnt.
1862 */
1863 pSession->bRefAssocStartCnt--;
1864 }
1865
Jeff Johnson295189b2012-06-20 16:38:30 -07001866 if ( (pSession == NULL) ||
1867 (eANI_BOOLEAN_FALSE == pSession->sessionActive) )
1868 {
1869 smsLog(pMac, LOG1, "Session ID is not valid\n");
1870 return eHAL_STATUS_FAILURE;
1871 }
1872
1873 if(NULL != pSession->callback)
1874 {
1875 if( pRoamInfo )
1876 {
1877 pRoamInfo->sessionId = (tANI_U8)sessionId;
1878 }
1879
1880 /* avoid holding the global lock when making the roaming callback , original change came
1881 from a raised CR (CR304874). Since this callback is in HDD a potential deadlock
1882 is possible on other OS ports where the callback may need to take locks to protect
1883 HDD state
1884 UPDATE : revert this change but keep the comments here. Need to revisit as there are callbacks
1885 that may actually depend on the lock being held */
1886 // TODO: revisit: sme_ReleaseGlobalLock( &pMac->sme );
1887 status = pSession->callback(pSession->pContext, pRoamInfo, roamId, u1, u2);
1888 // TODO: revisit: sme_AcquireGlobalLock( &pMac->sme );
1889 }
1890 //EVENT_WLAN_STATUS: eCSR_ROAM_ASSOCIATION_COMPLETION,
1891 // eCSR_ROAM_LOSTLINK, eCSR_ROAM_DISASSOCIATED,
1892#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1893 palZeroMemory(pMac->hHdd, &connectionStatus, sizeof(vos_event_wlan_status_payload_type));
1894 if((eCSR_ROAM_ASSOCIATION_COMPLETION == u1) && (eCSR_ROAM_RESULT_ASSOCIATED == u2))
1895 {
1896 connectionStatus.eventId = eCSR_WLAN_STATUS_CONNECT;
1897 connectionStatus.bssType = pRoamInfo->u.pConnectedProfile->BSSType;
1898 if(NULL != pRoamInfo->pBssDesc)
1899 {
1900 connectionStatus.rssi = pRoamInfo->pBssDesc->rssi * (-1);
1901 connectionStatus.channel = pRoamInfo->pBssDesc->channelId;
1902 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001903 connectionStatus.qosCapability = pRoamInfo->u.pConnectedProfile->qosConnection;
1904 connectionStatus.authType = (v_U8_t)diagAuthTypeFromCSRType(pRoamInfo->u.pConnectedProfile->AuthType);
1905 connectionStatus.encryptionType = (v_U8_t)diagEncTypeFromCSRType(pRoamInfo->u.pConnectedProfile->EncryptionType);
1906 palCopyMemory(pMac->hHdd, connectionStatus.ssid, pRoamInfo->u.pConnectedProfile->SSID.ssId, 6);
1907 connectionStatus.reason = eCSR_REASON_UNSPECIFIED;
1908 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1909 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001910 if((eCSR_ROAM_MIC_ERROR_IND == u1) || (eCSR_ROAM_RESULT_MIC_FAILURE == u2))
1911 {
1912 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1913 connectionStatus.reason = eCSR_REASON_MIC_ERROR;
1914 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1915 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001916 if(eCSR_ROAM_RESULT_FORCED == u2)
1917 {
1918 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1919 connectionStatus.reason = eCSR_REASON_USER_REQUESTED;
1920 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1921 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001922 if(eCSR_ROAM_RESULT_DISASSOC_IND == u2)
1923 {
1924 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1925 connectionStatus.reason = eCSR_REASON_DISASSOC;
1926 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1927 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001928 if(eCSR_ROAM_RESULT_DEAUTH_IND == u2)
1929 {
1930 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1931 connectionStatus.reason = eCSR_REASON_DEAUTH;
1932 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1933 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001934#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
1935
1936 return (status);
1937}
Jeff Johnson295189b2012-06-20 16:38:30 -07001938// Returns whether handoff is currently in progress or not
1939tANI_BOOLEAN csrRoamIsHandoffInProgress(tpAniSirGlobal pMac)
1940{
1941#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1942 return csrNeighborRoamIsHandoffInProgress(pMac);
1943#else
1944 return eANI_BOOLEAN_FALSE;
1945#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001946}
Jeff Johnson295189b2012-06-20 16:38:30 -07001947eHalStatus csrRoamIssueDisassociate( tpAniSirGlobal pMac, tANI_U32 sessionId,
1948 eCsrRoamSubState NewSubstate, tANI_BOOLEAN fMICFailure )
1949{
1950 eHalStatus status = eHAL_STATUS_SUCCESS;
1951 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1952 tANI_U16 reasonCode;
1953 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07001954
1955 if(!pSession)
1956 {
1957 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
1958 return eHAL_STATUS_FAILURE;
1959 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001960
1961 //Restore AC weight in case we change it
1962 if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
1963 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07001964 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 -07001965 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
1966 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
1967 }
1968
1969 if ( fMICFailure )
1970 {
1971 reasonCode = eSIR_MAC_MIC_FAILURE_REASON;
1972 }
1973 else if (NewSubstate == eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF)
1974 {
1975 reasonCode = eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON;
1976 } else
1977 {
1978 reasonCode = eSIR_MAC_UNSPEC_FAILURE_REASON;
1979 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001980#ifdef WLAN_FEATURE_VOWIFI_11R
1981 if ( (csrRoamIsHandoffInProgress(pMac)) &&
1982 (NewSubstate != eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF))
1983 {
1984 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
1985 palCopyMemory(pMac->hHdd, &bssId, pNeighborRoamInfo->csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001986 } else
1987#endif
1988 if(pSession->pConnectBssDesc)
1989 {
1990 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
1991 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001992
Jeff Johnson295189b2012-06-20 16:38:30 -07001993
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07001994 smsLog( pMac, LOG1, "CSR Attempting to Disassociate Bssid= %02x-%02x-%02x-%02x-%02x-%02x subState = %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07001995 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
1996 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ], NewSubstate );
Jeff Johnson295189b2012-06-20 16:38:30 -07001997 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
1998
1999 status = csrSendMBDisassocReqMsg( pMac, sessionId, bssId, reasonCode );
2000
2001 if(HAL_STATUS_SUCCESS(status))
2002 {
2003 csrRoamLinkDown(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002004#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2005 //no need to tell QoS that we are disassociating, it will be taken care off in assoc req for HO
2006 if(eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF != NewSubstate)
2007 {
2008 //Tush-QoS: notify QoS module that disassoc happening
2009 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
2010 }
2011#endif
2012 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002013 return (status);
2014}
Jeff Johnson295189b2012-06-20 16:38:30 -07002015#ifdef WLAN_SOFTAP_FEATURE
2016
Jeff Johnson295189b2012-06-20 16:38:30 -07002017/* ---------------------------------------------------------------------------
2018 \fn csrRoamIssueDisassociateStaCmd
2019 \brief csr function that HDD calls to disassociate a associated station
2020 \param sessionId - session Id for Soft AP
2021 \param pPeerMacAddr - MAC of associated station to delete
2022 \param reason - reason code, be one of the tSirMacReasonCodes
2023 \return eHalStatus
2024 ---------------------------------------------------------------------------*/
2025eHalStatus csrRoamIssueDisassociateStaCmd( tpAniSirGlobal pMac,
2026 tANI_U32 sessionId,
2027 tANI_U8 *pPeerMacAddr,
2028 tANI_U32 reason)
2029{
2030 eHalStatus status = eHAL_STATUS_SUCCESS;
2031 tSmeCmd *pCommand;
2032
2033 do
2034 {
2035 pCommand = csrGetCommandBuffer( pMac );
2036 if ( !pCommand )
2037 {
2038 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2039 status = eHAL_STATUS_RESOURCES;
2040 break;
2041 }
2042 pCommand->command = eSmeCommandRoam;
2043 pCommand->sessionId = (tANI_U8)sessionId;
2044 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocSta;
2045 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2046 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2047 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2048 if( !HAL_STATUS_SUCCESS( status ) )
2049 {
2050 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2051 csrReleaseCommandRoam( pMac, pCommand );
2052 }
2053 }while(0);
2054
2055 return status;
2056}
2057
2058
Jeff Johnson295189b2012-06-20 16:38:30 -07002059/* ---------------------------------------------------------------------------
2060 \fn csrRoamIssueDeauthSta
2061 \brief csr function that HDD calls to delete a associated station
2062 \param sessionId - session Id for Soft AP
2063 \param pPeerMacAddr - MAC of associated station to delete
2064 \param reason - reason code, be one of the tSirMacReasonCodes
2065 \return eHalStatus
2066 ---------------------------------------------------------------------------*/
2067eHalStatus csrRoamIssueDeauthStaCmd( tpAniSirGlobal pMac,
2068 tANI_U32 sessionId,
2069 tANI_U8 *pPeerMacAddr,
2070 tANI_U32 reason)
2071{
2072 eHalStatus status = eHAL_STATUS_SUCCESS;
2073 tSmeCmd *pCommand;
2074
2075 do
2076 {
2077 pCommand = csrGetCommandBuffer( pMac );
2078 if ( !pCommand )
2079 {
2080 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2081 status = eHAL_STATUS_RESOURCES;
2082 break;
2083 }
2084 pCommand->command = eSmeCommandRoam;
2085 pCommand->sessionId = (tANI_U8)sessionId;
2086 pCommand->u.roamCmd.roamReason = eCsrForcedDeauthSta;
2087 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2088 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2089 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2090 if( !HAL_STATUS_SUCCESS( status ) )
2091 {
2092 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2093 csrReleaseCommandRoam( pMac, pCommand );
2094 }
2095 }while(0);
2096
2097 return status;
2098}
Jeff Johnson295189b2012-06-20 16:38:30 -07002099eHalStatus
2100csrRoamIssueTkipCounterMeasures( tpAniSirGlobal pMac, tANI_U32 sessionId,
2101 tANI_BOOLEAN bEnable )
2102{
2103 eHalStatus status = eHAL_STATUS_FAILURE;
2104 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2105 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002106 if (!pSession)
2107 {
2108 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:CSR Session not found\n");
2109 return (status);
2110 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002111 if (pSession->pConnectBssDesc)
2112 {
2113 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2114 }
2115 else
2116 {
2117 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:Connected BSS Description in CSR Session not found\n");
2118 return (status);
2119 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002120 smsLog( pMac, LOG2, "CSR issuing tkip counter measures for Bssid = %02x-%02x-%02x-%02x-%02x-%02x, Enable = %d\n",
2121 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2122 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] , bEnable);
Jeff Johnson295189b2012-06-20 16:38:30 -07002123 status = csrSendMBTkipCounterMeasuresReqMsg( pMac, sessionId, bEnable, bssId );
2124 return (status);
2125}
Jeff Johnson295189b2012-06-20 16:38:30 -07002126eHalStatus
2127csrRoamGetAssociatedStas( tpAniSirGlobal pMac, tANI_U32 sessionId,
2128 VOS_MODULE_ID modId, void *pUsrContext,
2129 void *pfnSapEventCallback, v_U8_t *pAssocStasBuf )
2130{
2131 eHalStatus status = eHAL_STATUS_SUCCESS;
2132 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2133 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002134 if (!pSession)
2135 {
2136 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:CSR Session not found\n");
2137 return (status);
2138 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002139 if(pSession->pConnectBssDesc)
2140 {
2141 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2142 }
2143 else
2144 {
2145 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:Connected BSS Description in CSR Session not found\n");
2146 return (status);
2147 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002148 smsLog( pMac, LOG2, "CSR getting associated stations for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2149 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2150 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002151 status = csrSendMBGetAssociatedStasReqMsg( pMac, sessionId, modId, bssId, pUsrContext, pfnSapEventCallback, pAssocStasBuf );
2152 return (status);
2153}
Jeff Johnson295189b2012-06-20 16:38:30 -07002154eHalStatus
2155csrRoamGetWpsSessionOverlap( tpAniSirGlobal pMac, tANI_U32 sessionId,
2156 void *pUsrContext, void *pfnSapEventCallback, v_MACADDR_t pRemoveMac )
2157{
2158 eHalStatus status = eHAL_STATUS_SUCCESS;
2159 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2160 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2161
2162 if (!pSession)
2163 {
2164 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:CSR Session not found\n");
2165 return (status);
2166 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002167 if(pSession->pConnectBssDesc)
2168 {
2169 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2170 }
2171 else
2172 {
2173 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:Connected BSS Description in CSR Session not found\n");
2174 return (status);
2175 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002176 smsLog( pMac, LOG2, "CSR getting WPS Session Overlap for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2177 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2178 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
2179
2180 status = csrSendMBGetWPSPBCSessions( pMac, sessionId, bssId, pUsrContext, pfnSapEventCallback, pRemoveMac);
2181
2182 return (status);
2183}
Jeff Johnson295189b2012-06-20 16:38:30 -07002184#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002185eHalStatus csrRoamIssueDeauth( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
2186{
2187 eHalStatus status = eHAL_STATUS_SUCCESS;
2188 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2189 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07002190
2191 if (!pSession)
2192 {
2193 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2194 return eHAL_STATUS_FAILURE;
2195 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002196
2197 if(pSession->pConnectBssDesc)
2198 {
2199 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2200 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002201 smsLog( pMac, LOG2, "CSR Attempting to Deauth Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
2202 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2203 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002204 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
2205
2206 status = csrSendMBDeauthReqMsg( pMac, sessionId, bssId, eSIR_MAC_DISASSOC_LEAVING_BSS_REASON );
2207
2208 return (status);
2209}
2210
Jeff Johnson295189b2012-06-20 16:38:30 -07002211eHalStatus csrRoamSaveConnectedBssDesc( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDesc )
2212{
2213 eHalStatus status = eHAL_STATUS_SUCCESS;
2214 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2215 tANI_U32 size;
Jeff Johnson32d95a32012-09-10 13:15:23 -07002216
2217 if(!pSession)
2218 {
2219 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2220 return eHAL_STATUS_FAILURE;
2221 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002222
2223 // If no BSS description was found in this connection (happens with start IBSS), then
2224 // nix the BSS description that we keep around for the connected BSS) and get out...
2225 if(NULL == pBssDesc)
2226 {
2227 csrFreeConnectBssDesc(pMac, sessionId);
2228 }
2229 else
2230 {
2231 size = pBssDesc->length + sizeof( pBssDesc->length );
2232 if(NULL != pSession->pConnectBssDesc)
2233 {
2234 if(((pSession->pConnectBssDesc->length) + sizeof(pSession->pConnectBssDesc->length)) < size)
2235 {
2236 //not enough room for the new BSS, pMac->roam.pConnectBssDesc is freed inside
2237 csrFreeConnectBssDesc(pMac, sessionId);
2238 }
2239 }
2240 if(NULL == pSession->pConnectBssDesc)
2241 {
2242 status = palAllocateMemory( pMac->hHdd, (void **)&pSession->pConnectBssDesc, size);
2243 }
2244 if ( HAL_STATUS_SUCCESS(status) && pSession->pConnectBssDesc )
2245 {
2246 palCopyMemory( pMac->hHdd, pSession->pConnectBssDesc, pBssDesc, size );
2247 }
2248 }
2249
2250 return (status);
2251}
2252
Jeff Johnson295189b2012-06-20 16:38:30 -07002253eHalStatus csrRoamPrepareBssConfig(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2254 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
2255 tDot11fBeaconIEs *pIes)
2256{
2257 eHalStatus status = eHAL_STATUS_SUCCESS;
2258 eCsrCfgDot11Mode cfgDot11Mode;
Jeff Johnson295189b2012-06-20 16:38:30 -07002259#if defined(VOSS_ENABLED)
2260 VOS_ASSERT( pIes != NULL );
2261#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07002262
Jeff Johnson295189b2012-06-20 16:38:30 -07002263 do
2264 {
2265 palCopyMemory(pMac->hHdd, &pBssConfig->BssCap, &pBssDesc->capabilityInfo, sizeof(tSirMacCapabilityInfo));
2266 //get qos
2267 pBssConfig->qosType = csrGetQoSFromBssDesc(pMac, pBssDesc, pIes);
2268 //get SSID
2269 if(pIes->SSID.present)
2270 {
2271 palCopyMemory(pMac->hHdd, &pBssConfig->SSID.ssId, pIes->SSID.ssid, pIes->SSID.num_ssid);
2272 pBssConfig->SSID.length = pIes->SSID.num_ssid;
2273 }
2274 else
2275 pBssConfig->SSID.length = 0;
2276 if(csrIsNULLSSID(pBssConfig->SSID.ssId, pBssConfig->SSID.length))
2277 {
2278 smsLog(pMac, LOGW, " BSS desc SSID is a wildcard\n");
2279 //Return failed if profile doesn't have an SSID either.
2280 if(pProfile->SSIDs.numOfSSIDs == 0)
2281 {
2282 smsLog(pMac, LOGW, " Both BSS desc and profile doesn't have SSID\n");
2283 status = eHAL_STATUS_FAILURE;
2284 break;
2285 }
2286 }
2287 if(CSR_IS_CHANNEL_5GHZ(pBssDesc->channelId))
2288 {
2289 pBssConfig->eBand = eCSR_BAND_5G;
2290 }
2291 else
2292 {
2293 pBssConfig->eBand = eCSR_BAND_24;
2294 }
2295 //phymode
2296 if(csrIsPhyModeMatch( pMac, pProfile->phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes ))
2297 {
2298 pBssConfig->uCfgDot11Mode = cfgDot11Mode;
2299 }
2300 else
2301 {
2302 smsLog(pMac, LOGW, " Can not find match phy mode\n");
2303 //force it
2304 if(eCSR_BAND_24 == pBssConfig->eBand)
2305 {
2306 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2307 }
2308 else
2309 {
2310 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2311 }
2312 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002313 //Qos
2314 if ((pBssConfig->uCfgDot11Mode != eCSR_CFG_DOT11_MODE_11N) &&
2315 (pMac->roam.configParam.WMMSupportMode == eCsrRoamWmmNoQos))
2316 {
2317 //Joining BSS is not 11n capable and WMM is disabled on client.
2318 //Disable QoS and WMM
2319 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2320 }
2321
2322 //auth type
2323 switch( pProfile->negotiatedAuthType )
2324 {
2325 default:
2326 case eCSR_AUTH_TYPE_WPA:
2327 case eCSR_AUTH_TYPE_WPA_PSK:
2328 case eCSR_AUTH_TYPE_WPA_NONE:
2329 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2330 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2331 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002332 case eCSR_AUTH_TYPE_SHARED_KEY:
2333 pBssConfig->authType = eSIR_SHARED_KEY;
2334 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002335 case eCSR_AUTH_TYPE_AUTOSWITCH:
2336 pBssConfig->authType = eSIR_AUTO_SWITCH;
2337 break;
2338 }
2339 //short slot time
2340 if( eCSR_CFG_DOT11_MODE_11B != cfgDot11Mode )
2341 {
2342 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2343 }
2344 else
2345 {
2346 pBssConfig->uShortSlotTime = 0;
2347 }
2348 if(pBssConfig->BssCap.ibss)
2349 {
2350 //We don't support 11h on IBSS
2351 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2352 }
2353 else
2354 {
2355 pBssConfig->f11hSupport = pMac->roam.configParam.Is11hSupportEnabled;
2356 }
2357 //power constraint
2358 pBssConfig->uPowerLimit = csrGet11hPowerConstraint(pMac, &pIes->PowerConstraints);
2359 //heartbeat
2360 if ( CSR_IS_11A_BSS( pBssDesc ) )
2361 {
2362 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2363 }
2364 else
2365 {
2366 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2367 }
2368 //Join timeout
2369 // if we find a BeaconInterval in the BssDescription, then set the Join Timeout to
Jeff Johnsone7245742012-09-05 17:12:55 -07002370 // be 10 x the BeaconInterval.
Jeff Johnson295189b2012-06-20 16:38:30 -07002371 if ( pBssDesc->beaconInterval )
2372 {
2373 //Make sure it is bigger than the minimal
Jeff Johnsone7245742012-09-05 17:12:55 -07002374 pBssConfig->uJoinTimeOut = CSR_ROAM_MAX(10 * pBssDesc->beaconInterval, CSR_JOIN_FAILURE_TIMEOUT_MIN);
Jeff Johnson295189b2012-06-20 16:38:30 -07002375 }
2376 else
2377 {
2378 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
2379 }
2380 //validate CB
2381 pBssConfig->cbMode = csrGetCBModeFromIes(pMac, pBssDesc->channelId, pIes);
2382 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002383 return (status);
2384}
2385
Jeff Johnson295189b2012-06-20 16:38:30 -07002386static eHalStatus csrRoamPrepareBssConfigFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2387 tBssConfigParam *pBssConfig, tSirBssDescription *pBssDesc)
2388{
2389 eHalStatus status = eHAL_STATUS_SUCCESS;
2390 tANI_U8 operationChannel = 0;
2391 tANI_U8 qAPisEnabled = FALSE;
2392 //SSID
2393 pBssConfig->SSID.length = 0;
2394 if(pProfile->SSIDs.numOfSSIDs)
2395 {
2396 //only use the first one
2397 palCopyMemory(pMac->hHdd, &pBssConfig->SSID, &pProfile->SSIDs.SSIDList[0].SSID, sizeof(tSirMacSSid));
2398 }
2399 else
2400 {
2401 //SSID must present
2402 return eHAL_STATUS_FAILURE;
2403 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002404 //Settomg up the capabilities
2405 if( csrIsBssTypeIBSS(pProfile->BSSType) )
2406 {
2407 pBssConfig->BssCap.ibss = 1;
2408 }
2409 else
2410 {
2411 pBssConfig->BssCap.ess = 1;
2412 }
2413 if( eCSR_ENCRYPT_TYPE_NONE != pProfile->EncryptionType.encryptionType[0] )
2414 {
2415 pBssConfig->BssCap.privacy = 1;
2416 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002417 pBssConfig->eBand = pMac->roam.configParam.eBand;
2418 //phymode
2419 if(pProfile->ChannelInfo.ChannelList)
2420 {
2421 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2422 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002423#ifdef WLAN_SOFTAP_FEATURE
2424 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, operationChannel,
2425 &pBssConfig->eBand);
2426#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002427 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel,
2428 &pBssConfig->eBand);
2429#endif
2430 //QOS
2431 //Is this correct to always set to this //***
Jeff Johnson295189b2012-06-20 16:38:30 -07002432 if ( pBssConfig->BssCap.ess == 1 )
2433 {
2434#ifdef WLAN_SOFTAP_FEATURE
2435 /*For Softap case enable WMM*/
2436 if(CSR_IS_INFRA_AP(pProfile) && (eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode )){
2437 qAPisEnabled = TRUE;
2438 }
2439 else
2440#endif
2441 if (csrRoamGetQosInfoFromBss(pMac, pBssDesc) == eHAL_STATUS_SUCCESS) {
2442 qAPisEnabled = TRUE;
2443 } else {
2444 qAPisEnabled = FALSE;
2445 }
2446 } else {
2447 qAPisEnabled = TRUE;
2448 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002449 if (( eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode && qAPisEnabled) ||
2450 (( eCSR_CFG_DOT11_MODE_11N == pBssConfig->uCfgDot11Mode && qAPisEnabled) ||
2451 ( eCSR_CFG_DOT11_MODE_TAURUS == pBssConfig->uCfgDot11Mode ) ) //For 11n, need QoS
2452 )
2453 {
2454 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP;
2455 } else {
2456 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2457 }
2458
2459 //auth type
2460 switch( pProfile->AuthType.authType[0] ) //Take the prefered Auth type.
2461 {
2462 default:
2463 case eCSR_AUTH_TYPE_WPA:
2464 case eCSR_AUTH_TYPE_WPA_PSK:
2465 case eCSR_AUTH_TYPE_WPA_NONE:
2466 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2467 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2468 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002469 case eCSR_AUTH_TYPE_SHARED_KEY:
2470 pBssConfig->authType = eSIR_SHARED_KEY;
2471 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002472 case eCSR_AUTH_TYPE_AUTOSWITCH:
2473 pBssConfig->authType = eSIR_AUTO_SWITCH;
2474 break;
2475 }
2476 //short slot time
2477 if( WNI_CFG_PHY_MODE_11B != pBssConfig->uCfgDot11Mode )
2478 {
2479 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2480 }
2481 else
2482 {
2483 pBssConfig->uShortSlotTime = 0;
2484 }
2485 //power constraint. We don't support 11h on IBSS
2486 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2487 pBssConfig->uPowerLimit = 0;
2488 //heartbeat
2489 if ( eCSR_BAND_5G == pBssConfig->eBand )
2490 {
2491 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2492 }
2493 else
2494 {
2495 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2496 }
2497 //Join timeout
2498 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
Jeff Johnsone7245742012-09-05 17:12:55 -07002499
Jeff Johnson295189b2012-06-20 16:38:30 -07002500 return (status);
2501}
Jeff Johnson295189b2012-06-20 16:38:30 -07002502static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc)
2503{
2504 eHalStatus status = eHAL_STATUS_FAILURE;
2505 tDot11fBeaconIEs *pIes = NULL;
2506
2507 do
2508 {
2509 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIes)))
2510 {
2511 //err msg
2512 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
2513 "csrRoamGetQosInfoFromBss() failed\n");
Jeff Johnson295189b2012-06-20 16:38:30 -07002514 break;
2515 }
2516 //check if the AP is QAP & it supports APSD
2517 if( CSR_IS_QOS_BSS(pIes) )
2518 {
2519 return eHAL_STATUS_SUCCESS;
2520 }
2521 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002522 return status;
2523}
2524
Jeff Johnson295189b2012-06-20 16:38:30 -07002525void csrSetCfgPrivacy( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, tANI_BOOLEAN fPrivacy )
2526{
Jeff Johnson295189b2012-06-20 16:38:30 -07002527 // !! Note: the only difference between this function and the csrSetCfgPrivacyFromProfile() is the
2528 // setting of the privacy CFG based on the advertised privacy setting from the AP for WPA associations.
2529 // See !!Note: below in this function...
2530 tANI_U32 PrivacyEnabled = 0;
2531 tANI_U32 RsnEnabled = 0;
2532 tANI_U32 WepDefaultKeyId = 0;
2533 tANI_U32 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5; /* default 40 bits */
2534 tANI_U32 Key0Length = 0;
2535 tANI_U32 Key1Length = 0;
2536 tANI_U32 Key2Length = 0;
2537 tANI_U32 Key3Length = 0;
2538
2539 // Reserve for the biggest key
2540 tANI_U8 Key0[ WNI_CFG_WEP_DEFAULT_KEY_1_LEN ];
2541 tANI_U8 Key1[ WNI_CFG_WEP_DEFAULT_KEY_2_LEN ];
2542 tANI_U8 Key2[ WNI_CFG_WEP_DEFAULT_KEY_3_LEN ];
2543 tANI_U8 Key3[ WNI_CFG_WEP_DEFAULT_KEY_4_LEN ];
2544
2545 switch ( pProfile->negotiatedUCEncryptionType )
2546 {
2547 case eCSR_ENCRYPT_TYPE_NONE:
2548
2549 // for NO encryption, turn off Privacy and Rsn.
2550 PrivacyEnabled = 0;
2551 RsnEnabled = 0;
2552
2553 // WEP key length and Wep Default Key ID don't matter in this case....
2554
2555 // clear out the WEP keys that may be hanging around.
2556 Key0Length = 0;
2557 Key1Length = 0;
2558 Key2Length = 0;
2559 Key3Length = 0;
2560
2561 break;
2562
2563 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
2564
2565 // Privacy is ON. NO RSN for Wep40 static key.
2566 PrivacyEnabled = 1;
2567 RsnEnabled = 0;
2568
2569 // Set the Wep default key ID.
2570 WepDefaultKeyId = pProfile->Keys.defaultIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07002571 // Wep key size if 5 bytes (40 bits).
2572 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5;
2573
2574 // set encryption keys in the CFG database or clear those that are not present in this profile.
2575 if ( pProfile->Keys.KeyLength[0] )
2576 {
2577 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[0], WNI_CFG_WEP_KEY_LENGTH_5 );
2578 Key0Length = WNI_CFG_WEP_KEY_LENGTH_5;
2579 }
2580 else
2581 {
2582 Key0Length = 0;
2583 }
2584
2585 if ( pProfile->Keys.KeyLength[1] )
2586 {
2587 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[1], WNI_CFG_WEP_KEY_LENGTH_5 );
2588 Key1Length = WNI_CFG_WEP_KEY_LENGTH_5;
2589 }
2590 else
2591 {
2592 Key1Length = 0;
2593 }
2594
2595 if ( pProfile->Keys.KeyLength[2] )
2596 {
2597 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[2], WNI_CFG_WEP_KEY_LENGTH_5 );
2598 Key2Length = WNI_CFG_WEP_KEY_LENGTH_5;
2599 }
2600 else
2601 {
2602 Key2Length = 0;
2603 }
2604
2605 if ( pProfile->Keys.KeyLength[3] )
2606 {
2607 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[3], WNI_CFG_WEP_KEY_LENGTH_5 );
2608 Key3Length = WNI_CFG_WEP_KEY_LENGTH_5;
2609 }
2610 else
2611 {
2612 Key3Length = 0;
2613 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002614 break;
2615
2616 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
2617
2618 // Privacy is ON. NO RSN for Wep40 static key.
2619 PrivacyEnabled = 1;
2620 RsnEnabled = 0;
2621
2622 // Set the Wep default key ID.
2623 WepDefaultKeyId = pProfile->Keys.defaultIndex;
2624
2625 // Wep key size if 13 bytes (104 bits).
2626 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_13;
2627
2628 // set encryption keys in the CFG database or clear those that are not present in this profile.
2629 if ( pProfile->Keys.KeyLength[0] )
2630 {
2631 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[ 0 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2632 Key0Length = WNI_CFG_WEP_KEY_LENGTH_13;
2633 }
2634 else
2635 {
2636 Key0Length = 0;
2637 }
2638
2639 if ( pProfile->Keys.KeyLength[1] )
2640 {
2641 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[ 1 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2642 Key1Length = WNI_CFG_WEP_KEY_LENGTH_13;
2643 }
2644 else
2645 {
2646 Key1Length = 0;
2647 }
2648
2649 if ( pProfile->Keys.KeyLength[2] )
2650 {
2651 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[ 2 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2652 Key2Length = WNI_CFG_WEP_KEY_LENGTH_13;
2653 }
2654 else
2655 {
2656 Key2Length = 0;
2657 }
2658
2659 if ( pProfile->Keys.KeyLength[3] )
2660 {
2661 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[ 3 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2662 Key3Length = WNI_CFG_WEP_KEY_LENGTH_13;
2663 }
2664 else
2665 {
2666 Key3Length = 0;
2667 }
2668
2669 break;
2670
2671 case eCSR_ENCRYPT_TYPE_WEP40:
2672 case eCSR_ENCRYPT_TYPE_WEP104:
2673 case eCSR_ENCRYPT_TYPE_TKIP:
2674 case eCSR_ENCRYPT_TYPE_AES:
2675#ifdef FEATURE_WLAN_WAPI
2676 case eCSR_ENCRYPT_TYPE_WPI:
2677#endif /* FEATURE_WLAN_WAPI */
2678 // !! Note: this is the only difference between this function and the csrSetCfgPrivacyFromProfile()
2679 // (setting of the privacy CFG based on the advertised privacy setting from the AP for WPA/WAPI associations ).
2680 PrivacyEnabled = (0 != fPrivacy);
2681
2682 // turn on RSN enabled for WPA associations
2683 RsnEnabled = 1;
2684
2685 // WEP key length and Wep Default Key ID don't matter in this case....
2686
2687 // clear out the static WEP keys that may be hanging around.
2688 Key0Length = 0;
2689 Key1Length = 0;
2690 Key2Length = 0;
2691 Key3Length = 0;
2692
2693 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002694 default:
2695 PrivacyEnabled = 0;
2696 RsnEnabled = 0;
2697 break;
2698 }
2699
2700 ccmCfgSetInt(pMac, WNI_CFG_PRIVACY_ENABLED, PrivacyEnabled, NULL, eANI_BOOLEAN_FALSE);
2701 ccmCfgSetInt(pMac, WNI_CFG_RSN_ENABLED, RsnEnabled, NULL, eANI_BOOLEAN_FALSE);
2702 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_1, Key0, Key0Length, NULL, eANI_BOOLEAN_FALSE);
2703 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_2, Key1, Key1Length, NULL, eANI_BOOLEAN_FALSE);
2704 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_3, Key2, Key2Length, NULL, eANI_BOOLEAN_FALSE);
2705 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_4, Key3, Key3Length, NULL, eANI_BOOLEAN_FALSE);
2706 ccmCfgSetInt(pMac, WNI_CFG_WEP_KEY_LENGTH, WepKeyLength, NULL, eANI_BOOLEAN_FALSE);
2707 ccmCfgSetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, WepDefaultKeyId, NULL, eANI_BOOLEAN_FALSE);
2708}
2709
Jeff Johnson295189b2012-06-20 16:38:30 -07002710static void csrSetCfgSsid( tpAniSirGlobal pMac, tSirMacSSid *pSSID )
2711{
2712 tANI_U32 len = 0;
2713 if(pSSID->length <= WNI_CFG_SSID_LEN)
2714 {
2715 len = pSSID->length;
2716 }
2717 ccmCfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *)pSSID->ssId, len, NULL, eANI_BOOLEAN_FALSE);
2718}
2719
Jeff Johnson295189b2012-06-20 16:38:30 -07002720eHalStatus csrSetQosToCfg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrMediaAccessType qosType )
2721{
2722 eHalStatus status = eHAL_STATUS_SUCCESS;
2723 tANI_U32 QoSEnabled;
2724 tANI_U32 WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002725 // set the CFG enable/disable variables based on the qosType being configured...
2726 switch( qosType )
2727 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002728 case eCSR_MEDIUM_ACCESS_WMM_eDCF_802dot1p:
2729 QoSEnabled = FALSE;
2730 WmeEnabled = TRUE;
2731 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002732 case eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP:
2733 QoSEnabled = FALSE;
2734 WmeEnabled = TRUE;
2735 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002736 case eCSR_MEDIUM_ACCESS_WMM_eDCF_NoClassify:
2737 QoSEnabled = FALSE;
2738 WmeEnabled = TRUE;
2739 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002740 case eCSR_MEDIUM_ACCESS_11e_eDCF:
2741 QoSEnabled = TRUE;
2742 WmeEnabled = FALSE;
2743 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002744 case eCSR_MEDIUM_ACCESS_11e_HCF:
2745 QoSEnabled = TRUE;
2746 WmeEnabled = FALSE;
2747 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002748 default:
2749 case eCSR_MEDIUM_ACCESS_DCF:
2750 QoSEnabled = FALSE;
2751 WmeEnabled = FALSE;
2752 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002753 }
2754 //save the WMM setting for later use
2755 pMac->roam.roamSession[sessionId].fWMMConnection = (tANI_BOOLEAN)WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002756 status = ccmCfgSetInt(pMac, WNI_CFG_QOS_ENABLED, QoSEnabled, NULL, eANI_BOOLEAN_FALSE);
2757 status = ccmCfgSetInt(pMac, WNI_CFG_WME_ENABLED, WmeEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002758 return (status);
2759}
Jeff Johnson295189b2012-06-20 16:38:30 -07002760static eHalStatus csrGetRateSet( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tSirBssDescription *pBssDesc,
2761 tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet)
2762{
2763 eHalStatus status = eHAL_STATUS_FAILURE;
2764 int i;
2765 eCsrCfgDot11Mode cfgDot11Mode;
2766 tANI_U8 *pDstRate;
Jeff Johnson295189b2012-06-20 16:38:30 -07002767 palZeroMemory(pMac->hHdd, pOpRateSet, sizeof(tSirMacRateSet));
2768 palZeroMemory(pMac->hHdd, pExRateSet, sizeof(tSirMacRateSet));
Jeff Johnson295189b2012-06-20 16:38:30 -07002769#if defined(VOSS_ENABLED)
2770 VOS_ASSERT( pIes != NULL );
2771#endif
2772
2773 if( NULL != pIes )
2774 {
2775 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002776 // Originally, we thought that for 11a networks, the 11a rates are always
2777 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2778 // appear in the Operational Rate set. Consequently, in either case, we
2779 // would blindly put the rates we support into our Operational Rate set
2780 // (including the basic rates, which we have already verified are
2781 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002782 // However, it turns out that this is not always the case. Some AP's
2783 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2784 // too. Now, we're a little more careful:
2785 pDstRate = pOpRateSet->rate;
2786 if(pIes->SuppRates.present)
2787 {
2788 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2789 {
2790 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) )
2791 {
2792 *pDstRate++ = pIes->SuppRates.rates[ i ];
2793 pOpRateSet->numRates++;;
2794 }
2795 }
2796 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002797 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2798 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2799 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2800 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2801 {
2802 // If there are Extended Rates in the beacon, we will reflect those
2803 // extended rates that we support in out Extended Operational Rate
2804 // set:
2805 pDstRate = pExRateSet->rate;
2806 if(pIes->ExtSuppRates.present)
2807 {
2808 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2809 {
2810 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) )
2811 {
2812 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2813 pExRateSet->numRates++;
2814 }
2815 }
2816 }
2817 }
2818 }//Parsing BSSDesc
2819 else
2820 {
2821 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2822 }
2823 if (pOpRateSet->numRates > 0 || pExRateSet->numRates > 0) status = eHAL_STATUS_SUCCESS;
2824 return status;
2825}
2826
2827static void csrSetCfgRateSet( tpAniSirGlobal pMac, eCsrPhyMode phyMode, tCsrRoamProfile *pProfile,
2828 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
2829{
2830 int i;
2831 tANI_U8 *pDstRate;
2832 eCsrCfgDot11Mode cfgDot11Mode;
2833 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2834 tANI_U32 OperationalRatesLength = 0;
2835 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2836 tANI_U32 ExtendedOperationalRatesLength = 0;
2837 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2838 tANI_U32 ProprietaryOperationalRatesLength = 0;
2839 tANI_U32 PropRatesEnable = 0;
2840 tANI_U8 MCSRateIdxSet[ SIZE_OF_SUPPORTED_MCS_SET ];
2841 tANI_U32 MCSRateLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002842#if defined(VOSS_ENABLED)
2843 VOS_ASSERT( pIes != NULL );
2844#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002845 if( NULL != pIes )
2846 {
2847 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002848 // Originally, we thought that for 11a networks, the 11a rates are always
2849 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2850 // appear in the Operational Rate set. Consequently, in either case, we
2851 // would blindly put the rates we support into our Operational Rate set
2852 // (including the basic rates, which we have already verified are
2853 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002854 // However, it turns out that this is not always the case. Some AP's
2855 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2856 // too. Now, we're a little more careful:
2857 pDstRate = OperationalRates;
2858 if(pIes->SuppRates.present)
2859 {
2860 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2861 {
2862 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) &&
2863 ( OperationalRatesLength < CSR_DOT11_SUPPORTED_RATES_MAX ))
2864 {
2865 *pDstRate++ = pIes->SuppRates.rates[ i ];
2866 OperationalRatesLength++;
2867 }
2868 }
2869 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002870 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2871 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2872 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2873 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2874 {
2875 // If there are Extended Rates in the beacon, we will reflect those
2876 // extended rates that we support in out Extended Operational Rate
2877 // set:
2878 pDstRate = ExtendedOperationalRates;
2879 if(pIes->ExtSuppRates.present)
2880 {
2881 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2882 {
2883 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) &&
2884 ( ExtendedOperationalRatesLength < CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ))
2885 {
2886 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2887 ExtendedOperationalRatesLength++;
2888 }
2889 }
2890 }
2891 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002892 // Enable proprietary MAC features if peer node is Airgo node and STA
2893 // user wants to use them
2894 if( pIes->Airgo.present && pMac->roam.configParam.ProprietaryRatesEnabled )
2895 {
2896 PropRatesEnable = 1;
2897 }
2898 else
2899 {
2900 PropRatesEnable = 0;
2901 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002902 // For ANI network companions, we need to populate the proprietary rate
2903 // set with any proprietary rates we found in the beacon, only if user
2904 // allows them...
2905 if ( PropRatesEnable && pIes->Airgo.PropSuppRates.present &&
2906 ( pIes->Airgo.PropSuppRates.num_rates > 0 ))
2907 {
2908 ProprietaryOperationalRatesLength = pIes->Airgo.PropSuppRates.num_rates;
2909 if ( ProprietaryOperationalRatesLength > sizeof(ProprietaryOperationalRates) )
2910 {
2911 ProprietaryOperationalRatesLength = sizeof (ProprietaryOperationalRates);
2912 }
2913 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates, pIes->Airgo.PropSuppRates.rates, ProprietaryOperationalRatesLength );
2914 }
2915 else {
2916 // No proprietary modes...
2917 ProprietaryOperationalRatesLength = 0;
2918 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002919 /* Get MCS Rate */
2920 pDstRate = MCSRateIdxSet;
2921 if ( pIes->HTCaps.present )
2922 {
2923 for ( i = 0; i < VALID_MAX_MCS_INDEX; i++ )
2924 {
2925 if ( (unsigned int)pIes->HTCaps.supportedMCSSet[0] & (1 << i) )
2926 {
2927 MCSRateLength++;
2928 *pDstRate++ = i;
2929 }
2930 }
2931 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002932 // Set the operational rate set CFG variables...
2933 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
2934 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2935 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
2936 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2937 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
2938 ProprietaryOperationalRates,
2939 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2940 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
2941 ccmCfgSetStr(pMac, WNI_CFG_CURRENT_MCS_SET, MCSRateIdxSet,
2942 MCSRateLength, NULL, eANI_BOOLEAN_FALSE);
2943 }//Parsing BSSDesc
2944 else
2945 {
2946 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2947 }
2948}
2949
Jeff Johnson295189b2012-06-20 16:38:30 -07002950static void csrSetCfgRateSetFromProfile( tpAniSirGlobal pMac,
2951 tCsrRoamProfile *pProfile )
2952{
2953 tSirMacRateSetIE DefaultSupportedRates11a = { SIR_MAC_RATESET_EID,
2954 { 8,
2955 { SIR_MAC_RATE_6,
2956 SIR_MAC_RATE_9,
2957 SIR_MAC_RATE_12,
2958 SIR_MAC_RATE_18,
2959 SIR_MAC_RATE_24,
2960 SIR_MAC_RATE_36,
2961 SIR_MAC_RATE_48,
2962 SIR_MAC_RATE_54 } } };
Jeff Johnson295189b2012-06-20 16:38:30 -07002963 tSirMacRateSetIE DefaultSupportedRates11b = { SIR_MAC_RATESET_EID,
2964 { 4,
2965 { SIR_MAC_RATE_1,
2966 SIR_MAC_RATE_2,
2967 SIR_MAC_RATE_5_5,
2968 SIR_MAC_RATE_11 } } };
2969
2970
2971 tSirMacPropRateSet DefaultSupportedPropRates = { 3,
2972 { SIR_MAC_RATE_72,
2973 SIR_MAC_RATE_96,
2974 SIR_MAC_RATE_108 } };
2975 eCsrCfgDot11Mode cfgDot11Mode;
2976 eCsrBand eBand;
2977 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2978 tANI_U32 OperationalRatesLength = 0;
2979 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2980 tANI_U32 ExtendedOperationalRatesLength = 0;
2981 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2982 tANI_U32 ProprietaryOperationalRatesLength = 0;
2983 tANI_U32 PropRatesEnable = 0;
2984 tANI_U8 operationChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002985 if(pProfile->ChannelInfo.ChannelList)
2986 {
2987 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2988 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002989#ifdef WLAN_SOFTAP_FEATURE
2990 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
2991#else
2992 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
2993#endif
2994 // For 11a networks, the 11a rates go into the Operational Rate set. For 11b and 11g
2995 // networks, the 11b rates appear in the Operational Rate set. In either case,
2996 // we can blindly put the rates we support into our Operational Rate set
2997 // (including the basic rates, which we have already verified are supported
2998 // earlier in the roaming decision).
2999 if ( eCSR_BAND_5G == eBand )
3000 {
3001 // 11a rates into the Operational Rate Set.
3002 OperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3003 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3004 palCopyMemory( pMac->hHdd, OperationalRates,
3005 DefaultSupportedRates11a.supportedRateSet.rate,
3006 OperationalRatesLength );
3007
3008 // Nothing in the Extended rate set.
3009 ExtendedOperationalRatesLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003010 // populate proprietary rates if user allows them
3011 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3012 {
3013 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3014 sizeof(*DefaultSupportedPropRates.propRate);
3015 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3016 DefaultSupportedPropRates.propRate,
3017 ProprietaryOperationalRatesLength );
3018 }
3019 else
3020 {
3021 // No proprietary modes
3022 ProprietaryOperationalRatesLength = 0;
3023 }
3024 }
3025 else if ( eCSR_CFG_DOT11_MODE_11B == cfgDot11Mode )
3026 {
3027 // 11b rates into the Operational Rate Set.
3028 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3029 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3030 palCopyMemory( pMac->hHdd, OperationalRates,
3031 DefaultSupportedRates11b.supportedRateSet.rate,
3032 OperationalRatesLength );
3033 // Nothing in the Extended rate set.
3034 ExtendedOperationalRatesLength = 0;
3035 // No proprietary modes
3036 ProprietaryOperationalRatesLength = 0;
3037 }
3038 else
3039 {
3040 // 11G
3041
3042 // 11b rates into the Operational Rate Set.
3043 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3044 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3045 palCopyMemory( pMac->hHdd, OperationalRates,
3046 DefaultSupportedRates11b.supportedRateSet.rate,
3047 OperationalRatesLength );
3048
3049 // 11a rates go in the Extended rate set.
3050 ExtendedOperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3051 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3052 palCopyMemory( pMac->hHdd, ExtendedOperationalRates,
3053 DefaultSupportedRates11a.supportedRateSet.rate,
3054 ExtendedOperationalRatesLength );
3055
3056 // populate proprietary rates if user allows them
3057 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3058 {
3059 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3060 sizeof(*DefaultSupportedPropRates.propRate);
3061 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3062 DefaultSupportedPropRates.propRate,
3063 ProprietaryOperationalRatesLength );
3064 }
3065 else
3066 {
3067 // No proprietary modes
3068 ProprietaryOperationalRatesLength = 0;
3069 }
3070 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003071 // set this to 1 if prop. rates need to be advertised in to the IBSS beacon and user wants to use them
3072 if ( ProprietaryOperationalRatesLength && pMac->roam.configParam.ProprietaryRatesEnabled )
3073 {
3074 PropRatesEnable = 1;
3075 }
3076 else
3077 {
3078 PropRatesEnable = 0;
3079 }
3080
3081 // Set the operational rate set CFG variables...
3082 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
3083 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3084 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
3085 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3086 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
3087 ProprietaryOperationalRates,
3088 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3089 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003090}
Jeff Johnson295189b2012-06-20 16:38:30 -07003091void csrRoamCcmCfgSetCallback(tHalHandle hHal, tANI_S32 result)
3092{
3093 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
Jeff Johnsone7245742012-09-05 17:12:55 -07003094
Jeff Johnson295189b2012-06-20 16:38:30 -07003095 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
3096 tANI_U32 sessionId;
3097 tSmeCmd *pCommand = NULL;
3098
3099 if(NULL == pEntry)
3100 {
3101 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
3102 return;
3103 }
3104 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
3105 sessionId = pCommand->sessionId;
3106
3107 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
3108 {
3109 csrRoamingStateConfigCnfProcessor(pMac, (tANI_U32)result);
3110 }
3111}
3112
Jeff Johnson295189b2012-06-20 16:38:30 -07003113//This function is very dump. It is here because PE still need WNI_CFG_PHY_MODE
3114tANI_U32 csrRoamGetPhyModeFromDot11Mode(eCsrCfgDot11Mode dot11Mode, eCsrBand band)
3115{
3116 if(eCSR_CFG_DOT11_MODE_11B == dot11Mode)
3117 {
3118 return (WNI_CFG_PHY_MODE_11B);
3119 }
3120 else
3121 {
3122 if(eCSR_BAND_24 == band)
3123 return (WNI_CFG_PHY_MODE_11G);
3124 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003125 return (WNI_CFG_PHY_MODE_11A);
3126}
Jeff Johnson295189b2012-06-20 16:38:30 -07003127
Jeff Johnsone7245742012-09-05 17:12:55 -07003128
3129#ifdef WLAN_FEATURE_11AC
3130ePhyChanBondState csrGetHTCBStateFromVHTCBState(ePhyChanBondState aniCBMode)
3131{
3132 switch ( aniCBMode )
3133 {
3134 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3135 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3136 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3137 return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
3138 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3139 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3140 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3141 return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
3142 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003143 default :
Jeff Johnsone7245742012-09-05 17:12:55 -07003144 return PHY_SINGLE_CHANNEL_CENTERED;
3145 }
3146}
3147#endif
3148
Jeff Johnson295189b2012-06-20 16:38:30 -07003149//pIes may be NULL
3150eHalStatus csrRoamSetBssConfigCfg(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3151 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
3152 tDot11fBeaconIEs *pIes)
3153{
3154 eHalStatus status = eHAL_STATUS_SUCCESS;
3155 tANI_U32 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3156 tANI_U8 channel = 0;
3157 //Make sure we have the domain info for the BSS we try to connect to.
3158 //Do we need to worry about sequence for OSs that are not Windows??
3159 if(pBssDesc)
3160 {
3161 if(csrLearnCountryInformation(pMac, pBssDesc, pIes, eANI_BOOLEAN_TRUE))
3162 {
3163 //Make sure the 11d info from this BSSDesc can be applied
3164 pMac->scan.fAmbiguous11dInfoFound = eANI_BOOLEAN_FALSE;
3165 csrApplyCountryInformation( pMac, TRUE );
3166 }
3167 }
3168
3169 //Qos
3170 csrSetQosToCfg( pMac, sessionId, pBssConfig->qosType );
3171 //SSID
3172 csrSetCfgSsid(pMac, &pBssConfig->SSID );
3173 //fragment threshold
3174 //ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3175 //RTS threshold
3176 //ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3177
3178 //ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, csrTranslateToWNICfgDot11Mode(pMac, pBssConfig->uCfgDot11Mode), NULL, eANI_BOOLEAN_FALSE);
3179
3180 //Auth type
3181 ccmCfgSetInt(pMac, WNI_CFG_AUTHENTICATION_TYPE, pBssConfig->authType, NULL, eANI_BOOLEAN_FALSE);
3182 //encryption type
3183 csrSetCfgPrivacy(pMac, pProfile, (tANI_BOOLEAN)pBssConfig->BssCap.privacy );
3184 //short slot time
3185 ccmCfgSetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, pBssConfig->uShortSlotTime, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003186#ifdef WLAN_SOFTAP_FEATURE
3187 //11d
3188 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
3189 ((pBssConfig->f11hSupport) ? pBssConfig->f11hSupport : pProfile->ieee80211d),
3190 NULL, eANI_BOOLEAN_FALSE);
3191#endif
3192 /*//11h
3193 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
3194 */
3195 ccmCfgSetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, pBssConfig->uPowerLimit, NULL, eANI_BOOLEAN_FALSE);
3196 //CB
Jeff Johnsone7245742012-09-05 17:12:55 -07003197
Jeff Johnson295189b2012-06-20 16:38:30 -07003198 if(CSR_IS_INFRA_AP(pProfile) || CSR_IS_WDS_AP(pProfile))
3199 {
3200 channel = pProfile->operationChannel;
3201 }
3202 else
3203 {
3204 if(pBssDesc)
3205 {
3206 channel = pBssDesc->channelId;
3207 }
3208 }
3209 if(0 != channel)
3210 {
3211 if(CSR_IS_CHANNEL_24GHZ(channel))
3212 {//for now if we are on 2.4 Ghz, CB will be always disabled
3213 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3214 }
3215 else
3216 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003217 cfgCb = pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003218 }
3219 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003220#ifdef WLAN_FEATURE_11AC
3221 if(cfgCb > 2 )
3222 {
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003223 if(!WDA_getFwWlanFeatCaps(DOT11AC)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003224 cfgCb = csrGetHTCBStateFromVHTCBState(cfgCb);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003225 }
3226 else
3227 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003228 ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, pMac->roam.configParam.nVhtChannelWidth, NULL, eANI_BOOLEAN_FALSE);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003229 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003230 }
3231 else
3232#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003233 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, cfgCb, NULL, eANI_BOOLEAN_FALSE);
3234 //Rate
3235 //Fixed Rate
3236 if(pBssDesc)
3237 {
3238 csrSetCfgRateSet(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile, pBssDesc, pIes);
3239 }
3240 else
3241 {
3242 csrSetCfgRateSetFromProfile(pMac, pProfile);
3243 }
3244 //Make this the last CFG to set. The callback will trigger a join_req
3245 //Join time out
3246 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_CONFIG, sessionId );
3247
3248 ccmCfgSetInt(pMac, WNI_CFG_JOIN_FAILURE_TIMEOUT, pBssConfig->uJoinTimeOut, (tCcmCfgSetCallback)csrRoamCcmCfgSetCallback, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003249 return (status);
3250}
3251
Jeff Johnson295189b2012-06-20 16:38:30 -07003252eHalStatus csrRoamStopNetwork( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3253 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
3254{
3255 eHalStatus status;
3256 tBssConfigParam *pBssConfig;
3257 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003258
3259 if(!pSession)
3260 {
3261 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3262 return eHAL_STATUS_FAILURE;
3263 }
3264
Jeff Johnson295189b2012-06-20 16:38:30 -07003265 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
3266 if(HAL_STATUS_SUCCESS(status))
3267 {
3268 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
3269 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, pBssConfig, pIes);
3270 if(HAL_STATUS_SUCCESS(status))
3271 {
3272 pSession->bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003273 /* This will allow to pass cbMode during join req */
3274 pSession->bssParams.cbMode= pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003275 //For IBSS, we need to prepare some more information
3276 if( csrIsBssTypeIBSS(pProfile->BSSType) || CSR_IS_WDS( pProfile )
3277#ifdef WLAN_SOFTAP_FEATURE
3278 || CSR_IS_INFRA_AP(pProfile)
3279#endif
3280 )
3281 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003282 csrRoamPrepareBssParams(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07003283 }
3284 // If we are in an IBSS, then stop the IBSS...
3285 ////Not worry about WDS connection for now
3286 if ( csrIsConnStateIbss( pMac, sessionId ) )
3287 {
3288 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
3289 }
3290 else
3291 {
3292 // if we are in an Infrastructure association....
3293 if ( csrIsConnStateInfra( pMac, sessionId ) )
3294 {
3295 // and the new Bss is an Ibss OR we are roaming from Infra to Infra
3296 // across SSIDs (roaming to a new SSID)... //
3297 //Not worry about WDS connection for now
3298 if ( pBssDesc && ( ( csrIsIbssBssDesc( pBssDesc ) ) ||
3299 !csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIes ) ) )
3300 {
3301 // then we need to disassociate from the Infrastructure network...
3302 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
3303 }
3304 else
3305 {
3306 // In an Infrastucture and going to an Infrastructure network with the same SSID. This
3307 // calls for a Reassociation sequence. So issue the CFG sets for this new AP.
3308 if ( pBssDesc )
3309 {
3310 // Set parameters for this Bss.
3311 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3312 }
3313 }
3314 }
3315 else
3316 {
3317 // Neiher in IBSS nor in Infra. We can go ahead and set the CFG for tne new network...
3318 // Nothing to stop.
3319 if ( pBssDesc || CSR_IS_WDS_AP( pProfile )
3320#ifdef WLAN_SOFTAP_FEATURE
3321 || CSR_IS_INFRA_AP(pProfile)
3322#endif
3323 )
3324 {
3325 // Set parameters for this Bss.
3326 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3327 }
3328 }
3329 }
3330 }//Success getting BSS config info
3331 palFreeMemory(pMac->hHdd, pBssConfig);
3332 }//Allocate memory
3333
3334 return (status);
3335}
3336
Jeff Johnson295189b2012-06-20 16:38:30 -07003337eCsrJoinState csrRoamJoin( tpAniSirGlobal pMac, tANI_U32 sessionId,
3338 tCsrScanResultInfo *pScanResult, tCsrRoamProfile *pProfile )
3339{
3340 eCsrJoinState eRoamState = eCsrContinueRoaming;
3341 eHalStatus status;
3342 tSirBssDescription *pBssDesc = &pScanResult->BssDescriptor;
3343 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)( pScanResult->pvIes ); //This may be NULL
3344 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003345
3346 if(!pSession)
3347 {
3348 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3349 return (eCsrStopRoaming);
3350 }
3351
Jeff Johnson295189b2012-06-20 16:38:30 -07003352 if( CSR_IS_WDS_STA( pProfile ) )
3353 {
3354 status = csrRoamStartWds( pMac, sessionId, pProfile, pBssDesc );
3355 if( !HAL_STATUS_SUCCESS( status ) )
3356 {
3357 eRoamState = eCsrStopRoaming;
3358 }
3359 }
3360 else
3361 {
3362 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
3363 {
3364 smsLog(pMac, LOGE, FL(" fail to parse IEs"));
3365 return (eCsrStopRoaming);
3366 }
3367 if ( csrIsInfraBssDesc( pBssDesc ) )
3368 {
3369 // If we are connected in infrastructure mode and the Join Bss description is for the same BssID, then we are
3370 // attempting to join the AP we are already connected with. In that case, see if the Bss or Sta capabilities
3371 // have changed and handle the changes (without disturbing the current association).
3372
3373 if ( csrIsConnStateConnectedInfra(pMac, sessionId) &&
3374 csrIsBssIdEqual( pMac, pBssDesc, pSession->pConnectBssDesc ) &&
3375 csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIesLocal )
3376 )
3377 {
3378 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
3379 // with Authenticating first. To force this, stop the current association (Disassociate) and
3380 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
3381 // a new Association.
3382 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3383 {
3384 smsLog(pMac, LOGW, FL(" detect same profile authType = %d encryType = %d\n"), pProfile->AuthType, pProfile->EncryptionType);
3385 if(csrRoamIsSameProfileKeys(pMac, &pSession->connectedProfile, pProfile))
3386 {
3387 eRoamState = eCsrReassocToSelfNoCapChange;
3388 }
3389 else
3390 {
3391 tBssConfigParam bssConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07003392 //The key changes
3393 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(bssConfig));
3394 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, &bssConfig, pIesLocal);
3395 if(HAL_STATUS_SUCCESS(status))
3396 {
3397 pSession->bssParams.uCfgDot11Mode = bssConfig.uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003398 pSession->bssParams.cbMode = bssConfig.cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003399 //Reapply the config including Keys so reassoc is happening.
3400 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, &bssConfig, pIesLocal);
3401 if(!HAL_STATUS_SUCCESS(status))
3402 {
3403 eRoamState = eCsrStopRoaming;
3404 }
3405 }
3406 else
3407 {
3408 eRoamState = eCsrStopRoaming;
3409 }
3410 }//same profile
3411 }
3412 else
3413 {
3414 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, sessionId,
3415 eCSR_ROAM_SUBSTATE_DISASSOC_REQ, FALSE )))
3416 {
3417 smsLog(pMac, LOGW, FL(" fail to issue disassociate\n"));
3418 eRoamState = eCsrStopRoaming;
3419 }
3420 }
3421 }
3422 else
3423 {
3424 // note: we used to pre-auth here with open authentication networks but that was not working so well.
3425 // we had a lot of join timeouts when testing at Samsung. removing this step helped associations
3426 // work much better.
3427 //
3428 //
3429 // stop the existing network before attempting to join the new network...
3430 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3431 {
3432 eRoamState = eCsrStopRoaming;
3433 }
3434 }
3435 }//Infra
3436 else
3437 {
3438 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3439 {
3440 eRoamState = eCsrStopRoaming;
3441 }
3442 }
3443 if( pIesLocal && !pScanResult->pvIes )
3444 {
3445 palFreeMemory(pMac->hHdd, pIesLocal);
3446 }
3447 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003448 return( eRoamState );
3449}
3450
Jeff Johnson295189b2012-06-20 16:38:30 -07003451eHalStatus csrRoamShouldRoam(tpAniSirGlobal pMac, tANI_U32 sessionId,
3452 tSirBssDescription *pBssDesc, tANI_U32 roamId)
3453{
3454 eHalStatus status = eHAL_STATUS_SUCCESS;
3455 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07003456 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3457 roamInfo.pBssDesc = pBssDesc;
3458 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, roamId, eCSR_ROAM_SHOULD_ROAM, eCSR_ROAM_RESULT_NONE);
3459 return (status);
3460}
Jeff Johnson295189b2012-06-20 16:38:30 -07003461//In case no matching BSS is found, use whatever default we can find
3462static void csrRoamAssignDefaultParam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3463{
3464 //Need to get all negotiated types in place first
3465 //auth type
3466 switch( pCommand->u.roamCmd.roamProfile.AuthType.authType[0] ) //Take the prefered Auth type.
3467 {
3468 default:
3469 case eCSR_AUTH_TYPE_WPA:
3470 case eCSR_AUTH_TYPE_WPA_PSK:
3471 case eCSR_AUTH_TYPE_WPA_NONE:
3472 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3473 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3474 break;
3475
3476 case eCSR_AUTH_TYPE_SHARED_KEY:
3477 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
3478 break;
3479
3480 case eCSR_AUTH_TYPE_AUTOSWITCH:
3481 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
3482 break;
3483 }
3484 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType =
3485 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3486 //In this case, the multicast encryption needs to follow the uncast ones.
3487 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType =
3488 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3489}
3490
3491static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fUseSameBss )
3492{
3493 eHalStatus status;
3494 tCsrScanResult *pScanResult = NULL;
3495 eCsrJoinState eRoamState = eCsrStopRoaming;
3496 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
3497 tANI_BOOLEAN fDone = eANI_BOOLEAN_FALSE;
3498 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
3499#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3500 v_U8_t acm_mask = 0;
3501#endif
3502 tANI_U32 sessionId = pCommand->sessionId;
3503 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
3504 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
3505 tANI_U8 concurrentChannel = 0;
Jeff Johnson32d95a32012-09-10 13:15:23 -07003506
3507 if(!pSession)
3508 {
3509 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3510 return (eCsrStopRoaming);
3511 }
3512
Jeff Johnson295189b2012-06-20 16:38:30 -07003513 do
3514 {
3515 // Check for Cardbus eject condition, before trying to Roam to any BSS
3516 //***if( !balIsCardPresent(pAdapter) ) break;
3517
3518 if(NULL != pBSSList)
3519 {
3520 // When handling AP's capability change, continue to associate to
3521 // same BSS and make sure pRoamBssEntry is not Null.
3522 if((eANI_BOOLEAN_FALSE == fUseSameBss) || (pCommand->u.roamCmd.pRoamBssEntry == NULL))
3523 {
3524 if(pCommand->u.roamCmd.pRoamBssEntry == NULL)
3525 {
3526 //Try the first BSS
3527 pCommand->u.roamCmd.pLastRoamBss = NULL;
3528 pCommand->u.roamCmd.pRoamBssEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
3529 }
3530 else
3531 {
3532 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3533 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3534 {
3535 //Done with all the BSSs
3536 //In this case, will tell HDD the completion
3537 break;
3538 }
3539 else
3540 {
3541 //We need to indicate to HDD that we are done with this one.
3542 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3543 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss; //this shall not be NULL
3544 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
3545 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
3546 pRoamInfo = &roamInfo;
3547 }
3548 }
3549 while(pCommand->u.roamCmd.pRoamBssEntry)
3550 {
3551 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
Jeff Johnson295189b2012-06-20 16:38:30 -07003552 /*If concurrency enabled take the concurrent connected channel first. */
3553 /* Valid multichannel concurrent sessions exempted */
Jeff Johnsone7245742012-09-05 17:12:55 -07003554 if (vos_concurrent_sessions_running() &&
3555 !csrIsValidMcConcurrentSession(pMac, sessionId, &pScanResult->Result.BssDescriptor))
Jeff Johnson295189b2012-06-20 16:38:30 -07003556 {
3557 concurrentChannel =
3558 csrGetConcurrentOperationChannel(pMac);
3559 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH, "%s: "
3560 " csr Concurrent Channel = %d", __FUNCTION__, concurrentChannel);
Jeff Johnson295189b2012-06-20 16:38:30 -07003561 if ((concurrentChannel) &&
3562 (concurrentChannel ==
3563 pScanResult->Result.BssDescriptor.channelId))
3564 {
3565 //make this 0 because we do not want the
3566 //below check to pass as we don't want to
3567 //connect on other channel
3568 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3569 FL("Concurrent channel match =%d"),
3570 concurrentChannel);
3571 concurrentChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003572 }
3573 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003574
3575 if (!concurrentChannel)
3576 {
3577
3578 if(HAL_STATUS_SUCCESS(csrRoamShouldRoam(pMac,
3579 sessionId, &pScanResult->Result.BssDescriptor,
3580 pCommand->u.roamCmd.roamId)))
3581 {
3582 //Ok to roam this
3583 break;
3584 }
3585 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003586 else
3587 {
3588 eRoamState = eCsrStopRoamingDueToConcurrency;
3589 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003590 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3591 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3592 {
3593 //Done with all the BSSs
3594 fDone = eANI_BOOLEAN_TRUE;
3595 break;
3596 }
3597 }
3598 if(fDone)
3599 {
3600 break;
3601 }
3602 }
3603 }
3604 //We have something to roam, tell HDD when it is infra.
3605 //For IBSS, the indication goes back to HDD via eCSR_ROAM_IBSS_IND
3606 //For WDS, the indication is eCSR_ROAM_WDS_IND
3607 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
3608 {
3609 if(pRoamInfo)
3610 {
3611 pSession->bRefAssocStartCnt--;
3612 //Complete the last association attemp because a new one is about to be tried
3613 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3614 eCSR_ROAM_ASSOCIATION_COMPLETION,
3615 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3616 }
3617 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
3618 if(pScanResult)
3619 {
3620 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07003621 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, &pScanResult->Result.BssDescriptor, &pIesLocal))) )
3622 {
3623 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
3624 fDone = eANI_BOOLEAN_TRUE;
3625 eRoamState = eCsrStopRoaming;
3626 break;
3627 }
3628 roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor;
3629 pCommand->u.roamCmd.pLastRoamBss = roamInfo.pBssDesc;
3630 //No need to put uapsd_mask in if the BSS doesn't support uAPSD
3631 if( pCommand->u.roamCmd.roamProfile.uapsd_mask &&
3632 CSR_IS_QOS_BSS(pIesLocal) &&
3633 CSR_IS_UAPSD_BSS(pIesLocal) )
3634 {
3635#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson295189b2012-06-20 16:38:30 -07003636 acm_mask = sme_QosGetACMMask(pMac, &pScanResult->Result.BssDescriptor,
3637 pIesLocal);
3638 pCommand->u.roamCmd.roamProfile.uapsd_mask &= ~(acm_mask);
3639#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
Jeff Johnson295189b2012-06-20 16:38:30 -07003640 }
3641 else
3642 {
3643 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3644 }
3645 if( pIesLocal && !pScanResult->Result.pvIes)
3646 {
3647 palFreeMemory(pMac->hHdd, pIesLocal);
3648 }
3649 }
3650 else
3651 {
3652 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3653 }
3654 roamInfo.pProfile = pProfile;
3655 pSession->bRefAssocStartCnt++;
3656 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3657 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3658 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003659 if ( NULL == pCommand->u.roamCmd.pRoamBssEntry )
3660 {
3661 // If this is a start IBSS profile, then we need to start the IBSS.
3662 if ( CSR_IS_START_IBSS(pProfile) )
3663 {
3664 tANI_BOOLEAN fSameIbss = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003665 // Attempt to start this IBSS...
3666 csrRoamAssignDefaultParam( pMac, pCommand );
3667 status = csrRoamStartIbss( pMac, sessionId, pProfile, &fSameIbss );
3668 if(HAL_STATUS_SUCCESS(status))
3669 {
3670 if ( fSameIbss )
3671 {
3672 eRoamState = eCsrStartIbssSameIbss;
3673 }
3674 else
3675 {
3676 eRoamState = eCsrContinueRoaming;
3677 }
3678 }
3679 else
3680 {
3681 //it somehow fail need to stop
3682 eRoamState = eCsrStopRoaming;
3683 }
3684 break;
3685 }
3686 else if ( (CSR_IS_WDS_AP(pProfile))
3687#ifdef WLAN_SOFTAP_FEATURE
3688 || (CSR_IS_INFRA_AP(pProfile))
3689#endif
3690 )
3691 {
3692 // Attempt to start this WDS...
3693 csrRoamAssignDefaultParam( pMac, pCommand );
3694 /* For AP WDS, we dont have any BSSDescription */
3695 status = csrRoamStartWds( pMac, sessionId, pProfile, NULL );
3696 if(HAL_STATUS_SUCCESS(status))
3697 {
3698 eRoamState = eCsrContinueRoaming;
3699 }
3700 else
3701 {
3702 //it somehow fail need to stop
3703 eRoamState = eCsrStopRoaming;
3704 }
3705 }
3706 else
3707 {
3708 //Nothing we can do
3709 smsLog(pMac, LOGW, FL("cannot continue without BSS list\n"));
3710 eRoamState = eCsrStopRoaming;
3711 break;
3712 }
3713 }
3714 else //We have BSS
3715 {
3716 //Need to assign these value because they are used in csrIsSameProfile
3717 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3718 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType = pScanResult->ucEncryptionType; //Negotiated while building scan result.
3719 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType = pScanResult->mcEncryptionType;
3720 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = pScanResult->authType;
3721 if ( CSR_IS_START_IBSS(&pCommand->u.roamCmd.roamProfile) )
3722 {
3723 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3724 {
3725 eRoamState = eCsrStartIbssSameIbss;
3726 break;
3727 }
3728 }
3729 if( pCommand->u.roamCmd.fReassocToSelfNoCapChange )
3730 {
3731 //trying to connect to the one already connected
3732 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_FALSE;
3733 eRoamState = eCsrReassocToSelfNoCapChange;
3734 break;
3735 }
3736 // Attempt to Join this Bss...
3737 eRoamState = csrRoamJoin( pMac, sessionId, &pScanResult->Result, pProfile );
3738 break;
3739 }
3740
3741 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07003742 if( (eCsrStopRoaming == eRoamState) && (CSR_IS_INFRASTRUCTURE( pProfile )) )
3743 {
3744 //Need to indicate association_completion if association_start has been done
3745 if(pSession->bRefAssocStartCnt > 0)
3746 {
3747 pSession->bRefAssocStartCnt--;
3748 //Complete the last association attemp because a new one is about to be tried
3749 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3750 eCSR_ROAM_ASSOCIATION_COMPLETION,
3751 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3752 }
3753 }
3754
3755 return( eRoamState );
3756}
3757
Jeff Johnson295189b2012-06-20 16:38:30 -07003758static eHalStatus csrRoam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3759{
3760 eHalStatus status = eHAL_STATUS_SUCCESS;
3761 eCsrJoinState RoamState;
3762 tANI_U32 sessionId = pCommand->sessionId;
3763
Jeff Johnson295189b2012-06-20 16:38:30 -07003764 //***if( hddIsRadioStateOn( pAdapter ) )
3765 {
3766 // Attept to join a Bss...
3767 RoamState = csrRoamJoinNextBss( pMac, pCommand, eANI_BOOLEAN_FALSE );
Jeff Johnsone7245742012-09-05 17:12:55 -07003768
Jeff Johnson295189b2012-06-20 16:38:30 -07003769 // if nothing to join..
Jeff Johnsone7245742012-09-05 17:12:55 -07003770 if (( eCsrStopRoaming == RoamState ) || ( eCsrStopRoamingDueToConcurrency == RoamState))
Jeff Johnson295189b2012-06-20 16:38:30 -07003771 {
3772 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003773 // and if connected in Infrastructure mode...
3774 if ( csrIsConnStateInfra(pMac, sessionId) )
3775 {
3776 //... then we need to issue a disassociation
3777 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISASSOC_NOTHING_TO_JOIN, FALSE );
3778 if(!HAL_STATUS_SUCCESS(status))
3779 {
3780 smsLog(pMac, LOGW, FL(" failed to issue disassociate, status = %d\n"), status);
3781 //roam command is completed by caller in the failed case
3782 fComplete = eANI_BOOLEAN_TRUE;
3783 }
3784 }
3785 else if( csrIsConnStateIbss(pMac, sessionId) )
3786 {
3787 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3788 if(!HAL_STATUS_SUCCESS(status))
3789 {
3790 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3791 //roam command is completed by caller in the failed case
3792 fComplete = eANI_BOOLEAN_TRUE;
3793 }
3794 }
3795#ifdef WLAN_SOFTAP_FEATURE
3796 else if (csrIsConnStateConnectedInfraAp(pMac, sessionId))
3797 {
3798 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3799 if(!HAL_STATUS_SUCCESS(status))
3800 {
3801 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3802 //roam command is completed by caller in the failed case
3803 fComplete = eANI_BOOLEAN_TRUE;
3804 }
3805 }
3806#endif
3807 else
3808 {
3809 fComplete = eANI_BOOLEAN_TRUE;
3810 }
3811 if(fComplete)
3812 {
3813 // ... otherwise, we can complete the Roam command here.
Jeff Johnsone7245742012-09-05 17:12:55 -07003814 if(eCsrStopRoamingDueToConcurrency == RoamState)
3815 {
3816 csrRoamComplete( pMac, eCsrJoinFailureDueToConcurrency, NULL );
3817 }
3818 else
3819 {
3820 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
3821 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003822 }
3823 }
3824 else if ( eCsrReassocToSelfNoCapChange == RoamState )
3825 {
3826 csrRoamComplete( pMac, eCsrSilentlyStopRoamingSaveState, NULL );
3827 }
3828 else if ( eCsrStartIbssSameIbss == RoamState )
3829 {
3830 csrRoamComplete( pMac, eCsrSilentlyStopRoaming, NULL );
3831 }
3832 }//hddIsRadioStateOn
3833
3834 return status;
3835}
Jeff Johnson295189b2012-06-20 16:38:30 -07003836eHalStatus csrProcessFTReassocRoamCommand ( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3837{
3838 tANI_U32 sessionId;
3839 tCsrRoamSession *pSession;
3840 tCsrScanResult *pScanResult = NULL;
3841 tSirBssDescription *pBssDesc = NULL;
3842 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003843 sessionId = pCommand->sessionId;
3844 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003845
3846 if(!pSession)
3847 {
3848 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3849 return eHAL_STATUS_FAILURE;
3850 }
3851
Jeff Johnson295189b2012-06-20 16:38:30 -07003852 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
3853 {
3854 //the roaming is cancelled. Simply complete the command
3855 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3856 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3857 return eHAL_STATUS_FAILURE;
3858 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003859 if (pCommand->u.roamCmd.pRoamBssEntry)
3860 {
3861 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3862 pBssDesc = &pScanResult->Result.BssDescriptor;
3863 }
3864 else
3865 {
3866 //the roaming is cancelled. Simply complete the command
3867 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3868 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3869 return eHAL_STATUS_FAILURE;
3870 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003871 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
3872 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
3873 return status;
3874}
3875
Jeff Johnson295189b2012-06-20 16:38:30 -07003876eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3877{
3878 eHalStatus status = eHAL_STATUS_SUCCESS;
3879 tCsrRoamInfo roamInfo;
3880 tANI_U32 sessionId = pCommand->sessionId;
3881 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003882
3883 if(!pSession)
3884 {
3885 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3886 return eHAL_STATUS_FAILURE;
3887 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003888
3889 switch ( pCommand->u.roamCmd.roamReason )
3890 {
3891 case eCsrForcedDisassoc:
3892 csrFreeRoamProfile(pMac, sessionId);
3893 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3894 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003895 case eCsrSmeIssuedDisassocForHandoff:
3896 //Not to free pMac->roam.pCurRoamProfile (via csrFreeRoamProfile) because it is needed after disconnect
3897#if 0 // TODO : Confirm this change
3898 status = csrRoamProcessDisassociate( pMac, pCommand, FALSE );
3899#else
3900 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3901#endif
3902
3903 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003904 case eCsrForcedDisassocMICFailure:
3905 csrFreeRoamProfile(pMac, sessionId);
3906 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, TRUE );
3907 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003908 case eCsrForcedDeauth:
3909 csrFreeRoamProfile(pMac, sessionId);
3910 status = csrRoamProcessDisassocDeauth( pMac, pCommand, FALSE, FALSE );
3911 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003912 case eCsrHddIssuedReassocToSameAP:
3913 case eCsrSmeIssuedReassocToSameAP:
3914 {
3915 tDot11fBeaconIEs *pIes = NULL;
3916
Jeff Johnson295189b2012-06-20 16:38:30 -07003917 if( pSession->pConnectBssDesc )
3918 {
3919 status = csrGetParsedBssDescriptionIEs(pMac, pSession->pConnectBssDesc, &pIes);
3920 if(!HAL_STATUS_SUCCESS(status) )
3921 {
3922 smsLog(pMac, LOGE, FL(" fail to parse IEs\n"));
3923 }
3924 else
3925 {
3926 roamInfo.reasonCode = eCsrRoamReasonStaCapabilityChanged;
3927 csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
3928 pSession->roamingReason = eCsrReassocRoaming;
Jeff Johnson295189b2012-06-20 16:38:30 -07003929 roamInfo.pBssDesc = pSession->pConnectBssDesc;
3930 roamInfo.pProfile = &pCommand->u.roamCmd.roamProfile;
3931 pSession->bRefAssocStartCnt++;
3932 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3933 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3934
3935 smsLog(pMac, LOG1, FL(" calling csrRoamIssueReassociate\n"));
3936 csrRoamIssueReassociate( pMac, sessionId, pSession->pConnectBssDesc, pIes,
3937 &pCommand->u.roamCmd.roamProfile );
3938 palFreeMemory(pMac->hHdd, pIes);
3939 pIes = NULL;
3940 }
3941 }
3942 break;
3943 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003944 case eCsrCapsChange:
3945 smsLog(pMac, LOGE, FL("received eCsrCapsChange \n"));
3946 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
3947 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE);
3948 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003949 case eCsrSmeIssuedFTReassoc:
3950 smsLog(pMac, LOGE, FL("received FT Reassoc Req \n"));
3951 status = csrProcessFTReassocRoamCommand(pMac, pCommand);
3952 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07003953
Jeff Johnson295189b2012-06-20 16:38:30 -07003954 case eCsrStopBss:
3955 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3956 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3957 break;
3958
3959 case eCsrForcedDisassocSta:
3960 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3961 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DISASSOC_REQ, sessionId);
3962 status = csrSendMBDisassocReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
3963 pCommand->u.roamCmd.reason);
3964 break;
3965
3966 case eCsrForcedDeauthSta:
3967 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3968 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DEAUTH_REQ, sessionId);
3969 status = csrSendMBDeauthReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
3970 pCommand->u.roamCmd.reason);
3971 break;
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07003972#if 1
3973 /*Varun*/
3974 case eCsrPerformPreauth:
3975 smsLog(pMac, LOGE, FL("Attempting FT PreAuth Req \n"));
3976 status = csrRoamIssueFTPreauthReq(pMac, sessionId,
3977 pCommand->u.roamCmd.pLastRoamBss);
3978 break;
3979#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003980
3981 default:
3982 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
3983
3984 if( pCommand->u.roamCmd.fUpdateCurRoamProfile )
3985 {
3986 //Remember the roaming profile
3987 csrFreeRoamProfile(pMac, sessionId);
3988 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pSession->pCurRoamProfile, sizeof(tCsrRoamProfile))))
3989 {
3990 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
3991 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, &pCommand->u.roamCmd.roamProfile);
3992 }
3993 }
3994
3995 //At this point, original uapsd_mask is saved in pCurRoamProfile
3996 //uapsd_mask in the pCommand may change from this point on.
3997
3998 // Attempt to roam with the new scan results (if we need to..)
3999 status = csrRoam( pMac, pCommand );
4000 break;
4001 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004002 return (status);
4003}
4004
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07004005void csrReinitPreauthCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4006{
4007 pCommand->u.roamCmd.pLastRoamBss = NULL;
4008 pCommand->u.roamCmd.pRoamBssEntry = NULL;
4009 //Because u.roamCmd is union and share with scanCmd and StatusChange
4010 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
4011}
4012
Jeff Johnson295189b2012-06-20 16:38:30 -07004013void csrReinitRoamCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4014{
4015 if(pCommand->u.roamCmd.fReleaseBssList)
4016 {
4017 csrScanResultPurge(pMac, pCommand->u.roamCmd.hBSSList);
4018 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
4019 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
4020 }
4021 if(pCommand->u.roamCmd.fReleaseProfile)
4022 {
4023 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
4024 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
4025 }
4026 pCommand->u.roamCmd.pRoamBssEntry = NULL;
4027 //Because u.roamCmd is union and share with scanCmd and StatusChange
4028 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
4029}
4030
Jeff Johnson295189b2012-06-20 16:38:30 -07004031void csrReinitWmStatusChangeCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4032{
4033 palZeroMemory(pMac->hHdd, &pCommand->u.wmStatusChangeCmd, sizeof(tWmStatusChangeCmd));
4034}
Jeff Johnson295189b2012-06-20 16:38:30 -07004035void csrRoamComplete( tpAniSirGlobal pMac, eCsrRoamCompleteResult Result, void *Context )
4036{
4037 tListElem *pEntry;
4038 tSmeCmd *pCommand;
4039 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004040 smsLog( pMac, LOG2, "roamQ: Roam Completion ...\n" );
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
4042 if ( pEntry )
4043 {
4044 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07004045 // If the head of the queue is Active and it is a ROAM command, remove
4046 // and put this on the Free queue.
4047 if ( eSmeCommandRoam == pCommand->command )
4048 {
4049 //we need to process the result first before removing it from active list because state changes
4050 //still happening insides roamQProcessRoamResults so no other roam command should be issued
4051 fReleaseCommand = csrRoamProcessResults( pMac, pCommand, Result, Context );
4052 if( fReleaseCommand )
4053 {
4054 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
4055 {
4056 csrReleaseCommandRoam( pMac, pCommand );
4057 }
4058 else
4059 {
4060 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4061 pCommand->u.roamCmd.roamReason );
4062 }
4063 }
4064 else
4065 {
4066 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4067 pCommand->u.roamCmd.roamReason );
4068 }
4069 }
4070 else
4071 {
4072 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
4073 }
4074 }
4075 else
4076 {
4077 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
4078 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004079 if( fReleaseCommand )
4080 {
4081 smeProcessPendingQueue( pMac );
4082 }
4083}
4084
Jeff Johnson295189b2012-06-20 16:38:30 -07004085void csrResetPMKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4086{
4087 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004088 if(!pSession)
4089 {
4090 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4091 return;
4092 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004093 palZeroMemory( pMac->hHdd, &(pSession->PmkidCandidateInfo[0]), sizeof(tPmkidCandidateInfo) * CSR_MAX_PMKID_ALLOWED );
4094 pSession->NumPmkidCandidate = 0;
4095}
Jeff Johnson295189b2012-06-20 16:38:30 -07004096#ifdef FEATURE_WLAN_WAPI
4097void csrResetBKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4098{
4099 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004100 if(!pSession)
4101 {
4102 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4103 return;
4104 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004105 palZeroMemory( pMac->hHdd, &(pSession->BkidCandidateInfo[0]), sizeof(tBkidCandidateInfo) * CSR_MAX_BKID_ALLOWED );
4106 pSession->NumBkidCandidate = 0;
4107}
4108#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07004109extern tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ];
4110
Jeff Johnson295189b2012-06-20 16:38:30 -07004111static eHalStatus csrRoamSaveSecurityRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrAuthType authType,
4112 tSirBssDescription *pSirBssDesc,
4113 tDot11fBeaconIEs *pIes)
4114{
4115 eHalStatus status = eHAL_STATUS_SUCCESS;
4116 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4117 tDot11fBeaconIEs *pIesLocal = pIes;
Jeff Johnson32d95a32012-09-10 13:15:23 -07004118
4119 if(!pSession)
4120 {
4121 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4122 return eHAL_STATUS_FAILURE;
4123 }
4124
Jeff Johnson295189b2012-06-20 16:38:30 -07004125 if((eCSR_AUTH_TYPE_WPA == authType) ||
4126 (eCSR_AUTH_TYPE_WPA_PSK == authType) ||
4127 (eCSR_AUTH_TYPE_RSN == authType) ||
4128 (eCSR_AUTH_TYPE_RSN_PSK == authType)
4129#if defined WLAN_FEATURE_VOWIFI_11R
4130 ||
4131 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4132 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType)
4133#endif /* FEATURE_WLAN_WAPI */
4134#ifdef FEATURE_WLAN_WAPI
4135 ||
4136 (eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4137 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType)
4138#endif /* FEATURE_WLAN_WAPI */
4139 )
4140 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004141 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4142 {
4143 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
4144 }
4145 if( pIesLocal )
4146 {
4147 tANI_U32 nIeLen;
4148 tANI_U8 *pIeBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07004149 if((eCSR_AUTH_TYPE_RSN == authType) ||
4150#if defined WLAN_FEATURE_VOWIFI_11R
4151 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4152 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType) ||
4153#endif /* WLAN_FEATURE_VOWIFI_11R */
4154 (eCSR_AUTH_TYPE_RSN_PSK == authType))
4155 {
4156 if(pIesLocal->RSN.present)
4157 {
4158 //Calculate the actual length
4159 nIeLen = 8 //version + gp_cipher_suite + pwise_cipher_suite_count
4160 + pIesLocal->RSN.pwise_cipher_suite_count * 4 //pwise_cipher_suites
4161 + 2 //akm_suite_count
4162 + pIesLocal->RSN.akm_suite_count * 4 //akm_suites
4163 + 2; //reserved
4164 if( pIesLocal->RSN.pmkid_count )
4165 {
4166 nIeLen += 2 + pIesLocal->RSN.pmkid_count * 4; //pmkid
4167 }
4168 //nIeLen doesn't count EID and length fields
4169 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4170 {
4171 pSession->pWpaRsnRspIE[0] = DOT11F_EID_RSN;
4172 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4173 //copy upto akm_suites
4174 pIeBuf = pSession->pWpaRsnRspIE + 2;
4175 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.version, 8);
4176 pIeBuf += 8;
4177 if( pIesLocal->RSN.pwise_cipher_suite_count )
4178 {
4179 //copy pwise_cipher_suites
4180 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.pwise_cipher_suites,
4181 pIesLocal->RSN.pwise_cipher_suite_count * 4);
4182 pIeBuf += pIesLocal->RSN.pwise_cipher_suite_count * 4;
4183 }
4184 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.akm_suite_count, 2);
4185 pIeBuf += 2;
4186 if( pIesLocal->RSN.akm_suite_count )
4187 {
4188 //copy akm_suites
4189 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites,
4190 pIesLocal->RSN.akm_suite_count * 4);
4191 pIeBuf += pIesLocal->RSN.akm_suite_count * 4;
4192 }
4193 //copy the rest
4194 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites +
4195 pIesLocal->RSN.akm_suite_count * 4,
4196 2 + pIesLocal->RSN.pmkid_count * 4);
4197 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4198 }
4199 }
4200 }
4201 else if((eCSR_AUTH_TYPE_WPA == authType) ||
4202 (eCSR_AUTH_TYPE_WPA_PSK == authType))
4203 {
4204 if(pIesLocal->WPA.present)
4205 {
4206 //Calculate the actual length
4207 nIeLen = 12 //OUI + version + multicast_cipher + unicast_cipher_count
4208 + pIesLocal->WPA.unicast_cipher_count * 4 //unicast_ciphers
4209 + 2 //auth_suite_count
4210 + pIesLocal->WPA.auth_suite_count * 4; //auth_suites
4211 // The WPA capabilities follows the Auth Suite (two octects)--
4212 // this field is optional, and we always "send" zero, so just
4213 // remove it. This is consistent with our assumptions in the
4214 // frames compiler; c.f. bug 15234:
4215 //nIeLen doesn't count EID and length fields
4216 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4217 {
4218 pSession->pWpaRsnRspIE[0] = DOT11F_EID_WPA;
4219 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4220 pIeBuf = pSession->pWpaRsnRspIE + 2;
4221 //Copy WPA OUI
4222 palCopyMemory(pMac->hHdd, pIeBuf, &csrWpaOui[1], 4);
4223 pIeBuf += 4;
4224 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.version, 8 +
4225 pIesLocal->WPA.unicast_cipher_count * 4);
4226 pIeBuf += 8 + pIesLocal->WPA.unicast_cipher_count * 4;
4227 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.auth_suite_count, 2 +
4228 pIesLocal->WPA.auth_suite_count * 4);
4229 pIeBuf += pIesLocal->WPA.auth_suite_count * 4;
4230 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4231 }
4232 }
4233 }
4234#ifdef FEATURE_WLAN_WAPI
4235 else if((eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4236 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType))
4237 {
4238 if(pIesLocal->WAPI.present)
4239 {
4240 //Calculate the actual length
4241 nIeLen = 4 //version + akm_suite_count
4242 + pIesLocal->WAPI.akm_suite_count * 4 // akm_suites
4243 + 2 //pwise_cipher_suite_count
4244 + pIesLocal->WAPI.unicast_cipher_suite_count * 4 //pwise_cipher_suites
4245 + 6; //gp_cipher_suite + preauth + reserved
4246 if( pIesLocal->WAPI.bkid_count )
4247 {
4248 nIeLen += 2 + pIesLocal->WAPI.bkid_count * 4; //bkid
4249 }
4250
4251 //nIeLen doesn't count EID and length fields
4252 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiRspIE, nIeLen + 2))))
4253 {
4254 pSession->pWapiRspIE[0] = DOT11F_EID_WAPI;
4255 pSession->pWapiRspIE[1] = (tANI_U8)nIeLen;
4256 pIeBuf = pSession->pWapiRspIE + 2;
4257 //copy upto akm_suite_count
4258 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.version, 4);
4259 pIeBuf += 4;
4260 if( pIesLocal->WAPI.akm_suite_count )
4261 {
4262 //copy akm_suites
4263 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.akm_suites,
4264 pIesLocal->WAPI.akm_suite_count * 4);
4265 pIeBuf += pIesLocal->WAPI.akm_suite_count * 4;
4266 }
4267 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.unicast_cipher_suite_count, 2);
4268 pIeBuf += 2;
Jeff Johnson295189b2012-06-20 16:38:30 -07004269 if( pIesLocal->WAPI.unicast_cipher_suite_count )
4270 {
4271 //copy pwise_cipher_suites
4272 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.unicast_cipher_suites,
4273 pIesLocal->WAPI.unicast_cipher_suite_count * 4);
4274 pIeBuf += pIesLocal->WAPI.unicast_cipher_suite_count * 4;
4275 }
4276 //gp_cipher_suite + preauth + reserved + bkid_count
4277 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.multicast_cipher_suite, 8);
4278 pIeBuf += 8;
4279 if( pIesLocal->WAPI.bkid_count )
4280 {
4281 //copy akm_suites
4282 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.bkid, pIesLocal->WAPI.bkid_count * 4);
4283 pIeBuf += pIesLocal->WAPI.bkid_count * 4;
4284 }
4285 pSession->nWapiRspIeLength = nIeLen + 2;
4286 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004287 }
4288 }
4289#endif /* FEATURE_WLAN_WAPI */
4290 if( !pIes )
4291 {
4292 //locally allocated
4293 palFreeMemory(pMac->hHdd, pIesLocal);
4294 }
4295 }
4296 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004297 return (status);
4298}
4299
Jeff Johnson295189b2012-06-20 16:38:30 -07004300static void csrCheckAndUpdateACWeight( tpAniSirGlobal pMac, tDot11fBeaconIEs *pIEs )
4301{
4302 v_U8_t bACWeights[WLANTL_MAX_AC];
4303 v_U8_t paramBk, paramBe, paramVi, paramVo;
4304 v_BOOL_t fWeightChange = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004305 //Compare two ACs' EDCA parameters, from low to high (BK, BE, VI, VO)
4306 //The "formula" is, if lower AC's AIFSN+CWMin is bigger than a fixed amount
4307 //of the higher AC one, make the higher AC has the same weight as the lower AC.
4308 //This doesn't address the case where the lower AC needs a real higher weight
4309 if( pIEs->WMMParams.present )
4310 {
4311 //no change to the lowest ones
4312 bACWeights[WLANTL_AC_BK] = pMac->roam.ucACWeights[WLANTL_AC_BK];
4313 bACWeights[WLANTL_AC_BE] = pMac->roam.ucACWeights[WLANTL_AC_BE];
4314 bACWeights[WLANTL_AC_VI] = pMac->roam.ucACWeights[WLANTL_AC_VI];
4315 bACWeights[WLANTL_AC_VO] = pMac->roam.ucACWeights[WLANTL_AC_VO];
4316 paramBk = pIEs->WMMParams.acbk_aifsn + pIEs->WMMParams.acbk_acwmin;
4317 paramBe = pIEs->WMMParams.acbe_aifsn + pIEs->WMMParams.acbe_acwmin;
4318 paramVi = pIEs->WMMParams.acvi_aifsn + pIEs->WMMParams.acvi_acwmin;
4319 paramVo = pIEs->WMMParams.acvo_aifsn + pIEs->WMMParams.acvo_acwmin;
4320 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramBe) )
4321 {
4322 bACWeights[WLANTL_AC_BE] = bACWeights[WLANTL_AC_BK];
4323 fWeightChange = VOS_TRUE;
4324 }
4325 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVi) )
4326 {
4327 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BK];
4328 fWeightChange = VOS_TRUE;
4329 }
4330 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVi) )
4331 {
4332 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BE];
4333 fWeightChange = VOS_TRUE;
4334 }
4335 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVo) )
4336 {
4337 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BK];
4338 fWeightChange = VOS_TRUE;
4339 }
4340 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVo) )
4341 {
4342 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BE];
4343 fWeightChange = VOS_TRUE;
4344 }
4345 else if( SME_DETECT_AC_WEIGHT_DIFF(paramVi, paramVo) )
4346 {
4347 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_VI];
4348 fWeightChange = VOS_TRUE;
4349 }
4350 if(fWeightChange)
4351 {
4352 smsLog(pMac, LOGE, FL(" change AC weights (%d-%d-%d-%d)\n"), bACWeights[0], bACWeights[1],
4353 bACWeights[2], bACWeights[3]);
4354 WLANTL_SetACWeights(pMac->roam.gVosContext, bACWeights);
4355 }
4356 }
4357}
Jeff Johnson295189b2012-06-20 16:38:30 -07004358#ifdef WLAN_FEATURE_VOWIFI_11R
4359//Returns whether the current association is a 11r assoc or not
4360tANI_BOOLEAN csrRoamIs11rAssoc(tpAniSirGlobal pMac)
4361{
4362#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4363 return csrNeighborRoamIs11rAssoc(pMac);
4364#else
4365 return eANI_BOOLEAN_FALSE;
4366#endif
4367}
4368#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004369#ifdef FEATURE_WLAN_CCX
4370//Returns whether the current association is a CCX assoc or not
4371tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac)
4372{
4373#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4374 return csrNeighborRoamIsCCXAssoc(pMac);
4375#else
4376 return eANI_BOOLEAN_FALSE;
4377#endif
4378}
4379#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004380#ifdef FEATURE_WLAN_LFR
4381//Returns whether "Legacy Fast Roaming" is currently enabled...or not
4382tANI_BOOLEAN csrRoamIsFastRoamEnabled(tpAniSirGlobal pMac)
4383{
Madan Mohan Koyyalamudi9ce36ec2012-10-15 16:03:17 -07004384 return (pMac->roam.configParam.isFastRoamIniFeatureEnabled &&
Madan Mohan Koyyalamudi393a4342012-10-15 16:07:09 -07004385 (!csrIsConcurrentSessionRunning(pMac)));
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004386}
4387#endif
4388
Jeff Johnson295189b2012-06-20 16:38:30 -07004389//Return true means the command can be release, else not
4390static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
4391 eCsrRoamCompleteResult Result, void *Context )
4392{
4393 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
4394 tSirBssDescription *pSirBssDesc = NULL;
4395 tSirMacAddr BroadcastMac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4396 tCsrScanResult *pScanResult = NULL;
4397 tCsrRoamInfo roamInfo;
4398 sme_QosAssocInfo assocInfo;
4399 sme_QosCsrEventIndType ind_qos;//indication for QoS module in SME
4400 tANI_U8 acm_mask = 0; //HDD needs the ACM mask in the assoc rsp callback
4401 tDot11fBeaconIEs *pIes = NULL;
4402 tANI_U32 sessionId = pCommand->sessionId;
4403 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4404 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
4405 eRoamCmdStatus roamStatus;
4406 eCsrRoamResult roamResult;
4407 eHalStatus status;
4408 tANI_U32 key_timeout_interval = 0;
4409#ifdef WLAN_SOFTAP_FEATURE
4410 tSirSmeStartBssRsp *pSmeStartBssRsp = NULL;
4411#endif
4412
Jeff Johnson32d95a32012-09-10 13:15:23 -07004413 if(!pSession)
4414 {
4415 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4416 return eANI_BOOLEAN_FALSE;
4417 }
4418
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 smsLog( pMac, LOG1, FL("Processing ROAM results...\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004420 switch( Result )
4421 {
4422 case eCsrJoinSuccess:
4423 // reset the IDLE timer
4424 // !!
4425 // !! fall through to the next CASE statement here is intentional !!
4426 // !!
4427 case eCsrReassocSuccess:
4428 if(eCsrReassocSuccess == Result)
4429 {
4430 ind_qos = SME_QOS_CSR_REASSOC_COMPLETE;
4431 }
4432 else
4433 {
4434 ind_qos = SME_QOS_CSR_ASSOC_COMPLETE;
4435 }
4436 // Success Join Response from LIM. Tell NDIS we are connected and save the
4437 // Connected state...
4438 smsLog(pMac, LOGW, FL("receives association indication\n"));
4439 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4440 //always free the memory here
4441 if(pSession->pWpaRsnRspIE)
4442 {
4443 pSession->nWpaRsnRspIeLength = 0;
4444 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
4445 pSession->pWpaRsnRspIE = NULL;
4446 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004447#ifdef FEATURE_WLAN_WAPI
4448 if(pSession->pWapiRspIE)
4449 {
4450 pSession->nWapiRspIeLength = 0;
4451 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
4452 pSession->pWapiRspIE = NULL;
4453 }
4454#endif /* FEATURE_WLAN_WAPI */
4455#ifdef FEATURE_WLAN_BTAMP_UT_RF
4456 //Reset counter so no join retry is needed.
4457 pSession->maxRetryCount = 0;
4458 csrRoamStopJoinRetryTimer(pMac, sessionId);
4459#endif
4460 /* This creates problem since we have not saved the connected profile.
4461 So moving this after saving the profile
4462 */
4463 //csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED );
4464 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
4465 {
4466 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED;
4467 }
4468 else
4469 {
4470 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;
4471 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004472 //Use the last connected bssdesc for reassoc-ing to the same AP.
4473 //NOTE: What to do when reassoc to a different AP???
4474 if( (eCsrHddIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) ||
4475 (eCsrSmeIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) )
4476 {
4477 pSirBssDesc = pSession->pConnectBssDesc;
4478 if(pSirBssDesc)
4479 {
4480 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4481 }
4482 }
4483 else
4484 {
4485
4486 if(pCommand->u.roamCmd.pRoamBssEntry)
4487 {
4488 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
4489 if(pScanResult != NULL)
4490 {
4491 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4492 //this can be NULL
4493 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4494 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4495 }
4496 }
4497 }
4498 if( pSirBssDesc )
4499 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004500 roamInfo.staId = HAL_STA_INVALID_IDX;
Jeff Johnson295189b2012-06-20 16:38:30 -07004501 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4502 //Save WPA/RSN IE
4503 csrRoamSaveSecurityRspIE(pMac, sessionId, pProfile->negotiatedAuthType, pSirBssDesc, pIes);
4504#ifdef FEATURE_WLAN_CCX
4505 roamInfo.isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
4506#endif
4507
4508 // csrRoamStateChange also affects sub-state. Hence, csrRoamStateChange happens first and then
4509 // substate change.
4510 // Moving even save profile above so that below mentioned conditon is also met.
4511 // JEZ100225: Moved to after saving the profile. Fix needed in main/latest
4512 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07004513 // Make sure the Set Context is issued before link indication to NDIS. After link indication is
4514 // made to NDIS, frames could start flowing. If we have not set context with LIM, the frames
4515 // will be dropped for the security context may not be set properly.
4516 //
4517 // this was causing issues in the 2c_wlan_wep WHQL test when the SetContext was issued after the link
4518 // indication. (Link Indication happens in the profFSMSetConnectedInfra call).
4519 //
4520 // this reordering was done on titan_prod_usb branch and is being replicated here.
4521 //
4522
4523 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) &&
4524 !pProfile->bWPSAssociation)
4525 {
4526 // Issue the set Context request to LIM to establish the Unicast STA context
4527 if( !HAL_STATUS_SUCCESS( csrRoamIssueSetContextReq( pMac, sessionId,
4528 pProfile->negotiatedUCEncryptionType,
4529 pSirBssDesc, &(pSirBssDesc->bssId),
4530 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ) ) ) // NO keys... these key parameters don't matter.
4531 {
4532 smsLog( pMac, LOGE, FL(" Set context for unicast fail\n") );
4533 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4534 }
4535 // Issue the set Context request to LIM to establish the Broadcast STA context
4536 csrRoamIssueSetContextReq( pMac, sessionId, pProfile->negotiatedMCEncryptionType,
4537 pSirBssDesc, &BroadcastMac,
4538 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4539 }
4540 else
4541 {
4542 //Need to wait for supplicant authtication
4543 roamInfo.fAuthRequired = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004544 //Set the subestate to WaitForKey in case authentiation is needed
4545 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY, sessionId );
4546
Jeff Johnson295189b2012-06-20 16:38:30 -07004547 if(pProfile->bWPSAssociation)
4548 {
4549 key_timeout_interval = CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD;
4550 }
4551 else
4552 {
4553 key_timeout_interval = CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD;
4554 }
4555
4556 //Save sessionId in case of timeout
4557 pMac->roam.WaitForKeyTimerInfo.sessionId = (tANI_U8)sessionId;
4558 //This time should be long enough for the rest of the process plus setting key
4559 if(!HAL_STATUS_SUCCESS( csrRoamStartWaitForKeyTimer( pMac, key_timeout_interval ) ) )
4560 {
4561 //Reset our state so nothting is blocked.
4562 smsLog( pMac, LOGE, FL(" Failed to start pre-auth timer\n") );
4563 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
4564 }
4565 }
4566
4567 assocInfo.pBssDesc = pSirBssDesc; //could be NULL
4568 assocInfo.pProfile = pProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07004569 if(Context)
4570 {
4571 tSirSmeJoinRsp *pJoinRsp = (tSirSmeJoinRsp *)Context;
4572 tANI_U32 len;
Jeff Johnson295189b2012-06-20 16:38:30 -07004573 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4574 len = pJoinRsp->assocReqLength + pJoinRsp->assocRspLength + pJoinRsp->beaconLength;
4575#ifdef WLAN_FEATURE_VOWIFI_11R
4576 len += pJoinRsp->parsedRicRspLen;
4577#endif /* WLAN_FEATURE_VOWIFI_11R */
4578#ifdef FEATURE_WLAN_CCX
4579 len += pJoinRsp->tspecIeLen;
4580#endif
4581 if(len)
4582 {
4583 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
4584 (void **)&pSession->connectedInfo.pbFrames, len)))
4585 {
4586 if(HAL_STATUS_SUCCESS( palCopyMemory(pMac->hHdd,
4587 pSession->connectedInfo.pbFrames, pJoinRsp->frames, len) ))
4588 {
4589 pSession->connectedInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4590 pSession->connectedInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4591 pSession->connectedInfo.nBeaconLength = pJoinRsp->beaconLength;
4592#ifdef WLAN_FEATURE_VOWIFI_11R
4593 pSession->connectedInfo.nRICRspLength = pJoinRsp->parsedRicRspLen;
4594#endif /* WLAN_FEATURE_VOWIFI_11R */
4595#ifdef FEATURE_WLAN_CCX
4596 pSession->connectedInfo.nTspecIeLength = pJoinRsp->tspecIeLen;
4597#endif
4598 roamInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4599 roamInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4600 roamInfo.nBeaconLength = pJoinRsp->beaconLength;
4601 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4602 }
4603 else
4604 {
4605 smsLog(pMac, LOGE, "%s: Copying of memory failed for %d bytes !!!\n",
4606 __FUNCTION__, len);
4607 palFreeMemory( pMac->hHdd, pSession->connectedInfo.pbFrames );
4608 pSession->connectedInfo.pbFrames = NULL;
4609 }
4610 }
4611 }
4612 if(pCommand->u.roamCmd.fReassoc)
4613 {
4614 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4615 }
4616 pSession->connectedInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4617 roamInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4618 roamInfo.ucastSig = ( tANI_U8 )pJoinRsp->ucastSig;
4619 roamInfo.bcastSig = ( tANI_U8 )pJoinRsp->bcastSig;
4620 }
4621 else
4622 {
4623 if(pCommand->u.roamCmd.fReassoc)
4624 {
4625 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4626 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4627 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4628 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4629 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4630 }
4631 }
4632#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4633 // Indicate SME-QOS with reassoc success event, only after
4634 // copying the frames
4635 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, ind_qos, &assocInfo);
4636#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004637 roamInfo.pBssDesc = pSirBssDesc;
4638 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4639 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4640#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4641 acm_mask = sme_QosGetACMMask(pMac, pSirBssDesc, NULL);
4642#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
4643 pSession->connectedProfile.acm_mask = acm_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004644#ifdef FEATURE_WLAN_UAPSD_FW_TRG_FRAMES
4645 //start UAPSD if uapsd_mask is not 0 because HDD will configure for trigger frame
4646 //It may be better to let QoS do this????
4647 if( pSession->connectedProfile.modifyProfileFields.uapsd_mask )
4648 {
4649 smsLog(pMac, LOGE, " uapsd_mask (0x%X) set, request UAPSD now\n",
4650 pSession->connectedProfile.modifyProfileFields.uapsd_mask);
4651 pmcStartUapsd( pMac, NULL, NULL );
4652 }
4653#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004654 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4655 if( pSession->bRefAssocStartCnt > 0 )
4656 {
4657 pSession->bRefAssocStartCnt--;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004658 //Remove this code once SLM_Sessionization is supported
4659 //BMPS_WORKAROUND_NOT_NEEDED
4660 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) && ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004661 {
4662 pMac->roam.configParam.doBMPSWorkaround = 1;
4663 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4665 }
4666
4667 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_NONE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004668 // reset the PMKID candidate list
4669 csrResetPMKIDCandidateList( pMac, sessionId );
4670 //Update TL's AC weight base on the current EDCA parameters
4671 //These parameters may change in the course of the connection, that sictuation
4672 //is not taken care here. This change is mainly to address a WIFI WMM test where
4673 //BE has a equal or higher TX priority than VI.
4674 //We only do this for infra link
4675 if( csrIsConnStateConnectedInfra(pMac, sessionId ) && pIes )
4676 {
4677 csrCheckAndUpdateACWeight(pMac, pIes);
4678 }
4679#ifdef FEATURE_WLAN_WAPI
4680 // reset the BKID candidate list
4681 csrResetBKIDCandidateList( pMac, sessionId );
4682#endif /* FEATURE_WLAN_WAPI */
4683 }
4684 else
4685 {
4686 smsLog(pMac, LOGW, " Roam command doesn't have a BSS desc\n");
4687 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004688 csrScanCancelIdleScan(pMac);
4689 //Not to signal link up because keys are yet to be set.
4690 //The linkup function will overwrite the sub-state that we need to keep at this point.
4691 if( !CSR_IS_WAIT_FOR_KEY(pMac, sessionId) )
4692 {
4693 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
4694 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004695 //Check if BMPS is required and start the BMPS retry timer. Timer period is large
4696 //enough to let security and DHCP handshake succeed before entry into BMPS
4697 if (pmcShouldBmpsTimerRun(pMac))
4698 {
4699 if (pmcStartTrafficTimer(pMac, BMPS_TRAFFIC_TIMER_ALLOW_SECURITY_DHCP)
4700 != eHAL_STATUS_SUCCESS)
4701 {
4702 smsLog(pMac, LOGP, FL("Cannot start BMPS Retry timer"));
4703 }
4704 smsLog(pMac, LOG2, FL("BMPS Retry Timer already running or started"));
4705 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004706 break;
4707
Jeff Johnson295189b2012-06-20 16:38:30 -07004708 case eCsrStartBssSuccess:
4709 // on the StartBss Response, LIM is returning the Bss Description that we
4710 // are beaconing. Add this Bss Description to our scan results and
4711 // chain the Profile to this Bss Description. On a Start BSS, there was no
4712 // detected Bss description (no partner) so we issued the Start Bss to
4713 // start the Ibss without any Bss description. Lim was kind enough to return
4714 // the Bss Description that we start beaconing for the newly started Ibss.
4715 smsLog(pMac, LOG2, FL("receives start BSS ok indication\n"));
4716 status = eHAL_STATUS_FAILURE;
4717#ifdef WLAN_SOFTAP_FEATURE
4718 pSmeStartBssRsp = (tSirSmeStartBssRsp *)Context;
4719#endif
4720 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4721 if( CSR_IS_IBSS( pProfile ) )
4722 {
4723 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
4724 }
4725#ifdef WLAN_SOFTAP_FEATURE
4726 else if (CSR_IS_INFRA_AP(pProfile))
4727 {
4728 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
4729 }
4730#endif
4731 else
4732 {
4733 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
4734 }
4735 if( !CSR_IS_WDS_STA( pProfile ) )
4736 {
4737 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4738#ifdef WLAN_SOFTAP_FEATURE
4739 pSirBssDesc = &pSmeStartBssRsp->bssDescription;
4740#else
4741 pSirBssDesc = (tSirBssDescription *)Context;
4742#endif
4743 if( !HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs( pMac, pSirBssDesc, &pIes )) )
4744 {
4745 smsLog(pMac, LOG2, FL("cannot parse IBSS IEs\n"));
4746 roamInfo.pBssDesc = pSirBssDesc;
4747 //We need to associate_complete it first, becasue Associate_start already indicated.
4748 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4749 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_START_FAILED );
4750 break;
4751 }
4752#ifdef WLAN_SOFTAP_FEATURE
4753 if (!CSR_IS_INFRA_AP(pProfile))
4754#endif
4755 {
4756 pScanResult = csrScanAppendBssDescription( pMac, pSirBssDesc, pIes );
4757 }
4758 csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
4759 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4760 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4761 if(pSirBssDesc)
4762 {
4763 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4764 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4765 }
4766 //We are doen with the IEs so free it
4767 palFreeMemory(pMac->hHdd, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07004768#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4769 {
4770 vos_log_ibss_pkt_type *pIbssLog;
4771 tANI_U32 bi;
4772
4773 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4774 if(pIbssLog)
4775 {
4776 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4777 {
4778 //We start the IBSS (didn't find any matched IBSS out there)
4779 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_RSP;
4780 }
4781 else
4782 {
4783 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_RSP;
4784 }
4785 if(pSirBssDesc)
4786 {
4787 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pSirBssDesc->bssId, 6);
4788 pIbssLog->operatingChannel = pSirBssDesc->channelId;
4789 }
4790 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
4791 {
4792 //***U8 is not enough for beacon interval
4793 pIbssLog->beaconInterval = (v_U8_t)bi;
4794 }
4795 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4796 }
4797 }
4798#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4799 //Only set context for non-WDS_STA. We don't even need it for WDS_AP. But since the encryption
4800 //is WPA2-PSK so it won't matter.
Jeff Johnson295189b2012-06-20 16:38:30 -07004801#ifdef WLAN_SOFTAP_FEATURE
4802 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) && !CSR_IS_INFRA_AP( pSession->pCurRoamProfile ))
4803 {
4804#else
4805 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ))
4806 {
4807#endif
4808 // Issue the set Context request to LIM to establish the Broadcast STA context for the Ibss.
4809 csrRoamIssueSetContextReq( pMac, sessionId,
4810 pProfile->negotiatedMCEncryptionType,
4811 pSirBssDesc, &BroadcastMac,
4812 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4813 }
4814 }
4815 else
4816 {
4817 //Keep the state to eCSR_ROAMING_STATE_JOINING
4818 //Need to send join_req.
4819 if(pCommand->u.roamCmd.pRoamBssEntry)
4820 {
4821 if((pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link)))
4822 {
4823 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4824 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4825 // Set the roaming substate to 'join attempt'...
4826 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
4827 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
4828 }
4829 }
4830 else
4831 {
4832 smsLog( pMac, LOGE, " StartBSS for WDS station with no BssDesc\n" );
4833 VOS_ASSERT( 0 );
4834 }
4835 }
4836 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4837 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4838 //trigger the connection start indication in Vista
4839 if( !CSR_IS_JOIN_TO_IBSS( pProfile ) )
4840 {
4841 roamStatus = eCSR_ROAM_IBSS_IND;
4842 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4843 if( CSR_IS_WDS( pProfile ) )
4844 {
4845 roamStatus = eCSR_ROAM_WDS_IND;
4846 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4847 }
4848#ifdef WLAN_SOFTAP_FEATURE
4849 if( CSR_IS_INFRA_AP( pProfile ) )
4850 {
4851 roamStatus = eCSR_ROAM_INFRA_IND;
4852 roamResult = eCSR_ROAM_RESULT_INFRA_STARTED;
4853 }
4854#endif
4855
4856 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4857 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4858 //trigger the connection start indication in Vista
4859 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4860 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4861 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4862 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4863 {
4864 //We start the IBSS (didn't find any matched IBSS out there)
4865 roamInfo.pBssDesc = pSirBssDesc;
4866 }
4867#ifdef WLAN_SOFTAP_FEATURE
4868 roamInfo.staId = (tANI_U8)pSmeStartBssRsp->staId;
4869#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004870 //Remove this code once SLM_Sessionization is supported
4871 //BMPS_WORKAROUND_NOT_NEEDED
4872 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -07004873 ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004874 {
4875 pMac->roam.configParam.doBMPSWorkaround = 1;
4876 }
Mohit Khanna349bc392012-09-11 17:24:52 -07004877
Jeff Johnson295189b2012-06-20 16:38:30 -07004878 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4879 }
4880
4881 csrScanCancelIdleScan(pMac);
4882 //Only use this timer for ibss. BAP has its own timer for WDS
4883 if( CSR_IS_IBSS( pProfile) && CSR_INVALID_SCANRESULT_HANDLE != pCommand->u.roamCmd.hBSSList)
4884 {
4885 //start the join IBSS timer
4886 csrRoamStartIbssJoinTimer(pMac, sessionId, CSR_IBSS_JOIN_TIMEOUT_PERIOD); //interval
4887 pSession->ibss_join_pending = TRUE;
4888 }
4889 if( HAL_STATUS_SUCCESS( status ) )
4890 {
4891 //Already sent join_req for the WDS station
4892 fReleaseCommand = eANI_BOOLEAN_FALSE;
4893 }
4894 else if( CSR_IS_WDS_STA( pProfile ) )
4895 {
4896 //need to send stop BSS because we fail to send join_req
4897 csrRoamIssueDisassociateCmd( pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED );
4898 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4899 eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_STOPPED );
4900 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004901 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004902 case eCsrStartBssFailure:
4903#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4904 {
4905 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07004906 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4907 if(pIbssLog)
4908 {
4909 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
4910 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4911 }
4912 }
4913#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 roamStatus = eCSR_ROAM_IBSS_IND;
4915 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4916 if( CSR_IS_WDS( pProfile ) )
4917 {
4918 roamStatus = eCSR_ROAM_WDS_IND;
4919 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4920 }
4921#ifdef WLAN_SOFTAP_FEATURE
4922 if( CSR_IS_INFRA_AP( pProfile ) )
4923 {
4924 roamStatus = eCSR_ROAM_INFRA_IND;
4925 roamResult = eCSR_ROAM_RESULT_INFRA_START_FAILED;
4926 }
4927#endif
4928 if(Context)
4929 {
4930 pSirBssDesc = (tSirBssDescription *)Context;
4931 }
4932 else
4933 {
4934 pSirBssDesc = NULL;
4935 }
4936 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4937 roamInfo.pBssDesc = pSirBssDesc;
4938 //We need to associate_complete it first, becasue Associate_start already indicated.
4939 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4940 csrSetDefaultDot11Mode( pMac );
4941 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004942 case eCsrSilentlyStopRoaming:
4943 // We are here because we try to start the same IBSS
4944 //No message to PE
4945 // return the roaming state to Joined.
4946 smsLog(pMac, LOGW, FL("receives silently roaming indication\n"));
4947 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4948 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4949 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4950 roamInfo.pBssDesc = pSession->pConnectBssDesc;
4951 if( roamInfo.pBssDesc )
4952 {
4953 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
4954 }
4955 //Since there is no change in the current state, simply pass back no result otherwise
4956 //HDD may be mistakenly mark to disconnected state.
4957 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4958 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_NONE );
Jeff Johnson295189b2012-06-20 16:38:30 -07004959 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004960 case eCsrSilentlyStopRoamingSaveState:
4961 //We are here because we try to connect to the same AP
4962 //No message to PE
4963 smsLog(pMac, LOGW, FL("receives silently stop roaming indication\n"));
4964 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4965
4966 //to aviod resetting the substate to NONE
4967 pMac->roam.curState[sessionId] = eCSR_ROAMING_STATE_JOINED;
4968 //No need to change substate to wai_for_key because there is no state change
4969 roamInfo.pBssDesc = pSession->pConnectBssDesc;
4970 if( roamInfo.pBssDesc )
4971 {
4972 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
4973 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004974 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4975 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4976 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4977 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4978 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4979 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4980 roamInfo.staId = pSession->connectedInfo.staId;
4981 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4982#if defined(VOSS_ENABLED)
4983 VOS_ASSERT( roamInfo.staId != 0 );
4984#endif
4985 pSession->bRefAssocStartCnt--;
4986 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4987 eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4988 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_ASSOCIATED, eANI_BOOLEAN_TRUE);
4989 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004990 case eCsrReassocFailure:
4991#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4992 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_REASSOC_FAILURE, NULL);
4993#endif
4994 case eCsrJoinWdsFailure:
4995 smsLog(pMac, LOGW, FL("failed to join WDS\n"));
4996 csrFreeConnectBssDesc(pMac, sessionId);
4997 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4998 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4999 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5000 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5001 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5002 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
5003 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5004 eCSR_ROAM_WDS_IND,
5005 eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED);
5006 //Need to issue stop_bss
5007 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005008 case eCsrJoinFailure:
5009 case eCsrNothingToJoin:
Jeff Johnsone7245742012-09-05 17:12:55 -07005010 case eCsrJoinFailureDueToConcurrency:
Jeff Johnson295189b2012-06-20 16:38:30 -07005011 default:
5012 {
5013 smsLog(pMac, LOGW, FL("receives no association indication\n"));
Madan Mohan Koyyalamudi85d140a2012-10-18 20:23:01 -07005014 smsLog(pMac, LOG1, FL("Assoc ref count %d\n"),
5015 pSession->bRefAssocStartCnt);
Jeff Johnson295189b2012-06-20 16:38:30 -07005016 if( CSR_IS_INFRASTRUCTURE( &pSession->connectedProfile ) ||
5017 CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, sessionId ) )
5018 {
5019 //do not free for the other profiles as we need to send down stop BSS later
5020 csrFreeConnectBssDesc(pMac, sessionId);
5021 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
5022 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
5023 csrSetDefaultDot11Mode( pMac );
5024 }
5025
5026 switch( pCommand->u.roamCmd.roamReason )
5027 {
5028 // If this transition is because of an 802.11 OID, then we transition
5029 // back to INIT state so we sit waiting for more OIDs to be issued and
5030 // we don't start the IDLE timer.
Jeff Johnsone7245742012-09-05 17:12:55 -07005031 case eCsrSmeIssuedFTReassoc:
Jeff Johnson295189b2012-06-20 16:38:30 -07005032 case eCsrSmeIssuedAssocToSimilarAP:
5033 case eCsrHddIssued:
5034 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5035 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5036 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5037 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5038 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07005039 /* Defeaturize this later if needed */
5040#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
5041 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
5042 if (csrRoamIsHandoffInProgress(pMac))
5043 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005044 /* Should indicate neighbor roam algorithm about the connect failure here */
5045 csrNeighborRoamIndicateConnect(pMac, (tANI_U8)sessionId, VOS_STATUS_E_FAILURE);
5046 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005047#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005048 if(pSession->bRefAssocStartCnt > 0)
5049 {
5050 pSession->bRefAssocStartCnt--;
Jeff Johnsone7245742012-09-05 17:12:55 -07005051 if(eCsrJoinFailureDueToConcurrency == Result)
5052 {
5053 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5054 eCSR_ROAM_ASSOCIATION_COMPLETION,
5055 eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL);
5056 }
5057 else
5058 {
5059 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
Jeff Johnson295189b2012-06-20 16:38:30 -07005060 eCSR_ROAM_ASSOCIATION_COMPLETION,
5061 eCSR_ROAM_RESULT_FAILURE);
Jeff Johnsone7245742012-09-05 17:12:55 -07005062 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005063 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005064 smsLog(pMac, LOG1, FL(" roam(reason %d) failed\n"), pCommand->u.roamCmd.roamReason);
5065#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5066 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5067#endif
5068 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5069 csrScanStartIdleScan(pMac);
5070#ifdef FEATURE_WLAN_BTAMP_UT_RF
5071 //For WDS STA. To fix the issue where the WDS AP side may be too busy by
5072 //BT activity and not able to recevie WLAN traffic. Retry the join
5073 if( CSR_IS_WDS_STA(pProfile) )
5074 {
5075 csrRoamStartJoinRetryTimer(pMac, sessionId, CSR_JOIN_RETRY_TIMEOUT_PERIOD);
5076 }
5077#endif
5078 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005079 case eCsrHddIssuedReassocToSameAP:
5080 case eCsrSmeIssuedReassocToSameAP:
5081 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5082
5083 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5084#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5085 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5086#endif
5087 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5088 csrScanStartIdleScan(pMac);
5089 break;
5090 case eCsrForcedDisassoc:
5091 case eCsrForcedDeauth:
5092 case eCsrSmeIssuedIbssJoinFailure:
5093 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5094
5095 if(eCsrSmeIssuedIbssJoinFailure == pCommand->u.roamCmd.roamReason)
5096 {
5097 // Notify HDD that IBSS join failed
5098 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
5099 }
5100 else
5101 {
5102 csrRoamCallCallback(pMac, sessionId, NULL,
5103 pCommand->u.roamCmd.roamId,
5104 eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5105 }
5106#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5107 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5108#endif
5109 csrRoamLinkDown(pMac, sessionId);
5110 csrScanStartIdleScan(pMac);
5111 break;
5112 case eCsrForcedIbssLeave:
5113 csrRoamCallCallback(pMac, sessionId, NULL,
5114 pCommand->u.roamCmd.roamId,
5115 eCSR_ROAM_IBSS_LEAVE,
5116 eCSR_ROAM_RESULT_IBSS_STOP);
5117 break;
5118 case eCsrForcedDisassocMICFailure:
5119 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5120
5121 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_MIC_FAILURE);
5122#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5123 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
5124#endif
5125 csrScanStartIdleScan(pMac);
5126 break;
5127#ifdef WLAN_SOFTAP_FEATURE
5128 case eCsrStopBss:
5129 csrRoamCallCallback(pMac, sessionId, NULL,
5130 pCommand->u.roamCmd.roamId,
5131 eCSR_ROAM_INFRA_IND,
5132 eCSR_ROAM_RESULT_INFRA_STOPPED);
5133 break;
5134 case eCsrForcedDisassocSta:
5135 case eCsrForcedDeauthSta:
5136 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId);
5137 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
5138 {
5139 pSession = CSR_GET_SESSION(pMac, sessionId);
5140 if (!pSession)
5141 break;
5142
5143 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
5144 {
5145 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5146 palCopyMemory(pMac->hHdd, roamInfo.peerMac,
5147 pCommand->u.roamCmd.peerMac, sizeof(tSirMacAddr));
5148 roamInfo.reasonCode = eCSR_ROAM_RESULT_FORCED;
5149 roamInfo.statusCode = eSIR_SME_SUCCESS;
5150 status = csrRoamCallCallback(pMac, sessionId,
5151 &roamInfo, pCommand->u.roamCmd.roamId,
5152 eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
5153 }
5154 }
5155 break;
5156#endif
5157 case eCsrLostLink1:
5158 // if lost link roam1 failed, then issue lost link Scan2 ...
5159 csrScanRequestLostLink2(pMac, sessionId);
5160 break;
5161 case eCsrLostLink2:
5162 // if lost link roam2 failed, then issue lost link scan3 ...
5163 csrScanRequestLostLink3(pMac, sessionId);
5164 break;
5165 case eCsrLostLink3:
5166 default:
5167 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5168
5169 //We are done with one round of lostlink roaming here
5170 csrScanHandleFailedLostlink3(pMac, sessionId);
5171 break;
5172 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005173 break;
5174 }
5175 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005176 return ( fReleaseCommand );
5177}
5178
Jeff Johnson295189b2012-06-20 16:38:30 -07005179eHalStatus csrRoamRegisterCallback(tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext)
5180{
5181 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005182 return (status);
5183}
5184
Jeff Johnson295189b2012-06-20 16:38:30 -07005185eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile, tCsrRoamProfile *pSrcProfile)
5186{
5187 eHalStatus status = eHAL_STATUS_SUCCESS;
5188 tANI_U32 size = 0;
5189
5190 do
5191 {
5192 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5193 if(pSrcProfile->BSSIDs.numOfBSSIDs)
5194 {
5195 size = sizeof(tCsrBssid) * pSrcProfile->BSSIDs.numOfBSSIDs;
5196 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, size);
5197 if(!HAL_STATUS_SUCCESS(status))
5198 {
5199 break;
5200 }
5201 pDstProfile->BSSIDs.numOfBSSIDs = pSrcProfile->BSSIDs.numOfBSSIDs;
5202 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->BSSIDs.bssid, size);
5203 }
5204 if(pSrcProfile->SSIDs.numOfSSIDs)
5205 {
5206 size = sizeof(tCsrSSIDInfo) * pSrcProfile->SSIDs.numOfSSIDs;
5207 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, size);
5208 if(!HAL_STATUS_SUCCESS(status))
5209 {
5210 break;
5211 }
5212 pDstProfile->SSIDs.numOfSSIDs = pSrcProfile->SSIDs.numOfSSIDs;
5213 palCopyMemory(pMac->hHdd, pDstProfile->SSIDs.SSIDList, pSrcProfile->SSIDs.SSIDList, size);
5214 }
5215 if(pSrcProfile->nWPAReqIELength)
5216 {
5217 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5218 if(!HAL_STATUS_SUCCESS(status))
5219 {
5220 break;
5221 }
5222 pDstProfile->nWPAReqIELength = pSrcProfile->nWPAReqIELength;
5223 palCopyMemory(pMac->hHdd, pDstProfile->pWPAReqIE, pSrcProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5224 }
5225 if(pSrcProfile->nRSNReqIELength)
5226 {
5227 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5228 if(!HAL_STATUS_SUCCESS(status))
5229 {
5230 break;
5231 }
5232 pDstProfile->nRSNReqIELength = pSrcProfile->nRSNReqIELength;
5233 palCopyMemory(pMac->hHdd, pDstProfile->pRSNReqIE, pSrcProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5234 }
5235#ifdef FEATURE_WLAN_WAPI
5236 if(pSrcProfile->nWAPIReqIELength)
5237 {
5238 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5239 if(!HAL_STATUS_SUCCESS(status))
5240 {
5241 break;
5242 }
5243 pDstProfile->nWAPIReqIELength = pSrcProfile->nWAPIReqIELength;
5244 palCopyMemory(pMac->hHdd, pDstProfile->pWAPIReqIE, pSrcProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5245 }
5246#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07005247 if(pSrcProfile->nAddIEScanLength)
5248 {
5249 status = palAllocateMemory(pMac->hHdd,
5250 (void **)&pDstProfile->pAddIEScan, pSrcProfile->nAddIEScanLength);
5251 if(!HAL_STATUS_SUCCESS(status))
5252 {
5253 break;
5254 }
5255 pDstProfile->nAddIEScanLength = pSrcProfile->nAddIEScanLength;
5256 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEScan, pSrcProfile->pAddIEScan,
5257 pSrcProfile->nAddIEScanLength);
5258 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005259 if(pSrcProfile->nAddIEAssocLength)
5260 {
5261 status = palAllocateMemory(pMac->hHdd,
5262 (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5263 if(!HAL_STATUS_SUCCESS(status))
5264 {
5265 break;
5266 }
5267 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5268 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5269 pSrcProfile->nAddIEAssocLength);
5270 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005271 if(pSrcProfile->ChannelInfo.ChannelList)
5272 {
5273 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5274 if(!HAL_STATUS_SUCCESS(status))
5275 {
5276 break;
5277 }
5278 pDstProfile->ChannelInfo.numOfChannels = pSrcProfile->ChannelInfo.numOfChannels;
5279 palCopyMemory(pMac->hHdd, pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5280 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005281 pDstProfile->AuthType = pSrcProfile->AuthType;
5282 pDstProfile->EncryptionType = pSrcProfile->EncryptionType;
5283 pDstProfile->mcEncryptionType = pSrcProfile->mcEncryptionType;
5284 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->negotiatedUCEncryptionType;
5285 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->negotiatedMCEncryptionType;
5286 pDstProfile->negotiatedAuthType = pSrcProfile->negotiatedAuthType;
5287 pDstProfile->BSSType = pSrcProfile->BSSType;
5288 pDstProfile->phyMode = pSrcProfile->phyMode;
5289 pDstProfile->csrPersona = pSrcProfile->csrPersona;
5290
5291#ifdef FEATURE_WLAN_WAPI
5292 if(csrIsProfileWapi(pSrcProfile))
5293 {
5294 if(pDstProfile->phyMode & eCSR_DOT11_MODE_11n)
5295 {
5296 pDstProfile->phyMode &= ~eCSR_DOT11_MODE_11n;
5297 }
5298 }
5299#endif /* FEATURE_WLAN_WAPI */
5300 pDstProfile->CBMode = pSrcProfile->CBMode;
5301 /*Save the WPS info*/
5302 pDstProfile->bWPSAssociation = pSrcProfile->bWPSAssociation;
5303 pDstProfile->uapsd_mask = pSrcProfile->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005304 pDstProfile->beaconInterval = pSrcProfile->beaconInterval;
5305#ifdef WLAN_SOFTAP_FEATURE
5306 pDstProfile->privacy = pSrcProfile->privacy;
5307 pDstProfile->fwdWPSPBCProbeReq = pSrcProfile->fwdWPSPBCProbeReq;
5308 pDstProfile->csr80211AuthType = pSrcProfile->csr80211AuthType;
5309 pDstProfile->dtimPeriod = pSrcProfile->dtimPeriod;
5310 pDstProfile->ApUapsdEnable = pSrcProfile->ApUapsdEnable;
5311 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->SSIDs.SSIDList[0].ssidHidden;
5312 pDstProfile->protEnabled = pSrcProfile->protEnabled;
5313 pDstProfile->obssProtEnabled = pSrcProfile->obssProtEnabled;
5314 pDstProfile->cfg_protection = pSrcProfile->cfg_protection;
5315 pDstProfile->wps_state = pSrcProfile->wps_state;
5316 pDstProfile->ieee80211d = pSrcProfile->ieee80211d;
5317#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005318 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
Jeff Johnson295189b2012-06-20 16:38:30 -07005319#ifdef WLAN_FEATURE_VOWIFI_11R
5320 if (pSrcProfile->MDID.mdiePresent)
5321 {
5322 pDstProfile->MDID.mdiePresent = 1;
5323 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5324 }
5325#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005326 }while(0);
5327
5328 if(!HAL_STATUS_SUCCESS(status))
5329 {
5330 csrReleaseProfile(pMac, pDstProfile);
5331 pDstProfile = NULL;
5332 }
5333
5334 return (status);
5335}
Jeff Johnson295189b2012-06-20 16:38:30 -07005336eHalStatus csrRoamCopyConnectedProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pDstProfile )
5337{
5338 eHalStatus status = eHAL_STATUS_SUCCESS;
5339 tCsrRoamConnectedProfile *pSrcProfile = &pMac->roam.roamSession[sessionId].connectedProfile;
5340 do
5341 {
5342 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5343 if(pSrcProfile->bssid)
5344 {
5345 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, sizeof(tCsrBssid));
5346 if(!HAL_STATUS_SUCCESS(status))
5347 {
5348 break;
5349 }
5350 pDstProfile->BSSIDs.numOfBSSIDs = 1;
5351 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->bssid, sizeof(tCsrBssid));
5352 }
5353 if(pSrcProfile->SSID.ssId)
5354 {
5355 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
5356 if(!HAL_STATUS_SUCCESS(status))
5357 {
5358 break;
5359 }
5360 pDstProfile->SSIDs.numOfSSIDs = 1;
5361 pDstProfile->SSIDs.SSIDList[0].handoffPermitted = pSrcProfile->handoffPermitted;
5362 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->ssidHidden;
5363 palCopyMemory(pMac->hHdd, &pDstProfile->SSIDs.SSIDList[0].SSID, &pSrcProfile->SSID, sizeof(tSirMacSSid));
5364 }
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07005365 if(pSrcProfile->nAddIEAssocLength)
5366 {
5367 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5368 if(!HAL_STATUS_SUCCESS(status))
5369 {
5370 smsLog( pMac, LOGE, FL(" failed to allocate memory for additional IEs \n") );
5371 break;
5372 }
5373 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5374 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5375 pSrcProfile->nAddIEAssocLength);
5376 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005377 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, 1);
5378 if(!HAL_STATUS_SUCCESS(status))
5379 {
5380 break;
5381 }
5382 pDstProfile->ChannelInfo.numOfChannels = 1;
5383 pDstProfile->ChannelInfo.ChannelList[0] = pSrcProfile->operationChannel;
Jeff Johnson295189b2012-06-20 16:38:30 -07005384 pDstProfile->AuthType.numEntries = 1;
5385 pDstProfile->AuthType.authType[0] = pSrcProfile->AuthType;
5386 pDstProfile->negotiatedAuthType = pSrcProfile->AuthType;
5387 pDstProfile->EncryptionType.numEntries = 1;
5388 pDstProfile->EncryptionType.encryptionType[0] = pSrcProfile->EncryptionType;
5389 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->EncryptionType;
5390 pDstProfile->mcEncryptionType.numEntries = 1;
5391 pDstProfile->mcEncryptionType.encryptionType[0] = pSrcProfile->mcEncryptionType;
5392 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->mcEncryptionType;
5393 pDstProfile->BSSType = pSrcProfile->BSSType;
5394 pDstProfile->CBMode = pSrcProfile->CBMode;
5395 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
5396#ifdef WLAN_FEATURE_VOWIFI_11R
5397 if (pSrcProfile->MDID.mdiePresent)
5398 {
5399 pDstProfile->MDID.mdiePresent = 1;
5400 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5401 }
5402#endif
5403
5404 }while(0);
5405
5406 if(!HAL_STATUS_SUCCESS(status))
5407 {
5408 csrReleaseProfile(pMac, pDstProfile);
5409 pDstProfile = NULL;
5410 }
5411
5412 return (status);
5413}
5414
Jeff Johnson295189b2012-06-20 16:38:30 -07005415eHalStatus csrRoamIssueConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5416 tScanResultHandle hBSSList,
5417 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate,
5418 tANI_BOOLEAN fClearScan)
5419{
5420 eHalStatus status = eHAL_STATUS_SUCCESS;
5421 tSmeCmd *pCommand;
5422
5423 pCommand = csrGetCommandBuffer(pMac);
5424 if(NULL == pCommand)
5425 {
5426 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5427 status = eHAL_STATUS_RESOURCES;
5428 }
5429 else
5430 {
5431 if( fClearScan )
5432 {
5433 csrScanCancelIdleScan(pMac);
5434 csrScanAbortMacScanNotForConnect(pMac);
5435 }
5436 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5437 if(NULL == pProfile)
5438 {
5439 //We can roam now
5440 //Since pProfile is NULL, we need to build our own profile, set everything to default
5441 //We can only support open and no encryption
5442 pCommand->u.roamCmd.roamProfile.AuthType.numEntries = 1;
5443 pCommand->u.roamCmd.roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5444 pCommand->u.roamCmd.roamProfile.EncryptionType.numEntries = 1;
5445 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5446 pCommand->u.roamCmd.roamProfile.csrPersona = VOS_STA_MODE;
5447 }
5448 else
5449 {
5450 //make a copy of the profile
5451 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5452 if(HAL_STATUS_SUCCESS(status))
5453 {
5454 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5455 }
5456 }
5457 pCommand->command = eSmeCommandRoam;
5458 pCommand->sessionId = (tANI_U8)sessionId;
5459 pCommand->u.roamCmd.hBSSList = hBSSList;
5460 pCommand->u.roamCmd.roamId = roamId;
5461 pCommand->u.roamCmd.roamReason = reason;
5462 //We need to free the BssList when the command is done
5463 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_TRUE;
5464 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005465 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
5466 FL("CSR PERSONA=%d"),
5467 pCommand->u.roamCmd.roamProfile.csrPersona);
Jeff Johnson295189b2012-06-20 16:38:30 -07005468 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5469 if( !HAL_STATUS_SUCCESS( status ) )
5470 {
5471 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5472 csrReleaseCommandRoam( pMac, pCommand );
5473 }
5474 }
5475
5476 return (status);
5477}
Jeff Johnson295189b2012-06-20 16:38:30 -07005478eHalStatus csrRoamIssueReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5479 tCsrRoamModifyProfileFields *pMmodProfileFields,
5480 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5481{
5482 eHalStatus status = eHAL_STATUS_SUCCESS;
5483 tSmeCmd *pCommand;
5484
5485 pCommand = csrGetCommandBuffer(pMac);
5486 if(NULL == pCommand)
5487 {
5488 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5489 status = eHAL_STATUS_RESOURCES;
5490 }
5491 else
5492 {
5493 csrScanCancelIdleScan(pMac);
5494 csrScanAbortMacScanNotForConnect(pMac);
5495 if(pProfile)
5496 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005497 //This is likely trying to reassoc to different profile
5498 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5499 //make a copy of the profile
5500 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5501 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005502 }
5503 else
5504 {
5505 status = csrRoamCopyConnectedProfile(pMac, sessionId, &pCommand->u.roamCmd.roamProfile);
5506 //how to update WPA/WPA2 info in roamProfile??
5507 pCommand->u.roamCmd.roamProfile.uapsd_mask = pMmodProfileFields->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005508 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005509 if(HAL_STATUS_SUCCESS(status))
5510 {
5511 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5512 }
5513 pCommand->command = eSmeCommandRoam;
5514 pCommand->sessionId = (tANI_U8)sessionId;
5515 pCommand->u.roamCmd.roamId = roamId;
5516 pCommand->u.roamCmd.roamReason = reason;
5517 //We need to free the BssList when the command is done
5518 //For reassoc there is no BSS list, so the boolean set to false
5519 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
5520 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
5521 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005522 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5523 if( !HAL_STATUS_SUCCESS( status ) )
5524 {
5525 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5526 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5527 csrReleaseCommandRoam( pMac, pCommand );
5528 }
5529 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005530 return (status);
5531}
5532
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07005533eHalStatus csrRoamEnqueuePreauth(tpAniSirGlobal pMac, tANI_U32 sessionId, tpSirBssDescription pBssDescription,
5534 eCsrRoamReason reason, tANI_BOOLEAN fImmediate)
5535// , eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5536{
5537 eHalStatus status = eHAL_STATUS_SUCCESS;
5538 tSmeCmd *pCommand;
5539
5540 pCommand = csrGetCommandBuffer(pMac);
5541 if(NULL == pCommand)
5542 {
5543 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5544 status = eHAL_STATUS_RESOURCES;
5545 }
5546 else
5547 {
5548 if(pBssDescription)
5549 {
5550 //copy over the parameters we need later
5551 pCommand->command = eSmeCommandRoam;
5552 pCommand->sessionId = (tANI_U8)sessionId;
5553 pCommand->u.roamCmd.roamReason = reason;
5554 //this is the important parameter
5555 //in this case we are using this field for the "next" BSS
5556 pCommand->u.roamCmd.pLastRoamBss = pBssDescription;
5557 status = csrQueueSmeCommand(pMac, pCommand, fImmediate);
5558 if( !HAL_STATUS_SUCCESS( status ) )
5559 {
5560 smsLog( pMac, LOGE, FL(" fail to enqueue preauth command, status = %d\n"), status );
5561 csrReleaseCommandPreauth( pMac, pCommand );
5562 }
5563 }
5564 else
5565 {
5566 //Return failure
5567 status = eHAL_STATUS_RESOURCES;
5568 }
5569 }
5570 return (status);
5571}
5572
5573eHalStatus csrRoamDequeuePreauth(tpAniSirGlobal pMac)
5574{
5575 tListElem *pEntry;
5576 tSmeCmd *pCommand;
5577 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
5578 if ( pEntry )
5579 {
5580 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
5581 if ( (eSmeCommandRoam == pCommand->command) &&
5582 (eCsrPerformPreauth == pCommand->u.roamCmd.roamReason))
5583 {
5584 smsLog( pMac, LOGE, FL("DQ-Command = %d, Reason = %d \n"),
5585 pCommand->command, pCommand->u.roamCmd.roamReason);
5586 if (csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK )) {
5587 csrReleaseCommandPreauth( pMac, pCommand );
5588 }
5589 } else {
5590 smsLog( pMac, LOGE, FL("Command = %d, Reason = %d \n"),
5591 pCommand->command, pCommand->u.roamCmd.roamReason);
5592 }
5593 }
5594 else {
5595 smsLog( pMac, LOGE, FL("pEntry NULL for eWNI_SME_FT_PRE_AUTH_RSP\n"));
5596 }
5597 smeProcessPendingQueue( pMac );
5598 return eHAL_STATUS_SUCCESS;
5599}
5600
Jeff Johnson295189b2012-06-20 16:38:30 -07005601eHalStatus csrRoamConnectWithBSSList(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5602 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5603{
5604 eHalStatus status = eHAL_STATUS_FAILURE;
5605 tScanResultHandle hBSSList;
5606 tANI_U32 roamId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005607 status = csrScanCopyResultList(pMac, hBssListIn, &hBSSList);
5608 if(HAL_STATUS_SUCCESS(status))
5609 {
5610 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5611 if(pRoamId)
5612 {
5613 *pRoamId = roamId;
5614 }
5615 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5616 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5617 if(!HAL_STATUS_SUCCESS(status))
5618 {
5619 smsLog(pMac, LOGE, FL("failed to start a join process\n"));
5620 csrScanResultPurge(pMac, hBSSList);
5621 }
5622 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005623 return (status);
5624}
5625
Jeff Johnson295189b2012-06-20 16:38:30 -07005626eHalStatus csrRoamConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5627 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5628{
5629 eHalStatus status = eHAL_STATUS_SUCCESS;
5630 tScanResultHandle hBSSList;
5631 tCsrScanResultFilter *pScanFilter;
5632 tANI_U32 roamId = 0;
5633 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_FALSE;
5634 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005635 if (NULL == pProfile)
5636 {
5637 smsLog(pMac, LOGP, FL("No profile specified"));
5638 return eHAL_STATUS_FAILURE;
5639 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005640 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"),
5641 pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07005642 if( CSR_IS_WDS( pProfile ) &&
5643 !HAL_STATUS_SUCCESS( status = csrIsBTAMPAllowed( pMac, pProfile->operationChannel ) ) )
5644 {
5645 return status;
5646 }
5647 csrRoamCancelRoaming(pMac, sessionId);
5648 csrScanRemoveFreshScanCommand(pMac, sessionId);
5649 csrScanCancelIdleScan(pMac);
5650 //Only abort the scan if it is not used for other roam/connect purpose
5651 csrScanAbortMacScan(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07005652#ifdef WLAN_SOFTAP_FEATURE
5653 if (!vos_concurrent_sessions_running() && (VOS_STA_SAP_MODE == pProfile->csrPersona))//In case of AP mode we do not want idle mode scan
5654 {
5655 csrScanDisable(pMac);
5656 }
5657#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005658 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5659 //Check whether ssid changes
5660 if(csrIsConnStateConnected(pMac, sessionId))
5661 {
5662 if(pProfile->SSIDs.numOfSSIDs && !csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5663 {
5664 csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5665 }
5666 }
5667#ifdef FEATURE_WLAN_BTAMP_UT_RF
5668 pSession->maxRetryCount = CSR_JOIN_MAX_RETRY_COUNT;
5669#endif
5670 if(CSR_INVALID_SCANRESULT_HANDLE != hBssListIn)
5671 {
5672 smsLog(pMac, LOGW, FL("is called with BSSList\n"));
5673 status = csrRoamConnectWithBSSList(pMac, sessionId, pProfile, hBssListIn, pRoamId);
5674 if(pRoamId)
5675 {
5676 roamId = *pRoamId;
5677 }
5678 if(!HAL_STATUS_SUCCESS(status))
5679 {
5680 fCallCallback = eANI_BOOLEAN_TRUE;
5681 }
5682 }
5683 else
5684 {
5685 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5686 if(HAL_STATUS_SUCCESS(status))
5687 {
5688 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5689 //Try to connect to any BSS
5690 if(NULL == pProfile)
5691 {
5692 //No encryption
5693 pScanFilter->EncryptionType.numEntries = 1;
5694 pScanFilter->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5695 }//we don't have a profile
5696 else
5697 {
5698 //Here is the profile we need to connect to
5699 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5700 }//We have a profile
5701 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5702 if(pRoamId)
5703 {
5704 *pRoamId = roamId;
5705 }
5706
5707 if(HAL_STATUS_SUCCESS(status))
5708 {
5709 /*Save the WPS info*/
5710 if(NULL != pProfile)
5711 {
5712 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
5713 }
5714 else
5715 {
5716 pScanFilter->bWPSAssociation = 0;
5717 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005718 do
5719 {
5720 if( (pProfile && CSR_IS_WDS_AP( pProfile ) )
5721#ifdef WLAN_SOFTAP_FEATURE
5722 || (pProfile && CSR_IS_INFRA_AP ( pProfile ))
5723#endif
5724 )
5725 {
5726 //This can be start right away
5727 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5728 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5729 if(!HAL_STATUS_SUCCESS(status))
5730 {
5731 fCallCallback = eANI_BOOLEAN_TRUE;
5732 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005733 break;
5734 }
5735 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
Mohit Khanna23863762012-09-11 17:40:09 -07005736 smsLog(pMac, LOG1, "************ csrScanGetResult Status ********* %d\n", status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005737 if(HAL_STATUS_SUCCESS(status))
5738 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005739 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5740 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5741 if(!HAL_STATUS_SUCCESS(status))
5742 {
5743 csrScanResultPurge(pMac, hBSSList);
5744 fCallCallback = eANI_BOOLEAN_TRUE;
5745 }
5746 }//Have scan result
5747 else if(NULL != pProfile)
5748 {
5749 //Check whether it is for start ibss
5750 if(CSR_IS_START_IBSS(pProfile))
5751 {
5752 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5753 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5754 if(!HAL_STATUS_SUCCESS(status))
5755 {
5756 smsLog(pMac, LOGE, " CSR failed to issue startIBSS command with status = 0x%08X\n", status);
5757 fCallCallback = eANI_BOOLEAN_TRUE;
5758 }
5759 }
5760 else
5761 {
5762 //scan for this SSID
5763 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5764 if(!HAL_STATUS_SUCCESS(status))
5765 {
5766 fCallCallback = eANI_BOOLEAN_TRUE;
5767 }
5768 }
5769 }
5770 else
5771 {
5772 fCallCallback = eANI_BOOLEAN_TRUE;
5773 }
5774 } while (0);
5775 if(NULL != pProfile)
5776 {
5777 //we need to free memory for filter if profile exists
5778 csrFreeScanFilter(pMac, pScanFilter);
5779 }
5780 }//Got the scan filter from profile
5781
5782 palFreeMemory(pMac->hHdd, pScanFilter);
5783 }//allocated memory for pScanFilter
5784 }//No Bsslist coming in
5785 //tell the caller if we fail to trigger a join request
5786 if( fCallCallback )
5787 {
5788 csrRoamCallCallback(pMac, sessionId, NULL, roamId, eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5789 }
5790
5791 return (status);
5792}
Jeff Johnson295189b2012-06-20 16:38:30 -07005793eHalStatus csrRoamReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5794 tCsrRoamModifyProfileFields modProfileFields,
5795 tANI_U32 *pRoamId)
5796{
5797 eHalStatus status = eHAL_STATUS_SUCCESS;
5798 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_TRUE;
5799 tANI_U32 roamId = 0;
5800 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005801 if (NULL == pProfile)
5802 {
5803 smsLog(pMac, LOGP, FL("No profile specified"));
5804 return eHAL_STATUS_FAILURE;
5805 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005806 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"), pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
5807 csrRoamCancelRoaming(pMac, sessionId);
5808 csrScanRemoveFreshScanCommand(pMac, sessionId);
5809 csrScanCancelIdleScan(pMac);
5810 csrScanAbortMacScanNotForConnect(pMac);
5811 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssuedReassocToSameAP);
Jeff Johnson295189b2012-06-20 16:38:30 -07005812 if(csrIsConnStateConnected(pMac, sessionId))
5813 {
5814 if(pProfile)
5815 {
5816 if(pProfile->SSIDs.numOfSSIDs &&
5817 csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5818 {
5819 fCallCallback = eANI_BOOLEAN_FALSE;
5820 }
5821 else
5822 {
5823 smsLog(pMac, LOG1, FL("Not connected to the same SSID asked in the profile\n"));
5824 }
5825 }
5826 else if(!palEqualMemory(pMac->hHdd, &modProfileFields,
5827 &pSession->connectedProfile.modifyProfileFields,
5828 sizeof(tCsrRoamModifyProfileFields)))
5829 {
5830 fCallCallback = eANI_BOOLEAN_FALSE;
5831 }
5832 else
5833 {
5834 smsLog(pMac, LOG1, FL("Either the profile is NULL or none of the fields "
5835 "in tCsrRoamModifyProfileFields got modified\n"));
5836 }
5837 }
5838 else
5839 {
5840 smsLog(pMac, LOG1, FL("Not connected! No need to reassoc\n"));
5841 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005842 if(!fCallCallback)
5843 {
5844 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5845 if(pRoamId)
5846 {
5847 *pRoamId = roamId;
5848 }
5849
Jeff Johnson295189b2012-06-20 16:38:30 -07005850 status = csrRoamIssueReassoc(pMac, sessionId, pProfile, &modProfileFields,
5851 eCsrHddIssuedReassocToSameAP, roamId, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005852 }
5853 else
5854 {
5855 status = csrRoamCallCallback(pMac, sessionId, NULL, roamId,
5856 eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5857 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005858 return status;
5859}
Jeff Johnson295189b2012-06-20 16:38:30 -07005860eHalStatus csrRoamJoinLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5861{
5862 eHalStatus status = eHAL_STATUS_FAILURE;
5863 tScanResultHandle hBSSList = NULL;
5864 tCsrScanResultFilter *pScanFilter = NULL;
5865 tANI_U32 roamId;
5866 tCsrRoamProfile *pProfile = NULL;
5867 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07005868
5869 if(!pSession)
5870 {
5871 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
5872 return eHAL_STATUS_FAILURE;
5873 }
5874
Jeff Johnson295189b2012-06-20 16:38:30 -07005875 do
5876 {
5877 if(pSession->pCurRoamProfile)
5878 {
5879 csrScanCancelIdleScan(pMac);
5880 csrScanAbortMacScanNotForConnect(pMac);
5881 //We have to make a copy of pCurRoamProfile because it will be free inside csrRoamIssueConnect
5882 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile, sizeof(tCsrRoamProfile));
5883 if(!HAL_STATUS_SUCCESS(status))
5884 break;
5885 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamProfile));
5886 status = csrRoamCopyProfile(pMac, pProfile, pSession->pCurRoamProfile);
5887 if(!HAL_STATUS_SUCCESS(status))
5888 break;
5889 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5890 if(!HAL_STATUS_SUCCESS(status))
5891 {
5892 break;
5893 }
5894 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5895 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5896 if(!HAL_STATUS_SUCCESS(status))
5897 {
5898 break;
5899 }
5900 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5901 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
5902 if(HAL_STATUS_SUCCESS(status))
5903 {
5904 //we want to put the last connected BSS to the very beginning, if possible
5905 csrMoveBssToHeadFromBSSID(pMac, &pSession->connectedProfile.bssid, hBSSList);
5906 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5907 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5908 if(!HAL_STATUS_SUCCESS(status))
5909 {
5910 csrScanResultPurge(pMac, hBSSList);
5911 break;
5912 }
5913 }
5914 else
5915 {
5916 //Do a scan on this profile
5917 //scan for this SSID only in case the AP suppresses SSID
5918 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5919 if(!HAL_STATUS_SUCCESS(status))
5920 {
5921 break;
5922 }
5923 }
5924 }//We have a profile
5925 else
5926 {
5927 smsLog(pMac, LOGW, FL("cannot find a roaming profile\n"));
5928 break;
5929 }
5930 }while(0);
5931 if(pScanFilter)
5932 {
5933 csrFreeScanFilter(pMac, pScanFilter);
5934 palFreeMemory(pMac->hHdd, pScanFilter);
5935 }
5936 if(NULL != pProfile)
5937 {
5938 csrReleaseProfile(pMac, pProfile);
5939 palFreeMemory(pMac->hHdd, pProfile);
5940 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005941 return (status);
5942}
Jeff Johnson295189b2012-06-20 16:38:30 -07005943eHalStatus csrRoamReconnect(tpAniSirGlobal pMac, tANI_U32 sessionId)
5944{
5945 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005946 if(csrIsConnStateConnected(pMac, sessionId))
5947 {
5948 status = csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5949 if(HAL_STATUS_SUCCESS(status))
5950 {
5951 status = csrRoamJoinLastProfile(pMac, sessionId);
5952 }
5953 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005954 return (status);
5955}
5956
Jeff Johnson295189b2012-06-20 16:38:30 -07005957eHalStatus csrRoamConnectToLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5958{
5959 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005960 smsLog(pMac, LOGW, FL("is called\n"));
5961 csrRoamCancelRoaming(pMac, sessionId);
5962 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5963 if(csrIsConnStateDisconnected(pMac, sessionId))
5964 {
5965 status = csrRoamJoinLastProfile(pMac, sessionId);
5966 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005967 return (status);
5968}
5969
Jeff Johnson295189b2012-06-20 16:38:30 -07005970eHalStatus csrRoamProcessDisassocDeauth( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fDisassoc, tANI_BOOLEAN fMICFailure )
5971{
5972 eHalStatus status = eHAL_STATUS_SUCCESS;
5973 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
5974 eCsrRoamSubState NewSubstate;
5975 tANI_U32 sessionId = pCommand->sessionId;
5976
5977 // change state to 'Roaming'...
5978 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
5979
5980 if ( csrIsConnStateIbss( pMac, sessionId ) )
5981 {
5982 // If we are in an IBSS, then stop the IBSS...
5983 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
5984 fComplete = (!HAL_STATUS_SUCCESS(status));
5985 }
5986 else if ( csrIsConnStateInfra( pMac, sessionId ) )
5987 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07005988 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 -07005989 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
5990 //Restore AC weight in case we change it
5991 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
5992 // in Infrasturcture, we need to disassociate from the Infrastructure network...
5993 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_FORCED;
5994 if(eCsrSmeIssuedDisassocForHandoff == pCommand->u.roamCmd.roamReason)
5995 {
5996 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF;
5997 }
5998 if( fDisassoc )
5999 {
6000 status = csrRoamIssueDisassociate( pMac, sessionId, NewSubstate, fMICFailure );
6001 }
6002 else
6003 {
6004 status = csrRoamIssueDeauth( pMac, sessionId, eCSR_ROAM_SUBSTATE_DEAUTH_REQ );
6005 }
6006 fComplete = (!HAL_STATUS_SUCCESS(status));
6007 }
6008 else if ( csrIsConnStateWds( pMac, sessionId ) )
6009 {
6010 if( CSR_IS_WDS_AP( &pMac->roam.roamSession[sessionId].connectedProfile ) )
6011 {
6012 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
6013 fComplete = (!HAL_STATUS_SUCCESS(status));
6014 }
6015 //This has to be WDS station
6016 else if( csrIsConnStateConnectedWds( pMac, sessionId ) ) //This has to be WDS station
6017 {
6018
6019 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6020 if( fDisassoc )
6021 {
6022 status = csrRoamIssueDisassociate( pMac, sessionId,
6023 eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, fMICFailure );
6024 fComplete = (!HAL_STATUS_SUCCESS(status));
6025 }
6026 }
6027 } else {
6028 // we got a dis-assoc request while not connected to any peer
6029 // just complete the command
6030 fComplete = eANI_BOOLEAN_TRUE;
6031 status = eHAL_STATUS_FAILURE;
6032 }
6033 if(fComplete)
6034 {
6035 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6036 }
6037
6038 if(HAL_STATUS_SUCCESS(status))
6039 {
6040 if ( csrIsConnStateInfra( pMac, sessionId ) )
6041 {
6042 //Set the state to disconnect here
6043 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6044 }
6045 }
6046 return (status);
6047}
6048
Jeff Johnson295189b2012-06-20 16:38:30 -07006049/* This is been removed from latest code base */
6050/*
6051static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand )
6052{
6053 eHalStatus status;
6054 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07006055 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING );
6056 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
Jeff Johnson295189b2012-06-20 16:38:30 -07006057 return ( status );
6058}
6059*/
6060
Jeff Johnson295189b2012-06-20 16:38:30 -07006061eHalStatus csrRoamIssueDisassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason )
6062{
6063 eHalStatus status = eHAL_STATUS_SUCCESS;
6064 tSmeCmd *pCommand;
6065 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006066 do
6067 {
6068 smsLog( pMac, LOGE, FL(" reason = %d\n"), reason );
6069 pCommand = csrGetCommandBuffer( pMac );
6070 if ( !pCommand )
6071 {
6072 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6073 status = eHAL_STATUS_RESOURCES;
6074 break;
6075 }
6076 //Change the substate in case it is wait-for-key
6077 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6078 {
6079 csrRoamStopWaitForKeyTimer( pMac );
6080 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6081 }
6082 pCommand->command = eSmeCommandRoam;
6083 pCommand->sessionId = (tANI_U8)sessionId;
6084 switch ( reason )
6085 {
6086 case eCSR_DISCONNECT_REASON_MIC_ERROR:
6087 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocMICFailure;
6088 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006089 case eCSR_DISCONNECT_REASON_DEAUTH:
6090 pCommand->u.roamCmd.roamReason = eCsrForcedDeauth;
6091 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006092 case eCSR_DISCONNECT_REASON_HANDOFF:
6093 fHighPriority = eANI_BOOLEAN_TRUE;
6094 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedDisassocForHandoff;
6095 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006096 case eCSR_DISCONNECT_REASON_UNSPECIFIED:
6097 case eCSR_DISCONNECT_REASON_DISASSOC:
6098 pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc;
6099 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006100 case eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE:
6101 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedIbssJoinFailure;
6102 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006103 case eCSR_DISCONNECT_REASON_IBSS_LEAVE:
6104 pCommand->u.roamCmd.roamReason = eCsrForcedIbssLeave;
6105 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006106 default:
6107 break;
6108 }
6109 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6110 if( !HAL_STATUS_SUCCESS( status ) )
6111 {
6112 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6113 csrReleaseCommandRoam( pMac, pCommand );
6114 }
6115 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07006116 return( status );
6117}
6118
Jeff Johnson295189b2012-06-20 16:38:30 -07006119eHalStatus csrRoamIssueStopBssCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN fHighPriority )
6120{
6121 eHalStatus status = eHAL_STATUS_SUCCESS;
6122 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006123 pCommand = csrGetCommandBuffer( pMac );
6124 if ( NULL != pCommand )
6125 {
6126 //Change the substate in case it is wait-for-key
6127 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
6128 {
6129 csrRoamStopWaitForKeyTimer( pMac );
6130 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6131 }
6132 pCommand->command = eSmeCommandRoam;
6133 pCommand->sessionId = (tANI_U8)sessionId;
6134 pCommand->u.roamCmd.roamReason = eCsrStopBss;
6135 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6136 if( !HAL_STATUS_SUCCESS( status ) )
6137 {
6138 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6139 csrReleaseCommandRoam( pMac, pCommand );
6140 }
6141 }
6142 else
6143 {
6144 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6145 status = eHAL_STATUS_RESOURCES;
6146 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006147 return ( status );
6148}
6149
Jeff Johnson295189b2012-06-20 16:38:30 -07006150eHalStatus csrRoamDisconnectInternal(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6151{
6152 eHalStatus status = eHAL_STATUS_SUCCESS;
6153 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006154
6155 if(!pSession)
6156 {
6157 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6158 return eHAL_STATUS_FAILURE;
6159 }
6160
Jeff Johnson295189b2012-06-20 16:38:30 -07006161#ifdef FEATURE_WLAN_BTAMP_UT_RF
6162 //Stop te retry
6163 pSession->maxRetryCount = 0;
6164 csrRoamStopJoinRetryTimer(pMac, sessionId);
6165#endif
6166 //Not to call cancel roaming here
6167 //Only issue disconnect when necessary
6168 if(csrIsConnStateConnected(pMac, sessionId) || csrIsBssTypeIBSS(pSession->connectedProfile.BSSType)
6169 || csrIsBssTypeWDS(pSession->connectedProfile.BSSType)
6170 || csrIsRoamCommandWaitingForSession(pMac, sessionId) )
6171
6172 {
6173 smsLog(pMac, LOG2, FL("called\n"));
6174 status = csrRoamIssueDisassociateCmd(pMac, sessionId, reason);
6175 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006176 return (status);
6177}
6178
Jeff Johnson295189b2012-06-20 16:38:30 -07006179eHalStatus csrRoamDisconnect(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6180{
6181 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006182
6183 if(!pSession)
6184 {
6185 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6186 return eHAL_STATUS_FAILURE;
6187 }
6188
Jeff Johnson295189b2012-06-20 16:38:30 -07006189 csrRoamCancelRoaming(pMac, sessionId);
6190 pSession->ibss_join_pending = FALSE;
6191 csrRoamStopIbssJoinTimer(pMac, sessionId);
6192 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrForcedDisassoc);
6193
6194 return (csrRoamDisconnectInternal(pMac, sessionId, reason));
6195}
6196
Jeff Johnson295189b2012-06-20 16:38:30 -07006197eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
6198 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes)
6199{
6200 eHalStatus status = eHAL_STATUS_SUCCESS;
6201 tDot11fBeaconIEs *pIesTemp = pIes;
6202 tANI_U8 index;
6203 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
6204 tCsrRoamConnectedProfile *pConnectProfile = &pSession->connectedProfile;
Jeff Johnson32d95a32012-09-10 13:15:23 -07006205
6206 if(!pSession)
6207 {
6208 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6209 return eHAL_STATUS_FAILURE;
6210 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006211
6212 palZeroMemory(pMac->hHdd, &pSession->connectedProfile, sizeof(tCsrRoamConnectedProfile));
6213 pConnectProfile->AuthType = pProfile->negotiatedAuthType;
6214 pConnectProfile->AuthInfo = pProfile->AuthType;
6215 pConnectProfile->CBMode = pProfile->CBMode; //*** this may not be valid
6216 pConnectProfile->EncryptionType = pProfile->negotiatedUCEncryptionType;
6217 pConnectProfile->EncryptionInfo = pProfile->EncryptionType;
6218 pConnectProfile->mcEncryptionType = pProfile->negotiatedMCEncryptionType;
6219 pConnectProfile->mcEncryptionInfo = pProfile->mcEncryptionType;
6220 pConnectProfile->BSSType = pProfile->BSSType;
6221 pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask;
6222 pConnectProfile->operationChannel = pSirBssDesc->channelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07006223 pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval;
6224
Jeff Johnson295189b2012-06-20 16:38:30 -07006225 palCopyMemory(pMac->hHdd, &pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys));
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07006226 /* saving the addional IE`s like Hot spot indication element and extended capabilities */
6227 if(pProfile->nAddIEAssocLength)
6228 {
6229 status = palAllocateMemory(pMac->hHdd,
6230 (void **)&pConnectProfile->pAddIEAssoc, pProfile->nAddIEAssocLength);
6231 if(!HAL_STATUS_SUCCESS(status))
6232 {
6233 smsLog(pMac, LOGE, FL("Failed to allocate memory for additional IEs")) ;
6234 return eHAL_STATUS_FAILURE;
6235 }
6236 pConnectProfile->nAddIEAssocLength = pProfile->nAddIEAssocLength;
6237 palCopyMemory(pMac->hHdd, pConnectProfile->pAddIEAssoc, pProfile->pAddIEAssoc,
6238 pProfile->nAddIEAssocLength);
6239 }
6240
Jeff Johnson295189b2012-06-20 16:38:30 -07006241 //Save bssid
6242 csrGetBssIdBssDesc(pMac, pSirBssDesc, &pConnectProfile->bssid);
6243#ifdef WLAN_FEATURE_VOWIFI_11R
6244 if (pSirBssDesc->mdiePresent)
6245 {
6246 pConnectProfile->MDID.mdiePresent = 1;
6247 pConnectProfile->MDID.mobilityDomain = (pSirBssDesc->mdie[1] << 8) | (pSirBssDesc->mdie[0]);
6248 }
6249#endif
6250#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006251 if ((csrIsProfileCCX(pProfile) ||
6252 ((pIesTemp->CCXVersion.present)
6253 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
6254 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
6255 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
6256 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
6257 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
6258 && (!(csrIsProfile11r( pProfile )))
6259 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -07006260 {
6261 pConnectProfile->isCCXAssoc = 1;
6262 }
6263#endif
6264 //save ssid
6265 if( NULL == pIesTemp )
6266 {
6267 status = csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesTemp);
6268 }
6269 if(HAL_STATUS_SUCCESS(status))
6270 {
6271 if(pIesTemp->SSID.present)
6272 {
6273 pConnectProfile->SSID.length = pIesTemp->SSID.num_ssid;
6274 palCopyMemory(pMac->hHdd, pConnectProfile->SSID.ssId,
6275 pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid);
6276 }
6277
6278 //Save the bss desc
6279 status = csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006280 if( CSR_IS_QOS_BSS(pIesTemp) )
6281 {
6282 pConnectProfile->qap = TRUE;
6283 }
6284 else
6285 {
6286 pConnectProfile->qap = FALSE;
6287 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006288 if ( NULL == pIes )
6289 {
6290 //Free memory if it allocated locally
6291 palFreeMemory(pMac->hHdd, pIesTemp);
6292 }
6293 }
6294 //Save Qos connection
6295 pConnectProfile->qosConnection = pMac->roam.roamSession[sessionId].fWMMConnection;
6296
6297 if(!HAL_STATUS_SUCCESS(status))
6298 {
6299 csrFreeConnectBssDesc(pMac, sessionId);
6300 }
6301 for(index = 0; index < pProfile->SSIDs.numOfSSIDs; index++)
6302 {
6303 if((pProfile->SSIDs.SSIDList[index].SSID.length == pConnectProfile->SSID.length) &&
6304 palEqualMemory(pMac->hHdd, pProfile->SSIDs.SSIDList[index].SSID.ssId,
6305 pConnectProfile->SSID.ssId, pConnectProfile->SSID.length))
6306 {
6307 pConnectProfile->handoffPermitted = pProfile->SSIDs.SSIDList[index].handoffPermitted;
6308 break;
6309 }
6310 pConnectProfile->handoffPermitted = FALSE;
6311 }
6312
6313 return (status);
6314}
6315
Jeff Johnson295189b2012-06-20 16:38:30 -07006316static void csrRoamJoinRspProcessor( tpAniSirGlobal pMac, tSirSmeJoinRsp *pSmeJoinRsp )
6317{
6318 tListElem *pEntry = NULL;
6319 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006320 //The head of the active list is the request we sent
6321 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6322 if(pEntry)
6323 {
6324 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6325 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006326 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6327 {
6328 if(pCommand && eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason)
6329 {
6330#ifndef WLAN_MDM_CODE_REDUCTION_OPT
6331 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6332#endif
6333 }
6334 csrRoamComplete( pMac, eCsrJoinSuccess, (void *)pSmeJoinRsp );
6335 }
6336 else
6337 {
6338 tANI_U32 roamId = 0;
6339 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pSmeJoinRsp->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006340 if(!pSession)
6341 {
6342 smsLog(pMac, LOGE, FL(" session %d not found "), pSmeJoinRsp->sessionId);
6343 return;
6344 }
6345
Jeff Johnson295189b2012-06-20 16:38:30 -07006346
6347 //The head of the active list is the request we sent
6348 //Try to get back the same profile and roam again
6349 if(pCommand)
6350 {
6351 roamId = pCommand->u.roamCmd.roamId;
6352 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006353 pSession->joinFailStatusCode.statusCode = pSmeJoinRsp->statusCode;
6354 pSession->joinFailStatusCode.reasonCode = pSmeJoinRsp->protStatusCode;
6355 smsLog( pMac, LOGW, "SmeJoinReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6356#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6357 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
6358 if (csrRoamIsHandoffInProgress(pMac))
6359 {
6360 csrRoamCallCallback(pMac, pSmeJoinRsp->sessionId, NULL, roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
6361 /* Should indicate neighbor roam algorithm about the connect failure here */
6362 csrNeighborRoamIndicateConnect(pMac, pSmeJoinRsp->sessionId, VOS_STATUS_E_FAILURE);
6363 }
6364#endif
6365 if (pCommand)
6366 {
6367 if(CSR_IS_WDS_STA( &pCommand->u.roamCmd.roamProfile ))
6368 {
6369 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6370 pSession->connectedProfile.BSSType = eCSR_BSS_TYPE_WDS_STA;
6371 csrRoamReissueRoamCommand(pMac);
6372 }
6373 else if( CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile ) )
6374 {
6375 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6376 }
6377 else
6378 {
6379 csrRoam(pMac, pCommand);
6380 }
6381 }
6382 else
6383 {
6384 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6385 }
6386 } /*else: ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode ) */
6387}
6388
Jeff Johnson295189b2012-06-20 16:38:30 -07006389eHalStatus csrRoamIssueJoin( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6390 tDot11fBeaconIEs *pIes,
6391 tCsrRoamProfile *pProfile, tANI_U32 roamId )
6392{
6393 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006394 smsLog( pMac, LOG1, "Attempting to Join Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
6395 pSirBssDesc->bssId[ 0 ],pSirBssDesc->bssId[ 1 ],pSirBssDesc->bssId[ 2 ],
6396 pSirBssDesc->bssId[ 3 ],pSirBssDesc->bssId[ 4 ],pSirBssDesc->bssId[ 5 ] );
6397
6398 // Set the roaming substate to 'join attempt'...
6399 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006400 // attempt to Join this BSS...
6401 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07006402 return (status);
6403}
6404
Jeff Johnson295189b2012-06-20 16:38:30 -07006405static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6406 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile)
6407{
6408 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006409 // Set the roaming substate to 'join attempt'...
6410 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_REASSOC_REQ, sessionId );
6411
6412 smsLog(pMac, LOGE, FL(" calling csrSendSmeReassocReqMsg\n"));
6413
6414 // attempt to Join this BSS...
6415 return csrSendSmeReassocReqMsg( pMac, sessionId, pSirBssDesc, pIes, pProfile );
6416}
6417
Jeff Johnson295189b2012-06-20 16:38:30 -07006418void csrRoamReissueRoamCommand(tpAniSirGlobal pMac)
6419{
6420 tListElem *pEntry;
6421 tSmeCmd *pCommand;
6422 tCsrRoamInfo roamInfo;
6423 tANI_U32 sessionId;
6424 tCsrRoamSession *pSession;
6425
6426 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6427 if(pEntry)
6428 {
6429 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6430 if ( eSmeCommandRoam == pCommand->command )
6431 {
6432 sessionId = pCommand->sessionId;
6433 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006434
6435 if(!pSession)
6436 {
6437 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6438 return;
6439 }
6440
Jeff Johnson295189b2012-06-20 16:38:30 -07006441 if( pCommand->u.roamCmd.fStopWds )
6442 {
6443 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
6444 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
6445 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
6446 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
6447#ifdef WLAN_SOFTAP_FEATURE
6448 if (CSR_IS_WDS(&pSession->connectedProfile)){
6449#endif
6450 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
6451 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6452 eCSR_ROAM_WDS_IND,
6453 eCSR_ROAM_RESULT_WDS_DISASSOCIATED);
6454#ifdef WLAN_SOFTAP_FEATURE
6455 }else if (CSR_IS_INFRA_AP(&pSession->connectedProfile)){
6456 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
6457 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6458 eCSR_ROAM_INFRA_IND,
6459 eCSR_ROAM_RESULT_INFRA_DISASSOCIATED);
6460 }
6461
6462#endif
6463
Jeff Johnson295189b2012-06-20 16:38:30 -07006464 if( !HAL_STATUS_SUCCESS( csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ ) ) )
6465 {
6466 smsLog(pMac, LOGE, " Failed to reissue stop_bss command for WDS after disassociated\n");
6467 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6468 }
6469 }
6470 else if(eCsrStopRoaming == csrRoamJoinNextBss(pMac, pCommand, eANI_BOOLEAN_TRUE))
6471 {
6472 smsLog(pMac, LOGW, " Failed to reissue join command after disassociated\n");
6473 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6474 }
6475 }
6476 else
6477 {
6478 smsLog(pMac, LOGW, " Command is not roaming after disassociated\n");
6479 }
6480 }
6481 else
6482 {
6483 smsLog(pMac, LOGE, " Disassoc rsp cannot continue because no command is available\n");
6484 }
6485}
6486
Jeff Johnson295189b2012-06-20 16:38:30 -07006487tANI_BOOLEAN csrIsRoamCommandWaitingForSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
6488{
6489 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6490 tListElem *pEntry;
6491 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006492 //alwasy lock active list before locking pending list
6493 csrLLLock( &pMac->sme.smeCmdActiveList );
6494 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6495 if(pEntry)
6496 {
6497 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6498 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6499 {
6500 fRet = eANI_BOOLEAN_TRUE;
6501 }
6502 }
6503 if(eANI_BOOLEAN_FALSE == fRet)
6504 {
6505 csrLLLock(&pMac->sme.smeCmdPendingList);
6506 pEntry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK);
6507 while(pEntry)
6508 {
6509 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6510 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6511 {
6512 fRet = eANI_BOOLEAN_TRUE;
6513 break;
6514 }
6515 pEntry = csrLLNext(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK);
6516 }
6517 csrLLUnlock(&pMac->sme.smeCmdPendingList);
6518 }
6519 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006520 return (fRet);
6521}
6522
Jeff Johnson295189b2012-06-20 16:38:30 -07006523tANI_BOOLEAN csrIsRoamCommandWaiting(tpAniSirGlobal pMac)
6524{
6525 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6526 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07006527 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
6528 {
6529 if( CSR_IS_SESSION_VALID( pMac, i ) && ( fRet = csrIsRoamCommandWaitingForSession( pMac, i ) ) )
6530 {
6531 break;
6532 }
6533 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006534 return ( fRet );
6535}
6536
Jeff Johnson295189b2012-06-20 16:38:30 -07006537tANI_BOOLEAN csrIsCommandWaiting(tpAniSirGlobal pMac)
6538{
6539 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006540 //alwasy lock active list before locking pending list
6541 csrLLLock( &pMac->sme.smeCmdActiveList );
6542 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6543 if(eANI_BOOLEAN_FALSE == fRet)
6544 {
6545 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
6546 }
6547 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006548 return (fRet);
6549}
6550
Jeff Johnson295189b2012-06-20 16:38:30 -07006551tANI_BOOLEAN csrIsScanForRoamCommandActive( tpAniSirGlobal pMac )
6552{
6553 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6554 tListElem *pEntry;
6555 tCsrCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006556 //alwasy lock active list before locking pending list
6557 csrLLLock( &pMac->sme.smeCmdActiveList );
6558 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6559 if( pEntry )
6560 {
6561 pCommand = GET_BASE_ADDR(pEntry, tCsrCmd, Link);
6562 if( ( eCsrRoamCommandScan == pCommand->command ) &&
6563 ( ( eCsrScanForSsid == pCommand->u.scanCmd.reason ) ||
6564 ( eCsrScanForCapsChange == pCommand->u.scanCmd.reason ) ||
6565 ( eCsrScanP2PFindPeer == pCommand->u.scanCmd.reason ) ) )
6566 {
6567 fRet = eANI_BOOLEAN_TRUE;
6568 }
6569 }
6570 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006571 return (fRet);
6572}
Jeff Johnson295189b2012-06-20 16:38:30 -07006573eHalStatus csrRoamIssueReassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId )
6574{
6575 eHalStatus status = eHAL_STATUS_SUCCESS;
6576 tSmeCmd *pCommand = NULL;
6577 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_TRUE;
6578 tANI_BOOLEAN fRemoveCmd = FALSE;
6579 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -07006580 // Delete the old assoc command. All is setup for reassoc to be serialized
6581 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6582 if ( pEntry )
6583 {
6584 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
6585 if ( !pCommand )
6586 {
6587 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6588 return eHAL_STATUS_RESOURCES;
6589 }
6590 if ( eSmeCommandRoam == pCommand->command )
6591 {
6592 if (pCommand->u.roamCmd.roamReason == eCsrSmeIssuedAssocToSimilarAP)
6593 {
6594 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
6595 }
6596 else
6597 {
6598 smsLog( pMac, LOGE, FL(" Unexpected active roam command present \n") );
6599 }
6600 if (fRemoveCmd == FALSE)
6601 {
6602 // Implies we did not get the serialized assoc command we
6603 // were expecting
6604 pCommand = NULL;
6605 }
6606 }
6607 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006608 if(NULL == pCommand)
6609 {
6610 smsLog( pMac, LOGE, FL(" fail to get command buffer as expected based on previous connect roam command\n") );
6611 return eHAL_STATUS_RESOURCES;
6612 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006613 do
6614 {
6615 //Change the substate in case it is wait-for-key
6616 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6617 {
6618 csrRoamStopWaitForKeyTimer( pMac );
6619 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
6620 }
6621 pCommand->command = eSmeCommandRoam;
6622 pCommand->sessionId = (tANI_U8)sessionId;
6623 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedFTReassoc;
Jeff Johnson295189b2012-06-20 16:38:30 -07006624 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6625 if( !HAL_STATUS_SUCCESS( status ) )
6626 {
6627 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6628 csrReleaseCommandRoam( pMac, pCommand );
6629 }
6630 } while( 0 );
6631
Jeff Johnson295189b2012-06-20 16:38:30 -07006632 return( status );
6633}
6634static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result )
6635{
6636 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6637 tCsrScanResult *pScanResult = NULL;
6638 tSirBssDescription *pBssDesc = NULL;
6639 tSmeCmd *pCommand = NULL;
6640 tANI_U32 sessionId;
6641 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07006642 if(NULL == pEntry)
6643 {
6644 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
6645 return;
6646 }
6647 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6648 sessionId = pCommand->sessionId;
6649 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006650
6651 if(!pSession)
6652 {
6653 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6654 return;
6655 }
6656
Jeff Johnson295189b2012-06-20 16:38:30 -07006657 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
6658 {
6659 //the roaming is cancelled. Simply complete the command
6660 smsLog(pMac, LOGW, FL(" Roam command cancelled\n"));
6661 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
6662 }
6663 else
6664 {
6665 if ( CCM_IS_RESULT_SUCCESS(result) )
6666 {
6667 smsLog(pMac, LOG2, "Cfg sequence complete\n");
6668 // Successfully set the configuration parameters for the new Bss. Attempt to
6669 // join the roaming Bss.
6670 if(pCommand->u.roamCmd.pRoamBssEntry)
6671 {
6672 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
6673 pBssDesc = &pScanResult->Result.BssDescriptor;
6674 }
6675 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) ||
6676 CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile )
6677#ifdef WLAN_SOFTAP_FEATURE
6678 || CSR_IS_INFRA_AP(&pCommand->u.roamCmd.roamProfile)
6679#endif
6680 )
6681 {
6682 if(!HAL_STATUS_SUCCESS(csrRoamIssueStartBss( pMac, sessionId,
6683 &pSession->bssParams, &pCommand->u.roamCmd.roamProfile,
6684 pBssDesc, pCommand->u.roamCmd.roamId )))
6685 {
6686 smsLog(pMac, LOGW, " CSR start BSS failed\n");
6687 //We need to complete the command
6688 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6689 }
6690 }
6691 else
6692 {
6693 if (!pCommand->u.roamCmd.pRoamBssEntry)
6694 {
6695 smsLog(pMac, LOGW, " pRoamBssEntry is NULL\n");
6696 //We need to complete the command
6697 csrRoamComplete(pMac, eCsrJoinFailure, NULL);
6698 return;
6699 }
6700 // If we are roaming TO an Infrastructure BSS...
6701 VOS_ASSERT(pScanResult != NULL);
6702 if ( csrIsInfraBssDesc( pBssDesc ) )
6703 {
6704 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07006705 if(pIesLocal || (HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
6706 {
6707 // ..and currently in an Infrastructure connection....
6708 if( csrIsConnStateConnectedInfra( pMac, sessionId ) )
6709 {
6710 // ...and the SSIDs are equal, then we Reassoc.
6711 if ( csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc,
6712 pIesLocal ) )
6713 // ..and currently in an infrastructure connection
6714 {
6715 // then issue a Reassoc.
6716 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
6717 csrRoamIssueReassociate( pMac, sessionId, pBssDesc, pIesLocal,
6718 &pCommand->u.roamCmd.roamProfile );
6719 }
6720 else
6721 {
6722
6723 // otherwise, we have to issue a new Join request to LIM because we disassociated from the
6724 // previously associated AP.
6725 if(!HAL_STATUS_SUCCESS(csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6726 pIesLocal,
6727 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId )))
6728 {
6729 //try something else
6730 csrRoam( pMac, pCommand );
6731 }
6732 }
6733 }
6734 else
6735 {
6736 eHalStatus status = eHAL_STATUS_SUCCESS;
6737
6738 /* We need to come with other way to figure out that this is because of HO in BMP
6739 The below API will be only available for Android as it uses a different HO algorithm */
6740 /* Reassoc request will be used only for CCX and 11r handoff whereas other legacy roaming should
6741 * use join request */
6742#ifdef WLAN_FEATURE_VOWIFI_11R
6743 if (csrRoamIsHandoffInProgress(pMac) &&
6744 csrRoamIs11rAssoc(pMac))
6745 {
6746 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
6747 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
6748 }
6749 else
6750#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006751#ifdef FEATURE_WLAN_CCX
6752 if (csrRoamIsHandoffInProgress(pMac) &&
6753 csrRoamIsCCXAssoc(pMac))
6754 {
6755 // Now serialize the reassoc command.
6756 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6757 }
6758 else
6759#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006760#ifdef FEATURE_WLAN_LFR
6761 if (csrRoamIsHandoffInProgress(pMac) &&
6762 csrRoamIsFastRoamEnabled(pMac))
6763 {
6764 // Now serialize the reassoc command.
6765 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6766 }
6767 else
6768#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006769 // else we are not connected and attempting to Join. Issue the
6770 // Join request.
6771 {
6772 status = csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6773 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ),
6774 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId );
6775 }
6776 if(!HAL_STATUS_SUCCESS(status))
6777 {
6778 //try something else
6779 csrRoam( pMac, pCommand );
6780 }
6781 }
6782 if( !pScanResult->Result.pvIes )
6783 {
6784 //Locally allocated
6785 palFreeMemory(pMac->hHdd, pIesLocal);
6786 }
6787 }
6788 }//if ( csrIsInfraBssDesc( pBssDesc ) )
6789 else
6790 {
6791 smsLog(pMac, LOGW, FL(" found BSSType mismatching the one in BSS description\n"));
6792 }
6793 }//else
6794 }//if ( WNI_CFG_SUCCESS == result )
6795 else
6796 {
6797 // In the event the configuration failed, for infra let the roam processor
6798 //attempt to join something else...
6799 if( pCommand->u.roamCmd.pRoamBssEntry && CSR_IS_INFRASTRUCTURE( &pCommand->u.roamCmd.roamProfile ) )
6800 {
6801 csrRoam(pMac, pCommand);
6802 }
6803 else
6804 {
6805 //We need to complete the command
6806 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) )
6807 {
6808 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6809 }
6810 else
6811 {
6812 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6813 }
6814 }
6815 }
6816 }//we have active entry
6817}
6818
Jeff Johnson295189b2012-06-20 16:38:30 -07006819static void csrRoamRoamingStateAuthRspProcessor( tpAniSirGlobal pMac, tSirSmeAuthRsp *pSmeAuthRsp )
6820{
6821 //No one is sending eWNI_SME_AUTH_REQ to PE.
6822 smsLog(pMac, LOGW, FL("is no-op\n"));
6823 if ( eSIR_SME_SUCCESS == pSmeAuthRsp->statusCode )
6824 {
6825 smsLog( pMac, LOGW, "CSR SmeAuthReq Successful\n" );
6826 // Successfully authenticated with a new Bss. Attempt to stop the current Bss and
6827 // join the new one...
6828 /***pBssDesc = profGetRoamingBssDesc( pAdapter, &pHddProfile );
Jeff Johnson295189b2012-06-20 16:38:30 -07006829 roamStopNetwork( pAdapter, &pBssDesc->SirBssDescription );***/
6830 }
6831 else {
6832 smsLog( pMac, LOGW, "CSR SmeAuthReq failed with statusCode= 0x%08lX [%d]\n", pSmeAuthRsp->statusCode, pSmeAuthRsp->statusCode );
6833 /***profHandleLostLinkAfterReset(pAdapter);
6834 // In the event the authenticate fails, let the roam processor attempt to join something else...
6835 roamRoam( pAdapter );***/
6836 }
6837}
6838
Jeff Johnson295189b2012-06-20 16:38:30 -07006839static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSmeJoinRsp pSmeJoinRsp )
6840{
6841 eCsrRoamCompleteResult result;
6842 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
6843 tCsrRoamInfo roamInfo;
6844 tANI_U32 roamId = 0;
6845
6846 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6847 {
6848 smsLog( pMac, LOGW, "CSR SmeReassocReq Successful\n" );
6849 result = eCsrReassocSuccess;
Jeff Johnson295189b2012-06-20 16:38:30 -07006850 /* Defeaturize this part later if needed */
6851#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
6852 /* Since the neighbor roam algorithm uses reassoc req for handoff instead of join,
6853 * we need the response contents while processing the result in csrRoamProcessResults() */
6854 if (csrRoamIsHandoffInProgress(pMac))
6855 {
6856 /* Need to dig more on indicating events to SME QoS module */
6857 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6858 csrRoamComplete( pMac, result, pSmeJoinRsp);
6859 }
6860 else
6861#endif
6862 {
6863 csrRoamComplete( pMac, result, NULL );
6864 }
6865 }
6866 /* Should we handle this similar to handling the join failure? Is it ok
6867 * to call csrRoamComplete() with state as CsrJoinFailure */
6868 else
6869 {
6870 smsLog( pMac, LOGW, "CSR SmeReassocReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6871 result = eCsrReassocFailure;
6872#ifdef WLAN_FEATURE_VOWIFI_11R
6873 if ((eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE == pSmeJoinRsp->statusCode) ||
6874 (eSIR_SME_FT_REASSOC_FAILURE == pSmeJoinRsp->statusCode))
6875 {
6876 // Inform HDD to turn off FT flag in HDD
6877 if (pNeighborRoamInfo)
6878 {
6879 vos_mem_zero(&roamInfo, sizeof(tCsrRoamInfo));
6880 csrRoamCallCallback(pMac, pNeighborRoamInfo->csrSessionId,
6881 &roamInfo, roamId, eCSR_ROAM_FT_REASSOC_FAILED, eSIR_SME_SUCCESS);
Madan Mohan Koyyalamudi57772162012-10-18 19:46:14 -07006882 /*
6883 * Since the above callback sends a disconnect
6884 * to HDD, we should clean-up our state
6885 * machine as well to be in sync with the upper
6886 * layers. There is no need to send a disassoc
6887 * since: 1) we will never reassoc to the current
6888 * AP in LFR, and 2) there is no need to issue a
6889 * disassoc to the AP with which we were trying
6890 * to reassoc.
6891 */
6892 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6893 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07006894 }
6895 }
6896#endif
6897 // In the event that the Reassociation fails, then we need to Disassociate the current association and keep
6898 // roaming. Note that we will attempt to Join the AP instead of a Reassoc since we may have attempted a
6899 // 'Reassoc to self', which AP's that don't support Reassoc will force a Disassoc.
6900 //The disassoc rsp message will remove the command from active list
6901 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, pSmeJoinRsp->sessionId,
6902 eCSR_ROAM_SUBSTATE_DISASSOC_REASSOC_FAILURE, FALSE )))
6903 {
6904 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6905 }
6906 }
6907}
6908
Jeff Johnson295189b2012-06-20 16:38:30 -07006909static void csrRoamRoamingStateStopBssRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSmeRsp)
6910{
Jeff Johnson295189b2012-06-20 16:38:30 -07006911#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
6912 {
6913 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07006914 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
6915 if(pIbssLog)
6916 {
6917 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_RSP;
6918 if(eSIR_SME_SUCCESS != pSmeRsp->statusCode)
6919 {
6920 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
6921 }
6922 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
6923 }
6924 }
6925#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07006926 pMac->roam.roamSession[pSmeRsp->sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6927 if(CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, pSmeRsp->sessionId))
6928 {
6929 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6930 }
6931 else if(CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId))
6932 {
6933 csrRoamReissueRoamCommand(pMac);
6934 }
6935}
6936
Jeff Johnson295189b2012-06-20 16:38:30 -07006937void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisassocRsp *pSmeRsp )
6938{
6939 tSirResultCodes statusCode;
6940#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6941 tScanResultHandle hBSSList;
6942 tANI_BOOLEAN fCallCallback, fRemoveCmd;
6943 eHalStatus status;
6944 tCsrRoamInfo roamInfo;
6945 tCsrScanResultFilter *pScanFilter = NULL;
6946 tANI_U32 roamId = 0;
6947 tCsrRoamProfile *pCurRoamProfile = NULL;
6948 tListElem *pEntry = NULL;
6949 tSmeCmd *pCommand = NULL;
6950#endif
6951 tANI_U32 sessionId;
6952 tCsrRoamSession *pSession;
Jeff Johnsone7245742012-09-05 17:12:55 -07006953
Jeff Johnson295189b2012-06-20 16:38:30 -07006954 tSirSmeDisassocRsp SmeDisassocRsp;
6955
6956 csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, &SmeDisassocRsp);
6957 sessionId = SmeDisassocRsp.sessionId;
6958 statusCode = SmeDisassocRsp.statusCode;
6959
6960 smsLog( pMac, LOG2, "csrRoamRoamingStateDisassocRspProcessor sessionId %d\n", sessionId);
6961
6962 if ( csrIsConnStateInfra( pMac, sessionId ) )
6963 {
6964 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6965 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006966 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006967
6968 if(!pSession)
6969 {
6970 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6971 return;
6972 }
6973
Jeff Johnson295189b2012-06-20 16:38:30 -07006974 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, sessionId ) )
6975 {
6976 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6977 }
6978 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, sessionId ) ||
6979 CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, sessionId ) )
6980 {
6981 if ( eSIR_SME_SUCCESS == statusCode )
6982 {
6983 smsLog( pMac, LOG2, "CSR SmeDisassocReq force disassociated Successfully\n" );
6984 //A callback to HDD will be issued from csrRoamComplete so no need to do anything here
6985 }
6986 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6987 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006988 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, sessionId ) )
6989 {
6990 smsLog( pMac, LOGE, "CSR SmeDisassocReq due to HO\n" );
6991#if defined (WLAN_FEATURE_NEIGHBOR_ROAMING)
6992 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6993 if ( pEntry )
6994 {
6995 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07006996 // If the head of the queue is Active and it is a ROAM command, remove
6997 // and put this on the Free queue.
6998 if ( eSmeCommandRoam == pCommand->command )
6999 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007000
Jeff Johnson295189b2012-06-20 16:38:30 -07007001 //we need to process the result first before removing it from active list because state changes
7002 //still happening insides roamQProcessRoamResults so no other roam command should be issued
7003 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
7004 if(pCommand->u.roamCmd.fReleaseProfile)
7005 {
7006 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
7007 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
7008 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007009 if( fRemoveCmd )
7010 {
7011 csrReleaseCommandRoam( pMac, pCommand );
7012 }
7013 else
7014 {
7015 smsLog( pMac, LOGE, " ********csrRoamRoamingStateDisassocRspProcessor fail to remove cmd reason %d\n",
7016 pCommand->u.roamCmd.roamReason );
7017 }
7018 }
7019 else
7020 {
7021 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
7022 }
7023 }
7024 else
7025 {
7026 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
7027 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007028 //notify HDD for handoff, providing the BSSID too
7029 roamInfo.reasonCode = eCsrRoamReasonBetterAP;
7030
7031 palCopyMemory(pMac->hHdd, roamInfo.bssid, pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
7032
Jeff Johnsone7245742012-09-05 17:12:55 -07007033 csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007034
7035 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
7036 if(HAL_STATUS_SUCCESS(status))
7037 {
7038 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
7039 status = csrRoamPrepareFilterFromProfile(pMac, &pMac->roam.neighborRoamInfo.csrNeighborRoamProfile, pScanFilter);
7040 if(!HAL_STATUS_SUCCESS(status))
7041 {
7042 smsLog(pMac, LOGE, FL(" csrRoamPrepareFilterFromProfile fail to create scan filter\n"));
7043 }
7044
7045 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
7046 if(HAL_STATUS_SUCCESS(status))
7047 {
7048 //copy over the connected profile to apply the same for this connection as well
7049 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pCurRoamProfile, sizeof(tCsrRoamProfile))))
7050 {
7051 palZeroMemory(pMac->hHdd, pCurRoamProfile, sizeof(tCsrRoamProfile));
7052 csrRoamCopyProfile(pMac, pCurRoamProfile, pSession->pCurRoamProfile);
7053 }
7054 //make sure to put it at the head of the cmd queue
7055 status = csrRoamIssueConnect(pMac, sessionId, pCurRoamProfile,
7056 hBSSList, eCsrSmeIssuedAssocToSimilarAP,
7057 roamId, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
7058 if(!HAL_STATUS_SUCCESS(status))
7059 {
7060 //msg
7061 fCallCallback = eANI_BOOLEAN_TRUE;
7062 }
7063 /* Notify sub-modules like QoS etc. that handoff happening */
7064 sme_QosCsrEventInd(pMac, sessionId, SME_QOS_CSR_HANDOFF_ASSOC_REQ, NULL);
7065 palFreeMemory(pMac->hHdd, pCurRoamProfile);
7066 }
7067 else
7068 {
7069 //msg
7070 smsLog( pMac, LOGE,"csrRoamRoamingStateDisassocRspProcessor: csrScanGetResult failed");
7071 // should have asserted, sending up roam complete instead. Let upper layer
7072 // decide what to do next
7073 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7074 }
7075 }
7076 else
7077 {
7078 smsLog(pMac, LOGE, FL(" fail to allocate memory for scan filter\n"));
7079 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7080 }
7081 if( pScanFilter )
7082 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007083
Jeff Johnson295189b2012-06-20 16:38:30 -07007084 csrFreeScanFilter(pMac, pScanFilter);
7085 palFreeMemory( pMac->hHdd, pScanFilter );
7086 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007087#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07007088
Jeff Johnson295189b2012-06-20 16:38:30 -07007089 } //else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac ) )
7090 else if ( CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, sessionId ) )
7091 {
7092 // Disassoc due to Reassoc failure falls into this codepath....
7093 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
7094 }
7095 else
7096 {
7097 if ( eSIR_SME_SUCCESS == statusCode )
7098 {
7099 // Successfully disassociated from the 'old' Bss...
7100 //
7101 // We get Disassociate response in three conditions.
7102 // - First is the case where we are disasociating from an Infra Bss to start an IBSS.
7103 // - Second is the when we are disassociating from an Infra Bss to join an IBSS or a new
7104 // Infrastructure network.
7105 // - Third is where we are doing an Infra to Infra roam between networks with different
7106 // SSIDs. In all cases, we set the new Bss configuration here and attempt to join
7107
7108 smsLog( pMac, LOG2, "CSR SmeDisassocReq disassociated Successfully\n" );
7109 }
7110 else
7111 {
7112 smsLog( pMac, LOGE, "SmeDisassocReq failed with statusCode= 0x%08lX\n", statusCode );
7113 }
7114 //We are not done yet. Get the data and continue roaming
7115 csrRoamReissueRoamCommand(pMac);
7116 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007117}
7118
Jeff Johnson295189b2012-06-20 16:38:30 -07007119static void csrRoamRoamingStateDeauthRspProcessor( tpAniSirGlobal pMac, tSirSmeDeauthRsp *pSmeRsp )
7120{
7121 tSirResultCodes statusCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07007122 //No one is sending eWNI_SME_DEAUTH_REQ to PE.
7123 smsLog(pMac, LOGW, FL("is no-op\n"));
7124 statusCode = csrGetDeAuthRspStatusCode( pSmeRsp );
7125 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId) )
7126 {
7127 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7128 }
7129 else
7130 {
7131 if ( eSIR_SME_SUCCESS == statusCode )
7132 {
7133 // Successfully deauth from the 'old' Bss...
7134 //
7135 smsLog( pMac, LOG2, "CSR SmeDeauthReq disassociated Successfully\n" );
7136 }
7137 else
7138 {
7139 smsLog( pMac, LOGW, "SmeDeauthReq failed with statusCode= 0x%08lX\n", statusCode );
7140 }
7141 //We are not done yet. Get the data and continue roaming
7142 csrRoamReissueRoamCommand(pMac);
7143 }
7144}
7145
Jeff Johnson295189b2012-06-20 16:38:30 -07007146static void csrRoamRoamingStateStartBssRspProcessor( tpAniSirGlobal pMac, tSirSmeStartBssRsp *pSmeStartBssRsp )
7147{
7148 eCsrRoamCompleteResult result;
7149
7150 if ( eSIR_SME_SUCCESS == pSmeStartBssRsp->statusCode )
7151 {
7152 smsLog( pMac, LOGW, "SmeStartBssReq Successful\n" );
7153 result = eCsrStartBssSuccess;
7154 }
7155 else
7156 {
7157 smsLog( pMac, LOGW, "SmeStartBssReq failed with statusCode= 0x%08lX\n", pSmeStartBssRsp->statusCode );
7158 //Let csrRoamComplete decide what to do
7159 result = eCsrStartBssFailure;
7160 }
7161#ifdef WLAN_SOFTAP_FEATURE
7162 csrRoamComplete( pMac, result, pSmeStartBssRsp);
7163#else
7164 csrRoamComplete( pMac, result, &pSmeStartBssRsp->bssDescription );
7165#endif
7166}
7167
Jeff Johnson295189b2012-06-20 16:38:30 -07007168/*
7169 We need to be careful on whether to cast pMsgBuf (pSmeRsp) to other type of strucutres.
7170 It depends on how the message is constructed. If the message is sent by limSendSmeRsp,
7171 the pMsgBuf is only a generic response and can only be used as pointer to tSirSmeRsp.
7172 For the messages where sender allocates memory for specific structures, then it can be
7173 cast accordingly.
7174*/
7175void csrRoamingStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7176{
7177 tSirSmeRsp *pSmeRsp;
7178 tSmeIbssPeerInd *pIbssPeerInd;
7179 tCsrRoamInfo roamInfo;
7180 // TODO Session Id need to be acquired in this function
7181 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07007182 pSmeRsp = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007183 smsLog( pMac, LOG2, "Message %d[0x%04X] received in substate %d\n",
7184 pSmeRsp->messageType, pSmeRsp->messageType,
7185 pMac->roam.curSubState[pSmeRsp->sessionId] );
7186#if defined ANI_PRODUCT_TYPE_AP
7187 pSmeRsp->messageType = pal_be16_to_cpu(pSmeRsp->messageType);
7188 pSmeRsp->length = pal_be16_to_cpu(pSmeRsp->length);
7189 pSmeRsp->statusCode = pal_be32_to_cpu(pSmeRsp->statusCode);
7190#else
7191 pSmeRsp->messageType = (pSmeRsp->messageType);
7192 pSmeRsp->length = (pSmeRsp->length);
7193 pSmeRsp->statusCode = (pSmeRsp->statusCode);
7194#endif
7195 switch (pSmeRsp->messageType)
7196 {
7197
7198 case eWNI_SME_JOIN_RSP: // in Roaming state, process the Join response message...
7199 if (CSR_IS_ROAM_SUBSTATE_JOIN_REQ(pMac, pSmeRsp->sessionId))
7200 {
7201 //We sent a JOIN_REQ
7202 csrRoamJoinRspProcessor( pMac, (tSirSmeJoinRsp *)pSmeRsp );
7203 }
7204 break;
7205
7206 case eWNI_SME_AUTH_RSP: // or the Authenticate response message...
7207 if (CSR_IS_ROAM_SUBSTATE_AUTH_REQ( pMac, pSmeRsp->sessionId) )
7208 {
7209 //We sent a AUTH_REQ
7210 csrRoamRoamingStateAuthRspProcessor( pMac, (tSirSmeAuthRsp *)pSmeRsp );
7211 }
7212 break;
7213
7214 case eWNI_SME_REASSOC_RSP: // or the Reassociation response message...
7215 if (CSR_IS_ROAM_SUBSTATE_REASSOC_REQ( pMac, pSmeRsp->sessionId) )
7216 {
7217 csrRoamRoamingStateReassocRspProcessor( pMac, (tpSirSmeJoinRsp )pSmeRsp );
7218 }
7219 break;
7220
7221 case eWNI_SME_STOP_BSS_RSP: // or the Stop Bss response message...
7222 {
7223 csrRoamRoamingStateStopBssRspProcessor(pMac, pSmeRsp);
7224 }
7225 break;
7226
7227 case eWNI_SME_DISASSOC_RSP: // or the Disassociate response message...
7228 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, pSmeRsp->sessionId ) ||
7229 CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, pSmeRsp->sessionId ) ||
7230 CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, pSmeRsp->sessionId ) ||
7231 CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, pSmeRsp->sessionId ) ||
7232 CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId ) ||
7233//HO
7234 CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, pSmeRsp->sessionId ) )
7235 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07007236 smsLog(pMac, LOG1, FL("eWNI_SME_DISASSOC_RSP subState = %d\n"), pMac->roam.curSubState[pSmeRsp->sessionId]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007237 csrRoamRoamingStateDisassocRspProcessor( pMac, (tSirSmeDisassocRsp *)pSmeRsp );
7238 }
7239 break;
7240
7241 case eWNI_SME_DEAUTH_RSP: // or the Deauthentication response message...
7242 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId ) )
7243 {
7244 csrRoamRoamingStateDeauthRspProcessor( pMac, (tSirSmeDeauthRsp *)pSmeRsp );
7245 }
7246 break;
7247
7248 case eWNI_SME_START_BSS_RSP: // or the Start BSS response message...
7249 if (CSR_IS_ROAM_SUBSTATE_START_BSS_REQ( pMac, pSmeRsp->sessionId ) )
7250 {
7251 csrRoamRoamingStateStartBssRspProcessor( pMac, (tSirSmeStartBssRsp *)pSmeRsp );
7252 }
7253 break;
7254
7255 case WNI_CFG_SET_CNF: // process the Config Confirm messages when we are in 'Config' substate...
7256 if ( CSR_IS_ROAM_SUBSTATE_CONFIG( pMac, pSmeRsp->sessionId ) )
7257 {
7258 csrRoamingStateConfigCnfProcessor( pMac, ((tCsrCfgSetRsp *)pSmeRsp)->respStatus );
7259 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007260 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007261 //In case CSR issues STOP_BSS, we need to tell HDD about peer departed becasue PE is removing them
7262 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
7263 pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
7264 smsLog(pMac, LOGE, "CSR: Peer departed notification from LIM in joining state\n");
7265 palZeroMemory( pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo) );
7266 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
7267 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
7268 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
7269 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
7270 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
7271 eCSR_ROAM_CONNECT_STATUS_UPDATE,
7272 eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
7273 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007274 default:
7275 smsLog( pMac, LOG1, "Unexpected message type = %d[0x%X] received in substate %d\n",
7276 pSmeRsp->messageType, pSmeRsp->messageType,
7277 pMac->roam.curSubState[pSmeRsp->sessionId] );
7278
7279 //If we are connected, check the link status change
7280 if(!csrIsConnStateDisconnected(pMac, sessionId))
7281 {
7282 csrRoamCheckForLinkStatusChange( pMac, pSmeRsp );
7283 }
7284 break;
7285 }
7286}
7287
Jeff Johnson295189b2012-06-20 16:38:30 -07007288void csrRoamJoinedStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7289{
7290 tSirSmeRsp *pSirMsg = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007291 switch (pSirMsg->messageType)
7292 {
7293 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07007294 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007295 csrRoamStatsRspProcessor( pMac, pSirMsg );
7296 break;
7297#ifdef WLAN_SOFTAP_FEATURE
7298 case eWNI_SME_UPPER_LAYER_ASSOC_CNF:
7299 {
7300 tCsrRoamSession *pSession;
7301 tSirSmeAssocIndToUpperLayerCnf *pUpperLayerAssocCnf;
7302 tCsrRoamInfo roamInfo;
7303 tCsrRoamInfo *pRoamInfo = NULL;
7304 tANI_U32 sessionId;
7305 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007306 smsLog( pMac, LOG1, FL("ASSOCIATION confirmation can be given to upper layer \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007307 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
7308 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007309 pUpperLayerAssocCnf = (tSirSmeAssocIndToUpperLayerCnf *)pMsgBuf;
7310 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pUpperLayerAssocCnf->bssId, &sessionId );
7311 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07007312
7313 if(!pSession)
7314 {
7315 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7316 return;
7317 }
7318
Jeff Johnson295189b2012-06-20 16:38:30 -07007319 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
7320 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07007321 pRoamInfo->staId = (tANI_U8)pUpperLayerAssocCnf->aid;
7322 pRoamInfo->rsnIELen = (tANI_U8)pUpperLayerAssocCnf->rsnIE.length;
7323 pRoamInfo->prsnIE = pUpperLayerAssocCnf->rsnIE.rsnIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007324 pRoamInfo->addIELen = (tANI_U8)pUpperLayerAssocCnf->addIE.length;
7325 pRoamInfo->paddIE = pUpperLayerAssocCnf->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007326 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pUpperLayerAssocCnf->peerMacAddr, sizeof(tSirMacAddr));
7327 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pUpperLayerAssocCnf->bssId, sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07007328 pRoamInfo->wmmEnabledSta = pUpperLayerAssocCnf->wmmEnabledSta;
Jeff Johnson295189b2012-06-20 16:38:30 -07007329 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) )
7330 {
7331 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED;
7332 pRoamInfo->fReassocReq = pUpperLayerAssocCnf->reassocReq;
7333 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
7334 }
7335 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
7336 {
7337 vos_sleep( 100 );
7338 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;//Sta
7339 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
7340 }
7341
Jeff Johnson295189b2012-06-20 16:38:30 -07007342 }
7343 break;
7344#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007345 default:
7346 csrRoamCheckForLinkStatusChange( pMac, pSirMsg );
7347 break;
7348 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007349}
7350
Jeff Johnson295189b2012-06-20 16:38:30 -07007351eHalStatus csrRoamIssueSetContextReq( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrEncryptionType EncryptType,
7352 tSirBssDescription *pBssDescription,
7353 tSirMacAddr *bssId, tANI_BOOLEAN addKey,
7354 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
7355 tANI_U8 keyId, tANI_U16 keyLength,
7356 tANI_U8 *pKey, tANI_U8 paeRole )
7357{
7358 eHalStatus status = eHAL_STATUS_SUCCESS;
7359 tAniEdType edType;
7360
7361 if(eCSR_ENCRYPT_TYPE_UNKNOWN == EncryptType)
7362 {
7363 EncryptType = eCSR_ENCRYPT_TYPE_NONE; //***
7364 }
7365
7366 edType = csrTranslateEncryptTypeToEdType( EncryptType );
7367
7368 // Allow 0 keys to be set for the non-WPA encrypt types... For WPA encrypt types, the num keys must be non-zero
7369 // or LIM will reject the set context (assumes the SET_CONTEXT does not occur until the keys are distrubuted).
7370 if ( CSR_IS_ENC_TYPE_STATIC( EncryptType ) ||
7371 addKey )
7372 {
7373 tCsrRoamSetKey setKey;
Jeff Johnson295189b2012-06-20 16:38:30 -07007374 setKey.encType = EncryptType;
7375 setKey.keyDirection = aniKeyDirection; //Tx, Rx or Tx-and-Rx
7376 palCopyMemory( pMac->hHdd, &setKey.peerMac, bssId, sizeof(tCsrBssid) );
7377 setKey.paeRole = paeRole; //0 for supplicant
7378 setKey.keyId = keyId; // Kye index
7379 setKey.keyLength = keyLength;
7380 if( keyLength )
7381 {
7382 palCopyMemory( pMac->hHdd, setKey.Key, pKey, keyLength );
7383 }
7384 status = csrRoamIssueSetKeyCommand( pMac, sessionId, &setKey, 0 );
7385 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007386 return (status);
7387}
7388
Jeff Johnson295189b2012-06-20 16:38:30 -07007389static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7390 tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7391{
7392 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7393 tSmeCmd *pCommand = NULL;
7394#ifdef FEATURE_WLAN_CCX
7395 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7396#endif /* FEATURE_WLAN_CCX */
7397
7398 do
7399 {
7400 pCommand = csrGetCommandBuffer(pMac);
7401 if(NULL == pCommand)
7402 {
7403 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7404 status = eHAL_STATUS_RESOURCES;
7405 break;
7406 }
7407 pCommand->command = eSmeCommandSetKey;
7408 pCommand->sessionId = (tANI_U8)sessionId;
7409 // validate the key length, Adjust if too long...
7410 // for static WEP the keys are not set thru' SetContextReq
7411 if ( ( eCSR_ENCRYPT_TYPE_WEP40 == pSetKey->encType ) ||
7412 ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pSetKey->encType ) )
7413 {
7414 //KeyLength maybe 0 for static WEP
7415 if( pSetKey->keyLength )
7416 {
7417 if ( pSetKey->keyLength < CSR_WEP40_KEY_LEN )
7418 {
7419 smsLog( pMac, LOGW, "Invalid WEP40 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7420 break;
7421 }
7422
7423 pCommand->u.setKeyCmd.keyLength = CSR_WEP40_KEY_LEN;
7424 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP40_KEY_LEN );
7425 }
7426 }
7427 else if ( ( eCSR_ENCRYPT_TYPE_WEP104 == pSetKey->encType ) ||
7428 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pSetKey->encType ) )
7429 {
7430 //KeyLength maybe 0 for static WEP
7431 if( pSetKey->keyLength )
7432 {
7433 if ( pSetKey->keyLength < CSR_WEP104_KEY_LEN )
7434 {
7435 smsLog( pMac, LOGW, "Invalid WEP104 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7436 break;
7437 }
7438
7439 pCommand->u.setKeyCmd.keyLength = CSR_WEP104_KEY_LEN;
7440 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP104_KEY_LEN );
7441 }
7442 }
7443 else if ( eCSR_ENCRYPT_TYPE_TKIP == pSetKey->encType )
7444 {
7445 if ( pSetKey->keyLength < CSR_TKIP_KEY_LEN )
7446 {
7447 smsLog( pMac, LOGW, "Invalid TKIP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7448 break;
7449 }
7450 pCommand->u.setKeyCmd.keyLength = CSR_TKIP_KEY_LEN;
7451 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_TKIP_KEY_LEN );
7452 }
7453 else if ( eCSR_ENCRYPT_TYPE_AES == pSetKey->encType )
7454 {
7455 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7456 {
7457 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7458 break;
7459 }
7460 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7461 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7462 }
7463#ifdef FEATURE_WLAN_WAPI
7464 else if ( eCSR_ENCRYPT_TYPE_WPI == pSetKey->encType )
7465 {
7466 if ( pSetKey->keyLength < CSR_WAPI_KEY_LEN )
7467 {
7468 smsLog( pMac, LOGW, "Invalid WAPI keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7469 break;
7470 }
7471 pCommand->u.setKeyCmd.keyLength = CSR_WAPI_KEY_LEN;
7472 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WAPI_KEY_LEN );
7473 }
7474#endif /* FEATURE_WLAN_WAPI */
7475#ifdef FEATURE_WLAN_CCX
7476 else if ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7477 {
7478 if ( pSetKey->keyLength < CSR_KRK_KEY_LEN )
7479 {
7480 smsLog( pMac, LOGW, "Invalid KRK keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7481 break;
7482 }
7483 palCopyMemory( pMac->hHdd, pSession->ccxCckmInfo.krk, pSetKey->Key, CSR_KRK_KEY_LEN );
7484 pSession->ccxCckmInfo.reassoc_req_num=1;
7485 pSession->ccxCckmInfo.krk_plumbed = eANI_BOOLEAN_TRUE;
7486 status = eHAL_STATUS_SUCCESS;
7487 break;
7488 }
7489#endif /* FEATURE_WLAN_CCX */
Jeff Johnsone7245742012-09-05 17:12:55 -07007490
Jeff Johnson295189b2012-06-20 16:38:30 -07007491#ifdef WLAN_FEATURE_11W
7492 //Check for 11w BIP
7493 else if ( eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType )
7494 {
7495 tANI_U16 count = 0;
7496 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7497 {
7498 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7499 break;
7500 }
7501 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7502 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7503 }
7504#endif
7505 status = eHAL_STATUS_SUCCESS;
7506 pCommand->u.setKeyCmd.roamId = roamId;
7507 pCommand->u.setKeyCmd.encType = pSetKey->encType;
7508 pCommand->u.setKeyCmd.keyDirection = pSetKey->keyDirection; //Tx, Rx or Tx-and-Rx
7509 palCopyMemory( pMac->hHdd, &pCommand->u.setKeyCmd.peerMac, &pSetKey->peerMac, sizeof(tCsrBssid) );
7510 pCommand->u.setKeyCmd.paeRole = pSetKey->paeRole; //0 for supplicant
7511 pCommand->u.setKeyCmd.keyId = pSetKey->keyId;
7512 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.keyRsc, pSetKey->keyRsc, CSR_MAX_RSC_LEN );
7513 //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
7514
7515 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
7516 if( !HAL_STATUS_SUCCESS( status ) )
7517 {
7518 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7519 }
7520 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007521 // Free the command if there has been a failure, or it is a
7522 // "local" operation like the set CCX CCKM KRK key.
7523 if( (!HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ))
7524#ifdef FEATURE_WLAN_CCX
7525 || ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7526#endif /* FEATURE_WLAN_CCX */
7527 )
7528 {
7529 csrReleaseCommandSetKey( pMac, pCommand );
7530 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007531 return( status );
7532}
7533
Jeff Johnson295189b2012-06-20 16:38:30 -07007534eHalStatus csrRoamIssueRemoveKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7535 tCsrRoamRemoveKey *pRemoveKey, tANI_U32 roamId )
7536{
7537 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7538 tSmeCmd *pCommand = NULL;
7539 tANI_BOOLEAN fImediate = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07007540 do
7541 {
7542 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7543 {
7544 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7545 status = eHAL_STATUS_CSR_WRONG_STATE;
7546 break;
7547 }
7548 pCommand = csrGetCommandBuffer(pMac);
7549 if(NULL == pCommand)
7550 {
7551 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7552 status = eHAL_STATUS_RESOURCES;
7553 break;
7554 }
7555 pCommand->command = eSmeCommandRemoveKey;
7556 pCommand->sessionId = (tANI_U8)sessionId;
7557 pCommand->u.removeKeyCmd.roamId = roamId;
7558 pCommand->u.removeKeyCmd.encType = pRemoveKey->encType;
7559 palCopyMemory( pMac->hHdd, &pCommand->u.removeKeyCmd.peerMac, &pRemoveKey->peerMac, sizeof(tSirMacAddr) );
7560 pCommand->u.removeKeyCmd.keyId = pRemoveKey->keyId;
7561 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7562 {
7563 //in this case, put it to the end of the Q incase there is a set key pending.
7564 fImediate = eANI_BOOLEAN_FALSE;
7565 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007566 smsLog( pMac, LOGE, FL("keyType=%d, keyId=%d, PeerMac=%02x, %02x, %02x, %02x, %02x, %02x\n"),
7567 pRemoveKey->encType, pRemoveKey->keyId,
7568 pCommand->u.removeKeyCmd.peerMac[0],
7569 pCommand->u.removeKeyCmd.peerMac[1],
7570 pCommand->u.removeKeyCmd.peerMac[2],
7571 pCommand->u.removeKeyCmd.peerMac[3],
7572 pCommand->u.removeKeyCmd.peerMac[4],
7573 pCommand->u.removeKeyCmd.peerMac[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007574 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
7575 if( !HAL_STATUS_SUCCESS( status ) )
7576 {
7577 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7578 break;
7579 }
7580 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007581 if( !HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ) )
7582 {
7583 csrReleaseCommandRemoveKey( pMac, pCommand );
7584 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007585 return (status );
7586}
7587
Jeff Johnson295189b2012-06-20 16:38:30 -07007588eHalStatus csrRoamProcessSetKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7589{
7590 eHalStatus status;
7591 tANI_U8 numKeys = ( pCommand->u.setKeyCmd.keyLength ) ? 1 : 0;
7592 tAniEdType edType = csrTranslateEncryptTypeToEdType( pCommand->u.setKeyCmd.encType );
7593 tANI_BOOLEAN fUnicast = ( pCommand->u.setKeyCmd.peerMac[0] == 0xFF ) ? eANI_BOOLEAN_FALSE : eANI_BOOLEAN_TRUE;
7594 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007595#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7596 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7597 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007598 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7599 {
7600 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7601 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7602 {
7603 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_REQ;
7604 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7605 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7606 }
7607 else
7608 {
7609 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_REQ;
7610 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7611 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7612 }
7613 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7614 if(CSR_IS_ENC_TYPE_STATIC(edType))
7615 {
7616 tANI_U32 defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007617 //It has to be static WEP here
7618 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, &defKeyId)))
7619 {
7620 setKeyEvent.keyId = (v_U8_t)defKeyId;
7621 }
7622 }
7623 else
7624 {
7625 setKeyEvent.keyId = pCommand->u.setKeyCmd.keyId;
7626 }
7627 setKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7628 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7629 }
7630#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007631 if( csrIsSetKeyAllowed(pMac, sessionId) )
7632 {
7633 status = csrSendMBSetContextReqMsg( pMac, sessionId,
7634 ( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac,
7635 numKeys, edType, fUnicast, pCommand->u.setKeyCmd.keyDirection,
7636 pCommand->u.setKeyCmd.keyId, pCommand->u.setKeyCmd.keyLength,
7637 pCommand->u.setKeyCmd.Key, pCommand->u.setKeyCmd.paeRole,
7638 pCommand->u.setKeyCmd.keyRsc);
7639 }
7640 else
7641 {
7642 smsLog( pMac, LOGW, FL(" cannot process not connected\n") );
7643 //Set this status so the error handling take care of the case.
7644 status = eHAL_STATUS_CSR_WRONG_STATE;
7645 }
7646 if( !HAL_STATUS_SUCCESS(status) )
7647 {
7648 smsLog( pMac, LOGE, FL(" error status %d\n"), status );
7649 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.setKeyCmd.roamId, eCSR_ROAM_SET_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007650#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7651 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7652 {
7653 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7654 {
7655 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
7656 }
7657 else
7658 {
7659 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
7660 }
7661 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
7662 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7663 }
7664#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007665 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007666 return ( status );
7667}
7668
Jeff Johnson295189b2012-06-20 16:38:30 -07007669eHalStatus csrRoamProcessRemoveKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7670{
7671 eHalStatus status;
7672 tpSirSmeRemoveKeyReq pMsg = NULL;
7673 tANI_U16 wMsgLen = sizeof(tSirSmeRemoveKeyReq);
7674 tANI_U8 *p;
7675 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007676#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7677 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7678 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007679 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7680 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_REQ;
7681 removeKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7682 removeKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7683 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7684 removeKeyEvent.keyId = pCommand->u.removeKeyCmd.keyId;
7685 removeKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7686 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7687#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007688 if( csrIsSetKeyAllowed(pMac, sessionId) )
7689 {
7690 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, wMsgLen );
7691 }
7692 else
7693 {
7694 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7695 //Set the error status so error handling kicks in below
7696 status = eHAL_STATUS_CSR_WRONG_STATE;
7697 }
7698 if( HAL_STATUS_SUCCESS( status ) )
7699 {
7700 palZeroMemory(pMac->hHdd, pMsg, wMsgLen);
7701 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REMOVEKEY_REQ);
7702 pMsg->length = pal_cpu_to_be16(wMsgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -07007703 pMsg->sessionId = (tANI_U8)sessionId;
7704 pMsg->transactionId = 0;
7705 p = (tANI_U8 *)pMsg + sizeof(pMsg->messageType) + sizeof(pMsg->length) +
7706 sizeof(pMsg->sessionId) + sizeof(pMsg->transactionId);
7707 // bssId - copy from session Info
7708 palCopyMemory( pMac->hHdd, p, &pMac->roam.roamSession[sessionId].connectedProfile.bssid, sizeof(tSirMacAddr) );
7709 p += sizeof(tSirMacAddr);
7710 // peerMacAddr
7711 palCopyMemory( pMac->hHdd, p, pCommand->u.removeKeyCmd.peerMac, sizeof(tSirMacAddr) );
7712 p += sizeof(tSirMacAddr);
7713 // edType
7714 *p = (tANI_U8)csrTranslateEncryptTypeToEdType( pCommand->u.removeKeyCmd.encType );
7715 p++;
7716 // weptype
7717 if( ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pCommand->u.removeKeyCmd.encType ) ||
7718 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pCommand->u.removeKeyCmd.encType ) )
7719 {
7720 *p = (tANI_U8)eSIR_WEP_STATIC;
7721 }
7722 else
7723 {
7724 *p = (tANI_U8)eSIR_WEP_DYNAMIC;
7725 }
7726 p++;
7727 //keyid
7728 *p = pCommand->u.removeKeyCmd.keyId;
7729 p++;
7730 *p = (pCommand->u.removeKeyCmd.peerMac[0] == 0xFF ) ? 0 : 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07007731 status = palSendMBMessage(pMac->hHdd, pMsg);
7732 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007733 if( !HAL_STATUS_SUCCESS( status ) )
7734 {
7735 smsLog( pMac, LOGE, FL(" error status \n"), status );
Jeff Johnson295189b2012-06-20 16:38:30 -07007736#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7737 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
7738 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;;
7739 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7740#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007741 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.removeKeyCmd.roamId, eCSR_ROAM_REMOVE_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
7742 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007743 return ( status );
7744}
7745
Jeff Johnson295189b2012-06-20 16:38:30 -07007746eHalStatus csrRoamSetKey( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7747{
7748 eHalStatus status;
7749
7750 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7751 {
7752 status = eHAL_STATUS_CSR_WRONG_STATE;
7753 }
7754 else
7755 {
7756 status = csrRoamIssueSetKeyCommand( pMac, sessionId, pSetKey, roamId );
7757 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007758 return ( status );
7759}
7760
Jeff Johnson295189b2012-06-20 16:38:30 -07007761/*
7762 Prepare a filter base on a profile for parsing the scan results.
7763 Upon successful return, caller MUST call csrFreeScanFilter on
7764 pScanFilter when it is done with the filter.
7765*/
7766eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
7767 tCsrScanResultFilter *pScanFilter)
7768{
7769 eHalStatus status = eHAL_STATUS_SUCCESS;
7770 tANI_U32 size = 0;
7771 tANI_U8 index = 0;
7772
7773 do
7774 {
7775 if(pProfile->BSSIDs.numOfBSSIDs)
7776 {
7777 size = sizeof(tCsrBssid) * pProfile->BSSIDs.numOfBSSIDs;
7778 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, size);
7779 if(!HAL_STATUS_SUCCESS(status))
7780 {
7781 break;
7782 }
7783 pScanFilter->BSSIDs.numOfBSSIDs = pProfile->BSSIDs.numOfBSSIDs;
7784 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, pProfile->BSSIDs.bssid, size);
7785 }
7786 if(pProfile->SSIDs.numOfSSIDs)
7787 {
7788 if( !CSR_IS_WDS_STA( pProfile ) )
7789 {
7790 pScanFilter->SSIDs.numOfSSIDs = pProfile->SSIDs.numOfSSIDs;
7791 }
7792 else
7793 {
7794 //For WDS station
7795 //We always use index 1 for self SSID. Index 0 for peer's SSID that we want to join
7796 pScanFilter->SSIDs.numOfSSIDs = 1;
7797 }
7798 size = sizeof(tCsrSSIDInfo) * pProfile->SSIDs.numOfSSIDs;
7799 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, size);
7800 if(!HAL_STATUS_SUCCESS(status))
7801 {
7802 break;
7803 }
7804 palCopyMemory(pMac->hHdd, pScanFilter->SSIDs.SSIDList, pProfile->SSIDs.SSIDList, size);
7805 }
7806 if(!pProfile->ChannelInfo.ChannelList || (pProfile->ChannelInfo.ChannelList[0] == 0) )
7807 {
7808 pScanFilter->ChannelInfo.numOfChannels = 0;
7809 pScanFilter->ChannelInfo.ChannelList = NULL;
7810 }
7811 else if(pProfile->ChannelInfo.numOfChannels)
7812 {
7813 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->ChannelInfo.ChannelList, sizeof(*pScanFilter->ChannelInfo.ChannelList) * pProfile->ChannelInfo.numOfChannels);
7814 pScanFilter->ChannelInfo.numOfChannels = 0;
7815 if(HAL_STATUS_SUCCESS(status))
7816 {
7817 for(index = 0; index < pProfile->ChannelInfo.numOfChannels; index++)
7818 {
7819 if(csrRoamIsChannelValid(pMac, pProfile->ChannelInfo.ChannelList[index]))
7820 {
7821 pScanFilter->ChannelInfo.ChannelList[pScanFilter->ChannelInfo.numOfChannels]
7822 = pProfile->ChannelInfo.ChannelList[index];
7823 pScanFilter->ChannelInfo.numOfChannels++;
7824 }
7825 else
7826 {
7827 smsLog(pMac, LOG1, FL("process a channel (%d) that is invalid\n"), pProfile->ChannelInfo.ChannelList[index]);
7828 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007829 }
7830 }
7831 else
7832 {
7833 break;
7834 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007835 }
7836 else
7837 {
7838 smsLog(pMac, LOGW, FL("Channel list empty\n"));
7839 status = eHAL_STATUS_FAILURE;
7840 break;
7841 }
7842 pScanFilter->uapsd_mask = pProfile->uapsd_mask;
7843 pScanFilter->authType = pProfile->AuthType;
7844 pScanFilter->EncryptionType = pProfile->EncryptionType;
7845 pScanFilter->mcEncryptionType = pProfile->mcEncryptionType;
7846 pScanFilter->BSSType = pProfile->BSSType;
7847 pScanFilter->phyMode = pProfile->phyMode;
7848#ifdef FEATURE_WLAN_WAPI
7849 //check if user asked for WAPI with 11n or auto mode, in that case modify
7850 //the phymode to 11g
7851 if(csrIsProfileWapi(pProfile))
7852 {
7853 if(pScanFilter->phyMode & eCSR_DOT11_MODE_11n)
7854 {
7855 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_11n;
7856 }
7857 if(pScanFilter->phyMode & eCSR_DOT11_MODE_AUTO)
7858 {
7859 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_AUTO;
7860 }
7861 if(!pScanFilter->phyMode)
7862 {
7863 pScanFilter->phyMode = eCSR_DOT11_MODE_11g;
7864 }
7865 }
7866#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07007867 /*Save the WPS info*/
7868 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
Jeff Johnson295189b2012-06-20 16:38:30 -07007869 if( pProfile->countryCode[0] )
7870 {
7871 //This causes the matching function to use countryCode as one of the criteria.
7872 palCopyMemory( pMac->hHdd, pScanFilter->countryCode, pProfile->countryCode,
7873 WNI_CFG_COUNTRY_CODE_LEN );
7874 }
7875#ifdef WLAN_FEATURE_VOWIFI_11R
7876 if (pProfile->MDID.mdiePresent)
7877 {
7878 pScanFilter->MDID.mdiePresent = 1;
7879 pScanFilter->MDID.mobilityDomain = pProfile->MDID.mobilityDomain;
7880 }
7881#endif
7882
7883 }while(0);
7884
7885 if(!HAL_STATUS_SUCCESS(status))
7886 {
7887 csrFreeScanFilter(pMac, pScanFilter);
7888 }
7889
7890 return(status);
7891}
7892
Jeff Johnson295189b2012-06-20 16:38:30 -07007893tANI_BOOLEAN csrRoamIssueWmStatusChange( tpAniSirGlobal pMac, tANI_U32 sessionId,
7894 eCsrRoamWmStatusChangeTypes Type, tSirSmeRsp *pSmeRsp )
7895{
7896 tANI_BOOLEAN fCommandQueued = eANI_BOOLEAN_FALSE;
7897 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07007898 do
7899 {
7900 // Validate the type is ok...
7901 if ( ( eCsrDisassociated != Type ) && ( eCsrDeauthenticated != Type ) ) break;
7902 pCommand = csrGetCommandBuffer( pMac );
7903 if ( !pCommand )
7904 {
7905 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7906 break;
7907 }
7908 //Change the substate in case it is waiting for key
7909 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7910 {
7911 csrRoamStopWaitForKeyTimer( pMac );
7912 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
7913 }
7914 pCommand->command = eSmeCommandWmStatusChange;
7915 pCommand->sessionId = (tANI_U8)sessionId;
7916 pCommand->u.wmStatusChangeCmd.Type = Type;
7917 if ( eCsrDisassociated == Type )
7918 {
7919 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg, pSmeRsp,
7920 sizeof( pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg ) );
7921 }
7922 else
7923 {
7924 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg, pSmeRsp,
7925 sizeof( pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg ) );
7926 }
7927 if( HAL_STATUS_SUCCESS( csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE) ) )
7928 {
7929 fCommandQueued = eANI_BOOLEAN_TRUE;
7930 }
7931 else
7932 {
7933 smsLog( pMac, LOGE, FL(" fail to send message \n") );
7934 csrReleaseCommandWmStatusChange( pMac, pCommand );
7935 }
7936
Jeff Johnson295189b2012-06-20 16:38:30 -07007937 /* AP has issued Dissac/Deauth, Set the operating mode value to configured value */
7938 csrSetDefaultDot11Mode( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -07007939 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07007940 return( fCommandQueued );
7941}
7942
Jeff Johnson295189b2012-06-20 16:38:30 -07007943static void csrUpdateRssi(tpAniSirGlobal pMac, void* pMsg)
7944{
7945 v_S7_t rssi = 0;
7946 tAniGetRssiReq *pGetRssiReq = (tAniGetRssiReq*)pMsg;
7947 if(pGetRssiReq)
7948 {
7949 if(NULL != pGetRssiReq->pVosContext)
7950 {
7951 WLANTL_GetRssi(pGetRssiReq->pVosContext, pGetRssiReq->staId, &rssi);
7952 }
7953 else
7954 {
7955 smsLog( pMac, LOGE, FL("pGetRssiReq->pVosContext is NULL\n"));
7956 return;
7957 }
7958
7959 if(NULL != pGetRssiReq->rssiCallback)
7960 {
7961 ((tCsrRssiCallback)(pGetRssiReq->rssiCallback))(rssi, pGetRssiReq->staId, pGetRssiReq->pDevContext);
7962 }
7963 else
7964 {
7965 smsLog( pMac, LOGE, FL("pGetRssiReq->rssiCallback is NULL\n"));
7966 return;
7967 }
7968 }
7969 else
7970 {
7971 smsLog( pMac, LOGE, FL("pGetRssiReq is NULL\n"));
7972 }
7973 return;
7974}
Jeff Johnsone7245742012-09-05 17:12:55 -07007975static void csrRoamRssiIndHdlr(tpAniSirGlobal pMac, void* pMsg)
7976{
7977 WLANTL_TlIndicationReq *pTlRssiInd = (WLANTL_TlIndicationReq*)pMsg;
7978 if(pTlRssiInd)
7979 {
7980 if(NULL != pTlRssiInd->tlCallback)
7981 {
7982 ((WLANTL_RSSICrossThresholdCBType)(pTlRssiInd->tlCallback))
7983 (pTlRssiInd->pAdapter, pTlRssiInd->rssiNotification, pTlRssiInd->pUserCtxt);
7984 }
7985 else
7986 {
7987 smsLog( pMac, LOGE, FL("pTlRssiInd->tlCallback is NULL\n"));
7988 }
7989 }
7990 else
7991 {
7992 smsLog( pMac, LOGE, FL("pTlRssiInd is NULL\n"));
7993 }
7994 return;
7995}
Jeff Johnson295189b2012-06-20 16:38:30 -07007996
7997void csrRoamCheckForLinkStatusChange( tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg )
7998{
7999 tSirSmeAssocInd *pAssocInd;
8000 tSirSmeDisassocInd *pDisassocInd;
8001 tSirSmeDeauthInd *pDeauthInd;
8002 tSirSmeWmStatusChangeNtf *pStatusChangeMsg;
8003 tSirSmeNewBssInfo *pNewBss;
8004 tSmeIbssPeerInd *pIbssPeerInd;
8005 tSirMacAddr Broadcastaddr = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
8006 tSirSmeApNewCaps *pApNewCaps;
8007 eCsrRoamResult result = eCSR_ROAM_RESULT_NONE;
8008 eRoamCmdStatus roamStatus = eCSR_ROAM_FAILED;
8009 tCsrRoamInfo *pRoamInfo = NULL;
8010 tCsrRoamInfo roamInfo;
8011 eHalStatus status;
8012 tANI_U32 sessionId = CSR_SESSION_ID_INVALID;
8013 tCsrRoamSession *pSession = NULL;
8014 tpSirSmeSwitchChannelInd pSwitchChnInd;
8015 tSmeMaxAssocInd *pSmeMaxAssocInd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008016#if defined ANI_PRODUCT_TYPE_AP
8017 pSirMsg->messageType = pal_be16_to_cpu(pSirMsg->messageType);
8018 pSirMsg->length = pal_be16_to_cpu(pSirMsg->length);
8019 pSirMsg->statusCode = pal_be32_to_cpu(pSirMsg->statusCode);
8020#else
8021 pSirMsg->messageType = (pSirMsg->messageType);
8022 pSirMsg->length = (pSirMsg->length);
8023 pSirMsg->statusCode = (pSirMsg->statusCode);
8024#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008025 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
Jeff Johnson295189b2012-06-20 16:38:30 -07008026 switch( pSirMsg->messageType )
8027 {
8028 case eWNI_SME_ASSOC_IND:
8029 {
8030 tCsrRoamSession *pSession;
8031 smsLog( pMac, LOG1, FL("ASSOCIATION Indication from SME\n"));
8032 pAssocInd = (tSirSmeAssocInd *)pSirMsg;
8033 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pAssocInd->bssId, &sessionId );
8034 if( HAL_STATUS_SUCCESS( status ) )
8035 {
8036 pSession = CSR_GET_SESSION(pMac, sessionId);
8037
Jeff Johnson32d95a32012-09-10 13:15:23 -07008038 if(!pSession)
8039 {
8040 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8041 return;
8042 }
8043
Jeff Johnson295189b2012-06-20 16:38:30 -07008044 pRoamInfo = &roamInfo;
8045
8046 // Required for indicating the frames to upper layer
8047 pRoamInfo->assocReqLength = pAssocInd->assocReqLength;
8048 pRoamInfo->assocReqPtr = pAssocInd->assocReqPtr;
8049
8050 pRoamInfo->beaconPtr = pAssocInd->beaconPtr;
8051 pRoamInfo->beaconLength = pAssocInd->beaconLength;
8052 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
8053 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8054
8055 pRoamInfo->staId = (tANI_U8)pAssocInd->staId;
8056 pRoamInfo->rsnIELen = (tANI_U8)pAssocInd->rsnIE.length;
8057 pRoamInfo->prsnIE = pAssocInd->rsnIE.rsnIEdata;
8058
8059 pRoamInfo->addIELen = (tANI_U8)pAssocInd->addIE.length;
8060 pRoamInfo->paddIE = pAssocInd->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07008061 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
8062 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pAssocInd->bssId, sizeof(tCsrBssid));
8063#ifdef WLAN_SOFTAP_FEATURE
8064 pRoamInfo->wmmEnabledSta = pAssocInd->wmmEnabledSta;
8065 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8066#endif
8067 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
8068#ifdef WLAN_SOFTAP_FEATURE
8069 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile))
8070 {
8071 if( CSR_IS_ENC_TYPE_STATIC( pSession->pCurRoamProfile->negotiatedUCEncryptionType ))
8072 {
8073 csrRoamIssueSetContextReq( pMac, sessionId, pSession->pCurRoamProfile->negotiatedUCEncryptionType,
8074 pSession->pConnectBssDesc,
8075 &(pRoamInfo->peerMac),
8076 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8077 pRoamInfo->fAuthRequired = FALSE;
8078 }
8079 else
8080 {
8081 pRoamInfo->fAuthRequired = TRUE;
8082 }
8083 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_IND);
8084 if (!HAL_STATUS_SUCCESS(status))
8085 pRoamInfo->statusCode = eSIR_SME_ASSOC_REFUSED;// Refused due to Mac filtering
8086 }
8087#endif
8088 /* Send Association completion message to PE */
8089 status = csrSendAssocCnfMsg( pMac, pAssocInd, status );//Sta
8090
8091 /* send a message to CSR itself just to avoid the EAPOL frames going
8092 * OTA before association response */
Jeff Johnson295189b2012-06-20 16:38:30 -07008093 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8094 {
8095 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8096 }
8097#ifdef WLAN_SOFTAP_FEATURE
8098 else if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) && (pRoamInfo->statusCode != eSIR_SME_ASSOC_REFUSED))
8099 {
8100 pRoamInfo->fReassocReq = pAssocInd->reassocReq;
8101 //status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
8102 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8103 }
8104#endif
8105 }
8106 }
8107 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008108 case eWNI_SME_DISASSOC_IND:
8109 smsLog( pMac, LOGE, FL("DISASSOCIATION Indication from MAC\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008110 // Check if AP dis-associated us because of MIC failure. If so,
8111 // then we need to take action immediately and not wait till the
8112 // the WmStatusChange requests is pushed and processed
8113 pDisassocInd = (tSirSmeDisassocInd *)pSirMsg;
8114 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDisassocInd->bssId, &sessionId );
8115 if( HAL_STATUS_SUCCESS( status ) )
8116 {
8117 // If we are in neighbor preauth done state then on receiving
8118 // disassoc or deauth we dont roam instead we just disassoc
8119 // from current ap and then go to disconnected state
8120 // This happens for CCX and 11r FT connections ONLY.
8121#ifdef WLAN_FEATURE_VOWIFI_11R
8122 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8123 {
8124 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8125 }
8126#endif
8127#ifdef FEATURE_WLAN_CCX
8128 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8129 {
8130 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8131 }
8132#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008133#ifdef FEATURE_WLAN_LFR
8134 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8135 {
8136 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8137 }
8138#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008139 pSession = CSR_GET_SESSION( pMac, sessionId );
8140
Jeff Johnson32d95a32012-09-10 13:15:23 -07008141 if(!pSession)
8142 {
8143 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8144 return;
8145 }
8146
Jeff Johnson295189b2012-06-20 16:38:30 -07008147 if ( csrIsConnStateInfra( pMac, sessionId ) )
8148 {
8149 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8150 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008151#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8152 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8153#endif
8154 csrRoamLinkDown(pMac, sessionId);
8155 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDisassociated, pSirMsg );
8156#ifdef WLAN_SOFTAP_FEATURE
8157 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8158 {
8159
8160 pRoamInfo = &roamInfo;
8161
8162 pRoamInfo->statusCode = pDisassocInd->statusCode;
8163 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8164
8165 pRoamInfo->staId = (tANI_U8)pDisassocInd->staId;
8166
8167 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocInd->peerMacAddr, sizeof(tSirMacAddr));
8168 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDisassocInd->bssId, sizeof(tCsrBssid));
8169
8170 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DISASSOC_IND);
8171 }
8172#endif
8173 }
8174 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008175 case eWNI_SME_DEAUTH_IND:
8176 smsLog( pMac, LOG1, FL("DEAUTHENTICATION Indication from MAC\n"));
8177 pDeauthInd = (tpSirSmeDeauthInd)pSirMsg;
8178 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDeauthInd->bssId, &sessionId );
8179 if( HAL_STATUS_SUCCESS( status ) )
8180 {
8181 // If we are in neighbor preauth done state then on receiving
8182 // disassoc or deauth we dont roam instead we just disassoc
8183 // from current ap and then go to disconnected state
8184 // This happens for CCX and 11r FT connections ONLY.
8185#ifdef WLAN_FEATURE_VOWIFI_11R
8186 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8187 {
8188 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8189 }
8190#endif
8191#ifdef FEATURE_WLAN_CCX
8192 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8193 {
8194 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8195 }
8196#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008197#ifdef FEATURE_WLAN_LFR
8198 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8199 {
8200 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8201 }
8202#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008203 pSession = CSR_GET_SESSION( pMac, sessionId );
8204
Jeff Johnson32d95a32012-09-10 13:15:23 -07008205 if(!pSession)
8206 {
8207 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8208 return;
8209 }
8210
Jeff Johnson295189b2012-06-20 16:38:30 -07008211 if ( csrIsConnStateInfra( pMac, sessionId ) )
8212 {
8213 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8214 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008215#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8216 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8217#endif
8218 csrRoamLinkDown(pMac, sessionId);
8219 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDeauthenticated, pSirMsg );
8220#ifdef WLAN_SOFTAP_FEATURE
8221 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8222 {
8223
8224 pRoamInfo = &roamInfo;
8225
8226 pRoamInfo->statusCode = pDeauthInd->statusCode;
8227 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8228
8229 pRoamInfo->staId = (tANI_U8)pDeauthInd->staId;
8230
8231 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthInd->peerMacAddr, sizeof(tSirMacAddr));
8232 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDeauthInd->bssId, sizeof(tCsrBssid));
8233
8234 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DEAUTH_IND);
8235 }
8236#endif
8237 }
8238 break;
8239
8240 case eWNI_SME_SWITCH_CHL_REQ: // in case of STA, the SWITCH_CHANNEL originates from its AP
8241 smsLog( pMac, LOGW, FL("eWNI_SME_SWITCH_CHL_REQ from SME\n"));
8242 pSwitchChnInd = (tpSirSmeSwitchChannelInd)pSirMsg;
8243 //Update with the new channel id.
8244 //The channel id is hidden in the statusCode.
8245 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pSwitchChnInd->bssId, &sessionId );
8246 if( HAL_STATUS_SUCCESS( status ) )
8247 {
8248 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008249 if(!pSession)
8250 {
8251 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8252 return;
8253 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008254 pSession->connectedProfile.operationChannel = (tANI_U8)pSwitchChnInd->newChannelId;
8255 if(pSession->pConnectBssDesc)
8256 {
8257 pSession->pConnectBssDesc->channelId = (tANI_U8)pSwitchChnInd->newChannelId;
8258 }
8259 }
8260 break;
8261
8262 case eWNI_SME_DEAUTH_RSP:
8263 smsLog( pMac, LOGW, FL("eWNI_SME_DEAUTH_RSP from SME\n"));
8264#ifdef WLAN_SOFTAP_FEATURE
8265 {
8266 tSirSmeDeauthRsp* pDeauthRsp = (tSirSmeDeauthRsp *)pSirMsg;
8267 sessionId = pDeauthRsp->sessionId;
8268 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8269 {
8270 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008271 if(!pSession)
8272 {
8273 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8274 return;
8275 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008276 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8277 {
8278 pRoamInfo = &roamInfo;
8279 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8280 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthRsp->peerMacAddr, sizeof(tSirMacAddr));
8281 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8282 pRoamInfo->statusCode = pDeauthRsp->statusCode;
8283 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8284 }
8285 }
8286 }
8287#endif
8288 break;
8289
8290 case eWNI_SME_DISASSOC_RSP:
8291 smsLog( pMac, LOGW, FL("eWNI_SME_DISASSOC_RSP from SME subState = %d\n"), pMac->roam.curSubState[sessionId]);
8292#ifdef WLAN_SOFTAP_FEATURE
8293 {
8294 tSirSmeDisassocRsp *pDisassocRsp = (tSirSmeDisassocRsp *)pSirMsg;
8295 sessionId = pDisassocRsp->sessionId;
8296 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8297 {
8298 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008299 if(!pSession)
8300 {
8301 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8302 return;
8303 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008304 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8305 {
8306 pRoamInfo = &roamInfo;
8307 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8308 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocRsp->peerMacAddr, sizeof(tSirMacAddr));
8309 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8310 pRoamInfo->statusCode = pDisassocRsp->statusCode;
8311 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8312 }
8313 }
8314 }
8315#endif
8316 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008317 case eWNI_SME_MIC_FAILURE_IND:
8318 {
8319 tpSirSmeMicFailureInd pMicInd = (tpSirSmeMicFailureInd)pSirMsg;
8320 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
8321 eCsrRoamResult result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
Jeff Johnson295189b2012-06-20 16:38:30 -07008322#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8323 {
8324 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008325 if(!pSession)
8326 {
8327 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8328 return;
8329 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008330 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
8331 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
8332 secEvent.eventId = WLAN_SECURITY_EVENT_MIC_ERROR;
8333 secEvent.encryptionModeMulticast =
8334 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8335 secEvent.encryptionModeUnicast =
8336 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8337 secEvent.authMode =
8338 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8339 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
8340 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
8341 }
8342#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008343 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pMicInd->bssId, &sessionId );
8344 if( HAL_STATUS_SUCCESS( status ) )
8345 {
8346 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8347 roamInfo.u.pMICFailureInfo = &pMicInd->info;
8348 pRoamInfo = &roamInfo;
8349 if(pMicInd->info.multicast)
8350 {
8351 result = eCSR_ROAM_RESULT_MIC_ERROR_GROUP;
8352 }
8353 else
8354 {
8355 result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
8356 }
8357 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_MIC_ERROR_IND, result);
8358 }
8359 }
8360 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008361#ifdef WLAN_SOFTAP_FEATURE
8362 case eWNI_SME_WPS_PBC_PROBE_REQ_IND:
8363 {
8364 tpSirSmeProbeReqInd pProbeReqInd = (tpSirSmeProbeReqInd)pSirMsg;
8365 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008366 smsLog( pMac, LOG1, FL("WPS PBC Probe request Indication from SME\n"));
8367
8368 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pProbeReqInd->bssId, &sessionId );
8369 if( HAL_STATUS_SUCCESS( status ) )
8370 {
8371 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8372 roamInfo.u.pWPSPBCProbeReq = &pProbeReqInd->WPSPBCProbeReq;
8373 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_WPS_PBC_PROBE_REQ_IND,
8374 eCSR_ROAM_RESULT_WPS_PBC_PROBE_REQ_IND);
8375 }
8376 }
8377 break;
8378#endif
8379
Jeff Johnson295189b2012-06-20 16:38:30 -07008380 case eWNI_SME_WM_STATUS_CHANGE_NTF:
8381 pStatusChangeMsg = (tSirSmeWmStatusChangeNtf *)pSirMsg;
8382 switch( pStatusChangeMsg->statusChangeCode )
8383 {
8384 case eSIR_SME_IBSS_ACTIVE:
8385 sessionId = csrFindIbssSession( pMac );
8386 if( CSR_SESSION_ID_INVALID != sessionId )
8387 {
8388 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008389 if(!pSession)
8390 {
8391 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8392 return;
8393 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008394 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED;
8395 if(pSession->pConnectBssDesc)
8396 {
8397 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8398 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
8399 pRoamInfo = &roamInfo;
8400 }
8401 else
8402 {
8403 smsLog(pMac, LOGE, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8404 }
8405 result = eCSR_ROAM_RESULT_IBSS_CONNECT;
8406 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8407 }
8408 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008409 case eSIR_SME_IBSS_INACTIVE:
8410 sessionId = csrFindIbssSession( pMac );
8411 if( CSR_SESSION_ID_INVALID != sessionId )
8412 {
8413 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008414 if(!pSession)
8415 {
8416 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8417 return;
8418 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008419 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
8420 result = eCSR_ROAM_RESULT_IBSS_INACTIVE;
8421 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8422 }
8423 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008424 case eSIR_SME_JOINED_NEW_BSS: // IBSS coalescing.
8425 sessionId = csrFindIbssSession( pMac );
8426 if( CSR_SESSION_ID_INVALID != sessionId )
8427 {
8428 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008429 if(!pSession)
8430 {
8431 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8432 return;
8433 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008434 // update the connection state information
8435 pNewBss = &pStatusChangeMsg->statusChangeInfo.newBssInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008436#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8437 {
8438 vos_log_ibss_pkt_type *pIbssLog;
8439 tANI_U32 bi;
Jeff Johnson295189b2012-06-20 16:38:30 -07008440 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8441 if(pIbssLog)
8442 {
8443 pIbssLog->eventId = WLAN_IBSS_EVENT_COALESCING;
8444 if(pNewBss)
8445 {
8446 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pNewBss->bssId, 6);
8447 if(pNewBss->ssId.length)
8448 {
8449 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pNewBss->ssId.ssId, pNewBss->ssId.length);
8450 }
8451 pIbssLog->operatingChannel = pNewBss->channelNumber;
8452 }
8453 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
8454 {
8455 //***U8 is not enough for beacon interval
8456 pIbssLog->beaconInterval = (v_U8_t)bi;
8457 }
8458 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8459 }
8460 }
8461#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008462 csrRoamUpdateConnectedProfileFromNewBss( pMac, sessionId, pNewBss );
8463 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8464 pSession->pConnectBssDesc,
8465 &Broadcastaddr,
8466 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 );
8467 result = eCSR_ROAM_RESULT_IBSS_COALESCED;
8468 roamStatus = eCSR_ROAM_IBSS_IND;
8469 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pNewBss->bssId, sizeof(tCsrBssid));
8470 pRoamInfo = &roamInfo;
8471 //This BSSID is th ereal BSSID, let's save it
8472 if(pSession->pConnectBssDesc)
8473 {
8474 palCopyMemory(pMac->hHdd, pSession->pConnectBssDesc->bssId, &pNewBss->bssId, sizeof(tCsrBssid));
8475 }
8476 // Stop the join IBSS timer in case of join, for
8477 // genuine merge do nothing
8478 if(pSession->ibss_join_pending)
8479 {
8480 pSession->ibss_join_pending = FALSE;
8481 csrRoamStopIbssJoinTimer(pMac, sessionId);
8482 result = eCSR_ROAM_RESULT_IBSS_JOIN_SUCCESS;
8483 }
8484 }
8485 smsLog(pMac, LOGW, "CSR: eSIR_SME_JOINED_NEW_BSS received from PE\n");
8486 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008487 // detection by LIM that the capabilities of the associated AP have changed.
8488 case eSIR_SME_AP_CAPS_CHANGED:
8489 pApNewCaps = &pStatusChangeMsg->statusChangeInfo.apNewCaps;
8490 smsLog(pMac, LOGW, "CSR handling eSIR_SME_AP_CAPS_CHANGED\n");
8491 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pApNewCaps->bssId, &sessionId );
8492 if( HAL_STATUS_SUCCESS( status ) )
8493 {
8494 csrScanForCapabilityChange( pMac, pApNewCaps );
8495 result = eCSR_ROAM_RESULT_CAP_CHANGED;
8496 roamStatus = eCSR_ROAM_GEN_INFO;
8497 }
8498 break;
8499
8500 default:
8501 roamStatus = eCSR_ROAM_FAILED;
8502 result = eCSR_ROAM_RESULT_NONE;
8503 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008504 } // end switch on statusChangeCode
8505 if(eCSR_ROAM_RESULT_NONE != result)
8506 {
8507 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, roamStatus, result);
8508 }
8509 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008510 case eWNI_SME_IBSS_NEW_PEER_IND:
8511 pIbssPeerInd = (tSmeIbssPeerInd *)pSirMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07008512#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8513 {
8514 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07008515 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8516 if(pIbssLog)
8517 {
8518 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_JOIN;
8519 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8520 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8521 }
8522 }
8523#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008524 sessionId = csrFindIbssSession( pMac );
8525 if( CSR_SESSION_ID_INVALID != sessionId )
8526 {
8527 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008528
8529 if(!pSession)
8530 {
8531 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8532 return;
8533 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008534 // Issue the set Context request to LIM to establish the Unicast STA context for the new peer...
8535 if(pSession->pConnectBssDesc)
8536 {
8537 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8538 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8539 if(pIbssPeerInd->mesgLen > sizeof(tSmeIbssPeerInd))
8540 {
8541 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pbFrames,
8542 (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd)));
8543 if(HAL_STATUS_SUCCESS(status))
8544 {
8545 roamInfo.nBeaconLength = (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd));
8546 palCopyMemory(pMac->hHdd, roamInfo.pbFrames, ((tANI_U8 *)pIbssPeerInd) + sizeof(tSmeIbssPeerInd),
8547 roamInfo.nBeaconLength);
8548 }
8549 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8550 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8551 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8552 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pBssDesc,
8553 pSession->pConnectBssDesc->length);
8554 if(HAL_STATUS_SUCCESS(status))
8555 {
8556 palCopyMemory(pMac->hHdd, roamInfo.pBssDesc, pSession->pConnectBssDesc,
8557 pSession->pConnectBssDesc->length);
8558 }
8559 if(HAL_STATUS_SUCCESS(status))
8560 {
8561 pRoamInfo = &roamInfo;
8562 }
8563 else
8564 {
8565 if(roamInfo.pbFrames)
8566 {
8567 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8568 }
8569 if(roamInfo.pBssDesc)
8570 {
8571 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8572 }
8573 }
8574 }
8575 else
8576 {
8577 pRoamInfo = &roamInfo;
8578 }
8579 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8580 pSession->pConnectBssDesc,
8581 &(pIbssPeerInd->peerAddr),
8582 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8583 }
8584 else
8585 {
8586 smsLog(pMac, LOGW, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8587 }
8588 //send up the sec type for the new peer
8589 if (pRoamInfo)
8590 {
8591 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8592 }
8593 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0,
8594 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_NEW_PEER);
8595 if(pRoamInfo)
8596 {
8597 if(roamInfo.pbFrames)
8598 {
8599 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8600 }
8601 if(roamInfo.pBssDesc)
8602 {
8603 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8604 }
8605 }
8606 }
8607 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008608 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
8609 pIbssPeerInd = (tSmeIbssPeerInd*)pSirMsg;
8610 sessionId = csrFindIbssSession( pMac );
8611 if( CSR_SESSION_ID_INVALID != sessionId )
8612 {
Jeff Johnson295189b2012-06-20 16:38:30 -07008613#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8614 {
8615 vos_log_ibss_pkt_type *pIbssLog;
8616
8617 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8618 if(pIbssLog)
8619 {
8620 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_LEAVE;
8621 if(pIbssPeerInd)
8622 {
8623 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8624 }
8625 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8626 }
8627 }
8628#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008629 smsLog(pMac, LOGW, "CSR: Peer departed notification from LIM\n");
8630 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8631 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8632 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8633 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8634 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8635 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
8636 }
8637 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008638 case eWNI_SME_SETCONTEXT_RSP:
8639 {
8640 tSirSmeSetContextRsp *pRsp = (tSirSmeSetContextRsp *)pSirMsg;
8641 tListElem *pEntry;
8642 tSmeCmd *pCommand;
8643
8644 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8645 if ( pEntry )
8646 {
8647 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8648 if ( eSmeCommandSetKey == pCommand->command )
8649 {
8650 sessionId = pCommand->sessionId;
8651 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008652
8653 if(!pSession)
8654 {
8655 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8656 return;
8657 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008658
8659#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8660 if(eCSR_ENCRYPT_TYPE_NONE != pSession->connectedProfile.EncryptionType)
8661 {
8662 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
8663 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8664 if( pRsp->peerMacAddr[0] & 0x01 )
8665 {
8666 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
8667 }
8668 else
8669 {
8670 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
8671 }
8672 setKeyEvent.encryptionModeMulticast =
8673 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8674 setKeyEvent.encryptionModeUnicast =
8675 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8676 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8677 setKeyEvent.authMode =
8678 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8679 if( eSIR_SUCCESS != pRsp->statusCode )
8680 {
8681 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8682 }
8683 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
8684 }
8685#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
8686 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
8687 {
8688 //We are done with authentication, whethere succeed or not
8689 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
8690
8691 csrRoamStopWaitForKeyTimer( pMac );
8692 //We do it here because this linkup function is not called after association
8693 //when a key needs to be set.
8694 if( csrIsConnStateConnectedInfra(pMac, sessionId) )
8695 {
8696 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
8697 }
8698 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008699 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008700 {
8701 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
Jeff Johnsone7245742012-09-05 17:12:55 -07008702 //Make sure we install the GTK before indicating to HDD as authenticated
8703 //This is to prevent broadcast packets go out after PTK and before GTK.
8704 if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr,
8705 sizeof(tSirMacAddr) ) )
8706 {
8707 result = eCSR_ROAM_RESULT_AUTHENTICATED;
8708 }
8709 else
8710 {
8711 result = eCSR_ROAM_RESULT_NONE;
8712 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008713 pRoamInfo = &roamInfo;
8714 }
8715 else
8716 {
8717 result = eCSR_ROAM_RESULT_FAILURE;
8718 smsLog( pMac, LOGE, "CSR: Roam Completion setkey command failed(%d) PeerMac %02X-%02X-%02X-%02X-%02X-%02X...\n",
8719 pRsp->statusCode, pRsp->peerMacAddr[0], pRsp->peerMacAddr[1], pRsp->peerMacAddr[2],
8720 pRsp->peerMacAddr[3], pRsp->peerMacAddr[4], pRsp->peerMacAddr[5] );
8721 }
8722 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8723 eCSR_ROAM_SET_KEY_COMPLETE, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07008724 // Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS
8725 // can go ahead and initiate the TSPEC if any are pending
8726 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -07008727#ifdef FEATURE_WLAN_CCX
8728 //Send Adjacent AP repot to new AP.
8729 if (result == eCSR_ROAM_RESULT_AUTHENTICATED &&
8730 pSession->isPrevApInfoValid &&
8731 pSession->connectedProfile.isCCXAssoc)
8732 {
8733#ifdef WLAN_FEATURE_VOWIFI
8734 csrCcxSendAdjacentApRepMsg(pMac, pSession);
8735#endif
8736 pSession->isPrevApInfoValid = FALSE;
8737 }
8738#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008739 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8740 {
8741 csrReleaseCommandSetKey( pMac, pCommand );
8742 }
8743 }
8744 else
8745 {
8746 smsLog( pMac, LOGE, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8747 }
8748 }
8749 else
8750 {
8751 smsLog( pMac, LOGE, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8752 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008753 smeProcessPendingQueue( pMac );
8754 }
8755 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008756 case eWNI_SME_REMOVEKEY_RSP:
8757 {
8758 tSirSmeRemoveKeyRsp *pRsp = (tSirSmeRemoveKeyRsp *)pSirMsg;
8759 tListElem *pEntry;
8760 tSmeCmd *pCommand;
8761
8762 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8763 if ( pEntry )
8764 {
8765 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8766 if ( eSmeCommandRemoveKey == pCommand->command )
8767 {
8768 sessionId = pCommand->sessionId;
8769 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008770
8771 if(!pSession)
8772 {
8773 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8774 return;
8775 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008776#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8777 {
8778 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
8779 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8780 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
8781 removeKeyEvent.encryptionModeMulticast =
8782 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8783 removeKeyEvent.encryptionModeUnicast =
8784 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8785 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8786 removeKeyEvent.authMode =
8787 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8788 if( eSIR_SUCCESS != pRsp->statusCode )
8789 {
8790 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8791 }
8792 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
8793 }
8794#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson43971f52012-07-17 12:26:56 -07008795 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008796 {
8797 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
8798 result = eCSR_ROAM_RESULT_NONE;
8799 pRoamInfo = &roamInfo;
8800 }
8801 else
8802 {
8803 result = eCSR_ROAM_RESULT_FAILURE;
8804 }
8805 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8806 eCSR_ROAM_REMOVE_KEY_COMPLETE, result);
8807 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8808 {
8809 csrReleaseCommandRemoveKey( pMac, pCommand );
8810 }
8811 }
8812 else
8813 {
8814 smsLog( pMac, LOGW, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8815 }
8816 }
8817 else
8818 {
8819 smsLog( pMac, LOGW, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8820 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008821 smeProcessPendingQueue( pMac );
8822 }
8823 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008824 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07008825 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008826 csrRoamStatsRspProcessor( pMac, pSirMsg );
8827 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008828 case eWNI_SME_GET_RSSI_REQ:
Mohit Khanna23863762012-09-11 17:40:09 -07008829 smsLog( pMac, LOG2, FL("GetRssiReq from self\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008830 csrUpdateRssi( pMac, pSirMsg );
8831 break;
8832
Jeff Johnson295189b2012-06-20 16:38:30 -07008833#ifdef WLAN_FEATURE_VOWIFI_11R
8834 case eWNI_SME_FT_PRE_AUTH_RSP:
8835 csrRoamFTPreAuthRspProcessor( pMac, (tpSirFTPreAuthRsp)pSirMsg );
8836 break;
8837#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008838 case eWNI_SME_MAX_ASSOC_EXCEEDED:
8839 pSmeMaxAssocInd = (tSmeMaxAssocInd*)pSirMsg;
8840 smsLog( pMac, LOG1, FL("send indication that max assoc have been reached and the new peer cannot be accepted\n"));
8841 sessionId = pSmeMaxAssocInd->sessionId;
8842 roamInfo.sessionId = sessionId;
8843 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pSmeMaxAssocInd->peerMac, sizeof(tCsrBssid));
8844 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8845 eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED);
8846 break;
8847
8848 case eWNI_SME_BTAMP_LOG_LINK_IND:
8849 smsLog( pMac, LOG1, FL("Establish logical link req from HCI serialized through MC thread\n"));
8850 btampEstablishLogLinkHdlr( pSirMsg );
8851 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07008852 case eWNI_SME_RSSI_IND:
8853 smsLog( pMac, LOG1, FL("RSSI indication from TL serialized through MC thread\n"));
8854 csrRoamRssiIndHdlr( pMac, pSirMsg );
8855 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008856
8857 default:
8858 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008859 } // end switch on message type
Jeff Johnson295189b2012-06-20 16:38:30 -07008860}
8861
Jeff Johnson295189b2012-06-20 16:38:30 -07008862void csrCallRoamingCompletionCallback(tpAniSirGlobal pMac, tCsrRoamSession *pSession,
8863 tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, eCsrRoamResult roamResult)
8864{
8865 if(pSession)
8866 {
8867 if(pSession->bRefAssocStartCnt)
8868 {
8869 pSession->bRefAssocStartCnt--;
8870 VOS_ASSERT( pSession->bRefAssocStartCnt == 0);
8871 //Need to call association_completion because there is an assoc_start pending.
8872 csrRoamCallCallback(pMac, pSession->sessionId, NULL, roamId,
8873 eCSR_ROAM_ASSOCIATION_COMPLETION,
8874 eCSR_ROAM_RESULT_FAILURE);
8875 }
8876 csrRoamCallCallback(pMac, pSession->sessionId, pRoamInfo, roamId, eCSR_ROAM_ROAMING_COMPLETION, roamResult);
8877 }
8878 else
8879 {
8880 smsLog(pMac, LOGW, FL(" pSession is NULL"));
8881 }
8882}
8883
8884
8885eHalStatus csrRoamStartRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamingReason roamingReason)
8886{
8887 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07008888 if(CSR_IS_LOSTLINK_ROAMING(roamingReason) &&
8889 (eANI_BOOLEAN_FALSE == pMac->roam.roamSession[sessionId].fCancelRoaming))
8890 {
8891 status = csrScanRequestLostLink1( pMac, sessionId );
8892 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008893 return(status);
8894}
8895
Jeff Johnson295189b2012-06-20 16:38:30 -07008896//return a boolean to indicate whether roaming completed or continue.
8897tANI_BOOLEAN csrRoamCompleteRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId,
8898 tANI_BOOLEAN fForce, eCsrRoamResult roamResult)
8899{
8900 tANI_BOOLEAN fCompleted = eANI_BOOLEAN_TRUE;
8901 tANI_TIMESTAMP roamTime = (tANI_TIMESTAMP)(pMac->roam.configParam.nRoamingTime * PAL_TICKS_PER_SECOND);
8902 tANI_TIMESTAMP curTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
8903 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07008904 //Check whether time is up
8905 if(pSession->fCancelRoaming || fForce ||
8906 ((curTime - pSession->roamingStartTime) > roamTime) ||
8907 eCsrReassocRoaming == pSession->roamingReason ||
8908 eCsrDynamicRoaming == pSession->roamingReason)
8909 {
8910 smsLog(pMac, LOGW, FL(" indicates roaming completion\n"));
8911 if(pSession->fCancelRoaming && CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason))
8912 {
8913 //roaming is cancelled, tell HDD to indicate disconnect
8914 //Because LIM overload deauth_ind for both deauth frame and missed beacon
8915 //we need to use this logic to detinguish it. For missed beacon, LIM set reason
8916 //to be eSIR_BEACON_MISSED
8917 if(eSIR_BEACON_MISSED == pSession->roamingStatusCode)
8918 {
8919 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8920 }
8921 else if(eCsrLostlinkRoamingDisassoc == pSession->roamingReason)
8922 {
8923 roamResult = eCSR_ROAM_RESULT_DISASSOC_IND;
8924 }
8925 else if(eCsrLostlinkRoamingDeauth == pSession->roamingReason)
8926 {
8927 roamResult = eCSR_ROAM_RESULT_DEAUTH_IND;
8928 }
8929 else
8930 {
8931 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8932 }
8933 }
8934 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8935 pSession->roamingReason = eCsrNotRoaming;
8936 }
8937 else
8938 {
8939 pSession->roamResult = roamResult;
8940 if(!HAL_STATUS_SUCCESS(csrRoamStartRoamingTimer(pMac, sessionId, PAL_TIMER_TO_SEC_UNIT)))
8941 {
8942 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8943 pSession->roamingReason = eCsrNotRoaming;
8944 }
8945 else
8946 {
8947 fCompleted = eANI_BOOLEAN_FALSE;
8948 }
8949 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008950 return(fCompleted);
8951}
8952
Jeff Johnson295189b2012-06-20 16:38:30 -07008953void csrRoamCancelRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId)
8954{
8955 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008956
8957 if(!pSession)
8958 {
8959 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8960 return;
8961 }
8962
Jeff Johnson295189b2012-06-20 16:38:30 -07008963 if(CSR_IS_ROAMING(pSession))
8964 {
8965 smsLog(pMac, LOGW, " Cancelling roaming\n");
8966 pSession->fCancelRoaming = eANI_BOOLEAN_TRUE;
8967 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
8968 {
8969 //No need to do anything in here because the handler takes care of it
8970 }
8971 else
8972 {
8973 eCsrRoamResult roamResult = CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason) ?
8974 eCSR_ROAM_RESULT_LOSTLINK : eCSR_ROAM_RESULT_NONE;
8975 //Roaming is stopped after here
8976 csrRoamCompleteRoaming(pMac, sessionId, eANI_BOOLEAN_TRUE, roamResult);
8977 //Since CSR may be in lostlink roaming situation, abort all roaming related activities
8978 csrScanAbortMacScan(pMac);
8979 csrRoamStopRoamingTimer(pMac, sessionId);
8980 }
8981 }
8982}
8983
Jeff Johnson295189b2012-06-20 16:38:30 -07008984void csrRoamRoamingTimerHandler(void *pv)
8985{
8986 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
8987 tpAniSirGlobal pMac = pInfo->pMac;
8988 tANI_U32 sessionId = pInfo->sessionId;
8989 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008990
8991 if(!pSession)
8992 {
8993 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8994 return;
8995 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008996
8997 if(eANI_BOOLEAN_FALSE == pSession->fCancelRoaming)
8998 {
8999 if(!HAL_STATUS_SUCCESS(csrRoamStartRoaming(pMac, sessionId, pSession->roamingReason)))
9000 {
9001 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, pSession->roamResult);
9002 pSession->roamingReason = eCsrNotRoaming;
9003 }
9004 }
9005}
9006
Jeff Johnson295189b2012-06-20 16:38:30 -07009007eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9008{
9009 eHalStatus status;
9010 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009011
9012 if(!pSession)
9013 {
9014 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9015 return eHAL_STATUS_FAILURE;
9016 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009017
9018 smsLog(pMac, LOG1, " csrScanStartRoamingTimer \n ");
9019 pSession->roamingTimerInfo.sessionId = (tANI_U8)sessionId;
9020 status = palTimerStart(pMac->hHdd, pSession->hTimerRoaming, interval, eANI_BOOLEAN_FALSE);
9021
9022 return (status);
9023}
9024
Jeff Johnson295189b2012-06-20 16:38:30 -07009025eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9026{
9027 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerRoaming));
9028}
9029
Jeff Johnson295189b2012-06-20 16:38:30 -07009030void csrRoamWaitForKeyTimeOutHandler(void *pv)
9031{
9032 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9033 tpAniSirGlobal pMac = pInfo->pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07009034 if( CSR_IS_WAIT_FOR_KEY( pMac, pInfo->sessionId ) )
9035 {
9036 smsLog(pMac, LOGW, " SME pre-auth state timeout. \n ");
9037 //Change the substate so command queue is unblocked.
9038 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, pInfo->sessionId);
9039 }
9040
9041}
9042
Jeff Johnson295189b2012-06-20 16:38:30 -07009043eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval)
9044{
9045 eHalStatus status;
9046
9047 smsLog(pMac, LOG1, " csrScanStartWaitForKeyTimer \n ");
9048 status = palTimerStart(pMac->hHdd, pMac->roam.hTimerWaitForKey, interval, eANI_BOOLEAN_FALSE);
9049
9050 return (status);
9051}
9052
Jeff Johnson295189b2012-06-20 16:38:30 -07009053eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac)
9054{
9055 return (palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey));
9056}
9057
Jeff Johnson295189b2012-06-20 16:38:30 -07009058void csrRoamIbssJoinTimerHandler(void *pv)
9059{
9060 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9061 tpAniSirGlobal pMac = pInfo->pMac;
9062 eCsrRoamDisconnectReason reason = eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE;
9063 tANI_U32 sessionId = pInfo->sessionId;
9064 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009065
9066 if(!pSession)
9067 {
9068 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9069 return;
9070 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009071
9072 pSession->ibss_join_pending = FALSE;
9073 // JEZ100225: As of main/latest "tip", we are no longer doing this. Check on this.
9074 //csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
9075 // Send an IBSS stop request to PE
9076 csrRoamDisconnectInternal(pMac, sessionId, reason);
Jeff Johnson295189b2012-06-20 16:38:30 -07009077}
Jeff Johnson295189b2012-06-20 16:38:30 -07009078eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9079{
9080 eHalStatus status;
9081 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009082
9083 if(!pSession)
9084 {
9085 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9086 return eHAL_STATUS_FAILURE;
9087 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009088
9089 smsLog(pMac, LOG1, " csrRoamStartIbssJoinTimer \n ");
9090 pSession->ibssJoinTimerInfo.sessionId = (tANI_U8)sessionId;
9091 status = palTimerStart(pMac->hHdd, pSession->hTimerIbssJoining, interval, eANI_BOOLEAN_FALSE);
9092
9093 return (status);
9094}
Jeff Johnson295189b2012-06-20 16:38:30 -07009095eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9096{
9097 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerIbssJoining));
9098}
Jeff Johnson295189b2012-06-20 16:38:30 -07009099void csrRoamCompletion(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo, tSmeCmd *pCommand,
9100 eCsrRoamResult roamResult, tANI_BOOLEAN fSuccess)
9101{
9102 eRoamCmdStatus roamStatus = csrGetRoamCompleteStatus(pMac, sessionId);
9103 tANI_U32 roamId = 0;
9104
9105 if(pCommand)
9106 {
9107 roamId = pCommand->u.roamCmd.roamId;
9108#if defined(VOSS_ENABLED)
9109 VOS_ASSERT( sessionId == pCommand->sessionId );
9110#endif
9111 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009112 if(eCSR_ROAM_ROAMING_COMPLETION == roamStatus)
9113 {
9114 //if success, force roaming completion
9115 csrRoamCompleteRoaming(pMac, sessionId, fSuccess, roamResult);
9116 }
9117 else
9118 {
9119 VOS_ASSERT((CSR_GET_SESSION( pMac, sessionId ))->bRefAssocStartCnt == 0);
9120 smsLog(pMac, LOGW, FL(" indicates association completion. roamResult = %d\n"), roamResult);
9121 csrRoamCallCallback(pMac, sessionId, pRoamInfo, roamId, roamStatus, roamResult);
9122 }
9123}
9124
Jeff Johnson295189b2012-06-20 16:38:30 -07009125eHalStatus csrRoamLostLink( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 type, tSirSmeRsp *pSirMsg)
9126{
9127 eHalStatus status = eHAL_STATUS_SUCCESS;
9128 tSirSmeDeauthInd *pDeauthIndMsg = NULL;
9129 tSirSmeDisassocInd *pDisassocIndMsg = NULL;
9130 eCsrRoamResult result = eCSR_ROAM_RESULT_LOSTLINK;
9131 tCsrRoamInfo *pRoamInfo = NULL;
9132 tCsrRoamInfo roamInfo;
9133 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
9134 //Only need to roam for infra station. In this case P2P client will roam as well
9135 tANI_BOOLEAN fToRoam = CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile);
Jeff Johnson295189b2012-06-20 16:38:30 -07009136 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
9137 if ( eWNI_SME_DISASSOC_IND == type )
9138 {
9139 result = eCSR_ROAM_RESULT_DISASSOC_IND;
9140 pDisassocIndMsg = (tSirSmeDisassocInd *)pSirMsg;
9141 pSession->roamingStatusCode = pDisassocIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009142 pSession->joinFailStatusCode.reasonCode = pDisassocIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009143 }
9144 else if ( eWNI_SME_DEAUTH_IND == type )
9145 {
9146 result = eCSR_ROAM_RESULT_DEAUTH_IND;
9147 pDeauthIndMsg = (tSirSmeDeauthInd *)pSirMsg;
9148 pSession->roamingStatusCode = pDeauthIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009149 pSession->joinFailStatusCode.reasonCode = pDeauthIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009150 }
9151 else
9152 {
9153 smsLog(pMac, LOGW, FL("gets an unknown type (%d)\n"), type);
9154 result = eCSR_ROAM_RESULT_NONE;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009155 pSession->joinFailStatusCode.reasonCode = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07009156 }
9157
9158 // call profile lost link routine here
9159#ifdef WLAN_SOFTAP_FEATURE
9160 if(!CSR_IS_INFRA_AP(&pSession->connectedProfile))
9161#endif
9162 {
9163 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_LOSTLINK_DETECTED, result);
9164 }
9165
9166 if ( eWNI_SME_DISASSOC_IND == type )
9167 {
9168 status = csrSendMBDisassocCnfMsg(pMac, pDisassocIndMsg);
9169 }
9170 else if ( eWNI_SME_DEAUTH_IND == type )
9171 {
9172 status = csrSendMBDeauthCnfMsg(pMac, pDeauthIndMsg);
9173 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009174 if(!HAL_STATUS_SUCCESS(status))
9175 {
9176 //If fail to send confirmation to PE, not to trigger roaming
9177 fToRoam = eANI_BOOLEAN_FALSE;
9178 }
9179
9180 //tell HDD to disconnect
9181 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9182 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9183 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9184#ifdef WLAN_SOFTAP_FEATURE
9185 if( eWNI_SME_DISASSOC_IND == type)
9186 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009187 //staMacAddr
9188 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9189 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9190 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009191 else if( eWNI_SME_DEAUTH_IND == type )
9192 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009193 //staMacAddr
9194 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9195 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9196 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009197#endif
9198 smsLog(pMac, LOGW, FL("roamInfo.staId (%d)\n"), roamInfo.staId);
9199 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9200 if(fToRoam)
9201 {
9202 //Only remove the connected BSS in infrastructure mode
9203 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9204 //Not to do anying for lostlink with WDS
9205 if( pMac->roam.configParam.nRoamingTime )
9206 {
9207 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac, sessionId,
9208 ( eWNI_SME_DEAUTH_IND == type ) ?
9209 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc)))
9210 {
9211 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9212 //For IBSS, we need to give some more info to HDD
9213 if(csrIsBssTypeIBSS(pSession->connectedProfile.BSSType))
9214 {
9215 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
9216 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9217 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9218 }
9219 else
9220 {
9221 roamInfo.reasonCode = eCsrRoamReasonSmeIssuedForLostLink;
9222 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009223 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07009224 pSession->roamingReason = ( eWNI_SME_DEAUTH_IND == type ) ?
9225 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc;
9226 pSession->roamingStartTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
9227 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_LOSTLINK);
9228 }
9229 else
9230 {
9231 smsLog(pMac, LOGW, " %s Fail to start roaming, status = %d", __FUNCTION__, status);
9232 fToRoam = eANI_BOOLEAN_FALSE;
9233 }
9234 }
9235 else
9236 {
9237 //We are told not to roam, indicate lostlink
9238 fToRoam = eANI_BOOLEAN_FALSE;
9239 }
9240 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009241 if(!fToRoam)
9242 {
9243 if( eWNI_SME_DISASSOC_IND == type)
9244 {
9245 //staMacAddr
9246 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9247 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9248 }
9249 else if( eWNI_SME_DEAUTH_IND == type )
9250 {
9251 //staMacAddr
9252 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9253 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9254 }
9255 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9256
9257 /*No need to start idle scan in case of IBSS/SAP
9258 Still enable idle scan for polling in case concurrent sessions are running */
9259 if(CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile))
9260 {
9261 csrScanStartIdleScan(pMac);
9262 }
9263 }
9264
9265 return (status);
9266}
9267
Jeff Johnson295189b2012-06-20 16:38:30 -07009268eHalStatus csrRoamLostLinkAfterhandoffFailure( tpAniSirGlobal pMac,tANI_U32 sessionId)
9269{
9270 eHalStatus status = eHAL_STATUS_SUCCESS;
9271 tListElem *pEntry = NULL;
9272 tSmeCmd *pCommand = NULL;
9273 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009274
9275 if(!pSession)
9276 {
9277 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9278 return eHAL_STATUS_FAILURE;
9279 }
9280
Jeff Johnson295189b2012-06-20 16:38:30 -07009281 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07009282 //Only remove the connected BSS in infrastructure mode
9283 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9284 if(pMac->roam.configParam.nRoamingTime)
9285 {
9286 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac,sessionId, pSession->roamingReason)))
9287 {
9288 //before starting the lost link logic release the roam command for handoff
9289 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
9290 if(pEntry)
9291 {
9292 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
9293 }
9294 if(pCommand)
9295 {
9296 if (( eSmeCommandRoam == pCommand->command ) &&
9297 ( eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason))
9298 {
9299 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9300 {
9301 csrReleaseCommandRoam( pMac, pCommand );
9302 }
9303 }
9304 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009305 smsLog( pMac, LOGW, "Lost link roaming started ...\n");
9306 }
9307 }
9308 else
9309 {
9310 //We are told not to roam, indicate lostlink
9311 status = eHAL_STATUS_FAILURE;
9312 }
9313
9314 return (status);
9315}
Jeff Johnson295189b2012-06-20 16:38:30 -07009316void csrRoamWmStatusChangeComplete( tpAniSirGlobal pMac )
9317{
9318 tListElem *pEntry;
9319 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07009320 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
9321 if ( pEntry )
9322 {
9323 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
9324 if ( eSmeCommandWmStatusChange == pCommand->command )
9325 {
9326 // Nothing to process in a Lost Link completion.... It just kicks off a
9327 // roaming sequence.
9328 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9329 {
9330 csrReleaseCommandWmStatusChange( pMac, pCommand );
9331 }
9332 else
9333 {
9334 smsLog( pMac, LOGE, " ******csrRoamWmStatusChangeComplete fail to release command\n");
9335 }
9336
9337 }
9338 else
9339 {
9340 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but LOST LINK command is not ACTIVE ...\n" );
9341 }
9342 }
9343 else
9344 {
9345 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but NO commands are ACTIVE ...\n" );
9346 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009347 smeProcessPendingQueue( pMac );
9348}
9349
Jeff Johnson295189b2012-06-20 16:38:30 -07009350void csrRoamProcessWmStatusChangeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
9351{
9352 eHalStatus status = eHAL_STATUS_FAILURE;
9353 tSirSmeRsp *pSirSmeMsg;
9354 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pCommand->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009355
9356 if(!pSession)
9357 {
9358 smsLog(pMac, LOGE, FL(" session %d not found "), pCommand->sessionId);
9359 return;
9360 }
9361
Jeff Johnson295189b2012-06-20 16:38:30 -07009362 switch ( pCommand->u.wmStatusChangeCmd.Type )
9363 {
9364 case eCsrDisassociated:
9365 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg;
9366 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DISASSOC_IND, pSirSmeMsg);
9367 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009368 case eCsrDeauthenticated:
9369 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg;
9370 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DEAUTH_IND, pSirSmeMsg);
9371 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009372 default:
9373 smsLog(pMac, LOGW, FL("gets an unknown command %d\n"), pCommand->u.wmStatusChangeCmd.Type);
9374 break;
9375 }
9376 //For WDS, we want to stop BSS as well when it is indicated that it is disconnected.
9377 if( CSR_IS_CONN_WDS(&pSession->connectedProfile) )
9378 {
9379 if( !HAL_STATUS_SUCCESS(csrRoamIssueStopBssCmd( pMac, pCommand->sessionId, eANI_BOOLEAN_TRUE )) )
9380 {
9381 //This is not good
9382 smsLog(pMac, LOGE, FL(" failed to issue stopBSS command\n"));
9383 }
9384 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009385 // Lost Link just triggers a roaming sequence. We can complte the Lost Link
9386 // command here since there is nothing else to do.
9387 csrRoamWmStatusChangeComplete( pMac );
9388}
9389
Jeff Johnson295189b2012-06-20 16:38:30 -07009390//This function returns band and mode information.
9391//The only tricky part is that if phyMode is set to 11abg, this function may return eCSR_CFG_DOT11_MODE_11B
9392//instead of eCSR_CFG_DOT11_MODE_11G if everything is set to auto-pick.
9393#ifdef WLAN_SOFTAP_FEATURE
9394static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9395 tANI_U8 operationChn, eCsrBand *pBand )
9396#else
9397static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn,
9398 tANI_U8 operationChn, eCsrBand *pBand )
9399#endif
9400{
Jeff Johnson295189b2012-06-20 16:38:30 -07009401#ifdef WLAN_SOFTAP_FEATURE
9402 eCsrPhyMode phyModeIn = (eCsrPhyMode)pProfile->phyMode;
9403 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pProfile, phyModeIn,
9404 pMac->roam.configParam.ProprietaryRatesEnabled);
9405#else
9406 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(phyModeIn,
9407 pMac->roam.configParam.ProprietaryRatesEnabled);
9408#endif
9409 eCsrBand eBand;
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009410
Jeff Johnson295189b2012-06-20 16:38:30 -07009411 //If the global setting for dot11Mode is set to auto/abg, we overwrite the setting in the profile.
9412#ifdef WLAN_SOFTAP_FEATURE
9413 if( ((!CSR_IS_INFRA_AP(pProfile )&& !CSR_IS_WDS(pProfile )) &&
9414 ((eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9415 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode))) ||
9416 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
9417#else
9418 if( (eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9419 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode) ||
9420 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
Jeff Johnson295189b2012-06-20 16:38:30 -07009421#endif
9422 {
9423 switch( pMac->roam.configParam.uCfgDot11Mode )
9424 {
9425 case eCSR_CFG_DOT11_MODE_11A:
9426 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9427 eBand = eCSR_BAND_5G;
9428 break;
9429 case eCSR_CFG_DOT11_MODE_11B:
9430 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9431 eBand = eCSR_BAND_24;
9432 break;
9433 case eCSR_CFG_DOT11_MODE_11G:
9434 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9435 eBand = eCSR_BAND_24;
9436 break;
9437 case eCSR_CFG_DOT11_MODE_11N:
9438 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
9439 eBand = eCSR_BAND_24;
9440 break;
9441 //case eCSR_CFG_DOT11_MODE_BEST:
9442 // cfgDot11Mode = eCSR_CFG_DOT11_MODE_BEST;
9443 // eBand = eCSR_BAND_24;
9444 // break;
9445 default:
9446 // Global dot11 Mode setting is 11a/b/g.
9447 // use the channel number to determine the Mode setting.
9448 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9449 {
9450 eBand = pMac->roam.configParam.eBand;
9451 if(eCSR_BAND_24 == eBand)
9452 {
9453 //See reason in else if ( CSR_IS_CHANNEL_24GHZ(operationChn) ) to pick 11B
9454 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9455 }
9456 else
9457 {
9458 //prefer 5GHz
9459 eBand = eCSR_BAND_5G;
9460 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9461 }
9462 }
9463 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9464 {
9465 // channel is a 2.4GHz channel. Set mode to 11g.
9466 //
9467 // !!LAC - WiFi tests require IBSS networks to start in 11b mode without any change to the
9468 // default parameter settings on the adapter. We use ACU to start an IBSS through creation
9469 // of a startIBSS profile. this startIBSS profile has Auto MACProtocol and the
9470 // adapter property setting for dot11Mode is also AUTO. So in this case, let's start
9471 // the IBSS network in 11b mode instead of 11g mode.
9472 //
9473 // so this is for Auto=profile->MacProtocol && Auto=Global.dot11Mode && profile->channel is < 14,
9474 // then start the IBSS in b mode.
9475 //
9476 // Note: we used to have this start as an 11g IBSS for best performance... now to specify that
9477 // the user will have to set the do11Mode in the property page to 11g to force it.
9478 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9479 eBand = eCSR_BAND_24;
9480 }
9481 else
9482 {
9483 // else, it's a 5.0GHz channel. Set mode to 11a.
9484 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9485 eBand = eCSR_BAND_5G;
9486 }
9487 break;
9488 }//switch
9489 }//if( eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
9490 else
9491 {
9492 //dot11 mode is set, lets pick the band
9493 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9494 {
9495 // channel is Auto also.
9496 eBand = pMac->roam.configParam.eBand;
9497 if(eCSR_BAND_ALL == eBand)
9498 {
9499 //prefer 5GHz
9500 eBand = eCSR_BAND_5G;
9501 }
9502 }
9503 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9504 {
9505 eBand = eCSR_BAND_24;
9506 }
9507 else
9508 {
9509 eBand = eCSR_BAND_5G;
9510 }
9511 }
9512 if(pBand)
9513 {
9514 *pBand = eBand;
9515 }
9516
9517 if (operationChn == 14){
9518 smsLog(pMac, LOGE, FL(" Switching to Dot11B mode \n"));
9519 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9520 }
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009521
9522 if( (!CSR_IS_11n_ALLOWED(pProfile->EncryptionType.encryptionType[0] )) &&
9523 ((eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode) ||
9524#ifdef WLAN_FEATURE_11AC
9525 (eCSR_CFG_DOT11_MODE_11AC == cfgDot11Mode) ||
9526#endif
9527 (eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode)) )
9528 {
9529 //We cannot do 11n here
9530 if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9531 {
9532 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9533 }
9534 else
9535 {
9536 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9537 }
9538 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009539 return( cfgDot11Mode );
9540}
9541
Jeff Johnson295189b2012-06-20 16:38:30 -07009542eHalStatus csrRoamIssueStopBss( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
9543{
9544 eHalStatus status;
9545 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009546
9547 if(!pSession)
9548 {
9549 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9550 return eHAL_STATUS_FAILURE;
9551 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009552
9553#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
9554 {
9555 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07009556 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
9557 if(pIbssLog)
9558 {
9559 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_REQ;
9560 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
9561 }
9562 }
9563#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07009564 pSession->ibss_join_pending = FALSE;
9565 csrRoamStopIbssJoinTimer(pMac, sessionId );
9566 // Set the roaming substate to 'stop Bss request'...
9567 csrRoamSubstateChange( pMac, NewSubstate, sessionId );
9568
9569 // attempt to stop the Bss (reason code is ignored...)
9570 status = csrSendMBStopBssReqMsg( pMac, sessionId );
9571
9572 return (status);
9573}
9574
Jeff Johnson295189b2012-06-20 16:38:30 -07009575//pNumChan is a caller allocated space with the sizeof pChannels
9576eHalStatus csrGetCfgValidChannels(tpAniSirGlobal pMac, tANI_U8 *pChannels, tANI_U32 *pNumChan)
9577{
9578
9579 return (ccmCfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
9580 (tANI_U8 *)pChannels,
9581 pNumChan));
9582}
9583
Jeff Johnson295189b2012-06-20 16:38:30 -07009584tANI_BOOLEAN csrRoamIsChannelValid( tpAniSirGlobal pMac, tANI_U8 channel )
9585{
9586 tANI_BOOLEAN fValid = FALSE;
9587 tANI_U32 idxValidChannels;
9588 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9589
9590 if (HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, pMac->roam.validChannelList, &len)))
9591 {
9592 for ( idxValidChannels = 0; ( idxValidChannels < len ); idxValidChannels++ )
9593 {
9594 if ( channel == pMac->roam.validChannelList[ idxValidChannels ] )
9595 {
9596 fValid = TRUE;
9597 break;
9598 }
9599 }
9600 }
9601 pMac->roam.numValidChannels = len;
9602 return fValid;
9603}
9604
Jeff Johnson295189b2012-06-20 16:38:30 -07009605tANI_BOOLEAN csrRoamIsValid40MhzChannel(tpAniSirGlobal pMac, tANI_U8 channel)
9606{
9607 tANI_BOOLEAN fValid = eANI_BOOLEAN_FALSE;
9608 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009609 for(i = 0; i < pMac->scan.base40MHzChannels.numChannels; i++)
9610 {
9611 if(channel == pMac->scan.base40MHzChannels.channelList[i])
9612 {
9613 fValid = eANI_BOOLEAN_TRUE;
9614 break;
9615 }
9616 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009617 return (fValid);
9618}
9619
Jeff Johnson295189b2012-06-20 16:38:30 -07009620//This function check and validate whether the NIC can do CB (40MHz)
Jeff Johnsone7245742012-09-05 17:12:55 -07009621 static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -07009622{
Jeff Johnsone7245742012-09-05 17:12:55 -07009623 ePhyChanBondState eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009624 tANI_U8 centerChn;
9625 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009626 if(CSR_IS_CHANNEL_24GHZ(primaryChn))
9627 {
9628 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
9629 }
9630 else
9631 {
9632 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
9633 }
9634 //Figure what the other side's CB mode
9635 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
9636 {
9637 if(pIes->HTCaps.present && (eHT_CHANNEL_WIDTH_40MHZ == pIes->HTCaps.supportedChannelWidthSet))
9638 {
9639 if(pIes->HTInfo.present)
9640 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009641 /* This is called during INFRA STA/CLIENT and should use the merged value of
9642 * supported channel width and recommended tx width as per standard
9643 */
9644 smsLog(pMac, LOG1, "scws %u rtws %u sco %u\n",
9645 pIes->HTCaps.supportedChannelWidthSet,
9646 pIes->HTInfo.recommendedTxWidthSet,
9647 pIes->HTInfo.secondaryChannelOffset);
9648
9649 if (pIes->HTInfo.recommendedTxWidthSet == eHT_CHANNEL_WIDTH_40MHZ)
9650 eRet = (ePhyChanBondState)pIes->HTInfo.secondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07009651 else
Jeff Johnsone7245742012-09-05 17:12:55 -07009652 eRet = PHY_SINGLE_CHANNEL_CENTERED;
9653 switch (eRet) {
9654 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
9655 centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
9656 break;
9657 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
9658 centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
9659 break;
9660 case PHY_SINGLE_CHANNEL_CENTERED:
9661 default:
9662 centerChn = primaryChn;
9663 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009664 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009665 if((PHY_SINGLE_CHANNEL_CENTERED != eRet) && !csrRoamIsValid40MhzChannel(pMac, centerChn))
Jeff Johnson295189b2012-06-20 16:38:30 -07009666 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009667 smsLog(pMac, LOGE, " Invalid center channel (%d), disable 40MHz mode\n", centerChn);
9668 //eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009669 }
9670 }
9671 }
9672 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009673 return eRet;
9674}
Jeff Johnson295189b2012-06-20 16:38:30 -07009675tANI_BOOLEAN csrIsEncryptionInList( tpAniSirGlobal pMac, tCsrEncryptionList *pCipherList, eCsrEncryptionType encryptionType )
9676{
9677 tANI_BOOLEAN fFound = FALSE;
9678 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009679 for( idx = 0; idx < pCipherList->numEntries; idx++ )
9680 {
9681 if( pCipherList->encryptionType[idx] == encryptionType )
9682 {
9683 fFound = TRUE;
9684 break;
9685 }
9686 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009687 return fFound;
9688}
Jeff Johnson295189b2012-06-20 16:38:30 -07009689tANI_BOOLEAN csrIsAuthInList( tpAniSirGlobal pMac, tCsrAuthList *pAuthList, eCsrAuthType authType )
9690{
9691 tANI_BOOLEAN fFound = FALSE;
9692 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009693 for( idx = 0; idx < pAuthList->numEntries; idx++ )
9694 {
9695 if( pAuthList->authType[idx] == authType )
9696 {
9697 fFound = TRUE;
9698 break;
9699 }
9700 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009701 return fFound;
9702}
Jeff Johnson295189b2012-06-20 16:38:30 -07009703tANI_BOOLEAN csrIsSameProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile1, tCsrRoamProfile *pProfile2)
9704{
9705 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9706 tCsrScanResultFilter *pScanFilter = NULL;
9707 eHalStatus status = eHAL_STATUS_SUCCESS;
9708
9709 if(pProfile1 && pProfile2)
9710 {
9711 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
9712 if(HAL_STATUS_SUCCESS(status))
9713 {
9714 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
9715 status = csrRoamPrepareFilterFromProfile(pMac, pProfile2, pScanFilter);
9716 if(HAL_STATUS_SUCCESS(status))
9717 {
9718 fCheck = eANI_BOOLEAN_FALSE;
9719 do
9720 {
9721 tANI_U32 i;
9722 for(i = 0; i < pScanFilter->SSIDs.numOfSSIDs; i++)
9723 {
9724 fCheck = csrIsSsidMatch( pMac, pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
9725 pScanFilter->SSIDs.SSIDList[i].SSID.length,
9726 pProfile1->SSID.ssId, pProfile1->SSID.length, eANI_BOOLEAN_FALSE );
9727 if ( fCheck ) break;
9728 }
9729 if(!fCheck)
9730 {
9731 break;
9732 }
9733 if( !csrIsAuthInList( pMac, &pProfile2->AuthType, pProfile1->AuthType)
9734 || pProfile2->BSSType != pProfile1->BSSType
9735 || !csrIsEncryptionInList( pMac, &pProfile2->EncryptionType, pProfile1->EncryptionType )
9736 )
9737 {
9738 fCheck = eANI_BOOLEAN_FALSE;
9739 break;
9740 }
9741#ifdef WLAN_FEATURE_VOWIFI_11R
9742 if (pProfile1->MDID.mdiePresent || pProfile2->MDID.mdiePresent)
9743 {
9744 if (pProfile1->MDID.mobilityDomain != pProfile2->MDID.mobilityDomain)
9745 {
9746 fCheck = eANI_BOOLEAN_FALSE;
9747 break;
9748 }
9749 }
9750#endif
9751 //Match found
9752 fCheck = eANI_BOOLEAN_TRUE;
9753 }while(0);
9754 csrFreeScanFilter(pMac, pScanFilter);
9755 }
9756 palFreeMemory(pMac->hHdd, pScanFilter);
9757 }
9758 }
9759
9760 return (fCheck);
9761}
9762
Jeff Johnson295189b2012-06-20 16:38:30 -07009763tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2)
9764{
9765 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9766 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009767 do
9768 {
9769 //Only check for static WEP
9770 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP40_STATICKEY) &&
9771 !csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP104_STATICKEY))
9772 {
9773 fCheck = eANI_BOOLEAN_TRUE;
9774 break;
9775 }
9776 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, pConnProfile->EncryptionType)) break;
9777 if(pConnProfile->Keys.defaultIndex != pProfile2->Keys.defaultIndex) break;
9778 for(i = 0; i < CSR_MAX_NUM_KEY; i++)
9779 {
9780 if(pConnProfile->Keys.KeyLength[i] != pProfile2->Keys.KeyLength[i]) break;
9781 if(!palEqualMemory(pMac->hHdd, &pConnProfile->Keys.KeyMaterial[i],
9782 &pProfile2->Keys.KeyMaterial[i], pProfile2->Keys.KeyLength[i]))
9783 {
9784 break;
9785 }
9786 }
9787 if( i == CSR_MAX_NUM_KEY)
9788 {
9789 fCheck = eANI_BOOLEAN_TRUE;
9790 }
9791 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009792 return (fCheck);
9793}
9794
Jeff Johnson295189b2012-06-20 16:38:30 -07009795//IBSS
9796
Jeff Johnson295189b2012-06-20 16:38:30 -07009797tANI_U8 csrRoamGetIbssStartChannelNumber50( tpAniSirGlobal pMac )
9798{
9799 tANI_U8 channel = 0;
9800 tANI_U32 idx;
9801 tANI_U32 idxValidChannels;
9802 tANI_BOOLEAN fFound = FALSE;
9803 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9804
9805 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel5G)
9806 {
9807 channel = pMac->roam.configParam.AdHocChannel5G;
9808 if(!csrRoamIsChannelValid(pMac, channel))
9809 {
9810 channel = 0;
9811 }
9812 }
9813 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9814 {
9815 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_50 ) && !fFound; idx++ )
9816 {
9817 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9818 {
9819 if ( csrStartIbssChannels50[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9820 {
9821 fFound = TRUE;
9822 channel = csrStartIbssChannels50[ idx ];
9823 }
9824 }
9825 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009826 // this is rare, but if it does happen, we find anyone in 11a bandwidth and return the first 11a channel found!
9827 if (!fFound)
9828 {
9829 for ( idxValidChannels = 0; idxValidChannels < len ; idxValidChannels++ )
9830 {
9831 if ( CSR_IS_CHANNEL_5GHZ(pMac->roam.validChannelList[ idx ]) ) // the max channel# in 11g is 14
9832 {
9833 channel = csrStartIbssChannels50[ idx ];
9834 break;
9835 }
9836 }
9837 }
9838 }//if
9839
9840 return( channel );
9841}
9842
Jeff Johnson295189b2012-06-20 16:38:30 -07009843tANI_U8 csrRoamGetIbssStartChannelNumber24( tpAniSirGlobal pMac )
9844{
9845 tANI_U8 channel = 1;
9846 tANI_U32 idx;
9847 tANI_U32 idxValidChannels;
9848 tANI_BOOLEAN fFound = FALSE;
9849 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9850
9851 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel24)
9852 {
9853 channel = pMac->roam.configParam.AdHocChannel24;
9854 if(!csrRoamIsChannelValid(pMac, channel))
9855 {
9856 channel = 0;
9857 }
9858 }
9859
9860 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9861 {
9862 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_24 ) && !fFound; idx++ )
9863 {
9864 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9865 {
9866 if ( csrStartIbssChannels24[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9867 {
9868 fFound = TRUE;
9869 channel = csrStartIbssChannels24[ idx ];
9870 }
9871 }
9872 }
9873 }
9874
9875 return( channel );
9876}
9877
Jeff Johnson295189b2012-06-20 16:38:30 -07009878static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9879 tCsrRoamStartBssParams *pParam )
9880{
9881 eCsrCfgDot11Mode cfgDot11Mode;
9882 eCsrBand eBand;
9883 tANI_U8 channel = 0;
9884 tSirNwType nwType;
9885 tANI_U8 operationChannel = 0;
9886
9887 if(pProfile->ChannelInfo.numOfChannels && pProfile->ChannelInfo.ChannelList)
9888 {
9889 operationChannel = pProfile->ChannelInfo.ChannelList[0];
9890 }
9891
9892#ifdef WLAN_SOFTAP_FEATURE
9893 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
9894#else
9895 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
9896#endif
9897
9898#ifdef WLAN_FEATURE_P2P
9899 if( ( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
9900 (pProfile->csrPersona == VOS_P2P_GO_MODE) )
9901 && ( cfgDot11Mode == eCSR_CFG_DOT11_MODE_11B)
9902 )
9903 {
9904 /* This should never happen */
9905 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL,
9906 FL("For P2PClient/P2P-GO (persona %d) cfgDot11Mode is 11B\n"),
9907 pProfile->csrPersona);
9908 VOS_ASSERT(0);
9909 }
9910#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009911 switch( cfgDot11Mode )
9912 {
9913 case eCSR_CFG_DOT11_MODE_11G:
9914 nwType = eSIR_11G_NW_TYPE;
9915 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009916 case eCSR_CFG_DOT11_MODE_11B:
9917 nwType = eSIR_11B_NW_TYPE;
9918 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009919 case eCSR_CFG_DOT11_MODE_11A:
9920 nwType = eSIR_11A_NW_TYPE;
9921 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009922 default:
9923 case eCSR_CFG_DOT11_MODE_11N:
9924 case eCSR_CFG_DOT11_MODE_TAURUS:
9925 //Because LIM only verifies it against 11a, 11b or 11g, set only 11g or 11a here
9926 if(eCSR_BAND_24 == eBand)
9927 {
9928 nwType = eSIR_11G_NW_TYPE;
9929 }
9930 else
9931 {
9932 nwType = eSIR_11A_NW_TYPE;
9933 }
9934 break;
9935 }
9936
9937 pParam->extendedRateSet.numRates = 0;
9938
9939 switch ( nwType )
9940 {
9941 default:
9942 smsLog(pMac, LOGE, FL("sees an unknown pSirNwType (%d)\n"), nwType);
9943 case eSIR_11A_NW_TYPE:
9944
9945 pParam->operationalRateSet.numRates = 8;
9946
9947 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
9948 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
9949 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
9950 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
9951 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
9952 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
9953 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
9954 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
9955
9956 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
9957 {
9958 channel = csrRoamGetIbssStartChannelNumber50( pMac );
9959 if( 0 == channel &&
9960 CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) &&
9961 CSR_IS_PHY_MODE_DUAL_BAND(pMac->roam.configParam.phyMode)
9962 )
9963 {
9964 //We could not find a 5G channel by auto pick, let's try 2.4G channels
9965 //We only do this here because csrRoamGetPhyModeBandForBss always picks 11a for AUTO
9966 nwType = eSIR_11B_NW_TYPE;
9967 channel = csrRoamGetIbssStartChannelNumber24( pMac );
9968 pParam->operationalRateSet.numRates = 4;
9969 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
9970 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
9971 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
9972 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
9973 }
9974 }
9975 else
9976 {
9977 channel = operationChannel;
9978 }
9979 break;
9980
9981 case eSIR_11B_NW_TYPE:
9982 pParam->operationalRateSet.numRates = 4;
9983 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
9984 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
9985 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
9986 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -07009987 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
9988 {
9989 channel = csrRoamGetIbssStartChannelNumber24( pMac );
9990 }
9991 else
9992 {
9993 channel = operationChannel;
9994 }
9995
9996 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009997 case eSIR_11G_NW_TYPE:
9998#ifdef WLAN_FEATURE_P2P
9999 /* For P2P Client and P2P GO, disable 11b rates */
10000 if( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
10001 (pProfile->csrPersona == VOS_P2P_GO_MODE)
10002 )
10003 {
10004 pParam->operationalRateSet.numRates = 8;
10005
10006 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
10007 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
10008 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
10009 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
10010 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
10011 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
10012 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
10013 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
10014 }
10015 else
10016#endif
10017 {
10018 pParam->operationalRateSet.numRates = 4;
Jeff Johnson295189b2012-06-20 16:38:30 -070010019 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10020 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10021 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10022 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
10023
10024 pParam->extendedRateSet.numRates = 8;
Jeff Johnson295189b2012-06-20 16:38:30 -070010025 pParam->extendedRateSet.rate[0] = SIR_MAC_RATE_6;
10026 pParam->extendedRateSet.rate[1] = SIR_MAC_RATE_9;
10027 pParam->extendedRateSet.rate[2] = SIR_MAC_RATE_12;
10028 pParam->extendedRateSet.rate[3] = SIR_MAC_RATE_18;
10029 pParam->extendedRateSet.rate[4] = SIR_MAC_RATE_24;
10030 pParam->extendedRateSet.rate[5] = SIR_MAC_RATE_36;
10031 pParam->extendedRateSet.rate[6] = SIR_MAC_RATE_48;
10032 pParam->extendedRateSet.rate[7] = SIR_MAC_RATE_54;
10033 }
10034
10035 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10036 {
10037 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10038 }
10039 else
10040 {
10041 channel = operationChannel;
10042 }
10043
10044 break;
10045 }
10046 pParam->operationChn = channel;
10047 pParam->sirNwType = nwType;
10048}
10049
Jeff Johnson295189b2012-06-20 16:38:30 -070010050static void csrRoamGetBssStartParmsFromBssDesc( tpAniSirGlobal pMac, tSirBssDescription *pBssDesc,
10051 tDot11fBeaconIEs *pIes, tCsrRoamStartBssParams *pParam )
10052{
10053
10054 if( pParam )
10055 {
10056 pParam->sirNwType = pBssDesc->nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070010057 pParam->cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010058 pParam->operationChn = pBssDesc->channelId;
10059 palCopyMemory( pMac->hHdd, &pParam->bssid, pBssDesc->bssId, sizeof(tCsrBssid) );
10060
10061 if( pIes )
10062 {
10063 if(pIes->SuppRates.present)
10064 {
10065 pParam->operationalRateSet.numRates = pIes->SuppRates.num_rates;
10066 if(pIes->SuppRates.num_rates > SIR_MAC_RATESET_EID_MAX)
10067 {
10068 smsLog(pMac, LOGE, FL("num_rates :%d is more than SIR_MAC_RATESET_EID_MAX, resetting to SIR_MAC_RATESET_EID_MAX\n"),
10069 pIes->SuppRates.num_rates);
10070 pIes->SuppRates.num_rates = SIR_MAC_RATESET_EID_MAX;
10071 }
10072 palCopyMemory(pMac->hHdd, pParam->operationalRateSet.rate, pIes->SuppRates.rates,
10073 sizeof(*pIes->SuppRates.rates) * pIes->SuppRates.num_rates);
10074 }
10075 if( pIes->SSID.present )
10076 {
10077 pParam->ssId.length = pIes->SSID.num_ssid;
10078 palCopyMemory(pMac->hHdd, pParam->ssId.ssId, pIes->SSID.ssid, pParam->ssId.length);
10079 }
10080 pParam->cbMode = csrGetCBModeFromIes(pMac, pParam->operationChn, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -070010081 }
10082 else
10083 {
10084 pParam->ssId.length = 0;
10085 pParam->operationalRateSet.numRates = 0;
10086 }
10087 }
10088}
10089
Jeff Johnson295189b2012-06-20 16:38:30 -070010090static void csrRoamDetermineMaxRateForAdHoc( tpAniSirGlobal pMac, tSirMacRateSet *pSirRateSet )
10091{
10092 tANI_U8 MaxRate = 0;
10093 tANI_U32 i;
10094 tANI_U8 *pRate;
10095
10096 pRate = pSirRateSet->rate;
10097 for ( i = 0; i < pSirRateSet->numRates; i++ )
10098 {
10099 MaxRate = CSR_MAX( MaxRate, ( pRate[ i ] & (~CSR_DOT11_BASIC_RATE_MASK) ) );
10100 }
10101
10102 // Save the max rate in the connected state information...
10103
10104 // modify LastRates variable as well
10105
10106 return;
10107}
10108
Jeff Johnson295189b2012-06-20 16:38:30 -070010109//this function finds a valid secondary channel for channel bonding with "channel".
10110//Param: channel -- primary channel, caller must validate it
10111// cbChoice -- CB directory
10112//Return: if 0, no secondary channel is found. Otherwise a valid secondary channel.
10113static tANI_U8 csrRoamGetSecondaryChannel(tpAniSirGlobal pMac, tANI_U8 channel, eCsrCBChoice cbChoice)
10114{
10115 tANI_U8 chnUp = 0, chnDown = 0, chnRet = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010116 switch (cbChoice)
10117 {
10118 case eCSR_CB_OFF:
10119 chnUp = 0;
10120 chnDown = 0;
10121 break;
10122 case eCSR_CB_DOWN:
10123 chnUp = 0;
10124 chnDown = channel - CSR_CB_CHANNEL_GAP;
10125 break;
10126 case eCSR_CB_UP:
10127 chnUp = channel + CSR_CB_CHANNEL_GAP;
10128 chnDown = 0;
10129 break;
10130 case eCSR_CB_AUTO:
10131 //consider every other value means auto
10132 default:
10133 chnUp = channel + CSR_CB_CHANNEL_GAP;
10134 chnDown = channel - CSR_CB_CHANNEL_GAP;
10135 break;
10136 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010137 //if CB_UP or auto, try channel up first
10138 if(chnUp && CSR_IS_SAME_BAND_CHANNELS(chnUp, channel) && csrRoamIsChannelValid(pMac, chnUp))
10139 {
10140 //found a valid up channel for channel bonding
10141 //check whether the center channel is valid
10142 if(csrRoamIsValid40MhzChannel(pMac, channel + CSR_CB_CENTER_CHANNEL_OFFSET))
10143 {
10144 chnRet = chnUp;
10145 }
10146 }
10147 if(chnRet == 0 && chnDown && CSR_IS_SAME_BAND_CHANNELS(chnDown, channel) && csrRoamIsChannelValid(pMac, chnDown))
10148 {
10149 //found a valid down channel for channel bonding
10150 if(csrRoamIsValid40MhzChannel(pMac, channel - CSR_CB_CENTER_CHANNEL_OFFSET))
10151 {
10152 chnRet = chnDown;
10153 }
10154 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010155 return chnRet;
10156}
10157
Jeff Johnson295189b2012-06-20 16:38:30 -070010158eHalStatus csrRoamIssueStartBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamStartBssParams *pParam,
10159 tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc, tANI_U32 roamId )
10160{
10161 eHalStatus status = eHAL_STATUS_SUCCESS;
10162 eCsrBand eBand;
Jeff Johnson295189b2012-06-20 16:38:30 -070010163 // Set the roaming substate to 'Start BSS attempt'...
10164 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_START_BSS_REQ, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070010165#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10166 //Need to figure out whether we need to log WDS???
10167 if( CSR_IS_IBSS( pProfile ) )
10168 {
10169 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -070010170 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
10171 if(pIbssLog)
10172 {
10173 if(pBssDesc)
10174 {
10175 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_REQ;
10176 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pBssDesc->bssId, 6);
10177 }
10178 else
10179 {
10180 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_REQ;
10181 }
10182 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pParam->ssId.ssId,
10183 pParam->ssId.length);
10184 if(pProfile->ChannelInfo.numOfChannels == 0)
10185 {
10186 pIbssLog->channelSetting = AUTO_PICK;
10187 }
10188 else
10189 {
10190 pIbssLog->channelSetting = SPECIFIED;
10191 }
10192 pIbssLog->operatingChannel = pParam->operationChn;
10193 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
10194 }
10195 }
10196#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
10197 //Put RSN information in for Starting BSS
10198 pParam->nRSNIELength = (tANI_U16)pProfile->nRSNReqIELength;
10199 pParam->pRSNIE = pProfile->pRSNReqIE;
10200
Jeff Johnson295189b2012-06-20 16:38:30 -070010201#ifdef WLAN_SOFTAP_FEATURE
10202 pParam->privacy = pProfile->privacy;
10203 pParam->fwdWPSPBCProbeReq = pProfile->fwdWPSPBCProbeReq;
10204 pParam->authType = pProfile->csr80211AuthType;
10205 pParam->beaconInterval = pProfile->beaconInterval;
10206 pParam->dtimPeriod = pProfile->dtimPeriod;
10207 pParam->ApUapsdEnable = pProfile->ApUapsdEnable;
10208 pParam->ssidHidden = pProfile->SSIDs.SSIDList[0].ssidHidden;
10209 if (CSR_IS_INFRA_AP(pProfile)&& (pParam->operationChn != 0))
10210 {
10211 if (csrIsValidChannel(pMac, pParam->operationChn) != eHAL_STATUS_SUCCESS)
10212 {
10213 pParam->operationChn = INFRA_AP_DEFAULT_CHANNEL;
10214 }
10215 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010216 pParam->protEnabled = pProfile->protEnabled;
10217 pParam->obssProtEnabled = pProfile->obssProtEnabled;
10218 pParam->ht_protection = pProfile->cfg_protection;
10219 pParam->wps_state = pProfile->wps_state;
10220#endif
10221
Jeff Johnson295189b2012-06-20 16:38:30 -070010222#ifdef WLAN_SOFTAP_FEATURE
10223 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, pParam->operationChn /* pProfile->operationChannel*/,
10224 &eBand);
10225#else
10226 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile->operationChannel,
10227 &eBand);
10228#endif
10229 pParam->bssPersona = pProfile->csrPersona;
10230 // When starting an IBSS, start on the channel from the Profile.
10231 status = csrSendMBStartBssReqMsg( pMac, sessionId, pProfile->BSSType, pParam, pBssDesc );
Jeff Johnson295189b2012-06-20 16:38:30 -070010232 return (status);
10233}
10234
Jeff Johnson295189b2012-06-20 16:38:30 -070010235static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
Jeff Johnsone7245742012-09-05 17:12:55 -070010236 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -070010237{
10238 tANI_U8 Channel, SecondChn;
Jeff Johnsone7245742012-09-05 17:12:55 -070010239 ePhyChanBondState cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010240 eCsrCBChoice cbChoice;
10241 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010242
10243 if(!pSession)
10244 {
10245 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10246 return;
10247 }
10248
Jeff Johnson295189b2012-06-20 16:38:30 -070010249 if( pBssDesc )
10250 {
10251 csrRoamGetBssStartParmsFromBssDesc( pMac, pBssDesc, pIes, &pSession->bssParams );
10252 //Since csrRoamGetBssStartParmsFromBssDesc fills in the bssid for pSession->bssParams
10253 //The following code has to be do after that.
10254 //For WDS station, use selfMac as the self BSSID
10255 if( CSR_IS_WDS_STA( pProfile ) )
10256 {
10257 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10258 }
10259 }
10260 else
10261 {
10262 csrRoamGetBssStartParms(pMac, pProfile, &pSession->bssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010263 //Use the first SSID
10264 if(pProfile->SSIDs.numOfSSIDs)
10265 {
10266 palCopyMemory(pMac->hHdd, &pSession->bssParams.ssId, pProfile->SSIDs.SSIDList, sizeof(tSirMacSSid));
10267 }
10268 //For WDS station, use selfMac as the self BSSID
10269 if( CSR_IS_WDS_STA( pProfile ) )
10270 {
10271 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10272 }
10273 //Use the first BSSID
10274 else if( pProfile->BSSIDs.numOfBSSIDs )
10275 {
10276 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid, sizeof(tCsrBssid));
10277 }
10278 else
10279 {
10280 palZeroMemory( pMac->hHdd, &pSession->bssParams.bssid, sizeof(tCsrBssid) );
10281 }
10282 }
10283 Channel = pSession->bssParams.operationChn;
Jeff Johnson295189b2012-06-20 16:38:30 -070010284 //Set operating channel in pProfile which will be used
10285 //in csrRoamSetBssConfigCfg() to determine channel bonding
10286 //mode and will be configured in CFG later
10287 pProfile->operationChannel = Channel;
10288
10289 if(Channel == 0)
10290 {
10291 smsLog(pMac, LOGW, " CSR cannot find a channel to start IBSS\n");
10292 }
10293 else
10294 {
10295
10296 csrRoamDetermineMaxRateForAdHoc( pMac, &pSession->bssParams.operationalRateSet );
Jeff Johnsone7245742012-09-05 17:12:55 -070010297 if (CSR_IS_INFRA_AP(pProfile))
10298 {
10299 if(CSR_IS_CHANNEL_24GHZ(Channel))
10300 {
10301 cbMode = pMac->roam.configParam.channelBondingMode24GHz;
10302 }
10303 else
10304 {
10305 cbMode = pMac->roam.configParam.channelBondingMode5GHz;
10306 }
10307 smsLog(pMac, LOG1, "##softap cbMode %d\n", cbMode);
10308 pBssConfig->cbMode = cbMode;
10309 pSession->bssParams.cbMode = cbMode;
10310 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010311
10312 if( CSR_IS_START_IBSS( pProfile ) )
10313 {
10314 //TBH: channel bonding is not supported for Libra
10315 if( pProfile->ChannelInfo.ChannelList && eCSR_OPERATING_CHANNEL_AUTO != pProfile->ChannelInfo.ChannelList[0] )
10316 {
10317 Channel = pProfile->ChannelInfo.ChannelList[0];
10318 cbChoice = pProfile->CBMode;
10319 }
10320 else {
10321 cbChoice = pMac->roam.configParam.cbChoice;
10322 }
10323 pSession->bssParams.operationChn = Channel;
10324 //make sure channel is valid
10325 if(!csrRoamIsChannelValid(pMac, Channel))
10326 {
10327 //set Channel to 0 to let lim know this is invalid
10328 //We still send this request down to lim even though we know the channel is wrong because
10329 //lim will response with error and hdd's eWNI_SME_START_BSS_RSP handler will roam other profile (if any)
10330 Channel = 0;
10331 pSession->bssParams.operationChn = 0;
10332 }
10333 else {
10334 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070010335 if(CSR_IS_CHANNEL_24GHZ(Channel))
10336 {
10337 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
10338 }
10339 else
10340 {
10341 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
10342 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010343 //now we have a valid channel
10344 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
10345 {
10346 //let's pick a secondard channel
10347 SecondChn = csrRoamGetSecondaryChannel(pMac, Channel, cbChoice);
Jeff Johnson295189b2012-06-20 16:38:30 -070010348 if(SecondChn > Channel)
10349 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010350 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010351 }
10352 else if(SecondChn && SecondChn < Channel)
10353 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010354 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010355 }
10356 else
10357 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010358 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010359 }
10360 pSession->bssParams.cbMode = cbMode;
10361 }
10362 else
10363 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010364 pSession->bssParams.cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010365 }
10366 }
10367 }
10368 }
10369}
10370
Jeff Johnson295189b2012-06-20 16:38:30 -070010371static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
10372 tANI_BOOLEAN *pfSameIbss )
10373{
10374 eHalStatus status = eHAL_STATUS_SUCCESS;
10375 tANI_BOOLEAN fSameIbss = FALSE;
10376
10377 if ( csrIsConnStateIbss( pMac, sessionId ) )
10378 {
10379 // Check if any profile parameter has changed ? If any profile parameter
10380 // has changed then stop old BSS and start a new one with new parameters
10381 if ( csrIsSameProfile( pMac, &pMac->roam.roamSession[sessionId].connectedProfile, pProfile ) )
10382 {
10383 fSameIbss = TRUE;
10384 }
10385 else
10386 {
10387 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10388 }
10389 }
10390 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10391 {
10392 // Disassociate from the connected Infrastructure network...
10393 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10394 }
10395 else
10396 {
10397 tBssConfigParam *pBssConfig;
10398
10399 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
10400 if(HAL_STATUS_SUCCESS(status))
10401 {
10402 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
10403 // there is no Bss description before we start an IBSS so we need to adopt
10404 // all Bss configuration parameters from the Profile.
10405 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, pBssConfig, NULL);
10406 if(HAL_STATUS_SUCCESS(status))
10407 {
10408 //save dotMode
10409 pMac->roam.roamSession[sessionId].bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
10410 //Prepare some more parameters for this IBSS
Jeff Johnsone7245742012-09-05 17:12:55 -070010411 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010412 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
10413 }
10414
10415 palFreeMemory(pMac->hHdd, pBssConfig);
10416 }//Allocate memory
10417 }
10418
10419 if(pfSameIbss)
10420 {
10421 *pfSameIbss = fSameIbss;
10422 }
10423 return( status );
10424}
10425
Jeff Johnson295189b2012-06-20 16:38:30 -070010426static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId,
10427 tSirSmeNewBssInfo *pNewBss )
10428{
10429 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010430
10431 if(!pSession)
10432 {
10433 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10434 return;
10435 }
10436
Jeff Johnson295189b2012-06-20 16:38:30 -070010437 if( pNewBss )
10438 {
10439 // Set the operating channel.
10440 pSession->connectedProfile.operationChannel = pNewBss->channelNumber;
10441 // move the BSSId from the BSS description into the connected state information.
10442 palCopyMemory( pMac->hHdd, &pSession->connectedProfile.bssid,
10443 &(pNewBss->bssId), sizeof( tCsrBssid ) );
10444 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010445 return;
10446}
10447
Jeff Johnson295189b2012-06-20 16:38:30 -070010448#ifdef FEATURE_WLAN_WAPI
10449eHalStatus csrRoamSetBKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tBkidCacheInfo *pBKIDCache,
10450 tANI_U32 numItems )
10451{
10452 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10453 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010454 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10455 {
10456 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10457 return status;
10458 }
10459 smsLog(pMac, LOGW, "csrRoamSetBKIDCache called, numItems = %d\n", numItems);
10460 pSession = CSR_GET_SESSION( pMac, sessionId );
10461 if(numItems <= CSR_MAX_BKID_ALLOWED)
10462 {
10463 status = eHAL_STATUS_SUCCESS;
10464 //numItems may be 0 to clear the cache
10465 pSession->NumBkidCache = (tANI_U16)numItems;
10466 if(numItems && pBKIDCache)
10467 {
10468 status = palCopyMemory( pMac->hHdd, pSession->BkidCacheInfo, pBKIDCache,
10469 sizeof(tBkidCacheInfo) * numItems );
10470 }
10471 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010472 return (status);
10473}
Jeff Johnson295189b2012-06-20 16:38:30 -070010474eHalStatus csrRoamGetBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum,
10475 tBkidCacheInfo *pBkidCache)
10476{
10477 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10478 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010479 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10480 {
10481 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10482 return status;
10483 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010484 pSession = CSR_GET_SESSION( pMac, sessionId );
10485 if(pNum && pBkidCache)
10486 {
10487 if(pSession->NumBkidCache == 0)
10488 {
10489 *pNum = 0;
10490 status = eHAL_STATUS_SUCCESS;
10491 }
10492 else if(*pNum >= pSession->NumBkidCache)
10493 {
10494 if(pSession->NumBkidCache > CSR_MAX_PMKID_ALLOWED)
10495 {
10496 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10497 pSession->NumBkidCache);
10498 pSession->NumBkidCache = CSR_MAX_PMKID_ALLOWED;
10499 }
10500 palCopyMemory( pMac->hHdd, pBkidCache, pSession->BkidCacheInfo,
10501 sizeof(tBkidCacheInfo) * pSession->NumBkidCache );
10502 *pNum = pSession->NumBkidCache;
10503 status = eHAL_STATUS_SUCCESS;
10504 }
10505 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010506 return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -070010507}
Jeff Johnson295189b2012-06-20 16:38:30 -070010508tANI_U32 csrRoamGetNumBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10509{
10510 return (pMac->roam.roamSession[sessionId].NumBkidCache);
Jeff Johnson295189b2012-06-20 16:38:30 -070010511}
10512#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010513eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
10514 tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems )
10515{
10516 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10517 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010518
10519 if(!pSession)
10520 {
10521 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10522 return eHAL_STATUS_FAILURE;
10523 }
10524
Jeff Johnson295189b2012-06-20 16:38:30 -070010525 smsLog(pMac, LOGW, "csrRoamSetPMKIDCache called, numItems = %d\n", numItems);
10526 if(numItems <= CSR_MAX_PMKID_ALLOWED)
10527 {
10528#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10529 {
10530 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
10531 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
10532 secEvent.eventId = WLAN_SECURITY_EVENT_PMKID_UPDATE;
10533 secEvent.encryptionModeMulticast =
10534 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
10535 secEvent.encryptionModeUnicast =
10536 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
10537 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
10538 secEvent.authMode =
10539 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
10540 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
10541 }
10542#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -070010543 status = eHAL_STATUS_SUCCESS;
10544 //numItems may be 0 to clear the cache
10545 pSession->NumPmkidCache = (tANI_U16)numItems;
10546 if(numItems && pPMKIDCache)
10547 {
10548 status = palCopyMemory( pMac->hHdd, pSession->PmkidCacheInfo, pPMKIDCache,
10549 sizeof(tPmkidCacheInfo) * numItems );
10550 }
10551 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010552 return (status);
10553}
10554
Jeff Johnson295189b2012-06-20 16:38:30 -070010555tANI_U32 csrRoamGetNumPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10556{
10557 return (pMac->roam.roamSession[sessionId].NumPmkidCache);
10558}
10559
Jeff Johnson295189b2012-06-20 16:38:30 -070010560eHalStatus csrRoamGetPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum, tPmkidCacheInfo *pPmkidCache)
10561{
10562 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10563 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010564
10565 if(!pSession)
10566 {
10567 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10568 return eHAL_STATUS_FAILURE;
10569 }
10570
Jeff Johnson295189b2012-06-20 16:38:30 -070010571 if(pNum && pPmkidCache)
10572 {
10573 if(pSession->NumPmkidCache == 0)
10574 {
10575 *pNum = 0;
10576 status = eHAL_STATUS_SUCCESS;
10577 }
10578 else if(*pNum >= pSession->NumPmkidCache)
10579 {
10580 if(pSession->NumPmkidCache > CSR_MAX_PMKID_ALLOWED)
10581 {
10582 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10583 pSession->NumPmkidCache);
10584 pSession->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
10585 }
10586 palCopyMemory( pMac->hHdd, pPmkidCache, pSession->PmkidCacheInfo,
10587 sizeof(tPmkidCacheInfo) * pSession->NumPmkidCache );
10588 *pNum = pSession->NumPmkidCache;
10589 status = eHAL_STATUS_SUCCESS;
10590 }
10591 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010592 return (status);
10593}
10594
Jeff Johnson295189b2012-06-20 16:38:30 -070010595eHalStatus csrRoamGetWpaRsnReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10596{
10597 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10598 tANI_U32 len;
10599 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010600
10601 if(!pSession)
10602 {
10603 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10604 return eHAL_STATUS_FAILURE;
10605 }
10606
Jeff Johnson295189b2012-06-20 16:38:30 -070010607 if(pLen)
10608 {
10609 len = *pLen;
10610 *pLen = pSession->nWpaRsnReqIeLength;
10611 if(pBuf)
10612 {
10613 if(len >= pSession->nWpaRsnReqIeLength)
10614 {
10615 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnReqIE, pSession->nWpaRsnReqIeLength);
10616 }
10617 }
10618 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010619 return (status);
10620}
10621
Jeff Johnson295189b2012-06-20 16:38:30 -070010622eHalStatus csrRoamGetWpaRsnRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10623{
10624 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10625 tANI_U32 len;
10626 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010627
10628 if(!pSession)
10629 {
10630 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10631 return eHAL_STATUS_FAILURE;
10632 }
10633
Jeff Johnson295189b2012-06-20 16:38:30 -070010634 if(pLen)
10635 {
10636 len = *pLen;
10637 *pLen = pSession->nWpaRsnRspIeLength;
10638 if(pBuf)
10639 {
10640 if(len >= pSession->nWpaRsnRspIeLength)
10641 {
10642 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnRspIE, pSession->nWpaRsnRspIeLength);
10643 }
10644 }
10645 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010646 return (status);
10647}
Jeff Johnson295189b2012-06-20 16:38:30 -070010648#ifdef FEATURE_WLAN_WAPI
10649eHalStatus csrRoamGetWapiReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10650{
10651 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10652 tANI_U32 len;
10653 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010654
10655 if(!pSession)
10656 {
10657 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10658 return eHAL_STATUS_FAILURE;
10659 }
10660
Jeff Johnson295189b2012-06-20 16:38:30 -070010661 if(pLen)
10662 {
10663 len = *pLen;
10664 *pLen = pSession->nWapiReqIeLength;
10665 if(pBuf)
10666 {
10667 if(len >= pSession->nWapiReqIeLength)
10668 {
10669 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiReqIE, pSession->nWapiReqIeLength);
10670 }
10671 }
10672 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010673 return (status);
10674}
Jeff Johnson295189b2012-06-20 16:38:30 -070010675eHalStatus csrRoamGetWapiRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10676{
10677 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10678 tANI_U32 len;
10679 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010680
10681 if(!pSession)
10682 {
10683 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10684 return eHAL_STATUS_FAILURE;
10685 }
10686
Jeff Johnson295189b2012-06-20 16:38:30 -070010687 if(pLen)
10688 {
10689 len = *pLen;
10690 *pLen = pSession->nWapiRspIeLength;
10691 if(pBuf)
10692 {
10693 if(len >= pSession->nWapiRspIeLength)
10694 {
10695 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiRspIE, pSession->nWapiRspIeLength);
10696 }
10697 }
10698 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010699 return (status);
10700}
10701#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010702eRoamCmdStatus csrGetRoamCompleteStatus(tpAniSirGlobal pMac, tANI_U32 sessionId)
10703{
10704 eRoamCmdStatus retStatus = eCSR_ROAM_CONNECT_COMPLETION;
10705 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010706
10707 if(!pSession)
10708 {
10709 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10710 return (retStatus);
10711 }
10712
Jeff Johnson295189b2012-06-20 16:38:30 -070010713 if(CSR_IS_ROAMING(pSession))
10714 {
10715 retStatus = eCSR_ROAM_ROAMING_COMPLETION;
10716 pSession->fRoaming = eANI_BOOLEAN_FALSE;
10717 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010718 return (retStatus);
10719}
10720
Jeff Johnson295189b2012-06-20 16:38:30 -070010721//This function remove the connected BSS from te cached scan result
10722eHalStatus csrRoamRemoveConnectedBssFromScanCache(tpAniSirGlobal pMac,
10723 tCsrRoamConnectedProfile *pConnProfile)
10724{
10725 eHalStatus status = eHAL_STATUS_FAILURE;
10726 tCsrScanResultFilter *pScanFilter = NULL;
10727 tListElem *pEntry;
10728 tCsrScanResult *pResult;
10729 tDot11fBeaconIEs *pIes;
10730 tANI_BOOLEAN fMatch;
Jeff Johnson295189b2012-06-20 16:38:30 -070010731 if(!(csrIsMacAddressZero(pMac, &pConnProfile->bssid) ||
10732 csrIsMacAddressBroadcast(pMac, &pConnProfile->bssid)))
10733 {
10734 do
10735 {
10736 //Prepare the filter. Only fill in the necessary fields. Not all fields are needed
10737 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
10738 if(!HAL_STATUS_SUCCESS(status)) break;
10739 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
10740 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, sizeof(tCsrBssid));
10741 if(!HAL_STATUS_SUCCESS(status)) break;
10742 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, &pConnProfile->bssid, sizeof(tCsrBssid));
10743 pScanFilter->BSSIDs.numOfBSSIDs = 1;
10744 if(!csrIsNULLSSID(pConnProfile->SSID.ssId, pConnProfile->SSID.length))
10745 {
10746 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
10747 if(!HAL_STATUS_SUCCESS(status)) break;
10748 palCopyMemory(pMac->hHdd, &pScanFilter->SSIDs.SSIDList[0].SSID, &pConnProfile->SSID, sizeof(tSirMacSSid));
10749 }
10750 pScanFilter->authType.numEntries = 1;
10751 pScanFilter->authType.authType[0] = pConnProfile->AuthType;
10752 pScanFilter->BSSType = pConnProfile->BSSType;
10753 pScanFilter->EncryptionType.numEntries = 1;
10754 pScanFilter->EncryptionType.encryptionType[0] = pConnProfile->EncryptionType;
10755 pScanFilter->mcEncryptionType.numEntries = 1;
10756 pScanFilter->mcEncryptionType.encryptionType[0] = pConnProfile->mcEncryptionType;
10757 //We ignore the channel for now, BSSID should be enough
10758 pScanFilter->ChannelInfo.numOfChannels = 0;
10759 //Also ignore the following fields
10760 pScanFilter->uapsd_mask = 0;
10761 pScanFilter->bWPSAssociation = eANI_BOOLEAN_FALSE;
10762 pScanFilter->countryCode[0] = 0;
10763 pScanFilter->phyMode = eCSR_DOT11_MODE_TAURUS;
Jeff Johnson295189b2012-06-20 16:38:30 -070010764 csrLLLock(&pMac->scan.scanResultList);
10765 pEntry = csrLLPeekHead( &pMac->scan.scanResultList, LL_ACCESS_NOLOCK );
10766 while( pEntry )
10767 {
10768 pResult = GET_BASE_ADDR( pEntry, tCsrScanResult, Link );
10769 pIes = (tDot11fBeaconIEs *)( pResult->Result.pvIes );
10770 fMatch = csrMatchBSS(pMac, &pResult->Result.BssDescriptor,
10771 pScanFilter, NULL, NULL, NULL, &pIes);
10772 //Release the IEs allocated by csrMatchBSS is needed
10773 if( !pResult->Result.pvIes )
10774 {
10775 //need to free the IEs since it is allocated by csrMatchBSS
10776 palFreeMemory(pMac->hHdd, pIes);
10777 }
10778 if(fMatch)
10779 {
10780 //We found the one
10781 if( csrLLRemoveEntry(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK) )
10782 {
10783 //Free the memory
10784 csrFreeScanResultEntry( pMac, pResult );
10785 }
10786 break;
10787 }
10788 pEntry = csrLLNext(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK);
10789 }//while
10790 csrLLUnlock(&pMac->scan.scanResultList);
10791 }while(0);
10792 if(pScanFilter)
10793 {
10794 csrFreeScanFilter(pMac, pScanFilter);
10795 palFreeMemory(pMac->hHdd, pScanFilter);
10796 }
10797 }
10798 return (status);
10799}
10800
Jeff Johnson295189b2012-06-20 16:38:30 -070010801//BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -070010802eHalStatus csrIsBTAMPAllowed( tpAniSirGlobal pMac, tANI_U32 chnId )
10803{
10804 eHalStatus status = eHAL_STATUS_SUCCESS;
10805 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070010806 for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
10807 {
10808 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
10809 {
10810 if( csrIsConnStateIbss( pMac, sessionId ) || csrIsBTAMP( pMac, sessionId ) )
10811 {
10812 //co-exist with IBSS or BT-AMP is not supported
10813 smsLog( pMac, LOGW, " BTAMP is not allowed due to IBSS/BT-AMP exist in session %d\n", sessionId );
10814 status = eHAL_STATUS_CSR_WRONG_STATE;
10815 break;
10816 }
10817 if( csrIsConnStateInfra( pMac, sessionId ) )
10818 {
10819 if( chnId &&
10820 ( (tANI_U8)chnId != pMac->roam.roamSession[sessionId].connectedProfile.operationChannel ) )
10821 {
10822 smsLog( pMac, LOGW, " BTAMP is not allowed due to channel (%d) diff than infr channel (%d)\n",
10823 chnId, pMac->roam.roamSession[sessionId].connectedProfile.operationChannel );
10824 status = eHAL_STATUS_CSR_WRONG_STATE;
10825 break;
10826 }
10827 }
10828 }
10829 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010830 return ( status );
10831}
10832
Jeff Johnson295189b2012-06-20 16:38:30 -070010833static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc )
10834{
10835 eHalStatus status = eHAL_STATUS_SUCCESS;
10836 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10837 tBssConfigParam bssConfig;
Jeff Johnson32d95a32012-09-10 13:15:23 -070010838
10839 if(!pSession)
10840 {
10841 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10842 return eHAL_STATUS_FAILURE;
10843 }
10844
Jeff Johnson295189b2012-06-20 16:38:30 -070010845 if ( csrIsConnStateIbss( pMac, sessionId ) )
10846 {
10847 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10848 }
10849 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10850 {
10851 // Disassociate from the connected Infrastructure network...
10852 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10853 }
10854 else
10855 {
10856#if defined(VOSS_ENABLED)
10857 //We don't expect Bt-AMP HDD not to disconnect the last connection first at this time.
10858 //Otherwise we need to add code to handle the
10859 //situation just like IBSS. Though for WDS station, we need to send disassoc to PE first then
10860 //send stop_bss to PE, before we can continue.
10861 VOS_ASSERT( !csrIsConnStateWds( pMac, sessionId ) );
10862#endif
10863 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(tBssConfigParam));
10864 /* Assume HDD provide bssid in profile */
10865 palCopyMemory( pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid[0], sizeof(tCsrBssid) );
10866 // there is no Bss description before we start an WDS so we need
10867 // to adopt all Bss configuration parameters from the Profile.
10868 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, &bssConfig, pBssDesc);
10869 if(HAL_STATUS_SUCCESS(status))
10870 {
10871 //Save profile for late use
10872 csrFreeRoamProfile( pMac, sessionId );
10873 if (HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
10874 (void **)&pSession->pCurRoamProfile,
10875 sizeof(tCsrRoamProfile))))
10876 {
10877 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
10878 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, pProfile);
10879 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010880 //Prepare some more parameters for this WDS
Jeff Johnsone7245742012-09-05 17:12:55 -070010881 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010882 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
10883 }
10884 }
10885
10886 return( status );
10887}
10888
Jeff Johnson295189b2012-06-20 16:38:30 -070010889////////////////////Mail box
10890
Jeff Johnson295189b2012-06-20 16:38:30 -070010891//pBuf is caller allocated memory point to &(tSirSmeJoinReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10892//or &(tSirSmeReassocReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10893static void csrPrepareJoinReassocReqBuffer( tpAniSirGlobal pMac,
10894 tSirBssDescription *pBssDescription,
10895 tANI_U8 *pBuf, tANI_U8 uapsdMask)
10896{
10897 tCsrChannelSet channelGroup;
10898 tSirMacCapabilityInfo *pAP_capabilityInfo;
10899 tAniBool fTmp;
10900 tANI_BOOLEAN found = FALSE;
10901 tANI_U32 size = 0;
10902 tANI_U16 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010903 // plug in neighborhood occupancy info (i.e. BSSes on primary or secondary channels)
10904 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundPri
10905 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecDown
10906 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecUp
Jeff Johnson295189b2012-06-20 16:38:30 -070010907 // 802.11h
10908 //We can do this because it is in HOST CPU order for now.
10909 pAP_capabilityInfo = (tSirMacCapabilityInfo *)&pBssDescription->capabilityInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070010910 //tell the target AP my 11H capability only if both AP and STA support 11H and the channel being used is 11a
10911 if ( csrIs11hSupported( pMac ) && pAP_capabilityInfo->spectrumMgt && eSIR_11A_NW_TYPE == pBssDescription->nwType )
10912 {
10913 fTmp = (tAniBool)pal_cpu_to_be32(1);
10914 }
10915 else
10916 fTmp = (tAniBool)0;
10917
10918 // corresponds to --- pMsg->spectrumMgtIndicator = ON;
10919 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&fTmp, sizeof(tAniBool) );
10920 pBuf += sizeof(tAniBool);
10921 *pBuf++ = MIN_STA_PWR_CAP_DBM; // it is for pMsg->powerCap.minTxPower = 0;
10922 found = csrSearchChannelListForTxPower(pMac, pBssDescription, &channelGroup);
Jeff Johnson295189b2012-06-20 16:38:30 -070010923 // This is required for 11k test VoWiFi Ent: Test 2.
10924 // We need the power capabilities for Assoc Req.
10925 // This macro is provided by the halPhyCfg.h. We pick our
10926 // max and min capability by the halPhy provided macros
10927 *pBuf++ = MAX_STA_PWR_CAP_DBM;
Jeff Johnson295189b2012-06-20 16:38:30 -070010928 size = sizeof(pMac->roam.validChannelList);
10929 if(HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &size)))
10930 {
10931 *pBuf++ = (tANI_U8)size; //tSirSupChnl->numChnl
10932 for ( i = 0; i < size; i++)
10933 {
10934 *pBuf++ = pMac->roam.validChannelList[ i ]; //tSirSupChnl->channelList[ i ]
10935
10936 }
10937 }
10938 else
10939 {
10940 smsLog(pMac, LOGE, FL("can not find any valid channel\n"));
10941 *pBuf++ = 0; //tSirSupChnl->numChnl
10942 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010943 //Check whether it is ok to enter UAPSD
10944#ifndef WLAN_MDM_CODE_REDUCTION_OPT
10945 if( btcIsReadyForUapsd(pMac) )
10946#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
10947 {
10948 *pBuf++ = uapsdMask;
10949 }
10950#ifndef WLAN_MDM_CODE_REDUCTION_OPT
10951 else
10952 {
10953 smsLog(pMac, LOGE, FL(" BTC doesn't allow UAPSD for uapsd_mask(0x%X)\n"), uapsdMask);
10954 *pBuf++ = 0;
10955 }
10956#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
10957
Jeff Johnson295189b2012-06-20 16:38:30 -070010958 // move the entire BssDescription into the join request.
10959 palCopyMemory( pMac->hHdd, pBuf, pBssDescription,
10960 pBssDescription->length + sizeof( pBssDescription->length ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070010961 pBuf += pBssDescription->length + sizeof( pBssDescription->length ); // update to new location
10962}
10963
Jeff Johnson295189b2012-06-20 16:38:30 -070010964/*
10965 * The communication between HDD and LIM is thru mailbox (MB).
10966 * Both sides will access the data structure "tSirSmeJoinReq".
10967 * The rule is, while the components of "tSirSmeJoinReq" can be accessed in the regular way like tSirSmeJoinReq.assocType, this guideline
10968 * stops at component tSirRSNie; any acces to the components after tSirRSNie is forbidden because the space from tSirRSNie is quueezed
10969 * with the component "tSirBssDescription". And since the size of actual 'tSirBssDescription' varies, the receiving side (which is the routine
10970 * limJoinReqSerDes() of limSerDesUtils.cc) should keep in mind not to access the components DIRECTLY after tSirRSNie.
10971 */
10972eHalStatus csrSendJoinReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
10973 tCsrRoamProfile *pProfile, tDot11fBeaconIEs *pIes )
10974{
10975 eHalStatus status = eHAL_STATUS_SUCCESS;
10976 tSirSmeJoinReq *pMsg;
10977 tANI_U8 *pBuf;
10978 tANI_U16 msgLen, wTmp, ieLen;
10979 tSirMacRateSet OpRateSet;
10980 tSirMacRateSet ExRateSet;
10981 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10982 tANI_U32 dwTmp;
10983 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070010984
10985 if(!pSession)
10986 {
10987 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10988 return eHAL_STATUS_FAILURE;
10989 }
10990
Jeff Johnson295189b2012-06-20 16:38:30 -070010991 do {
10992 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
10993 pSession->joinFailStatusCode.reasonCode = 0;
10994 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
10995 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
10996 // IE fields, but the length field in the bssDescription needs to be interpreted to
10997 // determine length of the IE fields.
10998 //
10999 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11000 // add in the length from the bssDescription (then add the size of the 'length' field
11001 // itself because that is NOT included in the length field).
11002 msgLen = sizeof( tSirSmeJoinReq ) - sizeof( *pBssDescription ) +
11003 pBssDescription->length + sizeof( pBssDescription->length ) +
11004 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 -070011005 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11006 if ( !HAL_STATUS_SUCCESS(status) ) break;
11007 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11008 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_JOIN_REQ);
11009 pMsg->length = pal_cpu_to_be16(msgLen);
11010 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070011011 // sessionId
11012 *pBuf = (tANI_U8)sessionId;
11013 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011014 // transactionId
11015 *pBuf = 0;
11016 *( pBuf + 1 ) = 0;
11017 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011018 // ssId
11019 if( pIes->SSID.present && pIes->SSID.num_ssid )
11020 {
11021 // ssId len
11022 *pBuf = pIes->SSID.num_ssid;
11023 pBuf++;
11024 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11025 pBuf += pIes->SSID.num_ssid;
11026 }
11027 else
11028 {
11029 *pBuf = 0;
11030 pBuf++;
11031 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011032 // selfMacAddr
11033 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11034 pBuf += sizeof(tSirMacAddr);
11035 // bsstype
11036 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11037 if (dwTmp == eSIR_BTAMP_STA_MODE) dwTmp = eSIR_BTAMP_AP_MODE; // Override BssType for BTAMP
11038 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11039 pBuf += sizeof(tSirBssType);
11040 // dot11mode
11041 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11042 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011043 //Persona
11044 *pBuf = (tANI_U8)pProfile->csrPersona;
11045 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011046 //CBMode
11047 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11048 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011049
11050 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
Jeff Johnsone7245742012-09-05 17:12:55 -070011051 FL("CSR PERSONA=%d CSR CbMode %d"), pProfile->csrPersona, pSession->bssParams.cbMode);
11052
Jeff Johnson295189b2012-06-20 16:38:30 -070011053 // uapsdPerAcBitmask
11054 *pBuf = pProfile->uapsd_mask;
11055 pBuf++;
11056
Jeff Johnsone7245742012-09-05 17:12:55 -070011057
Jeff Johnson295189b2012-06-20 16:38:30 -070011058
11059#if (WNI_POLARIS_FW_PACKAGE == ADVANCED)
11060#endif /*(WNI_POLARIS_FW_PACKAGE == ADVANCED)*/
Jeff Johnson295189b2012-06-20 16:38:30 -070011061 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet);
11062 if (HAL_STATUS_SUCCESS(status) )
11063 {
11064 // OperationalRateSet
11065 if (OpRateSet.numRates) {
11066 *pBuf++ = OpRateSet.numRates;
11067 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11068 pBuf += OpRateSet.numRates;
11069 } else *pBuf++ = 0;
11070 // ExtendedRateSet
11071 if (ExRateSet.numRates) {
11072 *pBuf++ = ExRateSet.numRates;
11073 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11074 pBuf += ExRateSet.numRates;
11075 } else *pBuf++ = 0;
11076 }
11077 else
11078 {
11079 *pBuf++ = 0;
11080 *pBuf++ = 0;
11081 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011082 // rsnIE
11083 if ( csrIsProfileWpa( pProfile ) )
11084 {
11085 // Insert the Wpa IE into the join request
11086 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11087 (tCsrWpaIe *)( wpaRsnIE ) );
11088 }
11089 else if( csrIsProfileRSN( pProfile ) )
11090 {
11091 // Insert the RSN IE into the join request
11092 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11093 (tCsrRSNIe *)( wpaRsnIE ) );
11094 }
11095#ifdef FEATURE_WLAN_WAPI
11096 else if( csrIsProfileWapi( pProfile ) )
11097 {
11098 // Insert the WAPI IE into the join request
11099 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11100 (tCsrWapiIe *)( wpaRsnIE ) );
11101 }
11102#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070011103 else
11104 {
11105 ieLen = 0;
11106 }
11107 //remember the IE for future use
11108 if( ieLen )
11109 {
11110 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11111 {
11112 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);
11113 ieLen = DOT11F_IE_RSN_MAX_LEN;
11114 }
11115#ifdef FEATURE_WLAN_WAPI
11116 if( csrIsProfileWapi( pProfile ) )
11117 {
11118 //Check whether we need to allocate more memory
11119 if(ieLen > pSession->nWapiReqIeLength)
11120 {
11121 if(pSession->pWapiReqIE && pSession->nWapiReqIeLength)
11122 {
11123 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11124 }
11125 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiReqIE, ieLen);
11126 if(!HAL_STATUS_SUCCESS(status)) break;
11127 }
11128 pSession->nWapiReqIeLength = ieLen;
11129 palCopyMemory(pMac->hHdd, pSession->pWapiReqIE, wpaRsnIE, ieLen);
11130 wTmp = pal_cpu_to_be16( ieLen );
11131 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11132 pBuf += sizeof(tANI_U16);
11133 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11134 pBuf += ieLen;
11135 }
11136 else//should be WPA/WPA2 otherwise
11137#endif /* FEATURE_WLAN_WAPI */
11138 {
11139 //Check whether we need to allocate more memory
11140 if(ieLen > pSession->nWpaRsnReqIeLength)
11141 {
11142 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11143 {
11144 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11145 }
11146 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11147 if(!HAL_STATUS_SUCCESS(status)) break;
11148 }
11149 pSession->nWpaRsnReqIeLength = ieLen;
11150 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11151 wTmp = pal_cpu_to_be16( ieLen );
11152 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11153 pBuf += sizeof(tANI_U16);
11154 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11155 pBuf += ieLen;
11156 }
11157 }
11158 else
11159 {
11160 //free whatever old info
11161 pSession->nWpaRsnReqIeLength = 0;
11162 if(pSession->pWpaRsnReqIE)
11163 {
11164 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11165 pSession->pWpaRsnReqIE = NULL;
11166 }
11167#ifdef FEATURE_WLAN_WAPI
11168 pSession->nWapiReqIeLength = 0;
11169 if(pSession->pWapiReqIE)
11170 {
11171 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11172 pSession->pWapiReqIE = NULL;
11173 }
11174#endif /* FEATURE_WLAN_WAPI */
11175 //length is two bytes
11176 *pBuf = 0;
11177 *(pBuf + 1) = 0;
11178 pBuf += 2;
11179 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011180#ifdef FEATURE_WLAN_CCX
11181 // Never include the cckmIE in an Join Request
11182 //length is two bytes
11183 *pBuf = 0;
11184 *(pBuf + 1) = 0;
11185 pBuf += 2;
11186#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011187 // addIEScan
11188 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11189 {
11190 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011191 if(ieLen > pSession->nAddIEScanLength)
11192 {
11193 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11194 {
11195 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11196 }
11197 status = palAllocateMemory(pMac->hHdd,
11198 (void **)&pSession->pAddIEScan, ieLen);
11199 if(!HAL_STATUS_SUCCESS(status)) break;
11200 }
11201 pSession->nAddIEScanLength = ieLen;
11202 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11203 pProfile->pAddIEScan, ieLen);
11204 wTmp = pal_cpu_to_be16( ieLen );
11205 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11206 pBuf += sizeof(tANI_U16);
11207 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11208 pBuf += ieLen;
11209 }
11210 else
11211 {
11212 pSession->nAddIEScanLength = 0;
11213 if(pSession->pAddIEScan)
11214 {
11215 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11216 pSession->pAddIEScan = NULL;
11217 }
11218 *pBuf = 0;
11219 *(pBuf + 1) = 0;
11220 pBuf += 2;
11221 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011222 // addIEAssoc
11223 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11224 {
11225 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011226 if(ieLen > pSession->nAddIEAssocLength)
11227 {
11228 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11229 {
11230 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11231 }
11232 status = palAllocateMemory(pMac->hHdd,
11233 (void **)&pSession->pAddIEAssoc, ieLen);
11234 if(!HAL_STATUS_SUCCESS(status)) break;
11235 }
11236 pSession->nAddIEAssocLength = ieLen;
11237 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11238 pProfile->pAddIEAssoc, ieLen);
11239 wTmp = pal_cpu_to_be16( ieLen );
11240 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11241 pBuf += sizeof(tANI_U16);
11242 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11243 pBuf += ieLen;
11244 }
11245 else
11246 {
11247 pSession->nAddIEAssocLength = 0;
11248 if(pSession->pAddIEAssoc)
11249 {
11250 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11251 pSession->pAddIEAssoc = NULL;
11252 }
11253 *pBuf = 0;
11254 *(pBuf + 1) = 0;
11255 pBuf += 2;
11256 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011257 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11258 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11259 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011260 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11261 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11262 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011263#ifdef WLAN_FEATURE_VOWIFI_11R
11264 if (csrIsProfile11r( pProfile ) )
11265 {
11266 // is11Rconnection;
11267 dwTmp = pal_cpu_to_be32(TRUE);
11268 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11269 pBuf += sizeof(tAniBool);
11270 }
11271 else
11272 {
11273 // is11Rconnection;
11274 dwTmp = pal_cpu_to_be32(FALSE);
11275 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11276 pBuf += sizeof(tAniBool);
11277 }
11278#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011279#ifdef FEATURE_WLAN_CCX
11280 /* A profile can not be both CCX and 11R. But an 802.11R AP
11281 * may be advertising support for CCX as well. So if we are
11282 * associating Open or explicitly CCX then we will get CCX.
11283 * If we are associating explictly 11R only then we will get
11284 * 11R.
11285 */
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011286 if ((csrIsProfileCCX(pProfile) ||
11287 ((pIes->CCXVersion.present)
11288 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11289 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11290 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11291 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11292 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11293 && (!(csrIsProfile11r( pProfile )))
11294 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011295 {
11296 // isCCXconnection;
11297 dwTmp = pal_cpu_to_be32(TRUE);
11298 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11299 pBuf += sizeof(tAniBool);
11300 }
11301 else
11302 {
11303 //isCCXconnection;
11304 dwTmp = pal_cpu_to_be32(FALSE);
11305 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11306 pBuf += sizeof(tAniBool);
11307 }
11308 {
11309 tCCXTspecInfo ccxTspec;
11310 // CCX-Tspec IEs in the ASSOC request is presently not supported
11311 // so nullify the TSPEC parameters
11312 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11313 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11314 pBuf += sizeof(tCCXTspecInfo);
11315 }
11316#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011317#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011318 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011319 if (pMac->roam.configParam.isFastTransitionEnabled
11320#ifdef FEATURE_WLAN_LFR
11321 || csrRoamIsFastRoamEnabled(pMac)
11322#endif
11323 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011324 {
11325 dwTmp = pal_cpu_to_be32(TRUE);
11326 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11327 pBuf += sizeof(tAniBool);
11328 }
11329 else
11330 {
11331 dwTmp = pal_cpu_to_be32(FALSE);
11332 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11333 pBuf += sizeof(tAniBool);
11334 }
11335#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011336#ifdef FEATURE_WLAN_LFR
11337 if(csrRoamIsFastRoamEnabled(pMac))
11338 {
11339 //legacy fast roaming enabled
11340 dwTmp = pal_cpu_to_be32(TRUE);
11341 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11342 pBuf += sizeof(tAniBool);
11343 }
11344 else
11345 {
11346 dwTmp = pal_cpu_to_be32(FALSE);
11347 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11348 pBuf += sizeof(tAniBool);
11349 }
11350#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011351 //BssDesc
11352 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf,
11353 (tANI_U8)pProfile->uapsd_mask);
Jeff Johnson295189b2012-06-20 16:38:30 -070011354 status = palSendMBMessage(pMac->hHdd, pMsg );
11355 if(!HAL_STATUS_SUCCESS(status))
11356 {
11357 break;
11358 }
11359 //Tush-QoS: notify QoS module that join happening
11360 else
11361 {
11362#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11363 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_JOIN_REQ, NULL);
11364#endif
11365 }
11366 } while( 0 );
11367 return( status );
11368}
11369
Jeff Johnson295189b2012-06-20 16:38:30 -070011370eHalStatus csrSendSmeReassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11371 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile )
11372{
11373 eHalStatus status;
11374 tSirSmeReassocReq *pMsg;
11375 tANI_U8 *pBuf;
11376 v_U8_t acm_mask = 0, uapsd_mask;
11377 tANI_U16 msgLen, ieLen, wTmp;
11378 tANI_U32 dwTmp;
11379 tSirMacRateSet OpRateSet;
11380 tSirMacRateSet ExRateSet;
11381 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11382 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011383
11384 if(!pSession)
11385 {
11386 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11387 return eHAL_STATUS_FAILURE;
11388 }
11389
Jeff Johnson295189b2012-06-20 16:38:30 -070011390 /* To satisfy klockworks */
11391 if (pBssDescription == NULL)
11392 {
11393 smsLog(pMac, LOGE, FL(" pBssDescription is NULL\n"));
11394 return eHAL_STATUS_FAILURE;
11395 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011396 do {
11397 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11398 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11399 // IE fields, but the length field in the bssDescription needs to be interpreted to
11400 // determine length of the IE fields.
11401 //
11402 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11403 // add in the length from the bssDescription (then add the size of the 'length' field
11404 // itself because that is NOT included in the length field).
11405 msgLen = sizeof( tSirSmeReassocReq ) - sizeof( *pBssDescription ) +
11406 pBssDescription->length + sizeof( pBssDescription->length ) +
11407 sizeof( tCsrWpaIe ) + sizeof( tCsrWpaAuthIe ) + sizeof( tANI_U16 ); // add in the size of the WPA IE that we may build.
11408 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11409 if ( !HAL_STATUS_SUCCESS(status) ) break;
11410 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11411 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REASSOC_REQ);
11412 pMsg->length = pal_cpu_to_be16(msgLen);
11413 pBuf = &pMsg->sessionId;
11414 // sessionId
11415 *pBuf++ = (tANI_U8)sessionId;
11416 // transactionId
11417 *pBuf = 0;
11418 *(pBuf + 1) = 0;
11419 pBuf += sizeof (tANI_U16);
11420 // ssId
11421 if( pIes->SSID.present && pIes->SSID.num_ssid )
11422 {
11423 // ssId len
11424 *pBuf++ = pIes->SSID.num_ssid;
11425 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11426 pBuf += pIes->SSID.num_ssid;
11427 }
11428 else
11429 {
11430 *pBuf++ = 0;
11431 }
11432 // selfMacAddr
11433 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11434 pBuf += sizeof(tSirMacAddr);
11435 // bsstype
11436 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11437 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11438 pBuf += sizeof(tSirBssType);
11439 // dot11mode
11440 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11441 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011442 //Persona
11443 *pBuf = (tANI_U8)pProfile->csrPersona;
11444 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011445 //CBMode
11446 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11447 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011448
Jeff Johnsone7245742012-09-05 17:12:55 -070011449 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
11450 FL("CSR PERSONA=%d CSR CBMode=%u\n"), pProfile->csrPersona, pSession->bssParams.cbMode);
11451
Jeff Johnson295189b2012-06-20 16:38:30 -070011452 // uapsdPerAcBitmask
11453 *pBuf = pProfile->uapsd_mask;
11454 pBuf++;
11455
Jeff Johnson295189b2012-06-20 16:38:30 -070011456 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode,
11457 pBssDescription, pIes, &OpRateSet, &ExRateSet);
11458 if (HAL_STATUS_SUCCESS(status) )
11459 {
11460 // OperationalRateSet
11461 if (OpRateSet.numRates)
11462 {
11463 *pBuf++ = OpRateSet.numRates;
11464 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11465 pBuf += OpRateSet.numRates;
11466 }
11467 else *pBuf++ = 0;
11468 // ExtendedRateSet
11469 if (ExRateSet.numRates)
11470 {
11471 *pBuf++ = ExRateSet.numRates;
11472 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11473 pBuf += ExRateSet.numRates;
11474 }
11475 else *pBuf++ = 0;
11476 }
11477 else
11478 {
11479 *pBuf++ = 0;
11480 *pBuf++ = 0;
11481 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011482 // rsnIE
11483 if ( csrIsProfileWpa( pProfile ) )
11484 {
11485 // Insert the Wpa IE into the join request
11486 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11487 (tCsrWpaIe *)( wpaRsnIE ) );
11488 }
11489 else if( csrIsProfileRSN( pProfile ) )
11490 {
11491 // Insert the RSN IE into the join request
11492 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11493 (tCsrRSNIe *)( wpaRsnIE ) );
11494 }
11495#ifdef FEATURE_WLAN_WAPI
11496 else if( csrIsProfileWapi( pProfile ) )
11497 {
11498 // Insert the WAPI IE into the join request
11499 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11500 (tCsrWapiIe *)( wpaRsnIE) );
11501 }
11502#endif /* FEATURE_WLAN_WAPI */
11503 else
11504 {
11505 ieLen = 0;
11506 }
11507 //remember the IE for future use
11508 if( ieLen )
11509 {
11510 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11511 {
11512 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);
11513 ieLen = DOT11F_IE_RSN_MAX_LEN;
11514 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011515 //Check whether we need to allocate more memory
11516 if(ieLen > pSession->nWpaRsnReqIeLength)
11517 {
11518 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11519 {
11520 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11521 }
11522 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11523 if(!HAL_STATUS_SUCCESS(status)) break;
11524 }
11525 pSession->nWpaRsnReqIeLength = ieLen;
11526 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11527 wTmp = pal_cpu_to_be16( ieLen );
11528 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11529 pBuf += sizeof(tANI_U16);
11530 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11531 pBuf += ieLen;
11532 }
11533 else
11534 {
11535 //free whatever old info
11536 pSession->nWpaRsnReqIeLength = 0;
11537 if(pSession->pWpaRsnReqIE)
11538 {
11539 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11540 pSession->pWpaRsnReqIE = NULL;
11541 }
11542 //length is two bytes
11543 *pBuf = 0;
11544 *(pBuf + 1) = 0;
11545 pBuf += 2;
11546 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011547#ifdef FEATURE_WLAN_CCX
11548 // cckmIE
11549 if( csrIsProfileCCX( pProfile ) )
11550 {
11551 // Insert the CCKM IE into the join request
11552 ieLen = csrConstructCcxCckmIe( pMac,
11553 pSession,
11554 pProfile,
11555 pBssDescription,
11556 pSession->pWpaRsnReqIE,
11557 pSession->nWpaRsnReqIeLength,
11558 (void *)( wpaRsnIE ) );
11559 }
11560 else
11561 {
11562 ieLen = 0;
11563 }
11564 //If present, copy the IE into the eWNI_SME_REASSOC_REQ message buffer
11565 if( ieLen )
11566 {
11567 //Copy the CCKM IE over from the temp buffer (wpaRsnIE)
11568 wTmp = pal_cpu_to_be16( ieLen );
11569 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11570 pBuf += sizeof(tANI_U16);
11571 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11572 pBuf += ieLen;
11573 }
11574 else
11575 {
11576 //Indicate you have no CCKM IE
11577 //length is two bytes
11578 *pBuf = 0;
11579 *(pBuf + 1) = 0;
11580 pBuf += 2;
11581 }
11582#endif /* FEATURE_WLAN_CCX */
Jeff Johnson295189b2012-06-20 16:38:30 -070011583 // addIEScan
11584 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11585 {
11586 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011587 if(ieLen > pSession->nAddIEScanLength)
11588 {
11589 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11590 {
11591 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11592 }
11593 status = palAllocateMemory(pMac->hHdd,
11594 (void **)&pSession->pAddIEScan, ieLen);
11595 if(!HAL_STATUS_SUCCESS(status)) break;
11596 }
11597 pSession->nAddIEScanLength = ieLen;
11598 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11599 pProfile->pAddIEScan, ieLen);
11600 wTmp = pal_cpu_to_be16( ieLen );
11601 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11602 pBuf += sizeof(tANI_U16);
11603 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11604 pBuf += ieLen;
11605 }
11606 else
11607 {
11608 pSession->nAddIEScanLength = 0;
11609 if(pSession->pAddIEScan)
11610 {
11611 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11612 pSession->pAddIEScan = NULL;
11613 }
11614 *pBuf = 0;
11615 *(pBuf + 1) = 0;
11616 pBuf += 2;
11617 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011618 // addIEAssoc
11619 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11620 {
11621 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011622 if(ieLen > pSession->nAddIEAssocLength)
11623 {
11624 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11625 {
11626 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11627 }
11628 status = palAllocateMemory(pMac->hHdd,
11629 (void **)&pSession->pAddIEAssoc, ieLen);
11630 if(!HAL_STATUS_SUCCESS(status)) break;
11631 }
11632 pSession->nAddIEAssocLength = ieLen;
11633 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11634 pProfile->pAddIEAssoc, ieLen);
11635 wTmp = pal_cpu_to_be16( ieLen );
11636 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11637 pBuf += sizeof(tANI_U16);
11638 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11639 pBuf += ieLen;
11640 }
11641 else
11642 {
11643 pSession->nAddIEAssocLength = 0;
11644 if(pSession->pAddIEAssoc)
11645 {
11646 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11647 pSession->pAddIEAssoc = NULL;
11648 }
11649 *pBuf = 0;
11650 *(pBuf + 1) = 0;
11651 pBuf += 2;
11652 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011653 //Unmask any AC in reassoc that is ACM-set
11654 uapsd_mask = (v_U8_t)pProfile->uapsd_mask;
11655 if( uapsd_mask && ( NULL != pBssDescription ) )
11656 {
11657 if( CSR_IS_QOS_BSS(pIes) && CSR_IS_UAPSD_BSS(pIes) )
11658 {
11659#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11660 acm_mask = sme_QosGetACMMask(pMac, pBssDescription, pIes);
11661#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11662 uapsd_mask &= ~(acm_mask);
11663 }
11664 else
11665 {
11666 uapsd_mask = 0;
11667 }
11668 }
11669
11670 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11671 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11672 pBuf += sizeof(tANI_U32);
11673
11674 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11675 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11676 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011677#ifdef WLAN_FEATURE_VOWIFI_11R
11678 // is11Rconnection;
11679 dwTmp = csrIsProfile11r( pProfile )? pal_cpu_to_be32(TRUE) : 0;
11680 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11681 pBuf += sizeof(tAniBool);
Jeff Johnson295189b2012-06-20 16:38:30 -070011682#ifdef FEATURE_WLAN_CCX
11683 //isCCXconnection;
11684 //CCKM profile, ccxversion ie present, not 11r and ini file has CCX enabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011685 dwTmp = ( ((csrIsProfileCCX(pProfile) ||
11686 ((pIes->CCXVersion.present)
11687 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11688 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11689 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11690 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11691 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11692 && (!(csrIsProfile11r( pProfile )))
11693 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
11694 ? pal_cpu_to_be32(TRUE) : 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070011695 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11696 pBuf += sizeof(tAniBool);
11697#endif // FEATURE_WLAN_CCX
11698#endif // WLAN_FEATURE_VOWIFI_11R
Jeff Johnson295189b2012-06-20 16:38:30 -070011699#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011700 if ((csrIsProfileCCX(pProfile) ||
11701 ((pIes->CCXVersion.present)
11702 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11703 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11704 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11705 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11706 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11707 && (!(csrIsProfile11r( pProfile )))
11708 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011709 {
11710 tCCXTspecInfo ccxTspec;
Jeff Johnson295189b2012-06-20 16:38:30 -070011711 // CCX Tspec information
11712 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11713 ccxTspec.numTspecs = sme_QosCCxRetrieveTspecInfo(pMac, sessionId, (tTspecInfo *) &ccxTspec.tspec[0]);
11714 *pBuf = ccxTspec.numTspecs;
11715 pBuf += sizeof(tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070011716 // Copy the TSPEC information only if present
11717 if (ccxTspec.numTspecs) {
11718 palCopyMemory(pMac->hHdd, pBuf, (void*)&ccxTspec.tspec[0], (ccxTspec.numTspecs*sizeof(tTspecInfo)));
11719 }
11720 pBuf += sizeof(ccxTspec.tspec);
11721 }
11722 else
11723 {
11724 {
11725 tCCXTspecInfo ccxTspec;
11726 // CCX-Tspec IEs in the ASSOC request is presently not supported
11727 // so nullify the TSPEC parameters
11728 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11729 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11730 pBuf += sizeof(tCCXTspecInfo);
11731 }
11732 }
11733#endif // FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011734#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011735 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011736 if (pMac->roam.configParam.isFastTransitionEnabled
11737#ifdef FEATURE_WLAN_LFR
11738 || csrRoamIsFastRoamEnabled(pMac)
11739#endif
11740 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011741 {
11742 dwTmp = pal_cpu_to_be32(TRUE);
11743 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11744 pBuf += sizeof(tAniBool);
11745 }
11746 else
11747 {
11748 dwTmp = pal_cpu_to_be32(FALSE);
11749 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11750 pBuf += sizeof(tAniBool);
11751 }
11752#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011753#ifdef FEATURE_WLAN_LFR
11754 if(csrRoamIsFastRoamEnabled(pMac))
11755 {
11756 //legacy fast roaming enabled
11757 dwTmp = pal_cpu_to_be32(TRUE);
11758 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11759 pBuf += sizeof(tAniBool);
11760 }
11761 else
11762 {
11763 dwTmp = pal_cpu_to_be32(FALSE);
11764 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11765 pBuf += sizeof(tAniBool);
11766 }
11767#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011768 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf, uapsd_mask);
11769
11770#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11771 //Tush-QoS: notify QoS module that reassoc happening
11772 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_REASSOC_REQ, NULL);
11773#endif
11774 status = palSendMBMessage( pMac->hHdd, pMsg );
11775 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011776 return( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070011777}
11778
Jeff Johnson295189b2012-06-20 16:38:30 -070011779//
11780eHalStatus csrSendMBDisassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11781{
11782 eHalStatus status = eHAL_STATUS_SUCCESS;
11783 tSirSmeDisassocReq *pMsg;
11784 tANI_U8 *pBuf;
11785 tANI_U16 wTmp;
11786#ifdef WLAN_SOFTAP_FEATURE
11787 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11788 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11789 return eHAL_STATUS_FAILURE;
11790#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011791 do {
11792 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocReq ));
11793 if ( !HAL_STATUS_SUCCESS(status) ) break;
11794 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocReq ));
11795 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_REQ);
11796 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011797 pBuf = &pMsg->sessionId;
11798 // sessionId
11799 *pBuf++ = (tANI_U8)sessionId;
11800 // transactionId
11801 *pBuf = 0;
11802 *( pBuf + 1 ) = 0;
11803 pBuf += sizeof(tANI_U16);
11804
11805#ifdef WLAN_SOFTAP_FEATURE
11806 if ( (pSession->pCurRoamProfile != NULL ) &&
11807 ( reasonCode == eSIR_MAC_UNSPEC_FAILURE_REASON ) &&
11808 ((CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) || (CSR_IS_WDS_AP(pSession->pCurRoamProfile))))
11809 {
11810 // Set the bssid address before sending the message to LIM
11811 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( tSirMacAddr ) );
11812 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011813 // Set the peer MAC address before sending the message to LIM
11814 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) ); //perMacAddr is passed as bssId for softAP
11815 pBuf = pBuf + sizeof ( tSirMacAddr );
11816 }
11817 else
11818 {
11819#endif
11820 // Set the peer MAC address before sending the message to LIM
11821 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) );
11822 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011823 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->bssId ) );
11824 pBuf = pBuf + sizeof ( tSirMacAddr );
11825#ifdef WLAN_SOFTAP_FEATURE
11826 }
11827#endif
11828 if(!HAL_STATUS_SUCCESS(status))
11829 {
11830 palFreeMemory(pMac->hHdd, pMsg);
11831 break;
11832 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011833 // reasonCode
11834 wTmp = pal_cpu_to_be16(reasonCode);
11835 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11836 if(!HAL_STATUS_SUCCESS(status))
11837 {
11838 palFreeMemory(pMac->hHdd, pMsg);
11839 break;
11840 }
11841 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011842 /* The state will be DISASSOC_HANDOFF only when we are doing handoff.
11843 Here we should not send the disassoc over the air to the AP */
11844 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO(pMac, sessionId)
11845#ifdef WLAN_FEATURE_VOWIFI_11R
11846 && csrRoamIs11rAssoc(pMac)
11847#endif
11848 )
11849 {
11850 *pBuf = CSR_DONT_SEND_DISASSOC_OVER_THE_AIR; /* Set DoNotSendOverTheAir flag to 1 only for handoff case */
11851 }
11852 pBuf += sizeof(tANI_U8);
11853 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011854 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011855 return( status );
11856}
Jeff Johnson295189b2012-06-20 16:38:30 -070011857#ifdef WLAN_SOFTAP_FEATURE
11858eHalStatus csrSendMBTkipCounterMeasuresReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN bEnable, tSirMacAddr bssId )
11859{
11860 eHalStatus status = eHAL_STATUS_SUCCESS;
11861 tSirSmeTkipCntrMeasReq *pMsg;
11862 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011863 do
11864 {
11865 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11866 if ( !HAL_STATUS_SUCCESS(status) ) break;
11867 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11868 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_TKIP_CNTR_MEAS_REQ);
11869 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeTkipCntrMeasReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011870 pBuf = &pMsg->sessionId;
11871 // sessionId
11872 *pBuf++ = (tANI_U8)sessionId;
11873 // transactionId
11874 *pBuf = 0;
11875 *( pBuf + 1 ) = 0;
11876 pBuf += sizeof(tANI_U16);
11877 // bssid
11878 status = palCopyMemory( pMac->hHdd, pMsg->bssId, bssId, sizeof( tSirMacAddr ) );
11879 pBuf = pBuf + sizeof ( tSirMacAddr );
11880 // bEnable
11881 *pBuf = (tANI_BOOLEAN)bEnable;
11882 if(!HAL_STATUS_SUCCESS(status))
11883 {
11884 palFreeMemory(pMac->hHdd, pMsg);
11885 break;
11886 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011887 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011888 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011889 return( status );
11890}
Jeff Johnson295189b2012-06-20 16:38:30 -070011891eHalStatus
11892csrSendMBGetAssociatedStasReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
11893 VOS_MODULE_ID modId, tSirMacAddr bssId,
11894 void *pUsrContext, void *pfnSapEventCallback,
11895 tANI_U8 *pAssocStasBuf )
11896{
11897 eHalStatus status = eHAL_STATUS_SUCCESS;
11898 tSirSmeGetAssocSTAsReq *pMsg;
11899 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11900 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011901 do
11902 {
11903 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11904 if (!HAL_STATUS_SUCCESS(status)) break;
11905 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11906 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_ASSOC_STAS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011907 pBuf = (tANI_U8 *)&pMsg->bssId;
11908 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011909 // bssId
11910 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11911 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011912 // modId
11913 dwTmp = pal_cpu_to_be16((tANI_U16)modId);
11914 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U16));
11915 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011916 // pUsrContext
11917 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11918 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11919 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011920 // pfnSapEventCallback
11921 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
11922 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11923 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011924 // pAssocStasBuf
11925 dwTmp = pal_cpu_to_be32((tANI_U32)pAssocStasBuf);
11926 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11927 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011928 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070011929 status = palSendMBMessage( pMac->hHdd, pMsg );
11930 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011931 return( status );
11932 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011933eHalStatus
11934csrSendMBGetWPSPBCSessions( tpAniSirGlobal pMac, tANI_U32 sessionId,
11935 tSirMacAddr bssId, void *pUsrContext, void *pfnSapEventCallback,v_MACADDR_t pRemoveMac)
11936 {
11937 eHalStatus status = eHAL_STATUS_SUCCESS;
11938 tSirSmeGetWPSPBCSessionsReq *pMsg;
11939 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11940 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011941 do
11942 {
11943 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirSmeGetWPSPBCSessionsReq) );
11944 if (!HAL_STATUS_SUCCESS(status)) break;
11945 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetWPSPBCSessionsReq ) );
11946 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_WPSPBC_SESSION_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011947 pBuf = (tANI_U8 *)&pMsg->pUsrContext;
11948 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011949 // pUsrContext
11950 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11951 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11952 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011953 // pSapEventCallback
11954 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
11955 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11956 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011957 // bssId
11958 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11959 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011960 // MAC Address of STA in WPS session
11961 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pRemoveMac.bytes, sizeof(v_MACADDR_t));
11962 pBuf += sizeof(v_MACADDR_t);
Jeff Johnson295189b2012-06-20 16:38:30 -070011963 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070011964 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011965 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011966 return( status );
11967}
11968#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011969eHalStatus csrSendMBDeauthReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11970{
11971 eHalStatus status = eHAL_STATUS_SUCCESS;
11972 tSirSmeDeauthReq *pMsg;
11973 tANI_U8 *pBuf;
11974 tANI_U16 wTmp;
11975 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11976 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11977 return eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070011978 do {
11979 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthReq ));
11980 if ( !HAL_STATUS_SUCCESS(status) ) break;
11981 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthReq ));
11982 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_REQ);
11983 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthReq ));
11984 //sessionId
11985 pBuf = &pMsg->sessionId;
11986 *pBuf++ = (tANI_U8)sessionId;
11987
11988 //tansactionId
11989 *pBuf = 0;
11990 *(pBuf + 1 ) = 0;
11991 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011992 if ((pSession->pCurRoamProfile != NULL) && (
11993#ifdef WLAN_SOFTAP_FEATURE
11994 (CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) ||
11995#endif
11996 (CSR_IS_WDS_AP(pSession->pCurRoamProfile)))){
11997 // Set the BSSID before sending the message to LIM
11998 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( pMsg->peerMacAddr ) );
11999 pBuf = pBuf + sizeof(tSirMacAddr);
12000 }
12001 else
12002 {
12003 // Set the BSSID before sending the message to LIM
12004 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
12005 pBuf = pBuf + sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070012006 }
12007 if(!HAL_STATUS_SUCCESS(status))
12008 {
12009 palFreeMemory(pMac->hHdd, pMsg);
12010 break;
12011 }
12012 // Set the peer MAC address before sending the message to LIM
12013 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *) pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
12014 pBuf = pBuf + sizeof(tSirMacAddr);
12015 if(!HAL_STATUS_SUCCESS(status))
12016 {
12017 palFreeMemory(pMac->hHdd, pMsg);
12018 break;
12019 }
12020 wTmp = pal_cpu_to_be16(reasonCode);
12021 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp,sizeof( tANI_U16 ) );
12022 if(!HAL_STATUS_SUCCESS(status))
12023 {
12024 palFreeMemory(pMac->hHdd, pMsg);
12025 break;
12026 }
12027 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012028 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012029 return( status );
12030}
12031
Jeff Johnson295189b2012-06-20 16:38:30 -070012032eHalStatus csrSendMBDisassocCnfMsg( tpAniSirGlobal pMac, tpSirSmeDisassocInd pDisassocInd )
12033{
12034 eHalStatus status = eHAL_STATUS_SUCCESS;
12035 tSirSmeDisassocCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070012036 do {
12037 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocCnf ));
12038 if ( !HAL_STATUS_SUCCESS(status) ) break;
12039 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocCnf ));
12040 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_CNF);
12041 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12042 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocCnf ));
12043 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDisassocInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12044 if(!HAL_STATUS_SUCCESS(status))
12045 {
12046 palFreeMemory(pMac->hHdd, pMsg);
12047 break;
12048 }
12049//To test reconn
12050 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDisassocInd->bssId, sizeof(pMsg->peerMacAddr));
12051 if(!HAL_STATUS_SUCCESS(status))
12052 {
12053 palFreeMemory(pMac->hHdd, pMsg);
12054 break;
12055 }
12056//To test reconn ends
Jeff Johnson295189b2012-06-20 16:38:30 -070012057 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012058 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012059 return( status );
12060}
12061
Jeff Johnson295189b2012-06-20 16:38:30 -070012062eHalStatus csrSendMBDeauthCnfMsg( tpAniSirGlobal pMac, tpSirSmeDeauthInd pDeauthInd )
12063{
12064 eHalStatus status = eHAL_STATUS_SUCCESS;
12065 tSirSmeDeauthCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070012066 do {
12067 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthCnf ));
12068 if ( !HAL_STATUS_SUCCESS(status) ) break;
12069 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthCnf ));
12070 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_CNF);
12071 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12072 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthCnf ));
12073 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDeauthInd->bssId, sizeof(pMsg->bssId));
12074 if(!HAL_STATUS_SUCCESS(status))
12075 {
12076 palFreeMemory(pMac->hHdd, pMsg);
12077 break;
12078 }
12079 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDeauthInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12080 if(!HAL_STATUS_SUCCESS(status))
12081 {
12082 palFreeMemory(pMac->hHdd, pMsg);
12083 break;
12084 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012085 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012086 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012087 return( status );
12088}
Jeff Johnson295189b2012-06-20 16:38:30 -070012089eHalStatus csrSendAssocCnfMsg( tpAniSirGlobal pMac, tpSirSmeAssocInd pAssocInd, eHalStatus Halstatus )
12090{
12091 eHalStatus status = eHAL_STATUS_SUCCESS;
12092 tSirSmeAssocCnf *pMsg;
12093 tANI_U8 *pBuf;
12094 tSirResultCodes statusCode;
12095 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012096 do {
12097 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocCnf ));
12098 if ( !HAL_STATUS_SUCCESS(status) ) break;
12099 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocCnf ));
12100 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ASSOC_CNF);
12101 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocCnf ));
Jeff Johnson295189b2012-06-20 16:38:30 -070012102 pBuf = (tANI_U8 *)&pMsg->statusCode;
12103 if(HAL_STATUS_SUCCESS(Halstatus))
12104 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12105 else
12106 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12107 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12108 pBuf += sizeof(tSirResultCodes);
12109 // bssId
12110 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12111 pBuf += sizeof (tSirMacAddr);
12112 // peerMacAddr
12113 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12114 pBuf += sizeof (tSirMacAddr);
12115 // aid
12116 wTmp = pal_cpu_to_be16(pAssocInd->aid);
12117 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12118 pBuf += sizeof (tANI_U16);
12119 // alternateBssId
12120 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12121 pBuf += sizeof (tSirMacAddr);
12122 // alternateChannelId
12123 *pBuf = 11;
Jeff Johnson295189b2012-06-20 16:38:30 -070012124 status = palSendMBMessage( pMac->hHdd, pMsg );
12125 if(!HAL_STATUS_SUCCESS(status))
12126 {
12127 //pMsg is freed by palSendMBMessage
12128 break;
12129 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012130 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012131 return( status );
12132}
Jeff Johnson295189b2012-06-20 16:38:30 -070012133#ifdef WLAN_SOFTAP_FEATURE
12134eHalStatus csrSendAssocIndToUpperLayerCnfMsg( tpAniSirGlobal pMac,
12135 tpSirSmeAssocInd pAssocInd,
12136 eHalStatus Halstatus,
12137 tANI_U8 sessionId)
12138{
12139 tSirMsgQ msgQ;
12140 eHalStatus status = eHAL_STATUS_SUCCESS;
12141 tSirSmeAssocIndToUpperLayerCnf *pMsg;
12142 tANI_U8 *pBuf;
12143 tSirResultCodes statusCode;
12144 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012145 do {
12146 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12147 if ( !HAL_STATUS_SUCCESS(status) ) break;
12148 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
Jeff Johnsone7245742012-09-05 17:12:55 -070012149
Jeff Johnson295189b2012-06-20 16:38:30 -070012150 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPPER_LAYER_ASSOC_CNF);
12151 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12152
12153 pMsg->sessionId = sessionId;
12154
12155 pBuf = (tANI_U8 *)&pMsg->statusCode;
12156 if(HAL_STATUS_SUCCESS(Halstatus))
12157 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12158 else
12159 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12160 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12161 pBuf += sizeof(tSirResultCodes);
12162 // bssId
12163 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12164 pBuf += sizeof (tSirMacAddr);
12165 // peerMacAddr
12166 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12167 pBuf += sizeof (tSirMacAddr);
12168 // StaId
12169 wTmp = pal_cpu_to_be16(pAssocInd->staId);
12170 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12171 pBuf += sizeof (tANI_U16);
12172 // alternateBssId
12173 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12174 pBuf += sizeof (tSirMacAddr);
12175 // alternateChannelId
12176 *pBuf = 11;
12177 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012178 // Instead of copying roam Info, we just copy only WmmEnabled , RsnIE information
12179 //Wmm
12180 *pBuf = pAssocInd->wmmEnabledSta;
12181 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012182 //RSN IE
12183 status = palCopyMemory(pMac->hHdd, (tSirRSNie *)pBuf, &pAssocInd->rsnIE, sizeof(tSirRSNie));
12184 pBuf += sizeof (tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012185 //Additional IE
12186 status = palCopyMemory(pMac->hHdd, (void *)pBuf, &pAssocInd->addIE, sizeof(tSirAddie));
12187 pBuf += sizeof (tSirAddie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012188 //reassocReq
12189 *pBuf = pAssocInd->reassocReq;
12190 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012191 msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF;
12192 msgQ.bodyptr = pMsg;
12193 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012194 SysProcessMmhMsg(pMac, &msgQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012195 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012196 return( status );
12197}
12198#endif
12199
Jeff Johnson295189b2012-06-20 16:38:30 -070012200eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId ,
12201 tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType,
12202 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
12203 tANI_U8 keyId, tANI_U8 keyLength, tANI_U8 *pKey, tANI_U8 paeRole,
12204 tANI_U8 *pKeyRsc )
12205{
12206 tSirSmeSetContextReq *pMsg;
12207 tANI_U16 msgLen;
12208 eHalStatus status = eHAL_STATUS_FAILURE;
12209 tAniEdType tmpEdType;
12210 tAniKeyDirection tmpDirection;
12211 tANI_U8 *pBuf;
12212 tANI_U8 *p;
12213 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012214 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012215 if( ( 1 != numKeys ) && ( 0 != numKeys ) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012216 // all of these fields appear in every SET_CONTEXT message. Below we'll add in the size for each
12217 // key set. Since we only support upto one key, we always allocate memory for 1 key
12218 msgLen = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) +
12219 sizeof( tSirMacAddr ) + 1 + sizeof(tANI_U16) +
12220 sizeof( pMsg->keyMaterial.length ) + sizeof( pMsg->keyMaterial.edType ) + sizeof( pMsg->keyMaterial.numKeys ) +
12221 ( sizeof( pMsg->keyMaterial.key ) );
12222
12223 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12224 if ( !HAL_STATUS_SUCCESS(status) ) break;
12225 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12226 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SETCONTEXT_REQ);
12227 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012228 //sessionId
12229 pBuf = &pMsg->sessionId;
12230 *pBuf = (tANI_U8)sessionId;
12231 pBuf++;
12232 // transactionId
12233 *pBuf = 0;
12234 *(pBuf + 1) = 0;
12235 pBuf += sizeof(tANI_U16);
12236 // peerMacAddr
12237 palCopyMemory( pMac->hHdd, pBuf,
12238 (tANI_U8 *)peerMacAddr, sizeof(tSirMacAddr) );
12239
12240 pBuf += sizeof(tSirMacAddr);
12241
12242 // bssId
12243 palCopyMemory( pMac->hHdd, pBuf,
12244 (tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12245
12246 pBuf += sizeof(tSirMacAddr);
12247
12248 p = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012249 // Set the pMsg->keyMaterial.length field (this length is defined as all data that follows the edType field
12250 // in the tSirKeyMaterial keyMaterial; field).
12251 //
12252 // !!NOTE: This keyMaterial.length contains the length of a MAX size key, though the keyLength can be
12253 // shorter than this max size. Is LIM interpreting this ok ?
12254 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 -070012255 // set pMsg->keyMaterial.edType
12256 tmpEdType = (tAniEdType)pal_cpu_to_be32(edType);
12257 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpEdType, sizeof(tAniEdType) );
12258 p += sizeof( pMsg->keyMaterial.edType );
Jeff Johnson295189b2012-06-20 16:38:30 -070012259 // set the pMsg->keyMaterial.numKeys field
12260 *p = numKeys;
12261 p += sizeof( pMsg->keyMaterial.numKeys );
Jeff Johnson295189b2012-06-20 16:38:30 -070012262 // set pSirKey->keyId = keyId;
12263 *p = keyId;
12264 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012265 // set pSirKey->unicast = (tANI_U8)fUnicast;
12266 *p = (tANI_U8)fUnicast;
12267 p += sizeof( pMsg->keyMaterial.key[ 0 ].unicast );
Jeff Johnson295189b2012-06-20 16:38:30 -070012268 // set pSirKey->keyDirection = aniKeyDirection;
12269 tmpDirection = (tAniKeyDirection)pal_cpu_to_be32(aniKeyDirection);
12270 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpDirection, sizeof(tAniKeyDirection) );
12271 p += sizeof(tAniKeyDirection);
12272 // pSirKey->keyRsc = ;;
12273 palCopyMemory( pMac->hHdd, p, pKeyRsc, CSR_MAX_RSC_LEN );
12274 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyRsc );
Jeff Johnson295189b2012-06-20 16:38:30 -070012275 // set pSirKey->paeRole
12276 *p = paeRole; // 0 is Supplicant
12277 p++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012278 // set pSirKey->keyLength = keyLength;
12279 p = pal_set_U16( p, pal_cpu_to_be16(keyLength) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012280 if ( keyLength && pKey )
12281 {
12282 palCopyMemory( pMac->hHdd, p, pKey, keyLength );
12283 if(keyLength == 16)
12284 {
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012285 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 -070012286 keyId, edType, pKey[0], pKey[1], pKey[2], pKey[3], pKey[4],
12287 pKey[5], pKey[6], pKey[7], pKey[8],
12288 pKey[9], pKey[10], pKey[11], pKey[12], pKey[13], pKey[14], pKey[15]);
12289 }
12290 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012291 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012292 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012293 return( status );
12294}
12295
Jeff Johnson295189b2012-06-20 16:38:30 -070012296eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamBssType bssType,
12297 tCsrRoamStartBssParams *pParam, tSirBssDescription *pBssDesc )
12298{
12299 eHalStatus status;
12300 tSirSmeStartBssReq *pMsg;
12301 tANI_U8 *pBuf = NULL;
12302 tANI_U8 *wTmpBuf = NULL;
12303 tANI_U16 msgLen, wTmp;
12304 tANI_U32 dwTmp;
12305 tSirNwType nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070012306 ePhyChanBondState cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070012307#ifdef WLAN_SOFTAP_FEATURE
12308 tANI_U32 authType;
12309#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012310 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012311
12312 if(!pSession)
12313 {
12314 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12315 return eHAL_STATUS_FAILURE;
12316 }
12317
Jeff Johnson295189b2012-06-20 16:38:30 -070012318 do {
12319 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
12320 pSession->joinFailStatusCode.reasonCode = 0;
12321 msgLen = sizeof(tSirSmeStartBssReq);
12322 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12323 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012324 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12325 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BSS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012326 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012327 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012328 //sessionId
12329 *pBuf = (tANI_U8)sessionId;
12330 pBuf++;
12331 // transactionId
12332 *pBuf = 0;
12333 *(pBuf + 1) = 0;
12334 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012335 // bssid
12336 palCopyMemory( pMac->hHdd, pBuf, pParam->bssid, sizeof(tSirMacAddr) );
12337 pBuf += sizeof(tSirMacAddr);
12338 // selfMacAddr
12339 palCopyMemory( pMac->hHdd, pBuf, pSession->selfMacAddr, sizeof(tSirMacAddr) );
12340 pBuf += sizeof(tSirMacAddr);
12341 // beaconInterval
12342 if( pBssDesc && pBssDesc->beaconInterval )
12343 {
12344 wTmp = pal_cpu_to_be16( pBssDesc->beaconInterval );
12345 }
12346#ifdef WLAN_SOFTAP_FEATURE
12347 else if(pParam->beaconInterval)
12348 {
12349 wTmp = pal_cpu_to_be16( pParam->beaconInterval );
12350 }
12351#endif
12352 else
12353 {
12354 wTmp = pal_cpu_to_be16( WNI_CFG_BEACON_INTERVAL_STADEF );
12355 }
Jeff Johnsone7245742012-09-05 17:12:55 -070012356 if(csrIsconcurrentsessionValid (pMac, sessionId,
12357 pParam->bssPersona)
12358 == eHAL_STATUS_SUCCESS )
12359 {
12360 csrValidateBeaconInterval(pMac, pParam->operationChn, &wTmp, sessionId,
12361 pParam->bssPersona);
12362 //Update the beacon Interval
12363 pParam->beaconInterval = wTmp;
12364 }
12365 else
12366 {
12367 smsLog( pMac,LOGE, FL("****Start BSS failed persona already exists***\n"));
12368 status = eHAL_STATUS_FAILURE;
12369 return status;
12370 }
12371
Jeff Johnson295189b2012-06-20 16:38:30 -070012372 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12373 pBuf += sizeof(tANI_U16);
12374 // dot11mode
12375 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pParam->uCfgDot11Mode );
12376 pBuf += 1;
12377 // bssType
12378 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( bssType ) );
12379 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
12380 pBuf += sizeof(tSirBssType);
12381 // ssId
12382 if( pParam->ssId.length )
12383 {
12384 // ssId len
12385 *pBuf = pParam->ssId.length;
12386 pBuf++;
12387 palCopyMemory( pMac->hHdd, pBuf, pParam->ssId.ssId, pParam->ssId.length );
12388 pBuf += pParam->ssId.length;
12389 }
12390 else
12391 {
12392 *pBuf = 0;
12393 pBuf++;
12394 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012395 // set the channel Id
12396 *pBuf = pParam->operationChn;
12397 pBuf++;
12398 //What should we really do for the cbmode.
Jeff Johnsone7245742012-09-05 17:12:55 -070012399 cbMode = (ePhyChanBondState)pal_cpu_to_be32(pParam->cbMode);
12400 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(ePhyChanBondState) );
12401 pBuf += sizeof(ePhyChanBondState);
Jeff Johnson295189b2012-06-20 16:38:30 -070012402
12403#ifdef WLAN_SOFTAP_FEATURE
12404 // Set privacy
12405 *pBuf = pParam->privacy;
12406 pBuf++;
12407
12408 //Set Uapsd
12409 *pBuf = pParam->ApUapsdEnable;
12410 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012411 //Set SSID hidden
12412 *pBuf = pParam->ssidHidden;
12413 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012414 *pBuf = (tANI_U8)pParam->fwdWPSPBCProbeReq;
12415 pBuf++;
12416
12417 //Ht protection Enable/Disable
12418 *pBuf = (tANI_U8)pParam->protEnabled;
12419 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012420 //Enable Beacons to Receive for OBSS protection Enable/Disable
12421 *pBuf = (tANI_U8)pParam->obssProtEnabled;
12422 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012423 //set cfg related to protection
12424 wTmp = pal_cpu_to_be16( pParam->ht_protection );
12425 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12426 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012427 // Set Auth type
12428 authType = pal_cpu_to_be32(pParam->authType);
12429 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&authType, sizeof(tANI_U32));
12430 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012431 // Set DTIM
12432 dwTmp = pal_cpu_to_be32(pParam->dtimPeriod);
12433 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12434 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012435 // Set wps_state
12436 *pBuf = pParam->wps_state;
12437 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012438#endif
12439 //Persona
12440 *pBuf = (tANI_U8)pParam->bssPersona;
12441 pBuf++;
12442
Jeff Johnsone7245742012-09-05 17:12:55 -070012443
Jeff Johnson295189b2012-06-20 16:38:30 -070012444
12445 // set RSN IE
12446 if( pParam->nRSNIELength > sizeof(pMsg->rsnIE.rsnIEdata) )
12447 {
12448 status = eHAL_STATUS_INVALID_PARAMETER;
12449 palFreeMemory( pMac->hHdd, pMsg );
12450 break;
12451 }
12452 wTmp = pal_cpu_to_be16( pParam->nRSNIELength );
12453 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12454 pBuf += sizeof(tANI_U16);
12455 if( wTmp )
12456 {
12457 wTmp = pParam->nRSNIELength;
12458 palCopyMemory( pMac->hHdd, pBuf, pParam->pRSNIE, wTmp );
12459 pBuf += wTmp;
12460 }
12461 nwType = (tSirNwType)pal_cpu_to_be32(pParam->sirNwType);
12462 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&nwType, sizeof(tSirNwType) );
12463 pBuf += sizeof(tSirNwType);
Jeff Johnson295189b2012-06-20 16:38:30 -070012464 *pBuf = pParam->operationalRateSet.numRates; //tSirMacRateSet->numRates
12465 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012466 palCopyMemory( pMac->hHdd, pBuf, pParam->operationalRateSet.rate, pParam->operationalRateSet.numRates );
12467 pBuf += pParam->operationalRateSet.numRates ;
12468 *pBuf++ = pParam->extendedRateSet.numRates;
12469 if(0 != pParam->extendedRateSet.numRates)
12470 {
12471 palCopyMemory( pMac->hHdd, pBuf, pParam->extendedRateSet.rate, pParam->extendedRateSet.numRates );
12472 pBuf += pParam->extendedRateSet.numRates;
12473 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012474 msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
12475 pMsg->length = pal_cpu_to_be16(msgLen);
12476
12477 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012478 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012479 return( status );
12480}
12481
Jeff Johnson295189b2012-06-20 16:38:30 -070012482eHalStatus csrSendMBStopBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId )
12483{
12484 eHalStatus status = eHAL_STATUS_FAILURE;
12485 tSirSmeStopBssReq *pMsg;
12486 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12487 tANI_U8 *pBuf;
12488 tANI_U16 msgLen;
Jeff Johnson32d95a32012-09-10 13:15:23 -070012489
12490 if(!pSession)
12491 {
12492 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12493 return eHAL_STATUS_FAILURE;
12494 }
12495
Jeff Johnson295189b2012-06-20 16:38:30 -070012496 do {
12497 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12498 if ( !HAL_STATUS_SUCCESS(status) ) break;
12499 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12500 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12501 pBuf = &pMsg->sessionId;
12502 //sessionId
12503 *pBuf = (tANI_U8)sessionId;
12504 pBuf++;
12505 // transactionId
12506 *pBuf = 0;
12507 pBuf += sizeof(tANI_U16);
12508 //reason code
12509 *pBuf = 0;
12510 pBuf += sizeof(tSirResultCodes);
12511 // bssid
12512 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12513 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12514 {
12515 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->selfMacAddr, sizeof(tSirMacAddr) );
12516 }
12517 else
12518 {
12519 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12520 }
12521 pBuf += sizeof(tSirMacAddr);
12522 msgLen = sizeof(tANI_U16) + sizeof(tANI_U16) + 1 + sizeof(tANI_U16) + sizeof(tSirResultCodes) + sizeof(tSirMacAddr);
12523 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012524 status = palSendMBMessage( pMac->hHdd, pMsg );
12525#if 0
12526 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12527 if ( !HAL_STATUS_SUCCESS(status) ) break;
12528 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12529 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12530 pMsg->reasonCode = 0;
12531 // bssid
12532 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12533 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12534 {
12535 pbBssid = (tANI_U8 *)&pSession->selfMacAddr;
12536 }
12537 else
12538 {
12539 pbBssid = (tANI_U8 *)&pSession->connectedProfile.bssid;
12540 }
12541 palCopyMemory( pMac->hHdd, &pMsg->bssId, pbBssid, sizeof(tSirMacAddr) );
12542 pMsg->transactionId = 0;
12543 pMsg->sessionId = (tANI_U8)sessionId;
12544 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeStopBssReq ));
12545 status = palSendMBMessage( pMac->hHdd, pMsg );
12546#endif
12547 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012548 return( status );
12549}
12550
Jeff Johnson295189b2012-06-20 16:38:30 -070012551eHalStatus csrReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId,
12552 tCsrRoamModifyProfileFields *pModProfileFields,
12553 tANI_U32 *pRoamId, v_BOOL_t fForce)
12554{
Jeff Johnson295189b2012-06-20 16:38:30 -070012555 eHalStatus status = eHAL_STATUS_FAILURE;
12556 tANI_U32 roamId = 0;
12557 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012558 if((csrIsConnStateConnected(pMac, sessionId)) &&
12559 (fForce || (!palEqualMemory(pMac->hHdd, &pModProfileFields,
12560 &pSession->connectedProfile.modifyProfileFields,
12561 sizeof(tCsrRoamModifyProfileFields)))) )
12562 {
12563 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
12564 if(pRoamId)
12565 {
12566 *pRoamId = roamId;
12567 }
12568
Jeff Johnson295189b2012-06-20 16:38:30 -070012569 status = csrRoamIssueReassoc(pMac, sessionId, NULL, pModProfileFields,
12570 eCsrSmeIssuedReassocToSameAP, roamId,
12571 eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -070012572 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012573 return status;
12574}
Jeff Johnson295189b2012-06-20 16:38:30 -070012575static eHalStatus csrRoamSessionOpened(tpAniSirGlobal pMac, tANI_U32 sessionId)
12576{
12577 eHalStatus status = eHAL_STATUS_SUCCESS;
12578 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070012579 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
12580 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
12581 eCSR_ROAM_SESSION_OPENED, eCSR_ROAM_RESULT_NONE);
12582 return (status);
12583}
Jeff Johnson295189b2012-06-20 16:38:30 -070012584eHalStatus csrProcessAddStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12585{
12586 eHalStatus status = eHAL_STATUS_SUCCESS;
12587 tListElem *pEntry = NULL;
12588 tSmeCmd *pCommand = NULL;
12589 tSirSmeAddStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012590 do
12591 {
12592 if(pMsg == NULL)
12593 {
12594 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
12595 status = eHAL_STATUS_FAILURE;
12596 break;
12597 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012598 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12599 if(pEntry)
12600 {
12601 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12602 if(eSmeCommandAddStaSession == pCommand->command)
12603 {
12604 pRsp = (tSirSmeAddStaSelfRsp*)pMsg;
12605 smsLog( pMac, LOG1, "Add Sta rsp status = %d\n", pRsp->status );
12606 //Nothing to be done. May be indicate the self sta addition success by calling session callback (TODO).
Jeff Johnson295189b2012-06-20 16:38:30 -070012607 csrRoamSessionOpened(pMac, pCommand->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012608 //Remove this command out of the active list
12609 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12610 {
12611 //Now put this command back on the avilable command list
12612 csrReleaseCommand(pMac, pCommand);
12613 }
12614 smeProcessPendingQueue( pMac );
12615 }
12616 else
12617 {
12618 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO Add sta session command are ACTIVE ...\n",
12619 __FUNCTION__);
12620 status = eHAL_STATUS_FAILURE;
12621 break;
12622 }
12623 }
12624 else
12625 {
12626 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
12627 __FUNCTION__);
12628 status = eHAL_STATUS_FAILURE;
12629 break;
12630 }
12631 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012632 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012633}
Jeff Johnson295189b2012-06-20 16:38:30 -070012634eHalStatus csrSendMBAddSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12635{
12636 tSirSmeAddStaSelfReq *pMsg;
12637 tANI_U16 msgLen;
12638 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012639 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012640 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12641 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012642 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12643 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012644 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012645 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ADD_STA_SELF_REQ);
12646 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012647 // self station address
12648 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012649 smsLog( pMac, LOG1, FL("selfMac=%02x, %02x, %02x, %02x, %02x, %02x"),
Jeff Johnson295189b2012-06-20 16:38:30 -070012650 pMsg->selfMacAddr[0],
12651 pMsg->selfMacAddr[1],
12652 pMsg->selfMacAddr[2],
12653 pMsg->selfMacAddr[3],
12654 pMsg->selfMacAddr[4],
12655 pMsg->selfMacAddr[5]);
12656 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012657 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012658 return( status );
12659}
Jeff Johnson295189b2012-06-20 16:38:30 -070012660eHalStatus csrIssueAddStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr sessionMacAddr)
12661{
12662 eHalStatus status = eHAL_STATUS_SUCCESS;
12663 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012664 pCommand = csrGetCommandBuffer(pMac);
12665 if(NULL == pCommand)
12666 {
12667 status = eHAL_STATUS_RESOURCES;
12668 }
12669 else
12670 {
12671 pCommand->command = eSmeCommandAddStaSession;
12672 pCommand->sessionId = (tANI_U8)sessionId;
12673 palCopyMemory( pMac->hHdd, pCommand->u.addStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012674 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12675 if( !HAL_STATUS_SUCCESS( status ) )
12676 {
12677 //Should be panic??
12678 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12679 }
12680 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012681 return (status);
12682}
Jeff Johnson295189b2012-06-20 16:38:30 -070012683eHalStatus csrProcessAddStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12684{
12685 return csrSendMBAddSelfStaReqMsg( pMac,
12686 pCommand->u.addStaSessionCmd.selfMacAddr );
12687}
Jeff Johnson295189b2012-06-20 16:38:30 -070012688eHalStatus csrRoamOpenSession( tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext,
12689 tANI_U8 *pSelfMacAddr, tANI_U8 *pbSessionId )
12690{
12691 eHalStatus status = eHAL_STATUS_SUCCESS;
12692 tANI_U32 i;
12693 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070012694 *pbSessionId = CSR_SESSION_ID_INVALID;
12695 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12696 {
12697 if( !CSR_IS_SESSION_VALID( pMac, i ) )
12698 {
12699 pSession = CSR_GET_SESSION( pMac, i );
12700 status = eHAL_STATUS_SUCCESS;
12701 pSession->sessionActive = eANI_BOOLEAN_TRUE;
12702 pSession->sessionId = (tANI_U8)i;
12703 pSession->callback = callback;
12704 pSession->pContext = pContext;
12705 palCopyMemory( pMac->hHdd, &pSession->selfMacAddr, pSelfMacAddr, sizeof(tCsrBssid) );
12706 *pbSessionId = (tANI_U8)i;
Jeff Johnson295189b2012-06-20 16:38:30 -070012707 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerRoaming, csrRoamRoamingTimerHandler,
12708 &pSession->roamingTimerInfo);
12709 if(!HAL_STATUS_SUCCESS(status))
12710 {
12711 smsLog(pMac, LOGE, FL("cannot allocate memory for Roaming timer\n"));
12712 break;
12713 }
12714#ifdef FEATURE_WLAN_BTAMP_UT_RF
12715 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerJoinRetry, csrRoamJoinRetryTimerHandler,
12716 &pSession->joinRetryTimerInfo);
12717 if(!HAL_STATUS_SUCCESS(status))
12718 {
12719 smsLog(pMac, LOGE, FL("cannot allocate memory for joinretry timer\n"));
12720 break;
12721 }
12722#endif
12723 pSession->ibssJoinTimerInfo.pMac = pMac;
12724 pSession->ibssJoinTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
Jeff Johnson295189b2012-06-20 16:38:30 -070012725 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerIbssJoining, csrRoamIbssJoinTimerHandler,
12726 &pSession->ibssJoinTimerInfo);
12727 if(!HAL_STATUS_SUCCESS(status))
12728 {
12729 smsLog(pMac, LOGE, FL("cannot allocate memory for IbssJoining timer\n"));
12730 break;
12731 }
12732 status = csrIssueAddStaForSessionReq ( pMac, i, pSelfMacAddr );
12733 break;
12734 }
12735 }
12736 if( CSR_ROAM_SESSION_MAX == i )
12737 {
12738 //No session is available
12739 status = eHAL_STATUS_RESOURCES;
12740 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012741 return ( status );
12742}
Jeff Johnson295189b2012-06-20 16:38:30 -070012743eHalStatus csrProcessDelStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12744{
12745 eHalStatus status = eHAL_STATUS_SUCCESS;
12746 tListElem *pEntry = NULL;
12747 tSmeCmd *pCommand = NULL;
12748 tSirSmeDelStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012749 do
12750 {
12751 if(pMsg == NULL)
12752 {
12753 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
12754 status = eHAL_STATUS_FAILURE;
12755 break;
12756 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012757 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12758 if(pEntry)
12759 {
12760 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12761 if(eSmeCommandDelStaSession == pCommand->command)
12762 {
12763 tANI_U8 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012764 pRsp = (tSirSmeDelStaSelfRsp*)pMsg;
12765 smsLog( pMac, LOG1, "Del Sta rsp status = %d\n", pRsp->status );
Jeff Johnson295189b2012-06-20 16:38:30 -070012766 //This session is done.
12767 csrCleanupSession(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012768 if(pCommand->u.delStaSessionCmd.callback)
12769 {
12770
12771 status = sme_ReleaseGlobalLock( &pMac->sme );
12772 if ( HAL_STATUS_SUCCESS( status ) )
12773 {
12774 pCommand->u.delStaSessionCmd.callback(
12775 pCommand->u.delStaSessionCmd.pContext);
12776 status = sme_AcquireGlobalLock( &pMac->sme );
12777 if (! HAL_STATUS_SUCCESS( status ) )
12778 {
12779 smsLog(pMac, LOGP, "%s: Failed to Acquire Lock\n", __FUNCTION__);
12780 return status;
12781 }
12782 }
12783 else {
12784 smsLog(pMac, LOGE, "%s: Failed to Release Lock\n", __FUNCTION__);
12785 }
12786 }
12787
12788 //Remove this command out of the active list
12789 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12790 {
12791 //Now put this command back on the avilable command list
12792 csrReleaseCommand(pMac, pCommand);
12793 }
12794 smeProcessPendingQueue( pMac );
12795 }
12796 else
12797 {
12798 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO Del sta session command are ACTIVE ...\n",
12799 __FUNCTION__);
12800 status = eHAL_STATUS_FAILURE;
12801 break;
12802 }
12803 }
12804 else
12805 {
12806 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
12807 __FUNCTION__);
12808 status = eHAL_STATUS_FAILURE;
12809 break;
12810 }
12811 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012812 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012813}
Jeff Johnson295189b2012-06-20 16:38:30 -070012814eHalStatus csrSendMBDelSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12815{
12816 tSirSmeDelStaSelfReq *pMsg;
12817 tANI_U16 msgLen;
12818 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012819 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012820 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12821 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012822 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12823 if ( !HAL_STATUS_SUCCESS(status) ) break;
12824
12825 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012826 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEL_STA_SELF_REQ);
12827 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012828 // self station address
12829 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012830 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012831 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012832 return( status );
12833}
Jeff Johnson295189b2012-06-20 16:38:30 -070012834eHalStatus csrIssueDelStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId,
12835 tSirMacAddr sessionMacAddr,
12836 csrRoamSessionCloseCallback callback,
12837 void *pContext)
12838{
12839 eHalStatus status = eHAL_STATUS_SUCCESS;
12840 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012841 pCommand = csrGetCommandBuffer(pMac);
12842 if(NULL == pCommand)
12843 {
12844 status = eHAL_STATUS_RESOURCES;
12845 }
12846 else
12847 {
12848 pCommand->command = eSmeCommandDelStaSession;
12849 pCommand->sessionId = (tANI_U8)sessionId;
12850 pCommand->u.delStaSessionCmd.callback = callback;
12851 pCommand->u.delStaSessionCmd.pContext = pContext;
12852 palCopyMemory( pMac->hHdd, pCommand->u.delStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012853 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12854 if( !HAL_STATUS_SUCCESS( status ) )
12855 {
12856 //Should be panic??
12857 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12858 }
12859 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012860 return (status);
12861}
Jeff Johnson295189b2012-06-20 16:38:30 -070012862eHalStatus csrProcessDelStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12863{
12864 return csrSendMBDelSelfStaReqMsg( pMac,
12865 pCommand->u.delStaSessionCmd.selfMacAddr );
12866}
Jeff Johnson295189b2012-06-20 16:38:30 -070012867static void purgeCsrSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId)
12868{
12869 tDblLinkList *pList = &pMac->roam.roamCmdPendingList;
12870 tListElem *pEntry, *pNext;
12871 tSmeCmd *pCommand;
12872 tDblLinkList localList;
12873
12874 vos_mem_zero(&localList, sizeof(tDblLinkList));
12875 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
12876 {
12877 smsLog(pMac, LOGE, FL(" failed to open list"));
12878 return;
12879 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012880 csrLLLock(pList);
12881 pEntry = csrLLPeekHead(pList, LL_ACCESS_NOLOCK);
12882 while(pEntry != NULL)
12883 {
12884 pNext = csrLLNext(pList, pEntry, LL_ACCESS_NOLOCK);
12885 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12886 if(pCommand->sessionId == sessionId)
12887 {
12888 if(csrLLRemoveEntry(pList, pEntry, LL_ACCESS_NOLOCK))
12889 {
12890 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
12891 }
12892 }
12893 pEntry = pNext;
12894 }
12895 csrLLUnlock(pList);
12896
12897 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
12898 {
12899 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12900 csrAbortCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
12901 }
12902 csrLLClose(&localList);
12903}
12904
Jeff Johnson295189b2012-06-20 16:38:30 -070012905void csrCleanupSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
12906{
12907 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12908 {
12909 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012910 csrRoamStop(pMac, sessionId);
12911 csrFreeConnectBssDesc(pMac, sessionId);
12912 csrRoamFreeConnectProfile( pMac, &pSession->connectedProfile );
12913 csrRoamFreeConnectedInfo ( pMac, &pSession->connectedInfo);
12914 palTimerFree(pMac->hHdd, pSession->hTimerRoaming);
12915#ifdef FEATURE_WLAN_BTAMP_UT_RF
12916 palTimerFree(pMac->hHdd, pSession->hTimerJoinRetry);
12917#endif
12918 palTimerFree(pMac->hHdd, pSession->hTimerIbssJoining);
12919 purgeSmeSessionCmdList(pMac, sessionId);
12920 purgeCsrSessionCmdList(pMac, sessionId);
12921 csrInitSession(pMac, sessionId);
12922 }
12923}
12924
Jeff Johnson295189b2012-06-20 16:38:30 -070012925eHalStatus csrRoamCloseSession( tpAniSirGlobal pMac, tANI_U32 sessionId,
12926 tANI_BOOLEAN fSync,
12927 csrRoamSessionCloseCallback callback,
12928 void *pContext )
12929{
12930 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -070012931 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12932 {
12933 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12934 if(fSync)
12935 {
12936 csrCleanupSession(pMac, sessionId);
12937 }
12938 else
12939 {
12940 purgeSmeSessionCmdList(pMac, sessionId);
12941 purgeCsrSessionCmdList(pMac, sessionId);
12942 status = csrIssueDelStaForSessionReq( pMac, sessionId,
12943 pSession->selfMacAddr, callback, pContext);
12944 }
12945 }
12946 else
12947 {
12948 status = eHAL_STATUS_INVALID_PARAMETER;
12949 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012950 return ( status );
12951}
12952
Jeff Johnson295189b2012-06-20 16:38:30 -070012953static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId )
12954{
12955 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012956
12957 if(!pSession)
12958 {
12959 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12960 return;
12961 }
12962
Jeff Johnson295189b2012-06-20 16:38:30 -070012963 pSession->sessionActive = eANI_BOOLEAN_FALSE;
12964 pSession->sessionId = CSR_SESSION_ID_INVALID;
12965 pSession->callback = NULL;
12966 pSession->pContext = NULL;
12967 pSession->ibss_join_pending = FALSE;
12968 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
12969 // TODO : Confirm pMac->roam.fReadyForPowerSave = eANI_BOOLEAN_FALSE;
12970 csrFreeRoamProfile( pMac, sessionId );
12971 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
12972 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
12973 csrFreeConnectBssDesc(pMac, sessionId);
12974 csrScanEnable(pMac);
12975 palZeroMemory( pMac->hHdd, &pSession->selfMacAddr, sizeof(tCsrBssid) );
12976 if(pSession->pWpaRsnReqIE)
12977 {
12978 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
12979 pSession->pWpaRsnReqIE = NULL;
12980 }
12981 pSession->nWpaRsnReqIeLength = 0;
12982 if(pSession->pWpaRsnRspIE)
12983 {
12984 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
12985 pSession->pWpaRsnRspIE = NULL;
12986 }
12987 pSession->nWpaRsnRspIeLength = 0;
12988#ifdef FEATURE_WLAN_WAPI
12989 if(pSession->pWapiReqIE)
12990 {
12991 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
12992 pSession->pWapiReqIE = NULL;
12993 }
12994 pSession->nWapiReqIeLength = 0;
12995 if(pSession->pWapiRspIE)
12996 {
12997 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
12998 pSession->pWapiRspIE = NULL;
12999 }
13000 pSession->nWapiRspIeLength = 0;
13001#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070013002 if(pSession->pAddIEScan)
13003 {
13004 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
13005 pSession->pAddIEScan = NULL;
13006 }
13007 pSession->nAddIEScanLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013008 if(pSession->pAddIEAssoc)
13009 {
13010 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
13011 pSession->pAddIEAssoc = NULL;
13012}
13013 pSession->nAddIEAssocLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013014}
13015
Jeff Johnson295189b2012-06-20 16:38:30 -070013016eHalStatus csrRoamGetSessionIdFromBSSID( tpAniSirGlobal pMac, tCsrBssid *bssid, tANI_U32 *pSessionId )
13017{
13018 eHalStatus status = eHAL_STATUS_FAILURE;
13019 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070013020 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
13021 {
13022 if( CSR_IS_SESSION_VALID( pMac, i ) )
13023 {
13024 if( csrIsMacAddressEqual( pMac, bssid, &pMac->roam.roamSession[i].connectedProfile.bssid ) )
13025 {
13026 //Found it
13027 status = eHAL_STATUS_SUCCESS;
13028 *pSessionId = i;
13029 break;
13030 }
13031 }
13032 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013033 return( status );
13034}
13035
Jeff Johnson295189b2012-06-20 16:38:30 -070013036//This function assumes that we only support one IBSS session. We cannot use BSSID to identify
13037//session because for IBSS, the bssid changes.
13038static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac )
13039{
13040 tANI_U32 i, nRet = CSR_SESSION_ID_INVALID;
13041 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070013042 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
13043 {
13044 if( CSR_IS_SESSION_VALID( pMac, i ) )
13045 {
13046 pSession = CSR_GET_SESSION( pMac, i );
13047 if( pSession->pCurRoamProfile && ( csrIsBssTypeIBSS( pSession->connectedProfile.BSSType ) ) )
13048 {
13049 //Found it
13050 nRet = i;
13051 break;
13052 }
13053 }
13054 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013055 return (nRet);
13056}
Jeff Johnson295189b2012-06-20 16:38:30 -070013057static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid)
13058{
13059 /* Update the current BSS info in ho control block based on connected
13060 profile info from pmac global structure */
13061
Jeff Johnson295189b2012-06-20 16:38:30 -070013062 smsLog(pMac, LOGW, " csrRoamLinkUp: WLAN link UP with AP= %02x-%02x-%02x-%02x-%02x-%02x\n",
13063 bssid[ 0 ], bssid[ 1 ], bssid[ 2 ],
13064 bssid[ 3 ], bssid[ 4 ], bssid[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -070013065 /* Check for user misconfig of RSSI trigger threshold */
13066 pMac->roam.configParam.vccRssiThreshold =
13067 ( 0 == pMac->roam.configParam.vccRssiThreshold ) ?
13068 CSR_VCC_RSSI_THRESHOLD : pMac->roam.configParam.vccRssiThreshold;
13069 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
Jeff Johnson295189b2012-06-20 16:38:30 -070013070 /* Check for user misconfig of UL MAC Loss trigger threshold */
13071 pMac->roam.configParam.vccUlMacLossThreshold =
13072 ( 0 == pMac->roam.configParam.vccUlMacLossThreshold ) ?
13073 CSR_VCC_UL_MAC_LOSS_THRESHOLD : pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013074#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13075 {
13076 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013077 /* Indicate the neighbor roal algorithm about the connect indication */
13078 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssid, &sessionId);
13079 csrNeighborRoamIndicateConnect(pMac, sessionId, VOS_STATUS_SUCCESS);
13080 }
13081#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070013082}
13083
Jeff Johnson295189b2012-06-20 16:38:30 -070013084static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId)
13085{
13086 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070013087
13088 if(!pSession)
13089 {
13090 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
13091 return;
13092 }
13093
Jeff Johnson295189b2012-06-20 16:38:30 -070013094 //Only to handle the case for Handover on infra link
13095 if( eCSR_BSS_TYPE_INFRASTRUCTURE != pSession->connectedProfile.BSSType )
13096 {
13097 return;
13098 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013099 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
13100 csrRoamDeregStatisticsReq(pMac);
13101 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13102#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13103 /* Indicate the neighbor roal algorithm about the disconnect indication */
13104 csrNeighborRoamIndicateDisconnect(pMac, sessionId);
13105#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070013106
13107 //Remove this code once SLM_Sessionization is supported
13108 //BMPS_WORKAROUND_NOT_NEEDED
13109 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -070013110 csrIsInfraApStarted( pMac ) &&
13111 pMac->roam.configParam.doBMPSWorkaround)
Jeff Johnsone7245742012-09-05 17:12:55 -070013112 {
13113 pMac->roam.configParam.doBMPSWorkaround = 0;
13114 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013115}
13116
Jeff Johnson295189b2012-06-20 16:38:30 -070013117void csrRoamTlStatsTimerHandler(void *pv)
13118{
13119 tpAniSirGlobal pMac = PMAC_STRUCT( pv );
13120 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013121 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13122
Jeff Johnsone7245742012-09-05 17:12:55 -070013123 smsLog(pMac, LOG1, FL(" TL stat timer is no-op. It needs to support multiple stations"));
13124
Jeff Johnson295189b2012-06-20 16:38:30 -070013125#if 0
13126 // TODO Persession .???
13127 //req TL for stats
13128 if(WLANTL_GetStatistics(pMac->roam.gVosContext, &tlStats, pMac->roam.connectedInfo.staId))
13129 {
13130 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:couldn't get the stats from TL\n"));
13131 }
13132 else
13133 {
13134 //save in SME
13135 csrRoamSaveStatsFromTl(pMac, tlStats);
13136 }
13137#endif
13138 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13139 {
13140 if(pMac->roam.tlStatsReqInfo.periodicity)
13141 {
13142 //start timer
13143 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13144 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13145 if(!HAL_STATUS_SUCCESS(status))
13146 {
13147 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:cannot start TlStatsTimer timer\n"));
13148 return;
13149 }
13150 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13151 }
13152 }
13153}
Jeff Johnson295189b2012-06-20 16:38:30 -070013154void csrRoamPeStatsTimerHandler(void *pv)
13155{
13156 tCsrPeStatsReqInfo *pPeStatsReqListEntry = (tCsrPeStatsReqInfo *)pv;
13157 eHalStatus status;
13158 tpAniSirGlobal pMac = pPeStatsReqListEntry->pMac;
13159 VOS_STATUS vosStatus;
13160 tPmcPowerState powerState;
Jeff Johnson295189b2012-06-20 16:38:30 -070013161 pPeStatsReqListEntry->timerRunning = FALSE;
13162 if( pPeStatsReqListEntry->timerStopFailed == TRUE )
13163 {
13164 // If we entered here, meaning the timer could not be successfully
13165 // stopped in csrRoamRemoveEntryFromPeStatsReqList(). So do it here.
13166
13167 /* Destroy the timer */
13168 vosStatus = vos_timer_destroy( &pPeStatsReqListEntry->hPeStatsTimer );
13169 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13170 {
13171 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to destroy hPeStatsTimer timer\n"));
13172 }
13173
13174 // Free the entry
13175 palFreeMemory(pMac->hHdd, pPeStatsReqListEntry);
13176 pPeStatsReqListEntry = NULL;
13177 }
13178 else
13179 {
13180 if(!pPeStatsReqListEntry->rspPending)
13181 {
13182 status = csrSendMBStatsReqMsg(pMac, pPeStatsReqListEntry->statsMask & ~(1 << eCsrGlobalClassDStats),
13183 pPeStatsReqListEntry->staId);
13184 if(!HAL_STATUS_SUCCESS(status))
13185 {
13186 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to send down stats req to PE\n"));
13187 }
13188 else
13189 {
13190 pPeStatsReqListEntry->rspPending = TRUE;
13191 }
13192 }
13193
13194 //send down a req
13195 if(pPeStatsReqListEntry->periodicity &&
13196 (VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pPeStatsReqListEntry->hPeStatsTimer)))
13197 {
13198 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
13199 if(ePMC_FULL_POWER == powerState)
13200 {
13201 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
13202 {
13203 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
13204 }
13205 }
13206 else
13207 {
13208 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
13209 {
13210 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
13211 }
13212 }
13213 //start timer
13214 vosStatus = vos_timer_start( &pPeStatsReqListEntry->hPeStatsTimer, pPeStatsReqListEntry->periodicity );
13215 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13216 {
13217 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:cannot start hPeStatsTimer timer\n"));
13218 return;
13219 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013220 pPeStatsReqListEntry->timerRunning = TRUE;
13221
13222 }
13223
13224 }
13225}
Jeff Johnson295189b2012-06-20 16:38:30 -070013226void csrRoamStatsClientTimerHandler(void *pv)
13227{
13228 tCsrStatsClientReqInfo *pStaEntry = (tCsrStatsClientReqInfo *)pv;
Jeff Johnson295189b2012-06-20 16:38:30 -070013229 if(VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pStaEntry->timer))
13230 {
13231#if 0
13232 // TODO Stats fix for multisession
13233 //start the timer
13234 vosStatus = vos_timer_start( &pStaEntry->timer, pStaEntry->periodicity );
13235
13236 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13237 {
13238 smsLog(pStaEntry->pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013239 }
13240#endif
13241 }
13242#if 0
13243 //send up the stats report
13244 csrRoamReportStatistics(pStaEntry->pMac, pStaEntry->statsMask, pStaEntry->callback,
13245 pStaEntry->staId, pStaEntry->pContext);
13246#endif
13247}
13248
13249
13250
Jeff Johnson295189b2012-06-20 16:38:30 -070013251eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId)
13252{
13253 tAniGetPEStatsReq *pMsg;
13254 eHalStatus status = eHAL_STATUS_SUCCESS;
13255 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetPEStatsReq));
13256 if ( !HAL_STATUS_SUCCESS(status) )
13257 {
13258 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to allocate mem for stats req \n");
13259 return status;
13260 }
13261 // need to initiate a stats request to PE
13262 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_STATISTICS_REQ);
13263 pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
13264 pMsg->staId = staId;
13265 pMsg->statsMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070013266 status = palSendMBMessage(pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070013267 if(!HAL_STATUS_SUCCESS(status))
13268 {
13269 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to send down the stats req \n");
13270 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013271 return status;
13272}
Jeff Johnson295189b2012-06-20 16:38:30 -070013273void csrRoamStatsRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg)
13274{
13275 tAniGetPEStatsRsp *pSmeStatsRsp;
13276 eHalStatus status = eHAL_STATUS_FAILURE;
13277 tListElem *pEntry = NULL;
13278 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
13279 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13280 tANI_U32 tempMask = 0;
13281 tANI_U8 counter = 0;
13282 tANI_U8 *pStats = NULL;
13283 tANI_U32 length = 0;
13284 v_PVOID_t pvosGCtx;
13285 v_S7_t rssi = 0;
13286 tANI_U32 *pRssi = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013287 pSmeStatsRsp = (tAniGetPEStatsRsp *)pSirMsg;
13288 if(pSmeStatsRsp->rc)
13289 {
13290 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:stats rsp from PE shows failure\n"));
13291 goto post_update;
13292 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013293 tempMask = pSmeStatsRsp->statsMask;
13294 pStats = ((tANI_U8 *)&pSmeStatsRsp->statsMask) + sizeof(pSmeStatsRsp->statsMask);
Jeff Johnson295189b2012-06-20 16:38:30 -070013295 /* subtract all statistics from this length, and after processing the entire
13296 * 'stat' part of the message, if the length is not zero, then rssi is piggy packed
13297 * in this 'stats' message.
13298 */
13299 length = pSmeStatsRsp->msgLen - sizeof(tAniGetPEStatsRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070013300 //new stats info from PE, fill up the stats strucutres in PMAC
13301 while(tempMask)
13302 {
13303 if(tempMask & 1)
13304 {
13305 switch(counter)
13306 {
13307 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013308 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013309 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
13310 pStats, sizeof(tCsrSummaryStatsInfo));
13311 if(!HAL_STATUS_SUCCESS(status))
13312 {
13313 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy summary stats\n"));
13314 }
13315 pStats += sizeof(tCsrSummaryStatsInfo);
13316 length -= sizeof(tCsrSummaryStatsInfo);
13317 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013318 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013319 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013320 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classAStatsInfo,
13321 pStats, sizeof(tCsrGlobalClassAStatsInfo));
13322 if(!HAL_STATUS_SUCCESS(status))
13323 {
13324 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassA stats\n"));
13325 }
13326 pStats += sizeof(tCsrGlobalClassAStatsInfo);
13327 length -= sizeof(tCsrGlobalClassAStatsInfo);
13328 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013329 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013330 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013331 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classBStatsInfo,
13332 pStats, sizeof(tCsrGlobalClassBStatsInfo));
13333 if(!HAL_STATUS_SUCCESS(status))
13334 {
13335 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassB stats\n"));
13336 }
13337 pStats += sizeof(tCsrGlobalClassBStatsInfo);
13338 length -= sizeof(tCsrGlobalClassBStatsInfo);
13339 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013340 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013341 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013342 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classCStatsInfo,
13343 pStats, sizeof(tCsrGlobalClassCStatsInfo));
13344 if(!HAL_STATUS_SUCCESS(status))
13345 {
13346 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassC stats\n"));
13347 }
13348 pStats += sizeof(tCsrGlobalClassCStatsInfo);
13349 length -= sizeof(tCsrGlobalClassCStatsInfo);
13350 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013351 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013352 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013353 if( CSR_MAX_STA > pSmeStatsRsp->staId )
13354 {
13355 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.perStaStatsInfo[pSmeStatsRsp->staId],
13356 pStats, sizeof(tCsrPerStaStatsInfo));
13357 }
13358 else
13359 {
13360 status = eHAL_STATUS_FAILURE;
13361 smsLog( pMac, LOGE, FL("csrRoamStatsRspProcessor:out bound staId:%d\n"), pSmeStatsRsp->staId);
13362 VOS_ASSERT( 0 );
13363 }
13364 if(!HAL_STATUS_SUCCESS(status))
13365 {
13366 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy PerSta stats\n"));
13367 }
13368 pStats += sizeof(tCsrPerStaStatsInfo);
13369 length -= sizeof(tCsrPerStaStatsInfo);
13370 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013371 default:
13372 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:unknown stats type\n"));
13373 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013374 }
13375 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013376 tempMask >>=1;
13377 counter++;
13378 }
13379 pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
13380 if (length != 0)
13381 {
13382 pRssi = (tANI_U32*)pStats;
13383 rssi = (v_S7_t)*pRssi;
13384 }
13385 else
13386 {
13387 /* If riva is not sending rssi, continue to use the hack */
13388 rssi = RSSI_HACK_BMPS;
13389 }
13390 WDA_UpdateRssiBmps(pvosGCtx, pSmeStatsRsp->staId, rssi);
Jeff Johnson295189b2012-06-20 16:38:30 -070013391post_update:
13392 //make sure to update the pe stats req list
13393 pEntry = csrRoamFindInPeStatsReqList(pMac, pSmeStatsRsp->statsMask);
13394 if(pEntry)
13395 {
13396 pPeStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
13397 pPeStaEntry->rspPending = FALSE;
13398
13399 }
13400 //check the one timer cases
13401 pEntry = csrRoamCheckClientReqList(pMac, pSmeStatsRsp->statsMask);
13402 if(pEntry)
13403 {
Jeff Johnson295189b2012-06-20 16:38:30 -070013404 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013405 if(pTempStaEntry->timerExpired)
13406 {
13407 //send up the stats report
13408 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
13409 pTempStaEntry->staId, pTempStaEntry->pContext);
13410 //also remove from the client list
13411 csrRoamRemoveStatListEntry(pMac, pEntry);
13412 pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013413 }
13414 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013415}
Jeff Johnson295189b2012-06-20 16:38:30 -070013416tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13417{
13418 tListElem *pEntry = NULL;
13419 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013420 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013421 if(!pEntry)
13422 {
13423 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013424 smsLog(pMac, LOG2, "csrRoamFindInPeStatsReqList: List empty, no request to PE\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013425 return NULL;
13426 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013427 while( pEntry )
13428 {
13429 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013430 if(pTempStaEntry->statsMask == statsMask)
13431 {
Mohit Khanna23863762012-09-11 17:40:09 -070013432 smsLog(pMac, LOG3, "csrRoamFindInPeStatsReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013433 break;
13434 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013435 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
13436 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013437 return pEntry;
13438}
13439
Jeff Johnson295189b2012-06-20 16:38:30 -070013440tListElem * csrRoamChecknUpdateClientReqList(tpAniSirGlobal pMac, tCsrStatsClientReqInfo *pStaEntry,
13441 tANI_BOOLEAN update)
13442{
13443 tListElem *pEntry;
13444 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013445 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013446 if(!pEntry)
13447 {
13448 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013449 smsLog(pMac, LOG2, "csrRoamChecknUpdateClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013450 "upper layer client(s)\n");
13451 return NULL;
13452 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013453 while( pEntry )
13454 {
13455 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013456 if((pTempStaEntry->requesterId == pStaEntry->requesterId) &&
13457 (pTempStaEntry->statsMask == pStaEntry->statsMask))
13458 {
Mohit Khanna23863762012-09-11 17:40:09 -070013459 smsLog(pMac, LOG3, "csrRoamChecknUpdateClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013460 if(update)
13461 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013462 pTempStaEntry->periodicity = pStaEntry->periodicity;
13463 pTempStaEntry->callback = pStaEntry->callback;
13464 pTempStaEntry->pContext = pStaEntry->pContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013465 }
13466 break;
13467 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013468 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13469 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013470 return pEntry;
13471}
Jeff Johnson295189b2012-06-20 16:38:30 -070013472tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13473{
13474 tListElem *pEntry;
13475 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013476 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013477 if(!pEntry)
13478 {
13479 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013480 smsLog(pMac, LOG2, "csrRoamCheckClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013481 "upper layer client(s)\n");
13482 return NULL;
13483 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013484 while( pEntry )
13485 {
13486 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013487 if((pTempStaEntry->statsMask & ~(1 << eCsrGlobalClassDStats)) == statsMask)
13488 {
Mohit Khanna23863762012-09-11 17:40:09 -070013489 smsLog(pMac, LOG3, "csrRoamCheckClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013490 break;
13491 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013492 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13493 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013494 return pEntry;
13495}
Jeff Johnson295189b2012-06-20 16:38:30 -070013496eHalStatus csrRoamRegisterLinkQualityIndCallback(tpAniSirGlobal pMac,
13497 csrRoamLinkQualityIndCallback callback,
13498 void *pContext)
13499{
13500 pMac->roam.linkQualityIndInfo.callback = callback;
13501 pMac->roam.linkQualityIndInfo.context = pContext;
13502 if( NULL == callback )
13503 {
13504 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being deregistered");
13505 }
13506 else
13507 {
13508 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being registered");
Jeff Johnson295189b2012-06-20 16:38:30 -070013509 /* do we need to invoke the callback to notify client of initial value ?? */
13510 }
13511 return eHAL_STATUS_SUCCESS;
13512}
Jeff Johnson295189b2012-06-20 16:38:30 -070013513void csrRoamVccTrigger(tpAniSirGlobal pMac)
13514{
13515 eCsrRoamLinkQualityInd newVccLinkQuality;
13516 tANI_U32 ul_mac_loss = 0;
13517 tANI_U32 ul_mac_loss_trigger_threshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013518 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
13519 /*-------------------------------------------------------------------------
13520 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013521 Check for a change in link quality and notify client if necessary
13522 -------------------------------------------------------------------------*/
13523 ul_mac_loss_trigger_threshold =
13524 pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013525 VOS_ASSERT( ul_mac_loss_trigger_threshold != 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070013526 smsLog(pMac, LOGW, "csrRoamVccTrigger: UL_MAC_LOSS_THRESHOLD is %d\n",
13527 ul_mac_loss_trigger_threshold );
Jeff Johnson295189b2012-06-20 16:38:30 -070013528 if(ul_mac_loss_trigger_threshold < ul_mac_loss)
13529 {
13530 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is POOR \n");
13531 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13532 }
13533 else
13534 {
13535 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is GOOD\n");
13536 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13537 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013538 smsLog(pMac, LOGW, "csrRoamVccTrigger: link qual : *** UL_MAC_LOSS %d *** ",
13539 ul_mac_loss);
Jeff Johnson295189b2012-06-20 16:38:30 -070013540 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13541 {
13542 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality changed: trigger necessary\n");
13543 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13544 {
13545 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality indication %d\n",
13546 newVccLinkQuality );
13547
13548 /* we now invoke the callback once to notify client of initial value */
13549 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13550 pMac->roam.linkQualityIndInfo.context );
13551 //event: EVENT_WLAN_VCC
13552 }
13553 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013554 pMac->roam.vccLinkQuality = newVccLinkQuality;
13555
Jeff Johnson295189b2012-06-20 16:38:30 -070013556}
Jeff Johnson295189b2012-06-20 16:38:30 -070013557VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal,
13558 v_U8_t rssiNotification,
13559 void * context)
13560{
13561 tpAniSirGlobal pMac = PMAC_STRUCT( context );
13562 eCsrRoamLinkQualityInd newVccLinkQuality;
13563 // TODO : Session info unavailable
13564 tANI_U32 sessionId = 0;
13565 VOS_STATUS status = VOS_STATUS_SUCCESS;
13566 /*-------------------------------------------------------------------------
13567 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013568 Check for a change in link quality and notify client if necessary
13569 -------------------------------------------------------------------------*/
13570 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: RSSI trigger threshold is %d\n",
13571 pMac->roam.configParam.vccRssiThreshold);
13572 if(!csrIsConnStateConnectedInfra(pMac, sessionId))
13573 {
13574 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: ignoring the indication as we are not connected\n");
13575 return VOS_STATUS_SUCCESS;
13576 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013577 if(WLANTL_HO_THRESHOLD_DOWN == rssiNotification)
13578 {
13579 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is POOR\n");
13580 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13581 }
13582 else if(WLANTL_HO_THRESHOLD_UP == rssiNotification)
13583 {
13584 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is GOOD \n");
13585 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13586 }
13587 else
13588 {
13589 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: unknown rssi notification %d\n", rssiNotification);
13590 //Set to this so the code below won't do anything
13591 newVccLinkQuality = pMac->roam.vccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013592 VOS_ASSERT(0);
13593 }
13594
Jeff Johnson295189b2012-06-20 16:38:30 -070013595 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13596 {
13597 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality changed: trigger necessary\n");
13598 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13599 {
13600 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality indication %d\n",
13601 newVccLinkQuality);
Jeff Johnson295189b2012-06-20 16:38:30 -070013602 /* we now invoke the callback once to notify client of initial value */
13603 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13604 pMac->roam.linkQualityIndInfo.context );
13605 //event: EVENT_WLAN_VCC
13606 }
13607 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013608 pMac->roam.vccLinkQuality = newVccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013609 return status;
13610}
Jeff Johnson295189b2012-06-20 16:38:30 -070013611tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
13612 tDblLinkList *pStaList,
13613 tCsrStatsClientReqInfo *pStaEntry)
13614{
13615 tCsrStatsClientReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013616 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013617 //if same entity requested for same set of stats with different periodicity &
13618 // callback update it
13619 if(NULL == csrRoamChecknUpdateClientReqList(pMac, pStaEntry, TRUE))
13620 {
13621
13622 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrStatsClientReqInfo));
13623 if (!HAL_STATUS_SUCCESS(status))
13624 {
13625 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoList: couldn't allocate memory for the "
13626 "entry\n");
13627 return NULL;
13628 }
13629
Jeff Johnson295189b2012-06-20 16:38:30 -070013630 pNewStaEntry->callback = pStaEntry->callback;
13631 pNewStaEntry->pContext = pStaEntry->pContext;
13632 pNewStaEntry->periodicity = pStaEntry->periodicity;
13633 pNewStaEntry->requesterId = pStaEntry->requesterId;
13634 pNewStaEntry->statsMask = pStaEntry->statsMask;
13635 pNewStaEntry->pPeStaEntry = pStaEntry->pPeStaEntry;
13636 pNewStaEntry->pMac = pStaEntry->pMac;
13637 pNewStaEntry->staId = pStaEntry->staId;
13638 pNewStaEntry->timerExpired = pStaEntry->timerExpired;
13639
13640 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
13641 }
13642 return pNewStaEntry;
13643}
13644
Jeff Johnson295189b2012-06-20 16:38:30 -070013645tCsrPeStatsReqInfo * csrRoamInsertEntryIntoPeStatsReqList( tpAniSirGlobal pMac,
13646 tDblLinkList *pStaList,
13647 tCsrPeStatsReqInfo *pStaEntry)
13648{
13649 tCsrPeStatsReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013650 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013651 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrPeStatsReqInfo));
13652 if (!HAL_STATUS_SUCCESS(status))
13653 {
13654 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoPeStatsReqList: couldn't allocate memory for the "
13655 "entry\n");
13656 return NULL;
13657 }
13658
Jeff Johnson295189b2012-06-20 16:38:30 -070013659 pNewStaEntry->hPeStatsTimer = pStaEntry->hPeStatsTimer;
13660 pNewStaEntry->numClient = pStaEntry->numClient;
13661 pNewStaEntry->periodicity = pStaEntry->periodicity;
13662 pNewStaEntry->statsMask = pStaEntry->statsMask;
13663 pNewStaEntry->pMac = pStaEntry->pMac;
13664 pNewStaEntry->staId = pStaEntry->staId;
13665 pNewStaEntry->timerRunning = pStaEntry->timerRunning;
13666 pNewStaEntry->rspPending = pStaEntry->rspPending;
13667
13668 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013669 return pNewStaEntry;
13670}
Jeff Johnson295189b2012-06-20 16:38:30 -070013671eHalStatus csrGetRssi(tpAniSirGlobal pMac,
13672 tCsrRssiCallback callback,
13673 tANI_U8 staId, tCsrBssid bssId, void *pContext, void* pVosContext)
13674{
13675 eHalStatus status = eHAL_STATUS_SUCCESS;
13676 vos_msg_t msg;
13677 tANI_U32 sessionId;
13678
13679 tAniGetRssiReq *pMsg;
13680 smsLog(pMac, LOG2, FL("called"));
13681 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetRssiReq));
13682 if ( !HAL_STATUS_SUCCESS(status) )
13683 {
13684 smsLog(pMac, LOGE, " csrGetRssi: failed to allocate mem for req \n");
13685 return status;
13686 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013687 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssId, &sessionId);
13688
13689 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_RSSI_REQ);
13690 pMsg->msgLen = (tANI_U16)sizeof(tAniGetRssiReq);
13691 pMsg->sessionId = sessionId;
13692 pMsg->staId = staId;
13693 pMsg->rssiCallback = callback;
13694 pMsg->pDevContext = pContext;
13695 pMsg->pVosContext = pVosContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013696 msg.type = eWNI_SME_GET_RSSI_REQ;
13697 msg.bodyptr = pMsg;
13698 msg.reserved = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013699 if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
13700 {
13701 smsLog(pMac, LOGE, " csrGetRssi failed to post msg to self \n");
13702 palFreeMemory(pMac->hHdd, (void *)pMsg);
13703 status = eHAL_STATUS_FAILURE;
13704 }
13705 smsLog(pMac, LOG2, FL("returned"));
13706 return status;
13707}
Jeff Johnson295189b2012-06-20 16:38:30 -070013708eHalStatus csrGetStatistics(tpAniSirGlobal pMac, eCsrStatsRequesterType requesterId,
13709 tANI_U32 statsMask,
13710 tCsrStatsCallback callback,
13711 tANI_U32 periodicity, tANI_BOOLEAN cache,
13712 tANI_U8 staId, void *pContext)
13713{
13714 tCsrStatsClientReqInfo staEntry;
13715 tCsrStatsClientReqInfo *pStaEntry = NULL;
13716 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13717 tListElem *pEntry = NULL;
13718 tANI_BOOLEAN found = FALSE;
13719 eHalStatus status = eHAL_STATUS_SUCCESS;
13720 tANI_BOOLEAN insertInClientList = FALSE;
13721 VOS_STATUS vosStatus;
Jeff Johnsone7245742012-09-05 17:12:55 -070013722 WLANTL_TRANSFER_STA_TYPE *pTlStats;
Jeff Johnson295189b2012-06-20 16:38:30 -070013723
13724 if( csrIsAllSessionDisconnected(pMac) )
13725 {
13726 //smsLog(pMac, LOGW, "csrGetStatistics: wrong state curState(%d) not connected\n", pMac->roam.curState);
13727 return eHAL_STATUS_FAILURE;
13728 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013729 if((!statsMask) && (!callback))
13730 {
13731 //msg
13732 smsLog(pMac, LOGW, "csrGetStatistics: statsMask & callback empty in the request\n");
13733 return eHAL_STATUS_FAILURE;
13734 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013735 //for the search list method for deregister
13736 staEntry.requesterId = requesterId;
13737 staEntry.statsMask = statsMask;
13738 //requester wants to deregister or just an error
13739 if((statsMask) && (!callback))
13740 {
13741 pEntry = csrRoamChecknUpdateClientReqList(pMac, &staEntry, FALSE);
13742 if(!pEntry)
13743 {
13744 //msg
13745 smsLog(pMac, LOGW, "csrGetStatistics: callback is empty in the request & couldn't "
13746 "find any existing request in statsClientReqList\n");
13747 return eHAL_STATUS_FAILURE;
13748 }
13749 else
13750 {
13751 //clean up & return
13752 pStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnsond13512a2012-07-17 11:42:19 -070013753 if(NULL != pStaEntry->pPeStaEntry)
Jeff Johnson295189b2012-06-20 16:38:30 -070013754 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013755 pStaEntry->pPeStaEntry->numClient--;
13756 //check if we need to delete the entry from peStatsReqList too
13757 if(!pStaEntry->pPeStaEntry->numClient)
13758 {
13759 csrRoamRemoveEntryFromPeStatsReqList(pMac, pStaEntry->pPeStaEntry);
13760 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013761 }
Jeff Johnsond13512a2012-07-17 11:42:19 -070013762
Jeff Johnson295189b2012-06-20 16:38:30 -070013763 //check if we need to stop the tl stats timer too
13764 pMac->roam.tlStatsReqInfo.numClient--;
13765 if(!pMac->roam.tlStatsReqInfo.numClient)
13766 {
13767 if(pMac->roam.tlStatsReqInfo.timerRunning)
13768 {
13769 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
13770 if(!HAL_STATUS_SUCCESS(status))
13771 {
13772 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot stop TlStatsTimer timer\n"));
13773 return eHAL_STATUS_FAILURE;
13774 }
13775 }
13776 pMac->roam.tlStatsReqInfo.periodicity = 0;
13777 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13778 }
13779 vos_timer_stop( &pStaEntry->timer );
Jeff Johnson295189b2012-06-20 16:38:30 -070013780 // Destroy the vos timer...
13781 vosStatus = vos_timer_destroy( &pStaEntry->timer );
13782 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13783 {
13784 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to destroy Client req timer\n"));
13785 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013786 csrRoamRemoveStatListEntry(pMac, pEntry);
13787 pStaEntry = NULL;
13788 return eHAL_STATUS_SUCCESS;
13789 }
13790 }
13791
13792 if(cache && !periodicity)
13793 {
13794 //return the cached stats
13795 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13796 }
13797 else
13798 {
13799 //add the request in the client req list
13800 staEntry.callback = callback;
13801 staEntry.pContext = pContext;
13802 staEntry.periodicity = periodicity;
13803 staEntry.pPeStaEntry = NULL;
13804 staEntry.staId = staId;
13805 staEntry.pMac = pMac;
13806 staEntry.timerExpired = FALSE;
13807
13808
Jeff Johnson295189b2012-06-20 16:38:30 -070013809 //if periodic report requested with non cached result from PE/TL
13810 if(periodicity)
13811 {
13812
13813 //if looking for stats from PE
13814 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13815 {
13816
13817 //check if same request made already & waiting for rsp
13818 pPeStaEntry = csrRoamCheckPeStatsReqList(pMac, statsMask & ~(1 << eCsrGlobalClassDStats),
13819 periodicity, &found, staId);
13820 if(!pPeStaEntry)
13821 {
13822 //bail out, maxed out on number of req for PE
13823 return eHAL_STATUS_FAILURE;
13824 }
13825 else
13826 {
13827 staEntry.pPeStaEntry = pPeStaEntry;
13828 }
13829
13830 }
13831 //request stats from TL rightaway if requested by client, update tlStatsReqInfo if needed
13832 if(statsMask & (1 << eCsrGlobalClassDStats))
13833 {
13834 if(cache && pMac->roam.tlStatsReqInfo.numClient)
13835 {
13836 smsLog(pMac, LOGE, FL("csrGetStatistics:Looking for cached stats from TL\n"));
13837 }
13838 else
13839 {
13840
13841 //update periodicity
13842 if(pMac->roam.tlStatsReqInfo.periodicity)
13843 {
13844 pMac->roam.tlStatsReqInfo.periodicity =
13845 CSR_ROAM_MIN(periodicity, pMac->roam.tlStatsReqInfo.periodicity);
13846 }
13847 else
13848 {
13849 pMac->roam.tlStatsReqInfo.periodicity = periodicity;
13850 }
13851 if(pMac->roam.tlStatsReqInfo.periodicity < CSR_MIN_TL_STAT_QUERY_PERIOD)
13852 {
13853 pMac->roam.tlStatsReqInfo.periodicity = CSR_MIN_TL_STAT_QUERY_PERIOD;
13854 }
13855
13856 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13857 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013858 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13859 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013860 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013861 //req TL for class D stats
13862 if(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId))
13863 {
13864 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13865 }
13866 else
13867 {
13868 //save in SME
13869 csrRoamSaveStatsFromTl(pMac, pTlStats);
13870 }
13871 vos_mem_free(pTlStats);
13872 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013873 }
13874 else
13875 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013876 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013877 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013878
Jeff Johnson295189b2012-06-20 16:38:30 -070013879 if(pMac->roam.tlStatsReqInfo.periodicity)
13880 {
13881 //start timer
13882 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13883 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13884 if(!HAL_STATUS_SUCCESS(status))
13885 {
13886 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start TlStatsTimer timer\n"));
13887 return eHAL_STATUS_FAILURE;
13888 }
13889 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13890 }
13891 }
13892 }
13893 pMac->roam.tlStatsReqInfo.numClient++;
13894 }
13895
13896 insertInClientList = TRUE;
13897 }
13898 //if one time report requested with non cached result from PE/TL
13899 else if(!cache && !periodicity)
13900 {
13901 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13902 {
13903 //send down a req
13904 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
13905 if(!HAL_STATUS_SUCCESS(status))
13906 {
13907 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to send down stats req to PE\n"));
13908 }
13909 //so that when the stats rsp comes back from PE we respond to upper layer
13910 //right away
13911 staEntry.timerExpired = TRUE;
13912 insertInClientList = TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -070013913 }
13914 if(statsMask & (1 << eCsrGlobalClassDStats))
13915 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013916 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13917 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013918 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013919 //req TL for class D stats
13920 if(!VOS_IS_STATUS_SUCCESS(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId)))
13921 {
13922 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13923 }
13924 else
13925 {
13926 //save in SME
13927 csrRoamSaveStatsFromTl(pMac, pTlStats);
13928 }
13929 vos_mem_free(pTlStats);
13930 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013931 }
13932 else
13933 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013934 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013935 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013936
13937 }
13938 //if looking for stats from TL only
13939 if(!insertInClientList)
13940 {
13941 //return the stats
13942 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13943 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013944 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013945 if(insertInClientList)
13946 {
13947 pStaEntry = csrRoamInsertEntryIntoList(pMac, &pMac->roam.statsClientReqList, &staEntry);
13948 if(!pStaEntry)
13949 {
13950 //msg
13951 smsLog(pMac, LOGW, "csrGetStatistics: Failed to insert req in statsClientReqList\n");
13952 return eHAL_STATUS_FAILURE;
13953 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013954 pStaEntry->periodicity = periodicity;
Jeff Johnson295189b2012-06-20 16:38:30 -070013955 //Init & start timer if needed
13956 if(periodicity)
13957 {
13958 vosStatus = vos_timer_init( &pStaEntry->timer, VOS_TIMER_TYPE_SW,
13959 csrRoamStatsClientTimerHandler, pStaEntry );
13960 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13961 {
13962 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot init StatsClient timer\n"));
13963 return eHAL_STATUS_FAILURE;
13964 }
13965 vosStatus = vos_timer_start( &pStaEntry->timer, periodicity );
13966 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13967 {
13968 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
13969 return eHAL_STATUS_FAILURE;
13970 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013971 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013972 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013973 }
13974 return eHAL_STATUS_SUCCESS;
13975}
13976
Jeff Johnson295189b2012-06-20 16:38:30 -070013977tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask,
13978 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId)
13979{
13980 tANI_BOOLEAN found = FALSE;
13981 eHalStatus status = eHAL_STATUS_SUCCESS;
13982 tCsrPeStatsReqInfo staEntry;
13983 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
13984 tListElem *pStaEntry = NULL;
13985 VOS_STATUS vosStatus;
13986 tPmcPowerState powerState;
13987 *pFound = FALSE;
13988
13989 pStaEntry = csrRoamFindInPeStatsReqList(pMac, statsMask);
13990 if(pStaEntry)
13991 {
13992 pTempStaEntry = GET_BASE_ADDR( pStaEntry, tCsrPeStatsReqInfo, link );
13993 if(pTempStaEntry->periodicity)
13994 {
13995 pTempStaEntry->periodicity =
13996 CSR_ROAM_MIN(periodicity, pTempStaEntry->periodicity);
13997 }
13998 else
13999 {
14000 pTempStaEntry->periodicity = periodicity;
14001 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014002 pTempStaEntry->numClient++;
14003 found = TRUE;
14004 }
14005 else
14006 {
14007 palZeroMemory(pMac->hHdd, &staEntry, sizeof(tCsrPeStatsReqInfo));
14008 staEntry.numClient = 1;
14009 staEntry.periodicity = periodicity;
14010 staEntry.pMac = pMac;
14011 staEntry.rspPending = FALSE;
14012 staEntry.staId = staId;
14013 staEntry.statsMask = statsMask;
14014 staEntry.timerRunning = FALSE;
14015 pTempStaEntry = csrRoamInsertEntryIntoPeStatsReqList(pMac, &pMac->roam.peStatsReqList, &staEntry);
14016 if(!pTempStaEntry)
14017 {
14018 //msg
14019 smsLog(pMac, LOGW, "csrRoamCheckPeStatsReqList: Failed to insert req in peStatsReqList\n");
14020 return NULL;
14021 }
14022 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014023 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
14024 if(ePMC_FULL_POWER == powerState)
14025 {
14026 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
14027 {
14028 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
14029 }
14030 }
14031 else
14032 {
14033 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
14034 {
14035 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
14036 }
14037 }
14038 if(!pTempStaEntry->timerRunning)
14039 {
14040 //send down a req in case of one time req, for periodic ones wait for timer to expire
14041 if(!pTempStaEntry->rspPending &&
14042 !pTempStaEntry->periodicity)
14043 {
14044 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
14045 if(!HAL_STATUS_SUCCESS(status))
14046 {
14047 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:failed to send down stats req to PE\n"));
14048 }
14049 else
14050 {
14051 pTempStaEntry->rspPending = TRUE;
14052 }
14053 }
14054 if(pTempStaEntry->periodicity)
14055 {
14056 if(!found)
14057 {
14058
14059 vosStatus = vos_timer_init( &pTempStaEntry->hPeStatsTimer, VOS_TIMER_TYPE_SW,
14060 csrRoamPeStatsTimerHandler, pTempStaEntry );
14061 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14062 {
14063 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot init hPeStatsTimer timer\n"));
14064 return NULL;
14065 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014066 }
14067 //start timer
14068 smsLog(pMac, LOG1, "csrRoamCheckPeStatsReqList:peStatsTimer period %d\n", pTempStaEntry->periodicity);
Jeff Johnson295189b2012-06-20 16:38:30 -070014069 vosStatus = vos_timer_start( &pTempStaEntry->hPeStatsTimer, pTempStaEntry->periodicity );
14070 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14071 {
14072 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot start hPeStatsTimer timer\n"));
14073 return NULL;
14074 }
14075 pTempStaEntry->timerRunning = TRUE;
14076 }
14077 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014078 *pFound = found;
14079 return pTempStaEntry;
14080}
14081
Jeff Johnson295189b2012-06-20 16:38:30 -070014082/*
14083 pStaEntry is no longer invalid upon the return of this function.
14084*/
14085static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry)
14086{
14087 if(pEntry)
14088 {
14089 if(csrLLRemoveEntry(&pMac->roam.statsClientReqList, pEntry, LL_ACCESS_LOCK))
14090 {
14091 palFreeMemory(pMac->hHdd, GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link ));
Jeff Johnsone7245742012-09-05 17:12:55 -070014092 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014093 }
14094 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014095
14096void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry)
14097{
14098 tListElem *pEntry;
14099 tCsrPeStatsReqInfo *pTempStaEntry;
14100 VOS_STATUS vosStatus;
14101 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014102 if(!pEntry)
14103 {
14104 //list empty
14105 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: List empty, no stats req for PE\n");
14106 return;
14107 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014108 while( pEntry )
14109 {
14110 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014111 if( pTempStaEntry && pTempStaEntry->statsMask == pPeStaEntry->statsMask)
14112 {
14113 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: match found\n");
14114 if(pTempStaEntry->timerRunning)
14115 {
14116 vosStatus = vos_timer_stop( &pTempStaEntry->hPeStatsTimer );
14117 /* If we are not able to stop the timer here, just remove
14118 * the entry from the linked list. Destroy the timer object
14119 * and free the memory in the timer CB
14120 */
14121 if( vosStatus == VOS_STATUS_SUCCESS )
14122 {
14123 /* the timer is successfully stopped */
14124 pTempStaEntry->timerRunning = FALSE;
14125
14126 /* Destroy the timer */
14127 vosStatus = vos_timer_destroy( &pTempStaEntry->hPeStatsTimer );
14128 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14129 {
14130 smsLog(pMac, LOGE, FL("csrRoamRemoveEntryFromPeStatsReqList:failed to destroy hPeStatsTimer timer\n"));
14131 }
14132 }
14133 else
14134 {
14135 // the timer could not be stopped. Hence destroy and free the
14136 // memory for the PE stat entry in the timer CB.
14137 pTempStaEntry->timerStopFailed = TRUE;
14138 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014139 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014140
14141 if(csrLLRemoveEntry(&pMac->roam.peStatsReqList, pEntry, LL_ACCESS_LOCK))
14142 {
14143 // Only free the memory if we could stop the timer successfully
14144 if(!pTempStaEntry->timerStopFailed)
14145 {
14146 palFreeMemory(pMac->hHdd, pTempStaEntry);
14147 pTempStaEntry = NULL;
14148 }
14149 break;
14150 }
14151
14152 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
14153 }
14154 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014155 return;
14156}
14157
14158
Jeff Johnsone7245742012-09-05 17:12:55 -070014159void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070014160{
14161
Jeff Johnsone7245742012-09-05 17:12:55 -070014162 pMac->roam.classDStatsInfo.num_rx_bytes_crc_ok = pTlStats->rxBcntCRCok;
14163 pMac->roam.classDStatsInfo.rx_bc_byte_cnt = pTlStats->rxBCBcnt;
14164 pMac->roam.classDStatsInfo.rx_bc_frm_cnt = pTlStats->rxBCFcnt;
14165 pMac->roam.classDStatsInfo.rx_byte_cnt = pTlStats->rxBcnt;
14166 pMac->roam.classDStatsInfo.rx_mc_byte_cnt = pTlStats->rxMCBcnt;
14167 pMac->roam.classDStatsInfo.rx_mc_frm_cnt = pTlStats->rxMCFcnt;
14168 pMac->roam.classDStatsInfo.rx_rate = pTlStats->rxRate;
Jeff Johnson295189b2012-06-20 16:38:30 -070014169 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014170 pMac->roam.classDStatsInfo.rx_uc_byte_cnt[0] = pTlStats->rxUCBcnt;
14171 pMac->roam.classDStatsInfo.rx_uc_frm_cnt = pTlStats->rxUCFcnt;
14172 pMac->roam.classDStatsInfo.tx_bc_byte_cnt = pTlStats->txBCBcnt;
14173 pMac->roam.classDStatsInfo.tx_bc_frm_cnt = pTlStats->txBCFcnt;
14174 pMac->roam.classDStatsInfo.tx_mc_byte_cnt = pTlStats->txMCBcnt;
14175 pMac->roam.classDStatsInfo.tx_mc_frm_cnt = pTlStats->txMCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014176 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014177 pMac->roam.classDStatsInfo.tx_uc_byte_cnt[0] = pTlStats->txUCBcnt;
14178 pMac->roam.classDStatsInfo.tx_uc_frm_cnt = pTlStats->txUCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014179
14180}
14181
Jeff Johnson295189b2012-06-20 16:38:30 -070014182void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
14183 tCsrStatsCallback callback, tANI_U8 staId, void *pContext)
14184{
14185 tANI_U8 stats[500];
14186 tANI_U8 *pStats = NULL;
14187 tANI_U32 tempMask = 0;
14188 tANI_U8 counter = 0;
14189 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014190 if(!callback)
14191 {
14192 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report callback NULL\n"));
14193 return;
14194 }
14195 if(!statsMask)
14196 {
14197 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report statsMask is 0\n"));
14198 return;
14199 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014200 pStats = stats;
Jeff Johnson295189b2012-06-20 16:38:30 -070014201 tempMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070014202 while(tempMask)
14203 {
14204 if(tempMask & 1)
14205 {
14206 //new stats info from PE, fill up the stats strucutres in PMAC
14207 switch(counter)
14208 {
14209 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014210 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014211 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
14212 sizeof(tCsrSummaryStatsInfo));
14213 if(!HAL_STATUS_SUCCESS(status))
14214 {
14215 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy summary stats\n"));
14216 }
14217 pStats += sizeof(tCsrSummaryStatsInfo);
14218 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014219 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014220 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014221 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classAStatsInfo,
14222 sizeof(tCsrGlobalClassAStatsInfo));
14223 if(!HAL_STATUS_SUCCESS(status))
14224 {
14225 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassA stats\n"));
14226 }
14227 pStats += sizeof(tCsrGlobalClassAStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014228 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014229 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014230 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014231 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classBStatsInfo,
14232 sizeof(tCsrGlobalClassBStatsInfo));
14233 if(!HAL_STATUS_SUCCESS(status))
14234 {
14235 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassB stats\n"));
14236 }
14237 pStats += sizeof(tCsrGlobalClassBStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014238 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014239 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014240 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014241 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classCStatsInfo,
14242 sizeof(tCsrGlobalClassCStatsInfo));
14243 if(!HAL_STATUS_SUCCESS(status))
14244 {
14245 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassC stats\n"));
14246 }
14247 pStats += sizeof(tCsrGlobalClassCStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014248 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014249 case eCsrGlobalClassDStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014250 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassD stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014251 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classDStatsInfo,
14252 sizeof(tCsrGlobalClassDStatsInfo));
14253 if(!HAL_STATUS_SUCCESS(status))
14254 {
14255 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassD stats\n"));
14256 }
14257 pStats += sizeof(tCsrGlobalClassDStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014258 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014259 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014260 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014261 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.perStaStatsInfo[staId],
14262 sizeof(tCsrPerStaStatsInfo));
14263 if(!HAL_STATUS_SUCCESS(status))
14264 {
14265 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy PerSta stats\n"));
14266 }
14267 pStats += sizeof(tCsrPerStaStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014268 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014269 default:
14270 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:unknown stats type\n"));
14271 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014272 }
14273 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014274 tempMask >>=1;
14275 counter++;
14276 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014277 callback(stats, pContext );
Jeff Johnson295189b2012-06-20 16:38:30 -070014278}
14279
Jeff Johnson295189b2012-06-20 16:38:30 -070014280eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac)
14281{
14282 tListElem *pEntry = NULL;
14283 tListElem *pPrevEntry = NULL;
14284 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
14285 eHalStatus status = eHAL_STATUS_SUCCESS;
14286 VOS_STATUS vosStatus;
14287 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014288 if(!pEntry)
14289 {
14290 //list empty
14291 smsLog(pMac, LOGW, "csrRoamDeregStatisticsReq: List empty, no request from "
14292 "upper layer client(s)\n");
14293 return status;
14294 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014295 while( pEntry )
14296 {
14297 if(pPrevEntry)
14298 {
14299 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14300 //send up the stats report
14301 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14302 pTempStaEntry->staId, pTempStaEntry->pContext);
14303 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14304 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014305 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014306 if (pTempStaEntry->pPeStaEntry) //pPeStaEntry can be NULL
14307 {
Jeff Johnsone7245742012-09-05 17:12:55 -070014308 pTempStaEntry->pPeStaEntry->numClient--;
14309 //check if we need to delete the entry from peStatsReqList too
14310 if(!pTempStaEntry->pPeStaEntry->numClient)
14311 {
14312 csrRoamRemoveEntryFromPeStatsReqList(pMac, pTempStaEntry->pPeStaEntry);
14313 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014314 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014315 //check if we need to stop the tl stats timer too
14316 pMac->roam.tlStatsReqInfo.numClient--;
14317 if(!pMac->roam.tlStatsReqInfo.numClient)
14318 {
14319 if(pMac->roam.tlStatsReqInfo.timerRunning)
14320 {
14321 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
14322 if(!HAL_STATUS_SUCCESS(status))
14323 {
14324 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:cannot stop TlStatsTimer timer\n"));
14325 //we will continue
14326 }
14327 }
14328 pMac->roam.tlStatsReqInfo.periodicity = 0;
14329 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
14330 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014331 if (pTempStaEntry->periodicity)
14332 {
14333 //While creating StaEntry in csrGetStatistics,
14334 //Initializing and starting timer only when periodicity is set.
14335 //So Stop and Destroy timer only when periodicity is set.
14336
Jeff Johnsone7245742012-09-05 17:12:55 -070014337 vos_timer_stop( &pTempStaEntry->timer );
14338 // Destroy the vos timer...
14339 vosStatus = vos_timer_destroy( &pTempStaEntry->timer );
14340 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14341 {
14342 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:failed to destroy Client req timer\n"));
14343 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014344 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014345
Jeff Johnson295189b2012-06-20 16:38:30 -070014346
14347 pPrevEntry = pEntry;
14348 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
14349 }
14350 //the last one
14351 if(pPrevEntry)
14352 {
14353 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14354 //send up the stats report
14355 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14356 pTempStaEntry->staId, pTempStaEntry->pContext);
14357 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14358 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014359 return status;
14360
14361}
14362
Jeff Johnson295189b2012-06-20 16:38:30 -070014363eHalStatus csrIsFullPowerNeeded( tpAniSirGlobal pMac, tSmeCmd *pCommand,
14364 tRequestFullPowerReason *pReason,
14365 tANI_BOOLEAN *pfNeedPower )
14366{
14367 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14368 tRequestFullPowerReason reason = eSME_REASON_OTHER;
14369 tPmcState pmcState;
14370 eHalStatus status = eHAL_STATUS_SUCCESS;
14371 // TODO : Session info unavailable
14372 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070014373 if( pfNeedPower )
14374 {
14375 *pfNeedPower = eANI_BOOLEAN_FALSE;
14376 }
14377 //We only handle CSR commands
14378 if( !(eSmeCsrCommandMask & pCommand->command) )
14379 {
14380 return eHAL_STATUS_SUCCESS;
14381 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014382 //Check PMC state first
14383 pmcState = pmcGetPmcState( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014384 switch( pmcState )
14385 {
14386 case REQUEST_IMPS:
14387 case IMPS:
14388 if( eSmeCommandScan == pCommand->command )
14389 {
14390 switch( pCommand->u.scanCmd.reason )
14391 {
14392 case eCsrScanGetResult:
14393 case eCsrScanBGScanAbort:
14394 case eCsrScanBGScanEnable:
14395 case eCsrScanGetScanChnInfo:
14396 //Internal process, no need for full power
14397 fNeedFullPower = eANI_BOOLEAN_FALSE;
14398 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014399 default:
14400 //Other scans are real scan, ask for power
14401 fNeedFullPower = eANI_BOOLEAN_TRUE;
14402 break;
14403 } //switch
14404 }
14405 else
14406 {
14407 //ask for power for roam and status change
14408 fNeedFullPower = eANI_BOOLEAN_TRUE;
14409 }
14410 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014411 case REQUEST_BMPS:
14412 case BMPS:
14413 case REQUEST_START_UAPSD:
14414 case UAPSD:
14415 //We treat WOWL same as BMPS
14416 case REQUEST_ENTER_WOWL:
14417 case WOWL:
14418 if( eSmeCommandRoam == pCommand->command )
14419 {
14420 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
14421 tCsrScanResult *pScanResult;
14422 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070014423 switch ( pCommand->u.roamCmd.roamReason )
14424 {
14425 case eCsrForcedDisassoc:
14426 case eCsrForcedDisassocMICFailure:
14427 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14428 fNeedFullPower = eANI_BOOLEAN_TRUE;
14429 break;
14430 case eCsrSmeIssuedDisassocForHandoff:
14431 case eCsrForcedDeauth:
14432 case eCsrHddIssuedReassocToSameAP:
14433 case eCsrSmeIssuedReassocToSameAP:
14434 fNeedFullPower = eANI_BOOLEAN_TRUE;
14435 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014436 case eCsrCapsChange:
14437 fNeedFullPower = eANI_BOOLEAN_TRUE;
14438 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014439 default:
14440 //Check whether the profile is already connected. If so, no need for full power
14441 //Note: IBSS is ignored for now because we don't support powersave in IBSS
14442 if ( csrIsConnStateConnectedInfra(pMac, sessionId) && pBSSList )
14443 {
14444 //Only need to check the first one
14445 pEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
14446 if( pEntry )
14447 {
14448 pScanResult = GET_BASE_ADDR(pEntry, tCsrScanResult, Link);
14449#if 0
14450 // TODO : Session Specific info pConnectBssDesc
14451 if( csrIsBssIdEqual( pMac, &pScanResult->Result.BssDescriptor, pMac->roam.pConnectBssDesc ) &&
14452 csrIsSsidEqual( pMac, pMac->roam.pConnectBssDesc,
14453 &pScanResult->Result.BssDescriptor, (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ) ) )
14454 {
14455 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
14456 // with Authenticating first. To force this, stop the current association (Disassociate) and
14457 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
14458 // a new Association.
14459 if(csrIsSameProfile(pMac, &pMac->roam.connectedProfile, pProfile))
14460 {
14461 if(csrRoamIsSameProfileKeys(pMac, &pMac->roam.connectedProfile, pProfile))
14462 {
14463 //Done, eventually, the command reaches eCsrReassocToSelfNoCapChange;
14464 //No need for full power
14465 //Set the flag so the code later can avoid to do the above
14466 //check again.
14467 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_TRUE;
14468 break;
14469 }
14470 }
14471 }
14472#endif
14473 }
14474 }
14475 //If we are here, full power is needed
14476 fNeedFullPower = eANI_BOOLEAN_TRUE;
14477 break;
14478 }
14479 }
14480 else if( eSmeCommandWmStatusChange == pCommand->command )
14481 {
14482 //need full power for all
14483 fNeedFullPower = eANI_BOOLEAN_TRUE;
14484 reason = eSME_LINK_DISCONNECTED_BY_OTHER;
14485 }
14486 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014487 case REQUEST_STOP_UAPSD:
14488 case REQUEST_EXIT_WOWL:
14489 if( eSmeCommandRoam == pCommand->command )
14490 {
14491 fNeedFullPower = eANI_BOOLEAN_TRUE;
14492 switch ( pCommand->u.roamCmd.roamReason )
14493 {
14494 case eCsrForcedDisassoc:
14495 case eCsrForcedDisassocMICFailure:
14496 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14497 break;
14498 default:
14499 break;
14500 }
14501 }
14502 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014503 case STOPPED:
14504 case REQUEST_STANDBY:
14505 case STANDBY:
14506 case LOW_POWER:
14507 //We are not supposed to do anything
14508 smsLog( pMac, LOGE, FL( " cannot process because PMC is in stopped/standby state %d\n" ), pmcState );
14509 status = eHAL_STATUS_FAILURE;
14510 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014511 case FULL_POWER:
14512 case REQUEST_FULL_POWER:
14513 default:
14514 //No need to ask for full power. This has to be FULL_POWER state
14515 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014516 } //switch
Jeff Johnson295189b2012-06-20 16:38:30 -070014517 if( pReason )
14518 {
14519 *pReason = reason;
14520 }
14521 if( pfNeedPower )
14522 {
14523 *pfNeedPower = fNeedFullPower;
14524 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014525 return ( status );
14526}
14527
Jeff Johnson295189b2012-06-20 16:38:30 -070014528static eHalStatus csrRequestFullPower( tpAniSirGlobal pMac, tSmeCmd *pCommand )
14529{
14530 eHalStatus status = eHAL_STATUS_SUCCESS;
14531 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14532 tRequestFullPowerReason reason = eSME_REASON_OTHER;
Jeff Johnson295189b2012-06-20 16:38:30 -070014533 status = csrIsFullPowerNeeded( pMac, pCommand, &reason, &fNeedFullPower );
Jeff Johnson295189b2012-06-20 16:38:30 -070014534 if( fNeedFullPower && HAL_STATUS_SUCCESS( status ) )
14535 {
14536 status = pmcRequestFullPower(pMac, csrFullPowerCallback, pMac, reason);
14537 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014538 return ( status );
14539}
14540
Jeff Johnson295189b2012-06-20 16:38:30 -070014541tSmeCmd *csrGetCommandBuffer( tpAniSirGlobal pMac )
14542{
14543 tSmeCmd *pCmd = smeGetCommandBuffer( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014544 if( pCmd )
14545 {
14546 pMac->roam.sPendingCommands++;
14547 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014548 return ( pCmd );
14549}
14550
Jeff Johnson295189b2012-06-20 16:38:30 -070014551void csrReleaseCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand)
14552{
14553 if (pMac->roam.sPendingCommands > 0)
14554 {
14555 //All command allocated through csrGetCommandBuffer need to
14556 //decrement the pending count when releasing.
14557 pMac->roam.sPendingCommands--;
14558 smeReleaseCommand( pMac, pCommand );
14559 }
14560 else
14561 {
14562 smsLog(pMac, LOGE, FL( "no pending commands"));
14563 VOS_ASSERT(0);
14564 }
14565}
14566
Jeff Johnson295189b2012-06-20 16:38:30 -070014567//Return SUCCESS is the command is queued, failed
14568eHalStatus csrQueueSmeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fHighPriority )
14569{
14570 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070014571 if( (eSmeCommandScan == pCommand->command) && pMac->scan.fDropScanCmd )
14572 {
14573 smsLog(pMac, LOGW, FL(" drop scan (scan reason %d) command"),
14574 pCommand->u.scanCmd.reason);
14575 return eHAL_STATUS_CSR_WRONG_STATE;
14576 }
14577
14578 //We can call request full power first before putting the command into pending Q
14579 //because we are holding SME lock at this point.
14580 status = csrRequestFullPower( pMac, pCommand );
14581 if( HAL_STATUS_SUCCESS( status ) )
14582 {
14583 tANI_BOOLEAN fNoCmdPending;
Jeff Johnson295189b2012-06-20 16:38:30 -070014584 //make sure roamCmdPendingList is not empty first
14585 fNoCmdPending = csrLLIsListEmpty( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_FALSE );
14586 if( fNoCmdPending )
14587 {
14588 smePushCommand( pMac, pCommand, fHighPriority );
14589 }
14590 else
14591 {
14592 //Other commands are waiting for PMC callback, queue the new command to the pending Q
14593 //no list lock is needed since SME lock is held
14594 if( !fHighPriority )
14595 {
14596 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14597 }
14598 else {
14599 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14600 }
14601 }
14602 }
14603 else if( eHAL_STATUS_PMC_PENDING == status )
14604 {
14605 //no list lock is needed since SME lock is held
14606 if( !fHighPriority )
14607 {
14608 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14609 }
14610 else {
14611 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14612 }
14613 //Let caller know the command is queue
14614 status = eHAL_STATUS_SUCCESS;
14615 }
14616 else
14617 {
14618 //Not to decrease pMac->roam.sPendingCommands here. Caller will decrease it when it
14619 //release the command.
14620 smsLog( pMac, LOGE, FL( " cannot queue command %d\n" ), pCommand->command );
14621 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014622 return ( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070014623}
Jeff Johnson295189b2012-06-20 16:38:30 -070014624#ifdef WLAN_SOFTAP_FEATURE
14625eHalStatus csrRoamUpdateAPWPSIE( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirAPWPSIEs* pAPWPSIES )
14626{
14627 eHalStatus status = eHAL_STATUS_SUCCESS;
14628 tSirUpdateAPWPSIEsReq *pMsg;
14629 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
14630
14631 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14632 if (NULL == pSession)
14633 {
14634 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14635 return eHAL_STATUS_FAILURE;
14636 }
14637
Jeff Johnson295189b2012-06-20 16:38:30 -070014638 do
14639 {
14640 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14641 if (!HAL_STATUS_SUCCESS(status)) break;
14642 palZeroMemory( pMac->hHdd, pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14643 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPDATE_APWPSIE_REQ);
14644
14645 pBuf = (tANI_U8 *)&pMsg->transactionId;
14646 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014647 // transactionId
14648 *pBuf = 0;
14649 *( pBuf + 1 ) = 0;
14650 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070014651 // bssId
14652 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14653 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014654 //sessionId
14655 *pBuf++ = (tANI_U8)sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014656 // APWPSIEs
14657 palCopyMemory( pMac->hHdd, (tSirAPWPSIEs *)pBuf, pAPWPSIES, sizeof(tSirAPWPSIEs));
14658 pBuf += sizeof(tSirAPWPSIEs);
Jeff Johnson295189b2012-06-20 16:38:30 -070014659 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014660 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014661 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014662 return ( status );
14663}
Jeff Johnson295189b2012-06-20 16:38:30 -070014664eHalStatus csrRoamUpdateWPARSNIEs( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirRSNie * pAPSirRSNie)
14665{
14666 eHalStatus status = eHAL_STATUS_SUCCESS;
14667 tSirUpdateAPWPARSNIEsReq *pMsg;
14668 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070014669 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14670 if (NULL == pSession)
14671 {
14672 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14673 return eHAL_STATUS_FAILURE;
14674 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014675 do
14676 {
14677 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPARSNIEsReq) );
14678 if (!HAL_STATUS_SUCCESS(status)) break;
14679 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirUpdateAPWPARSNIEsReq ) );
14680 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SET_APWPARSNIEs_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070014681 pBuf = (tANI_U8 *)&pMsg->transactionId;
14682 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014683 // transactionId
14684 *pBuf = 0;
14685 *( pBuf + 1 ) = 0;
14686 pBuf += sizeof(tANI_U16);
14687
14688 // bssId
14689 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14690 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014691 // sessionId
14692 *pBuf++ = (tANI_U8)sessionId;
14693
14694 // APWPARSNIEs
14695 palCopyMemory( pMac->hHdd, (tSirRSNie *)pBuf, pAPSirRSNie, sizeof(tSirRSNie));
14696 pBuf += sizeof(tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070014697 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014698 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014699 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014700 return ( status );
14701}
Jeff Johnson295189b2012-06-20 16:38:30 -070014702#endif //#ifdef WLAN_SOFTAP_FEATURE
14703
14704#ifdef WLAN_FEATURE_VOWIFI_11R
14705//eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tCsrBssid preAuthBssid, tANI_U8 channelId)
14706eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tpSirBssDescription pBssDescription)
14707{
14708 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14709 tpSirFTPreAuthReq pftPreAuthReq;
14710 tANI_U16 auth_req_len = 0;
14711 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070014712 auth_req_len = sizeof(tSirFTPreAuthReq);
14713 pftPreAuthReq = (tpSirFTPreAuthReq)vos_mem_malloc(auth_req_len);
14714 if (pftPreAuthReq == NULL)
14715 {
14716 smsLog(pMac, LOGE, FL("Memory allocation for FT Preauth request failed"));
14717 return eHAL_STATUS_RESOURCES;
14718 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014719 // Save the SME Session ID here. We need it while processing the preauth response
14720 pMac->ft.ftSmeContext.smeSessionId = sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014721 vos_mem_zero(pftPreAuthReq, auth_req_len);
14722
14723 pftPreAuthReq->pbssDescription = (tpSirBssDescription)vos_mem_malloc(
14724 sizeof(pBssDescription->length) + pBssDescription->length);
14725
14726 pftPreAuthReq->messageType = pal_cpu_to_be16(eWNI_SME_FT_PRE_AUTH_REQ);
14727
14728 pftPreAuthReq->preAuthchannelNum = pBssDescription->channelId;
14729
Jeff Johnson295189b2012-06-20 16:38:30 -070014730 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->currbssId, (void *)pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070014731 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->preAuthbssId, (void *)pBssDescription->bssId, sizeof(tSirMacAddr));
14732
Jeff Johnson295189b2012-06-20 16:38:30 -070014733#ifdef WLAN_FEATURE_VOWIFI_11R
14734 if (csrRoamIs11rAssoc(pMac))
14735 {
14736 pftPreAuthReq->ft_ies_length = (tANI_U16)pMac->ft.ftSmeContext.auth_ft_ies_length;
14737 palCopyMemory(pMac->hHdd, pftPreAuthReq->ft_ies, pMac->ft.ftSmeContext.auth_ft_ies,
14738 pMac->ft.ftSmeContext.auth_ft_ies_length);
14739 }
14740 else
14741#endif
14742 {
14743 pftPreAuthReq->ft_ies_length = 0;
14744 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014745 vos_mem_copy(pftPreAuthReq->pbssDescription, pBssDescription, pBssDescription->length);
Jeff Johnson295189b2012-06-20 16:38:30 -070014746 pftPreAuthReq->length = pal_cpu_to_be16(sizeof(tSirFTPreAuthReq) + sizeof(pBssDescription->length) +
14747 pBssDescription->length);
Jeff Johnson295189b2012-06-20 16:38:30 -070014748 return palSendMBMessage(pMac->hHdd, pftPreAuthReq);
14749}
Jeff Johnson295189b2012-06-20 16:38:30 -070014750/*--------------------------------------------------------------------------
14751 * This will receive and process the FT Pre Auth Rsp from the current
14752 * associated ap.
14753 *
14754 * This will invoke the hdd call back. This is so that hdd can now
14755 * send the FTIEs from the Auth Rsp (Auth Seq 2) to the supplicant.
14756 ------------------------------------------------------------------------*/
14757void csrRoamFTPreAuthRspProcessor( tHalHandle hHal, tpSirFTPreAuthRsp pFTPreAuthRsp )
14758{
14759 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14760 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014761#ifdef FEATURE_WLAN_LFR
14762 tCsrRoamInfo roamInfo;
14763#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014764
14765#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
14766 smsLog( pMac, LOGE, FL("Preauth response status code %d"), pFTPreAuthRsp->status);
14767#endif
Madan Mohan Koyyalamudi7a579cc2012-10-21 11:25:39 -070014768#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
14769 status = csrNeighborRoamPreauthRspHandler(pMac, (VOS_STATUS)pFTPreAuthRsp->status);
14770 if (status != eHAL_STATUS_SUCCESS) {
14771 /*
14772 * Bail out if pre-auth was not even processed.
14773 */
14774 smsLog(pMac, LOGW, FL("Preauth was not processed: %d"), status);
14775 return;
14776 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014777#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014778 /* The below function calls/timers should be invoked only if the pre-auth is successful */
14779 if (VOS_STATUS_SUCCESS != (VOS_STATUS)pFTPreAuthRsp->status)
14780 return;
Jeff Johnson295189b2012-06-20 16:38:30 -070014781 // Implies a success
14782 pMac->ft.ftSmeContext.FTState = eFT_AUTH_COMPLETE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014783 // Indicate SME QoS module the completion of Preauth success. This will trigger the creation of RIC IEs
14784 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = pFTPreAuthRsp;
14785 sme_QosCsrEventInd(pMac, pMac->ft.ftSmeContext.smeSessionId, SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070014786 /* Start the pre-auth reassoc interval timer with a period of 400ms. When this expires,
14787 * actual transition from the current to handoff AP is triggered */
14788 status = palTimerStart(pMac->hHdd, pMac->ft.ftSmeContext.preAuthReassocIntvlTimer,
14789 60 * PAL_TIMER_TO_MS_UNIT,
14790 eANI_BOOLEAN_FALSE);
14791 if (eHAL_STATUS_SUCCESS != status)
14792 {
14793 smsLog(pMac, LOGE, FL("Preauth reassoc interval timer start failed to start with status %d\n"), status);
14794 return;
14795 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014796 // Save the received response
14797 palCopyMemory(pMac->hHdd, (void *)&pMac->ft.ftSmeContext.preAuthbssId, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14798 if (csrRoamIs11rAssoc(pMac))
14799 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, NULL, 0,
14800 eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
14801
14802 // Currently we dont do anything special for CCX connection.
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014803#ifdef FEATURE_WLAN_LFR
14804 // If Legacy Fast Roaming is enabled, signal the supplicant
14805 // So he can send us a PMK-ID for this candidate AP.
14806 if (csrRoamIsFastRoamEnabled(pMac))
14807 {
14808 // Save the bssid from the received response
14809 palCopyMemory(pMac->hHdd, (void *)&roamInfo.bssid, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14810 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, &roamInfo, 0, eCSR_ROAM_PMK_NOTIFY, 0);
14811 }
14812
14813#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014814
14815 // Done with it, init it.
14816 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = NULL;
14817}
14818#endif
14819#ifdef FEATURE_WLAN_BTAMP_UT_RF
14820void csrRoamJoinRetryTimerHandler(void *pv)
14821{
14822 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
14823 tpAniSirGlobal pMac = pInfo->pMac;
14824 tANI_U32 sessionId = pInfo->sessionId;
14825 tCsrRoamSession *pSession;
14826
14827 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14828 {
14829 smsLog( pMac, LOGE, FL( " retrying the last roam profile on session %d\n" ), sessionId );
14830 pSession = CSR_GET_SESSION( pMac, sessionId );
14831 if(pSession->pCurRoamProfile && csrIsConnStateDisconnected(pMac, sessionId))
14832 {
14833 if( !HAL_STATUS_SUCCESS(csrRoamJoinLastProfile(pMac, sessionId)) )
14834 {
14835 smsLog( pMac, LOGE, FL( " fail to retry the last roam profile\n" ) );
14836 }
14837 }
14838 }
14839}
Jeff Johnson295189b2012-06-20 16:38:30 -070014840eHalStatus csrRoamStartJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
14841{
14842 eHalStatus status = eHAL_STATUS_FAILURE;
14843 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14844
14845 if(pSession->pCurRoamProfile && pSession->maxRetryCount)
14846 {
14847 smsLog(pMac, LOGE, FL(" call sessionId %d retry count %d left\n "), sessionId, pSession->maxRetryCount);
14848 pSession->maxRetryCount--;
14849 pSession->joinRetryTimerInfo.pMac = pMac;
14850 pSession->joinRetryTimerInfo.sessionId = (tANI_U8)sessionId;
14851 status = palTimerStart(pMac->hHdd, pSession->hTimerJoinRetry, interval, eANI_BOOLEAN_FALSE);
14852 if(!HAL_STATUS_SUCCESS(status))
14853 {
14854 smsLog(pMac, LOGE, FL(" fail to start timer status %s \n "), status);
14855 }
14856 }
14857 else
14858 {
14859 smsLog(pMac, LOGE, FL(" not to start timer due to no profile or reach mac ret (%d)\n "),
14860 pSession->maxRetryCount);
14861 }
14862
14863 return (status);
14864}
Jeff Johnson295189b2012-06-20 16:38:30 -070014865eHalStatus csrRoamStopJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
14866{
14867 smsLog(pMac, LOGE, " csrRoamStopJoinRetryTimer \n ");
14868 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14869 {
14870 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerJoinRetry));
14871 }
14872
14873 return eHAL_STATUS_SUCCESS;
14874}
14875#endif
14876
14877
14878/*
14879 pBuf points to the beginning of the message
14880 LIM packs disassoc rsp as below,
14881 messageType - 2 bytes
14882 messageLength - 2 bytes
14883 sessionId - 1 byte
14884 transactionId - 2 bytes (tANI_U16)
14885 reasonCode - 4 bytes (sizeof(tSirResultCodes))
14886 peerMacAddr - 6 bytes
14887 The rest is conditionally defined of (WNI_POLARIS_FW_PRODUCT == AP) and not used
14888*/
14889static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp)
14890{
14891 if(pBuf && pRsp)
14892 {
14893 pBuf += 4; //skip type and length
14894 pRsp->sessionId = *pBuf++;
14895 pal_get_U16( pBuf, (tANI_U16 *)&pRsp->transactionId );
14896 pBuf += 2;
14897 pal_get_U32( pBuf, (tANI_U32 *)&pRsp->statusCode );
14898 pBuf += 4;
14899 vos_mem_copy(pRsp->peerMacAddr, pBuf, 6);
14900 }
14901}
14902
Jeff Johnsond13512a2012-07-17 11:42:19 -070014903eHalStatus csrGetDefaultCountryCodeFrmNv(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14904{
14905 static uNvTables nvTables;
14906 eHalStatus status = eHAL_STATUS_SUCCESS;
14907 VOS_STATUS vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
14908
14909 /* read the country code from NV and use it */
14910 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
14911 {
14912 palCopyMemory( pMac->hHdd, pCountry,
14913 nvTables.defaultCountryTable.countryCode,
14914 WNI_CFG_COUNTRY_CODE_LEN );
14915 return status;
14916 }
14917 else
14918 {
14919 palCopyMemory( pMac->hHdd, pCountry,
14920 "XXX",
14921 WNI_CFG_COUNTRY_CODE_LEN );
14922 status = eHAL_STATUS_FAILURE;
14923 return status;
14924 }
14925}
14926
14927eHalStatus csrGetCurrentCountryCode(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14928{
14929 palCopyMemory( pMac->hHdd, pCountry,
14930 pMac->scan.countryCode11d,
14931 WNI_CFG_COUNTRY_CODE_LEN );
14932 return eHAL_STATUS_SUCCESS;
14933}