blob: 791474a0b150fc534f790cf613e25ef36996fb00 [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 }
716 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamConnectedProfile));
717 pProfile->AuthType = eCSR_AUTH_TYPE_UNKNOWN;
718 return (status);
719}
720
Jeff Johnson295189b2012-06-20 16:38:30 -0700721static eHalStatus csrRoamFreeConnectedInfo( tpAniSirGlobal pMac, tCsrRoamConnectedInfo *pConnectedInfo )
722{
723 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700724 if( pConnectedInfo->pbFrames )
725 {
726 palFreeMemory( pMac->hHdd, pConnectedInfo->pbFrames );
727 pConnectedInfo->pbFrames = NULL;
728 }
729 pConnectedInfo->nBeaconLength = 0;
730 pConnectedInfo->nAssocReqLength = 0;
731 pConnectedInfo->nAssocRspLength = 0;
732 pConnectedInfo->staId = 0;
733#ifdef WLAN_FEATURE_VOWIFI_11R
734 pConnectedInfo->nRICRspLength = 0;
735#endif
736#ifdef FEATURE_WLAN_CCX
737 pConnectedInfo->nTspecIeLength = 0;
738#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700739 return ( status );
740}
741
Jeff Johnson295189b2012-06-20 16:38:30 -0700742
743
Jeff Johnsone7245742012-09-05 17:12:55 -0700744
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -0700745void csrReleaseCommandPreauth(tpAniSirGlobal pMac, tSmeCmd *pCommand)
746{
747 csrReinitPreauthCmd(pMac, pCommand);
748 csrReleaseCommand( pMac, pCommand );
749}
750
Jeff Johnson295189b2012-06-20 16:38:30 -0700751void csrReleaseCommandRoam(tpAniSirGlobal pMac, tSmeCmd *pCommand)
752{
753 csrReinitRoamCmd(pMac, pCommand);
754 csrReleaseCommand( pMac, pCommand );
755}
756
Jeff Johnson295189b2012-06-20 16:38:30 -0700757void csrReleaseCommandScan(tpAniSirGlobal pMac, tSmeCmd *pCommand)
758{
759 csrReinitScanCmd(pMac, pCommand);
760 csrReleaseCommand( pMac, pCommand );
761}
762
Jeff Johnson295189b2012-06-20 16:38:30 -0700763void csrReleaseCommandWmStatusChange(tpAniSirGlobal pMac, tSmeCmd *pCommand)
764{
765 csrReinitWmStatusChangeCmd(pMac, pCommand);
766 csrReleaseCommand( pMac, pCommand );
767}
768
Jeff Johnson295189b2012-06-20 16:38:30 -0700769void csrReinitSetKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
770{
771 palZeroMemory(pMac->hHdd, &pCommand->u.setKeyCmd, sizeof(tSetKeyCmd));
772}
773
Jeff Johnson295189b2012-06-20 16:38:30 -0700774void csrReinitRemoveKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
775{
776 palZeroMemory(pMac->hHdd, &pCommand->u.removeKeyCmd, sizeof(tRemoveKeyCmd));
777}
778
Jeff Johnson295189b2012-06-20 16:38:30 -0700779void csrReleaseCommandSetKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
780{
781 csrReinitSetKeyCmd(pMac, pCommand);
782 csrReleaseCommand( pMac, pCommand );
783}
Jeff Johnson295189b2012-06-20 16:38:30 -0700784void csrReleaseCommandRemoveKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
785{
786 csrReinitRemoveKeyCmd(pMac, pCommand);
787 csrReleaseCommand( pMac, pCommand );
788}
Jeff Johnson295189b2012-06-20 16:38:30 -0700789void csrAbortCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fStopping )
790{
791
792 if( eSmeCsrCommandMask & pCommand->command )
793 {
794 switch (pCommand->command)
795 {
796 case eSmeCommandScan:
797 // We need to inform the requester before droping the scan command
798 smsLog( pMac, LOGW, "%s: Drop scan reason %d callback 0x%X\n",
799 __FUNCTION__, pCommand->u.scanCmd.reason, (unsigned int)pCommand->u.scanCmd.callback);
800 if (NULL != pCommand->u.scanCmd.callback)
801 {
802 smsLog( pMac, LOGW, "%s callback scan requester\n", __FUNCTION__);
803 csrScanCallCallback(pMac, pCommand, eCSR_SCAN_ABORT);
804 }
805 csrReleaseCommandScan( pMac, pCommand );
806 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700807 case eSmeCommandRoam:
808 csrReleaseCommandRoam( pMac, pCommand );
809 break;
810
811 case eSmeCommandWmStatusChange:
812 csrReleaseCommandWmStatusChange( pMac, pCommand );
813 break;
814
815 case eSmeCommandSetKey:
816 csrReleaseCommandSetKey( pMac, pCommand );
817 break;
818
819 case eSmeCommandRemoveKey:
820 csrReleaseCommandRemoveKey( pMac, pCommand );
821 break;
822
823 default:
824 smsLog( pMac, LOGW, " CSR abort standard command %d\n", pCommand->command );
825 csrReleaseCommand( pMac, pCommand );
826 break;
827 }
828 }
829}
830
Jeff Johnson295189b2012-06-20 16:38:30 -0700831void csrRoamSubstateChange( tpAniSirGlobal pMac, eCsrRoamSubState NewSubstate, tANI_U32 sessionId)
832{
833 smsLog( pMac, LOG1, " CSR RoamSubstate: [ %d <== %d ]\n", NewSubstate, pMac->roam.curSubState[sessionId]);
834
Jeff Johnson295189b2012-06-20 16:38:30 -0700835 if(pMac->roam.curSubState[sessionId] == NewSubstate)
836 {
837 return;
Jeff Johnsone7245742012-09-05 17:12:55 -0700838 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700839 pMac->roam.curSubState[sessionId] = NewSubstate;
840}
841
Jeff Johnson295189b2012-06-20 16:38:30 -0700842eCsrRoamState csrRoamStateChange( tpAniSirGlobal pMac, eCsrRoamState NewRoamState, tANI_U8 sessionId)
843{
844 eCsrRoamState PreviousState;
845
846 smsLog( pMac, LOG1, "CSR RoamState: [ %d <== %d ]\n", NewRoamState, pMac->roam.curState[sessionId]);
847
848 PreviousState = pMac->roam.curState[sessionId];
849
850 if ( NewRoamState != pMac->roam.curState[sessionId] )
851 {
852 // Whenever we transition OUT of the Roaming state, clear the Roaming substate...
853 if ( CSR_IS_ROAM_JOINING(pMac, sessionId) )
854 {
855 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
856 }
857
858 pMac->roam.curState[sessionId] = NewRoamState;
859 }
860 return( PreviousState );
861}
862
Jeff Johnson295189b2012-06-20 16:38:30 -0700863void csrAssignRssiForCategory(tpAniSirGlobal pMac, tANI_U8 catOffset)
864{
865 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -0700866 if(catOffset)
867 {
868 pMac->roam.configParam.bCatRssiOffset = catOffset;
869 for(i = 0; i < CSR_NUM_RSSI_CAT; i++)
870 {
871 pMac->roam.configParam.RSSICat[CSR_NUM_RSSI_CAT - i - 1] = (int)CSR_BEST_RSSI_VALUE - (int)(i * catOffset);
872 }
873 }
874}
875
Jeff Johnson295189b2012-06-20 16:38:30 -0700876static void initConfigParam(tpAniSirGlobal pMac)
877{
878 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -0700879 pMac->roam.configParam.agingCount = CSR_AGING_COUNT;
880 pMac->roam.configParam.channelBondingMode24GHz = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
881 pMac->roam.configParam.channelBondingMode5GHz = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700882
Jeff Johnson295189b2012-06-20 16:38:30 -0700883 pMac->roam.configParam.phyMode = eCSR_DOT11_MODE_TAURUS;
884 pMac->roam.configParam.eBand = eCSR_BAND_ALL;
885 pMac->roam.configParam.uCfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
886 pMac->roam.configParam.FragmentationThreshold = eCSR_DOT11_FRAG_THRESH_DEFAULT;
887 pMac->roam.configParam.HeartbeatThresh24 = 40;
888 pMac->roam.configParam.HeartbeatThresh50 = 40;
889 pMac->roam.configParam.Is11dSupportEnabled = eANI_BOOLEAN_FALSE;
890 pMac->roam.configParam.Is11dSupportEnabledOriginal = eANI_BOOLEAN_FALSE;
891 pMac->roam.configParam.Is11eSupportEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700892 pMac->roam.configParam.Is11hSupportEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700893 pMac->roam.configParam.RTSThreshold = 2346;
894 pMac->roam.configParam.shortSlotTime = eANI_BOOLEAN_TRUE;
895 pMac->roam.configParam.WMMSupportMode = eCsrRoamWmmAuto;
896 pMac->roam.configParam.ProprietaryRatesEnabled = eANI_BOOLEAN_TRUE;
897 pMac->roam.configParam.TxRate = eCSR_TX_RATE_AUTO;
898 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
899 pMac->roam.configParam.scanAgeTimeNCNPS = CSR_SCAN_AGING_TIME_NOT_CONNECT_NO_PS;
900 pMac->roam.configParam.scanAgeTimeNCPS = CSR_SCAN_AGING_TIME_NOT_CONNECT_W_PS;
901 pMac->roam.configParam.scanAgeTimeCNPS = CSR_SCAN_AGING_TIME_CONNECT_NO_PS;
902 pMac->roam.configParam.scanAgeTimeCPS = CSR_SCAN_AGING_TIME_CONNECT_W_PS;
903 for(i = 0; i < CSR_NUM_RSSI_CAT; i++)
904 {
905 pMac->roam.configParam.BssPreferValue[i] = i;
906 }
907 csrAssignRssiForCategory(pMac, CSR_DEFAULT_RSSI_DB_GAP);
908 pMac->roam.configParam.nRoamingTime = CSR_DEFAULT_ROAMING_TIME;
909 pMac->roam.configParam.fEnforce11dChannels = eANI_BOOLEAN_FALSE;
910 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700911 pMac->roam.configParam.fEnforceCountryCodeMatch = eANI_BOOLEAN_FALSE;
912 pMac->roam.configParam.fEnforceDefaultDomain = eANI_BOOLEAN_FALSE;
913 pMac->roam.configParam.nActiveMaxChnTime = CSR_ACTIVE_MAX_CHANNEL_TIME;
914 pMac->roam.configParam.nActiveMinChnTime = CSR_ACTIVE_MIN_CHANNEL_TIME;
915 pMac->roam.configParam.nPassiveMaxChnTime = CSR_PASSIVE_MAX_CHANNEL_TIME;
916 pMac->roam.configParam.nPassiveMinChnTime = CSR_PASSIVE_MIN_CHANNEL_TIME;
Jeff Johnson295189b2012-06-20 16:38:30 -0700917 pMac->roam.configParam.IsIdleScanEnabled = TRUE; //enable the idle scan by default
918 pMac->roam.configParam.nTxPowerCap = CSR_MAX_TX_POWER;
919 pMac->roam.configParam.statsReqPeriodicity = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD;
920 pMac->roam.configParam.statsReqPeriodicityInPS = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700921#ifdef WLAN_FEATURE_VOWIFI_11R
922 pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported = 0;
923#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700924#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
925 pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries = 3;
926 pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold = 120;
927 pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold = 125;
928 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime = 20;
929 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = 40;
930 pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod = 200;
931 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels = 3;
932 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[0] = 1;
933 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[1] = 6;
934 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[2] = 11;
935 pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod = 20000; //20 seconds
936#endif
Jeff Johnsone7245742012-09-05 17:12:55 -0700937#ifdef WLAN_FEATURE_11AC
938 pMac->roam.configParam.nVhtChannelWidth = WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1;
939#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700940
941 pMac->roam.configParam.addTSWhenACMIsOff = 0;
942 pMac->roam.configParam.fScanTwice = eANI_BOOLEAN_FALSE;
Mohit Khanna349bc392012-09-11 17:24:52 -0700943
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -0700944 //Remove this code once SLM_Sessionization is supported
945 //BMPS_WORKAROUND_NOT_NEEDED
Jeff Johnsone7245742012-09-05 17:12:55 -0700946 pMac->roam.configParam.doBMPSWorkaround = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700947
Jeff Johnsone7245742012-09-05 17:12:55 -0700948}
Jeff Johnson295189b2012-06-20 16:38:30 -0700949eCsrBand csrGetCurrentBand(tHalHandle hHal)
950{
951 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
952 return pMac->roam.configParam.bandCapability;
953}
Jeff Johnson295189b2012-06-20 16:38:30 -0700954eHalStatus csrSetBand(tHalHandle hHal, eCsrBand eBand)
955{
956 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
957 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700958 if (CSR_IS_PHY_MODE_A_ONLY(pMac) &&
959 (eBand == eCSR_BAND_24))
960 {
961 /* DOT11 mode configured to 11a only and received
962 request to change the band to 2.4 GHz */
963 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
964 "failed to set band cfg80211 = %u, band = %u\n",
965 pMac->roam.configParam.uCfgDot11Mode, eBand);
966 return eHAL_STATUS_INVALID_PARAMETER;
967 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700968 if ((CSR_IS_PHY_MODE_B_ONLY(pMac) ||
969 CSR_IS_PHY_MODE_G_ONLY(pMac)) &&
970 (eBand == eCSR_BAND_5G))
971 {
972 /* DOT11 mode configured to 11b/11g only and received
973 request to change the band to 5 GHz */
974 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
975 "failed to set band dot11mode = %u, band = %u\n",
976 pMac->roam.configParam.uCfgDot11Mode, eBand);
977 return eHAL_STATUS_INVALID_PARAMETER;
978 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700979 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
980 "Band changed to %u (0 - ALL, 1 - 2.4 GHZ, 2 - 5GHZ)\n", eBand);
981 pMac->roam.configParam.eBand = eBand;
982 pMac->roam.configParam.bandCapability = eBand;
983 csrScanGetSupportedChannels( pMac );
984 status = csrInitGetChannels( pMac );
985 if (eHAL_STATUS_SUCCESS == status)
986 csrInitChannelList( hHal );
987 return status;
988}
Jeff Johnsone7245742012-09-05 17:12:55 -0700989/* The funcns csrConvertCBIniValueToPhyCBState and csrConvertPhyCBStateToIniValue have been
990 * introduced to convert the ini value to the ENUM used in csr and MAC for CB state
991 * Ideally we should have kept the ini value and enum value same and representing the same
992 * cb values as in 11n standard i.e.
993 * Set to 1 (SCA) if the secondary channel is above the primary channel
994 * Set to 3 (SCB) if the secondary channel is below the primary channel
995 * Set to 0 (SCN) if no secondary channel is present
996 * However, since our driver is already distributed we will keep the ini definition as it is which is:
997 * 0 - secondary none
998 * 1 - secondary LOW
999 * 2 - secondary HIGH
1000 * and convert to enum value used within the driver in csrChangeDefaultConfigParam using this funcn
1001 * The enum values are as follows:
1002 * PHY_SINGLE_CHANNEL_CENTERED = 0
1003 * PHY_DOUBLE_CHANNEL_LOW_PRIMARY = 1
1004 * PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3
1005 */
1006ePhyChanBondState csrConvertCBIniValueToPhyCBState(v_U32_t cbIniValue)
1007{
1008
1009 ePhyChanBondState phyCbState;
1010 switch (cbIniValue) {
1011 // secondary none
1012 case 0:
1013 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1014 break;
1015 // secondary LOW
1016 case 1:
1017 phyCbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
1018 break;
1019 // secondary HIGH
1020 case 2:
1021 phyCbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
1022 break;
1023#ifdef WLAN_FEATURE_11AC
1024 case 3:
1025 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
1026 break;
1027 case 4:
1028 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1029 break;
1030 case 5:
1031 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1032 break;
1033 case 6:
1034 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
1035 break;
1036 case 7:
1037 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
1038 break;
1039 case 8:
1040 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
1041 break;
1042 case 9:
1043 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
1044 break;
1045#endif
1046 default:
1047 // If an invalid value is passed, disable CHANNEL BONDING
1048 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1049 break;
1050 }
1051 return phyCbState;
1052}
1053
1054v_U32_t csrConvertPhyCBStateToIniValue(ePhyChanBondState phyCbState)
1055{
1056
1057 v_U32_t cbIniValue;
1058 switch (phyCbState) {
1059 // secondary none
1060 case PHY_SINGLE_CHANNEL_CENTERED:
1061 cbIniValue = 0;
1062 break;
1063 // secondary LOW
1064 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1065 cbIniValue = 1;
1066 break;
1067 // secondary HIGH
1068 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1069 cbIniValue = 2;
1070 break;
1071#ifdef WLAN_FEATURE_11AC
1072 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
1073 cbIniValue = 3;
1074 break;
1075 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
1076 cbIniValue = 4;
1077 break;
1078 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
1079 cbIniValue = 5;
1080 break;
1081 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1082 cbIniValue = 6;
1083 break;
1084 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1085 cbIniValue = 7;
1086 break;
1087 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1088 cbIniValue = 8;
1089 break;
1090 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1091 cbIniValue = 9;
1092 break;
1093#endif
1094 default:
1095 // return some invalid value
1096 cbIniValue = 10;
1097 break;
1098 }
1099 return cbIniValue;
1100}
Jeff Johnson295189b2012-06-20 16:38:30 -07001101
1102eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1103{
1104 eHalStatus status = eHAL_STATUS_SUCCESS;
1105
1106 if(pParam)
1107 {
1108 pMac->roam.configParam.WMMSupportMode = pParam->WMMSupportMode;
1109 pMac->roam.configParam.Is11eSupportEnabled = pParam->Is11eSupportEnabled;
1110 pMac->roam.configParam.FragmentationThreshold = pParam->FragmentationThreshold;
1111 pMac->roam.configParam.Is11dSupportEnabled = pParam->Is11dSupportEnabled;
1112 pMac->roam.configParam.Is11dSupportEnabledOriginal = pParam->Is11dSupportEnabled;
1113 pMac->roam.configParam.Is11hSupportEnabled = pParam->Is11hSupportEnabled;
1114
1115 pMac->roam.configParam.fenableMCCMode = pParam->fEnableMCCMode;
Mohit Khanna7ed53f02012-09-11 17:52:10 -07001116 pMac->roam.configParam.fAllowMCCGODiffBI = pParam->fAllowMCCGODiffBI;
1117
Jeff Johnsone7245742012-09-05 17:12:55 -07001118 /* channelBondingMode5GHz plays a dual role right now
1119 * 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
1120 * This is how channelBondingMode5GHz works now and this is kept intact to avoid any cfg.ini change
1121 */
1122 if (pParam->channelBondingMode24GHz > MAX_CB_VALUE_IN_INI)
1123 {
1124 smsLog( pMac, LOGW, "Invalid CB value from ini in 2.4GHz band %d, CB DISABLED\n", pParam->channelBondingMode24GHz);
1125 }
1126 pMac->roam.configParam.channelBondingMode24GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode24GHz);
1127 if (pParam->channelBondingMode5GHz > MAX_CB_VALUE_IN_INI)
1128 {
1129 smsLog( pMac, LOGW, "Invalid CB value from ini in 5GHz band %d, CB DISABLED\n", pParam->channelBondingMode5GHz);
1130 }
1131 pMac->roam.configParam.channelBondingMode5GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001132 pMac->roam.configParam.RTSThreshold = pParam->RTSThreshold;
1133 pMac->roam.configParam.phyMode = pParam->phyMode;
1134 pMac->roam.configParam.shortSlotTime = pParam->shortSlotTime;
1135 pMac->roam.configParam.HeartbeatThresh24 = pParam->HeartbeatThresh24;
1136 pMac->roam.configParam.HeartbeatThresh50 = pParam->HeartbeatThresh50;
1137 pMac->roam.configParam.ProprietaryRatesEnabled = pParam->ProprietaryRatesEnabled;
1138 pMac->roam.configParam.TxRate = pParam->TxRate;
1139 pMac->roam.configParam.AdHocChannel24 = pParam->AdHocChannel24;
1140 pMac->roam.configParam.AdHocChannel5G = pParam->AdHocChannel5G;
1141 pMac->roam.configParam.bandCapability = pParam->bandCapability;
1142 pMac->roam.configParam.cbChoice = pParam->cbChoice;
1143 pMac->roam.configParam.bgScanInterval = pParam->bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001144 //if HDD passed down non zero values then only update,
1145 //otherwise keep using the defaults
1146 if(pParam->nActiveMaxChnTime)
1147 {
1148 pMac->roam.configParam.nActiveMaxChnTime = pParam->nActiveMaxChnTime;
1149 }
1150 if(pParam->nActiveMinChnTime)
1151 {
1152 pMac->roam.configParam.nActiveMinChnTime = pParam->nActiveMinChnTime;
1153 }
1154 if(pParam->nPassiveMaxChnTime)
1155 {
1156 pMac->roam.configParam.nPassiveMaxChnTime = pParam->nPassiveMaxChnTime;
1157 }
1158 if(pParam->nPassiveMinChnTime)
1159 {
1160 pMac->roam.configParam.nPassiveMinChnTime = pParam->nPassiveMinChnTime;
1161 }
1162 //if upper layer wants to disable idle scan altogether set it to 0
1163 if(pParam->impsSleepTime)
1164 {
1165 //Change the unit from second to microsecond
1166 tANI_U32 impsSleepTime = pParam->impsSleepTime * PAL_TIMER_TO_SEC_UNIT;
Jeff Johnson295189b2012-06-20 16:38:30 -07001167 if(CSR_IDLE_SCAN_NO_PS_INTERVAL_MIN <= impsSleepTime)
1168 {
1169 pMac->roam.configParam.impsSleepTime = impsSleepTime;
1170 }
1171 else
1172 {
1173 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
1174 }
1175 }
1176 else
1177 {
1178 pMac->roam.configParam.impsSleepTime = 0;
1179 }
1180 pMac->roam.configParam.eBand = pParam->eBand;
1181#ifdef WLAN_SOFTAP_FEATURE
1182 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(NULL, pMac->roam.configParam.phyMode,
1183 pMac->roam.configParam.ProprietaryRatesEnabled);
1184#else
1185 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pMac->roam.configParam.phyMode,
1186 pMac->roam.configParam.ProprietaryRatesEnabled);
1187#endif
1188 //if HDD passed down non zero values for age params, then only update,
1189 //otherwise keep using the defaults
1190 if(pParam->nScanResultAgeCount)
1191 {
1192 pMac->roam.configParam.agingCount = pParam->nScanResultAgeCount;
1193 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001194 if(pParam->scanAgeTimeNCNPS)
1195 {
1196 pMac->roam.configParam.scanAgeTimeNCNPS = pParam->scanAgeTimeNCNPS;
1197 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001198 if(pParam->scanAgeTimeNCPS)
1199 {
1200 pMac->roam.configParam.scanAgeTimeNCPS = pParam->scanAgeTimeNCPS;
1201 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001202 if(pParam->scanAgeTimeCNPS)
1203 {
1204 pMac->roam.configParam.scanAgeTimeCNPS = pParam->scanAgeTimeCNPS;
1205 }
1206 if(pParam->scanAgeTimeCPS)
1207 {
1208 pMac->roam.configParam.scanAgeTimeCPS = pParam->scanAgeTimeCPS;
1209 }
1210
1211 csrAssignRssiForCategory(pMac, pParam->bCatRssiOffset);
1212 pMac->roam.configParam.nRoamingTime = pParam->nRoamingTime;
1213 pMac->roam.configParam.fEnforce11dChannels = pParam->fEnforce11dChannels;
1214 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = pParam->fSupplicantCountryCodeHasPriority;
1215 pMac->roam.configParam.fEnforceCountryCodeMatch = pParam->fEnforceCountryCodeMatch;
1216 pMac->roam.configParam.fEnforceDefaultDomain = pParam->fEnforceDefaultDomain;
Jeff Johnson295189b2012-06-20 16:38:30 -07001217 pMac->roam.configParam.vccRssiThreshold = pParam->vccRssiThreshold;
1218 pMac->roam.configParam.vccUlMacLossThreshold = pParam->vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001219 pMac->roam.configParam.IsIdleScanEnabled = pParam->IsIdleScanEnabled;
1220 pMac->roam.configParam.statsReqPeriodicity = pParam->statsReqPeriodicity;
1221 pMac->roam.configParam.statsReqPeriodicityInPS = pParam->statsReqPeriodicityInPS;
1222 //Assign this before calling CsrInit11dInfo
1223 pMac->roam.configParam.nTxPowerCap = pParam->nTxPowerCap;
Jeff Johnson295189b2012-06-20 16:38:30 -07001224 if( csrIs11dSupported( pMac ) )
1225 {
1226 status = CsrInit11dInfo(pMac, &pParam->Csr11dinfo);
1227 }
1228 else
1229 {
1230 pMac->scan.curScanType = eSIR_ACTIVE_SCAN;
1231 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001232
1233 /* Initialize the power + channel information if 11h is enabled.
1234 If 11d is enabled this information has already been initialized */
1235 if( csrIs11hSupported( pMac ) && !csrIs11dSupported( pMac ) )
1236 {
1237 csrInitChannelPowerList(pMac, &pParam->Csr11dinfo);
1238 }
1239
1240
Jeff Johnson295189b2012-06-20 16:38:30 -07001241#ifdef WLAN_FEATURE_VOWIFI_11R
1242 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.csr11rConfig, &pParam->csr11rConfig, sizeof(tCsr11rConfigParams) );
1243 smsLog( pMac, LOG1, "IsFTResourceReqSupp = %d\n", pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported);
1244#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001245#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -07001246 pMac->roam.configParam.isFastTransitionEnabled = pParam->isFastTransitionEnabled;
Jeff Johnson43971f52012-07-17 12:26:56 -07001247 pMac->roam.configParam.RoamRssiDiff = pParam->RoamRssiDiff;
Jeff Johnson295189b2012-06-20 16:38:30 -07001248#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001249#ifdef FEATURE_WLAN_LFR
1250 pMac->roam.configParam.isFastRoamIniFeatureEnabled = pParam->isFastRoamIniFeatureEnabled;
1251#endif
1252
Jeff Johnson295189b2012-06-20 16:38:30 -07001253#ifdef FEATURE_WLAN_CCX
1254 pMac->roam.configParam.isCcxIniFeatureEnabled = pParam->isCcxIniFeatureEnabled;
1255#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001256#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1257 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.neighborRoamConfig, &pParam->neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
Jeff Johnson295189b2012-06-20 16:38:30 -07001258 smsLog( pMac, LOG1, "nNeighborScanTimerPerioid = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod);
1259 smsLog( pMac, LOG1, "nNeighborReassocRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold);
1260 smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);
1261 smsLog( pMac, LOG1, "nNeighborScanMinChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime);
1262 smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
1263 smsLog( pMac, LOG1, "nMaxNeighborRetries = %d\n", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
1264 smsLog( pMac, LOG1, "nNeighborResultsRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod);
Jeff Johnson295189b2012-06-20 16:38:30 -07001265 {
1266 int i;
1267 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 -07001268 for( i=0; i< pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels; i++)
1269 {
1270 smsLog( pMac, LOG1, "%d ", pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[i] );
1271 }
1272 smsLog( pMac, LOG1, "\n");
1273 }
1274#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001275 pMac->roam.configParam.addTSWhenACMIsOff = pParam->addTSWhenACMIsOff;
1276 pMac->scan.fValidateList = pParam->fValidateList;
1277 pMac->scan.fEnableBypass11d = pParam->fEnableBypass11d;
1278 pMac->scan.fEnableDFSChnlScan = pParam->fEnableDFSChnlScan;
1279 pMac->roam.configParam.fScanTwice = pParam->fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001280 pMac->scan.fFirstScanOnly2GChnl = pParam->fFirstScanOnly2GChnl;
1281 /* This parameter is not available in cfg and not passed from upper layers. Instead it is initialized here
1282 * This paramtere is used in concurrency to determine if there are concurrent active sessions.
1283 * Is used as a temporary fix to disconnect all active sessions when BMPS enabled so the active session if Infra STA
1284 * will automatically connect back and resume BMPS since resume BMPS is not working when moving from concurrent to
1285 * single session
1286 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07001287 //Remove this code once SLM_Sessionization is supported
1288 //BMPS_WORKAROUND_NOT_NEEDED
Mohit Khanna349bc392012-09-11 17:24:52 -07001289 pMac->roam.configParam.doBMPSWorkaround = 0;
1290
Jeff Johnsone7245742012-09-05 17:12:55 -07001291#ifdef WLAN_FEATURE_11AC
1292 pMac->roam.configParam.nVhtChannelWidth = pParam->nVhtChannelWidth;
1293#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001294 }
1295
1296 return status;
1297}
1298
Jeff Johnson295189b2012-06-20 16:38:30 -07001299eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1300{
1301 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07001302 if(pParam)
1303 {
1304 pParam->WMMSupportMode = pMac->roam.configParam.WMMSupportMode;
1305 pParam->Is11eSupportEnabled = pMac->roam.configParam.Is11eSupportEnabled;
1306 pParam->FragmentationThreshold = pMac->roam.configParam.FragmentationThreshold;
1307 pParam->Is11dSupportEnabled = pMac->roam.configParam.Is11dSupportEnabled;
1308 pParam->Is11dSupportEnabledOriginal = pMac->roam.configParam.Is11dSupportEnabledOriginal;
1309 pParam->Is11hSupportEnabled = pMac->roam.configParam.Is11hSupportEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001310 pParam->channelBondingMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode24GHz);
1311 pParam->channelBondingMode5GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001312 pParam->RTSThreshold = pMac->roam.configParam.RTSThreshold;
1313 pParam->phyMode = pMac->roam.configParam.phyMode;
1314 pParam->shortSlotTime = pMac->roam.configParam.shortSlotTime;
1315 pParam->HeartbeatThresh24 = pMac->roam.configParam.HeartbeatThresh24;
1316 pParam->HeartbeatThresh50 = pMac->roam.configParam.HeartbeatThresh50;
1317 pParam->ProprietaryRatesEnabled = pMac->roam.configParam.ProprietaryRatesEnabled;
1318 pParam->TxRate = pMac->roam.configParam.TxRate;
1319 pParam->AdHocChannel24 = pMac->roam.configParam.AdHocChannel24;
1320 pParam->AdHocChannel5G = pMac->roam.configParam.AdHocChannel5G;
1321 pParam->bandCapability = pMac->roam.configParam.bandCapability;
1322 pParam->cbChoice = pMac->roam.configParam.cbChoice;
1323 pParam->bgScanInterval = pMac->roam.configParam.bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001324 pParam->nActiveMaxChnTime = pMac->roam.configParam.nActiveMaxChnTime;
1325 pParam->nActiveMinChnTime = pMac->roam.configParam.nActiveMinChnTime;
1326 pParam->nPassiveMaxChnTime = pMac->roam.configParam.nPassiveMaxChnTime;
1327 pParam->nPassiveMinChnTime = pMac->roam.configParam.nPassiveMinChnTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07001328 //Change the unit from microsecond to second
1329 pParam->impsSleepTime = pMac->roam.configParam.impsSleepTime / PAL_TIMER_TO_SEC_UNIT;
1330 pParam->eBand = pMac->roam.configParam.eBand;
1331 pParam->nScanResultAgeCount = pMac->roam.configParam.agingCount;
1332 pParam->scanAgeTimeNCNPS = pMac->roam.configParam.scanAgeTimeNCNPS;
1333 pParam->scanAgeTimeNCPS = pMac->roam.configParam.scanAgeTimeNCPS;
1334 pParam->scanAgeTimeCNPS = pMac->roam.configParam.scanAgeTimeCNPS;
1335 pParam->scanAgeTimeCPS = pMac->roam.configParam.scanAgeTimeCPS;
1336 pParam->bCatRssiOffset = pMac->roam.configParam.bCatRssiOffset;
1337 pParam->nRoamingTime = pMac->roam.configParam.nRoamingTime;
1338 pParam->fEnforce11dChannels = pMac->roam.configParam.fEnforce11dChannels;
1339 pParam->fSupplicantCountryCodeHasPriority = pMac->roam.configParam.fSupplicantCountryCodeHasPriority;
1340 pParam->fEnforceCountryCodeMatch = pMac->roam.configParam.fEnforceCountryCodeMatch;
1341 pParam->fEnforceDefaultDomain = pMac->roam.configParam.fEnforceDefaultDomain;
1342 pParam->vccRssiThreshold = pMac->roam.configParam.vccRssiThreshold;
1343 pParam->vccUlMacLossThreshold = pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001344 pParam->IsIdleScanEnabled = pMac->roam.configParam.IsIdleScanEnabled;
1345 pParam->nTxPowerCap = pMac->roam.configParam.nTxPowerCap;
1346 pParam->statsReqPeriodicity = pMac->roam.configParam.statsReqPeriodicity;
1347 pParam->statsReqPeriodicityInPS = pMac->roam.configParam.statsReqPeriodicityInPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001348 pParam->addTSWhenACMIsOff = pMac->roam.configParam.addTSWhenACMIsOff;
1349 pParam->fValidateList = pMac->roam.configParam.fValidateList;
1350 pParam->fEnableBypass11d = pMac->scan.fEnableBypass11d;
1351 pParam->fEnableDFSChnlScan = pMac->scan.fEnableDFSChnlScan;
1352 pParam->fScanTwice = pMac->roam.configParam.fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001353 pParam->fFirstScanOnly2GChnl = pMac->scan.fFirstScanOnly2GChnl;
Jeff Johnson295189b2012-06-20 16:38:30 -07001354
1355#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1356 palCopyMemory( pMac->hHdd, &pParam->neighborRoamConfig, &pMac->roam.configParam.neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
1357#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001358#ifdef WLAN_FEATURE_11AC
1359 pParam->nVhtChannelWidth = pMac->roam.configParam.nVhtChannelWidth;
1360#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001361
1362 csrSetChannels(pMac, pParam);
1363
1364 status = eHAL_STATUS_SUCCESS;
1365 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001366 return (status);
1367}
1368
Jeff Johnson295189b2012-06-20 16:38:30 -07001369eHalStatus csrSetPhyMode(tHalHandle hHal, tANI_U32 phyMode, eCsrBand eBand, tANI_BOOLEAN *pfRestartNeeded)
1370{
1371 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
1372 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1373 tANI_BOOLEAN fRestartNeeded = eANI_BOOLEAN_FALSE;
1374 eCsrPhyMode newPhyMode = eCSR_DOT11_MODE_AUTO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001375 do
1376 {
1377 if(eCSR_BAND_24 == eBand)
1378 {
1379 if(CSR_IS_RADIO_A_ONLY(pMac)) break;
1380 if((eCSR_DOT11_MODE_11a & phyMode) || (eCSR_DOT11_MODE_11a_ONLY & phyMode)) break;
1381 }
1382 if(eCSR_BAND_5G == eBand)
1383 {
1384 if(CSR_IS_RADIO_BG_ONLY(pMac)) break;
1385 if((eCSR_DOT11_MODE_11b & phyMode) || (eCSR_DOT11_MODE_11b_ONLY & phyMode) ||
1386 (eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11g_ONLY & phyMode)
1387 )
1388 {
1389 break;
1390 }
1391 }
1392 if((0 == phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode))
1393 {
1394 newPhyMode = eCSR_DOT11_MODE_TAURUS;
1395 }
1396 else if(eCSR_DOT11_MODE_AUTO & phyMode)
1397 {
1398 newPhyMode = eCSR_DOT11_MODE_AUTO;
1399 }
1400 else
1401 {
1402 //Check for dual band and higher capability first
1403 if(eCSR_DOT11_MODE_11n_ONLY & phyMode)
1404 {
1405 if(eCSR_DOT11_MODE_11n_ONLY != phyMode) break;
1406 newPhyMode = eCSR_DOT11_MODE_11n_ONLY;
1407 }
1408 else if(eCSR_DOT11_MODE_11a_ONLY & phyMode)
1409 {
1410 if(eCSR_DOT11_MODE_11a_ONLY != phyMode) break;
1411 if(eCSR_BAND_24 == eBand) break;
1412 newPhyMode = eCSR_DOT11_MODE_11a_ONLY;
1413 eBand = eCSR_BAND_5G;
1414 }
1415 else if(eCSR_DOT11_MODE_11g_ONLY & phyMode)
1416 {
1417 if(eCSR_DOT11_MODE_11g_ONLY != phyMode) break;
1418 if(eCSR_BAND_5G == eBand) break;
1419 newPhyMode = eCSR_DOT11_MODE_11g_ONLY;
1420 eBand = eCSR_BAND_24;
1421 }
1422 else if(eCSR_DOT11_MODE_11b_ONLY & phyMode)
1423 {
1424 if(eCSR_DOT11_MODE_11b_ONLY != phyMode) break;
1425 if(eCSR_BAND_5G == eBand) break;
1426 newPhyMode = eCSR_DOT11_MODE_11b_ONLY;
1427 eBand = eCSR_BAND_24;
1428 }
1429 else if(eCSR_DOT11_MODE_11n & phyMode)
1430 {
1431 newPhyMode = eCSR_DOT11_MODE_11n;
1432 }
1433 else if(eCSR_DOT11_MODE_abg & phyMode)
1434 {
1435 newPhyMode = eCSR_DOT11_MODE_abg;
1436 }
1437 else if(eCSR_DOT11_MODE_11a & phyMode)
1438 {
1439 if((eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11b & phyMode))
1440 {
1441 if(eCSR_BAND_ALL == eBand)
1442 {
1443 newPhyMode = eCSR_DOT11_MODE_abg;
1444 }
1445 else
1446 {
1447 //bad setting
1448 break;
1449 }
1450 }
1451 else
1452 {
1453 newPhyMode = eCSR_DOT11_MODE_11a;
1454 eBand = eCSR_BAND_5G;
1455 }
1456 }
1457 else if(eCSR_DOT11_MODE_11g & phyMode)
1458 {
1459 newPhyMode = eCSR_DOT11_MODE_11g;
1460 eBand = eCSR_BAND_24;
1461 }
1462 else if(eCSR_DOT11_MODE_11b & phyMode)
1463 {
1464 newPhyMode = eCSR_DOT11_MODE_11b;
1465 eBand = eCSR_BAND_24;
1466 }
1467 else
1468 {
1469 //We will never be here
1470 smsLog( pMac, LOGE, FL(" cannot recognize the phy mode 0x%08X\n"), phyMode );
1471 newPhyMode = eCSR_DOT11_MODE_AUTO;
1472 }
1473 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001474 //Done validating
1475 status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001476 //Now we need to check whether a restart is needed.
1477 if(eBand != pMac->roam.configParam.eBand)
1478 {
1479 fRestartNeeded = eANI_BOOLEAN_TRUE;
1480 break;
1481 }
1482 if(newPhyMode != pMac->roam.configParam.phyMode)
1483 {
1484 fRestartNeeded = eANI_BOOLEAN_TRUE;
1485 break;
1486 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001487 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001488 if(HAL_STATUS_SUCCESS(status))
1489 {
1490 pMac->roam.configParam.eBand = eBand;
1491 pMac->roam.configParam.phyMode = newPhyMode;
1492 if(pfRestartNeeded)
1493 {
1494 *pfRestartNeeded = fRestartNeeded;
1495 }
1496 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001497 return (status);
1498}
1499
Jeff Johnson295189b2012-06-20 16:38:30 -07001500void csrPruneChannelListForMode( tpAniSirGlobal pMac, tCsrChannel *pChannelList )
1501{
1502 tANI_U8 Index;
1503 tANI_U8 cChannels;
Jeff Johnson295189b2012-06-20 16:38:30 -07001504 // for dual band NICs, don't need to trim the channel list....
1505 if ( !CSR_IS_OPEARTING_DUAL_BAND( pMac ) )
1506 {
1507 // 2.4 GHz band operation requires the channel list to be trimmed to
1508 // the 2.4 GHz channels only...
1509 if ( CSR_IS_24_BAND_ONLY( pMac ) )
1510 {
1511 for( Index = 0, cChannels = 0; Index < pChannelList->numChannels;
1512 Index++ )
1513 {
1514 if ( CSR_IS_CHANNEL_24GHZ(pChannelList->channelList[ Index ]) )
1515 {
1516 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1517 cChannels++;
1518 }
1519 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001520 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1521 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1522 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1523 // only if we need to.
1524 //
1525 // The amount of memory to clear is the number of channesl that we trimmed
1526 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1527
1528 if ( pChannelList->numChannels > cChannels )
1529 {
1530 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1531 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1532
1533 }
1534
1535 pChannelList->numChannels = cChannels;
1536 }
1537 else if ( CSR_IS_5G_BAND_ONLY( pMac ) )
1538 {
1539 for ( Index = 0, cChannels = 0; Index < pChannelList->numChannels; Index++ )
1540 {
1541 if ( CSR_IS_CHANNEL_5GHZ(pChannelList->channelList[ Index ]) )
1542 {
1543 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1544 cChannels++;
1545 }
1546 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001547 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1548 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1549 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1550 // only if we need to.
1551 //
1552 // The amount of memory to clear is the number of channesl that we trimmed
1553 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1554 if ( pChannelList->numChannels > cChannels )
1555 {
1556 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1557 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1558 }
1559
1560 pChannelList->numChannels = cChannels;
1561 }
1562 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001563}
Jeff Johnson295189b2012-06-20 16:38:30 -07001564#ifdef WLAN_SOFTAP_FEATURE
1565#define INFRA_AP_DEFAULT_CHANNEL 6
1566eHalStatus csrIsValidChannel(tpAniSirGlobal pMac, tANI_U8 chnNum)
1567{
1568 tANI_U8 index= 0;
1569 eHalStatus status = eHAL_STATUS_FAILURE;
1570 for (index=0; index < pMac->scan.base20MHzChannels.numChannels ;index++)
1571 {
1572 if(pMac->scan.base20MHzChannels.channelList[ index ] == chnNum){
1573 status = eHAL_STATUS_SUCCESS;
1574 break;
1575 }
1576 }
1577 return status;
1578}
1579#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001580eHalStatus csrInitGetChannels(tpAniSirGlobal pMac)
1581{
1582 eHalStatus status = eHAL_STATUS_SUCCESS;
1583 tANI_U8 num20MHzChannelsFound = 0;
1584 VOS_STATUS vosStatus;
1585 tANI_U8 Index = 0;
1586 tANI_U8 num40MHzChannelsFound = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001587
Jeff Johnson295189b2012-06-20 16:38:30 -07001588
1589 //TODO: this interface changed to include the 40MHz channel list
1590 // this needs to be tied into the adapter structure somehow and referenced appropriately for CB operation
1591 // Read the scan channel list (including the power limit) from EEPROM
1592 vosStatus = vos_nv_getChannelListWithPower( pMac->scan.defaultPowerTable, &num20MHzChannelsFound,
1593 pMac->scan.defaultPowerTable40MHz, &num40MHzChannelsFound);
1594 if ( (VOS_STATUS_SUCCESS != vosStatus) || (num20MHzChannelsFound == 0) )
1595 {
1596 smsLog( pMac, LOGE, FL("failed to get channels \n"));
1597 status = eHAL_STATUS_FAILURE;
1598 }
1599 else
1600 {
1601 if ( num20MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN )
1602 {
1603 num20MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1604 }
1605 pMac->scan.numChannelsDefault = num20MHzChannelsFound;
1606 // Move the channel list to the global data
1607 // structure -- this will be used as the scan list
1608 for ( Index = 0; Index < num20MHzChannelsFound; Index++)
1609 {
1610#ifdef FEATURE_WLAN_INTEGRATED_SOC /* Need to fix this while dealing with NV item */
1611 pMac->scan.base20MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable[ Index ].chanId;
1612#else
1613 pMac->scan.base20MHzChannels.channelList[ Index ] = Index + 1;
1614 pMac->scan.defaultPowerTable[Index].chanId = Index + 1;
1615 pMac->scan.defaultPowerTable[Index].pwr = 25;
1616#endif
1617 }
1618 pMac->scan.base20MHzChannels.numChannels = num20MHzChannelsFound;
1619 if(num40MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN)
1620 {
1621 num40MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1622 }
1623 for ( Index = 0; Index < num40MHzChannelsFound; Index++)
1624 {
1625 pMac->scan.base40MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable40MHz[ Index ].chanId;
1626 }
1627 pMac->scan.base40MHzChannels.numChannels = num40MHzChannelsFound;
1628 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001629 return (status);
1630}
1631
Jeff Johnson295189b2012-06-20 16:38:30 -07001632eHalStatus csrInitChannelList( tHalHandle hHal )
1633{
1634 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1635 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001636 csrPruneChannelListForMode(pMac, &pMac->scan.baseChannels);
1637 csrPruneChannelListForMode(pMac, &pMac->scan.base20MHzChannels);
1638 // Apply the base channel list, power info, and set the Country code...
1639 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1640
1641 return (status);
1642}
Jeff Johnson295189b2012-06-20 16:38:30 -07001643eHalStatus csrChangeConfigParams(tpAniSirGlobal pMac,
1644 tCsrUpdateConfigParam *pUpdateConfigParam)
1645{
1646 eHalStatus status = eHAL_STATUS_FAILURE;
1647 tCsr11dinfo *ps11dinfo = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001648 ps11dinfo = &pUpdateConfigParam->Csr11dinfo;
1649 status = CsrInit11dInfo(pMac, ps11dinfo);
1650 return status;
1651}
1652
Jeff Johnson295189b2012-06-20 16:38:30 -07001653static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1654{
1655 eHalStatus status = eHAL_STATUS_FAILURE;
1656 tANI_U8 index;
1657 tANI_U32 count=0;
1658 tSirMacChanInfo *pChanInfo;
1659 tSirMacChanInfo *pChanInfoStart;
1660 tANI_BOOLEAN applyConfig = TRUE;
1661
1662 if(!ps11dinfo)
1663 {
1664 return (status);
1665 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001666 if ( ps11dinfo->Channels.numChannels && ( WNI_CFG_VALID_CHANNEL_LIST_LEN >= ps11dinfo->Channels.numChannels ) )
1667 {
1668 pMac->scan.base20MHzChannels.numChannels = ps11dinfo->Channels.numChannels;
1669 status = palCopyMemory(pMac->hHdd, pMac->scan.base20MHzChannels.channelList,
1670 ps11dinfo->Channels.channelList, ps11dinfo->Channels.numChannels);
1671 if(!HAL_STATUS_SUCCESS(status)) return (status);
1672 }
1673 else
1674 {
1675 //No change
1676 return (eHAL_STATUS_SUCCESS);
1677 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001678 //legacy maintenance
1679 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeDefault,
1680 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1681 if(!HAL_STATUS_SUCCESS(status)) return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -07001682 //Tush: at csropen get this initialized with default, during csr reset if this
1683 // already set with some value no need initilaize with default again
1684 if(0 == pMac->scan.countryCodeCurrent[0])
1685 {
1686 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
1687 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1688 if(!HAL_STATUS_SUCCESS(status)) return (status);
1689 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001690 // need to add the max power channel list
1691 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1692 {
1693 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1694 pChanInfoStart = pChanInfo;
Jeff Johnsone7245742012-09-05 17:12:55 -07001695 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1696 {
1697 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1698 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1699 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1700 pChanInfo++;
1701 count++;
1702 }
1703 if(count)
1704 {
1705 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1706 }
1707 palFreeMemory(pMac->hHdd, pChanInfoStart);
1708 }
1709 //Only apply them to CFG when not in STOP state. Otherwise they will be applied later
1710 if( HAL_STATUS_SUCCESS(status) )
1711 {
1712 for( index = 0; index < CSR_ROAM_SESSION_MAX; index++ )
1713 {
1714 if((CSR_IS_SESSION_VALID(pMac, index)) && CSR_IS_ROAM_STOP(pMac, index))
1715 {
1716 applyConfig = FALSE;
1717 }
1718 }
1719
1720 if(TRUE == applyConfig)
1721 {
1722 // Apply the base channel list, power info, and set the Country code...
1723 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1724 }
1725
1726 }
1727 return (status);
1728}
1729/* Initialize the Channel + Power List in the local cache and in the CFG */
1730eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1731{
1732 tANI_U8 index;
1733 tANI_U32 count=0;
1734 tSirMacChanInfo *pChanInfo;
1735 tSirMacChanInfo *pChanInfoStart;
1736
1737 if(!ps11dinfo || !pMac)
1738 {
1739 return eHAL_STATUS_FAILURE;
1740 }
1741
1742 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1743 {
1744 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1745 pChanInfoStart = pChanInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07001746
1747 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1748 {
1749 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1750 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1751 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1752 pChanInfo++;
1753 count++;
1754 }
1755 if(count)
1756 {
1757 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1758 }
1759 palFreeMemory(pMac->hHdd, pChanInfoStart);
1760 }
1761
Jeff Johnsone7245742012-09-05 17:12:55 -07001762 return eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001763}
1764
1765//pCommand may be NULL
1766//Pass in sessionId in case pCommand is NULL. sessionId is not used in case pCommand is not NULL.
1767void csrRoamRemoveDuplicateCommand(tpAniSirGlobal pMac, tANI_U32 sessionId, tSmeCmd *pCommand, eCsrRoamReason eRoamReason)
1768{
1769 tListElem *pEntry, *pNextEntry;
1770 tSmeCmd *pDupCommand;
1771 tDblLinkList localList;
1772
1773 vos_mem_zero(&localList, sizeof(tDblLinkList));
1774 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
1775 {
1776 smsLog(pMac, LOGE, FL(" failed to open list"));
1777 return;
1778 }
1779 csrLLLock( &pMac->sme.smeCmdPendingList );
1780 pEntry = csrLLPeekHead( &pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK );
1781 while( pEntry )
1782 {
1783 pNextEntry = csrLLNext( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK );
1784 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07001785 // Remove the previous command if..
1786 // - the new roam command is for the same RoamReason...
1787 // - the new roam command is a NewProfileList.
1788 // - the new roam command is a Forced Dissoc
1789 // - the new roam command is from an 802.11 OID (OID_SSID or OID_BSSID).
1790 if (
1791 (pCommand && ( pCommand->sessionId == pDupCommand->sessionId ) &&
1792 ((pCommand->command == pDupCommand->command) &&
1793 (pCommand->u.roamCmd.roamReason == pDupCommand->u.roamCmd.roamReason ||
1794 eCsrForcedDisassoc == pCommand->u.roamCmd.roamReason ||
1795 eCsrHddIssued == pCommand->u.roamCmd.roamReason)))
1796 ||
1797 //below the pCommand is NULL
Jeff Johnson43971f52012-07-17 12:26:56 -07001798 ( (sessionId == pDupCommand->sessionId) &&
1799 (eSmeCommandRoam == pDupCommand->command) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07001800 ((eCsrForcedDisassoc == eRoamReason) ||
1801 (eCsrHddIssued == eRoamReason))
1802 )
1803 )
1804 {
1805 smsLog(pMac, LOGW, FL(" roamReason = %d\n"), pDupCommand->u.roamCmd.roamReason);
1806 // Remove the 'stale' roam command from the pending list...
1807 if(csrLLRemoveEntry( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK ))
1808 {
1809 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
1810 }
1811 }
1812 pEntry = pNextEntry;
1813 }
1814 csrLLUnlock( &pMac->sme.smeCmdPendingList );
1815
1816 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
1817 {
1818 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
1819 //Tell caller that the command is cancelled
1820 csrRoamCallCallback(pMac, pDupCommand->sessionId, NULL, pDupCommand->u.roamCmd.roamId,
1821 eCSR_ROAM_CANCELLED, eCSR_ROAM_RESULT_NONE);
1822 csrReleaseCommandRoam(pMac, pDupCommand);
1823 }
1824 csrLLClose(&localList);
1825}
Jeff Johnson295189b2012-06-20 16:38:30 -07001826eHalStatus csrRoamCallCallback(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo,
1827 tANI_U32 roamId, eRoamCmdStatus u1, eCsrRoamResult u2)
1828{
1829 eHalStatus status = eHAL_STATUS_SUCCESS;
1830#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1831 WLAN_VOS_DIAG_EVENT_DEF(connectionStatus, vos_event_wlan_status_payload_type);
1832#endif
1833 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07001834 if( CSR_IS_SESSION_VALID( pMac, sessionId) )
1835 {
1836 pSession = CSR_GET_SESSION( pMac, sessionId );
1837 }
1838 else
1839 {
1840 smsLog(pMac, LOGE, "Session ID:%d is not valid\n", sessionId);
1841 VOS_ASSERT(0);
1842 return eHAL_STATUS_FAILURE;
1843 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001844 if(eCSR_ROAM_ASSOCIATION_COMPLETION == u1 && pRoamInfo)
1845 {
1846 smsLog(pMac, LOGW, " Assoc complete result = %d statusCode = %d reasonCode = %d\n", u2, pRoamInfo->statusCode, pRoamInfo->reasonCode);
1847 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001848 if ( (pSession == NULL) ||
1849 (eANI_BOOLEAN_FALSE == pSession->sessionActive) )
1850 {
1851 smsLog(pMac, LOG1, "Session ID is not valid\n");
1852 return eHAL_STATUS_FAILURE;
1853 }
1854
1855 if(NULL != pSession->callback)
1856 {
1857 if( pRoamInfo )
1858 {
1859 pRoamInfo->sessionId = (tANI_U8)sessionId;
1860 }
1861
1862 /* avoid holding the global lock when making the roaming callback , original change came
1863 from a raised CR (CR304874). Since this callback is in HDD a potential deadlock
1864 is possible on other OS ports where the callback may need to take locks to protect
1865 HDD state
1866 UPDATE : revert this change but keep the comments here. Need to revisit as there are callbacks
1867 that may actually depend on the lock being held */
1868 // TODO: revisit: sme_ReleaseGlobalLock( &pMac->sme );
1869 status = pSession->callback(pSession->pContext, pRoamInfo, roamId, u1, u2);
1870 // TODO: revisit: sme_AcquireGlobalLock( &pMac->sme );
1871 }
1872 //EVENT_WLAN_STATUS: eCSR_ROAM_ASSOCIATION_COMPLETION,
1873 // eCSR_ROAM_LOSTLINK, eCSR_ROAM_DISASSOCIATED,
1874#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1875 palZeroMemory(pMac->hHdd, &connectionStatus, sizeof(vos_event_wlan_status_payload_type));
1876 if((eCSR_ROAM_ASSOCIATION_COMPLETION == u1) && (eCSR_ROAM_RESULT_ASSOCIATED == u2))
1877 {
1878 connectionStatus.eventId = eCSR_WLAN_STATUS_CONNECT;
1879 connectionStatus.bssType = pRoamInfo->u.pConnectedProfile->BSSType;
1880 if(NULL != pRoamInfo->pBssDesc)
1881 {
1882 connectionStatus.rssi = pRoamInfo->pBssDesc->rssi * (-1);
1883 connectionStatus.channel = pRoamInfo->pBssDesc->channelId;
1884 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001885 connectionStatus.qosCapability = pRoamInfo->u.pConnectedProfile->qosConnection;
1886 connectionStatus.authType = (v_U8_t)diagAuthTypeFromCSRType(pRoamInfo->u.pConnectedProfile->AuthType);
1887 connectionStatus.encryptionType = (v_U8_t)diagEncTypeFromCSRType(pRoamInfo->u.pConnectedProfile->EncryptionType);
1888 palCopyMemory(pMac->hHdd, connectionStatus.ssid, pRoamInfo->u.pConnectedProfile->SSID.ssId, 6);
1889 connectionStatus.reason = eCSR_REASON_UNSPECIFIED;
1890 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1891 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001892 if((eCSR_ROAM_MIC_ERROR_IND == u1) || (eCSR_ROAM_RESULT_MIC_FAILURE == u2))
1893 {
1894 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1895 connectionStatus.reason = eCSR_REASON_MIC_ERROR;
1896 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1897 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001898 if(eCSR_ROAM_RESULT_FORCED == u2)
1899 {
1900 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1901 connectionStatus.reason = eCSR_REASON_USER_REQUESTED;
1902 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1903 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001904 if(eCSR_ROAM_RESULT_DISASSOC_IND == u2)
1905 {
1906 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1907 connectionStatus.reason = eCSR_REASON_DISASSOC;
1908 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1909 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001910 if(eCSR_ROAM_RESULT_DEAUTH_IND == u2)
1911 {
1912 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1913 connectionStatus.reason = eCSR_REASON_DEAUTH;
1914 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1915 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001916#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
1917
1918 return (status);
1919}
Jeff Johnson295189b2012-06-20 16:38:30 -07001920// Returns whether handoff is currently in progress or not
1921tANI_BOOLEAN csrRoamIsHandoffInProgress(tpAniSirGlobal pMac)
1922{
1923#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1924 return csrNeighborRoamIsHandoffInProgress(pMac);
1925#else
1926 return eANI_BOOLEAN_FALSE;
1927#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001928}
Jeff Johnson295189b2012-06-20 16:38:30 -07001929eHalStatus csrRoamIssueDisassociate( tpAniSirGlobal pMac, tANI_U32 sessionId,
1930 eCsrRoamSubState NewSubstate, tANI_BOOLEAN fMICFailure )
1931{
1932 eHalStatus status = eHAL_STATUS_SUCCESS;
1933 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1934 tANI_U16 reasonCode;
1935 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07001936
1937 if(!pSession)
1938 {
1939 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
1940 return eHAL_STATUS_FAILURE;
1941 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001942
1943 //Restore AC weight in case we change it
1944 if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
1945 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07001946 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 -07001947 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
1948 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
1949 }
1950
1951 if ( fMICFailure )
1952 {
1953 reasonCode = eSIR_MAC_MIC_FAILURE_REASON;
1954 }
1955 else if (NewSubstate == eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF)
1956 {
1957 reasonCode = eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON;
1958 } else
1959 {
1960 reasonCode = eSIR_MAC_UNSPEC_FAILURE_REASON;
1961 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001962#ifdef WLAN_FEATURE_VOWIFI_11R
1963 if ( (csrRoamIsHandoffInProgress(pMac)) &&
1964 (NewSubstate != eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF))
1965 {
1966 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
1967 palCopyMemory(pMac->hHdd, &bssId, pNeighborRoamInfo->csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001968 } else
1969#endif
1970 if(pSession->pConnectBssDesc)
1971 {
1972 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
1973 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001974
Jeff Johnson295189b2012-06-20 16:38:30 -07001975
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07001976 smsLog( pMac, LOG1, "CSR Attempting to Disassociate Bssid= %02x-%02x-%02x-%02x-%02x-%02x subState = %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07001977 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
1978 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ], NewSubstate );
Jeff Johnson295189b2012-06-20 16:38:30 -07001979 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
1980
1981 status = csrSendMBDisassocReqMsg( pMac, sessionId, bssId, reasonCode );
1982
1983 if(HAL_STATUS_SUCCESS(status))
1984 {
1985 csrRoamLinkDown(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07001986#ifndef WLAN_MDM_CODE_REDUCTION_OPT
1987 //no need to tell QoS that we are disassociating, it will be taken care off in assoc req for HO
1988 if(eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF != NewSubstate)
1989 {
1990 //Tush-QoS: notify QoS module that disassoc happening
1991 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
1992 }
1993#endif
1994 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001995 return (status);
1996}
Jeff Johnson295189b2012-06-20 16:38:30 -07001997#ifdef WLAN_SOFTAP_FEATURE
1998
Jeff Johnson295189b2012-06-20 16:38:30 -07001999/* ---------------------------------------------------------------------------
2000 \fn csrRoamIssueDisassociateStaCmd
2001 \brief csr function that HDD calls to disassociate a associated station
2002 \param sessionId - session Id for Soft AP
2003 \param pPeerMacAddr - MAC of associated station to delete
2004 \param reason - reason code, be one of the tSirMacReasonCodes
2005 \return eHalStatus
2006 ---------------------------------------------------------------------------*/
2007eHalStatus csrRoamIssueDisassociateStaCmd( tpAniSirGlobal pMac,
2008 tANI_U32 sessionId,
2009 tANI_U8 *pPeerMacAddr,
2010 tANI_U32 reason)
2011{
2012 eHalStatus status = eHAL_STATUS_SUCCESS;
2013 tSmeCmd *pCommand;
2014
2015 do
2016 {
2017 pCommand = csrGetCommandBuffer( pMac );
2018 if ( !pCommand )
2019 {
2020 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2021 status = eHAL_STATUS_RESOURCES;
2022 break;
2023 }
2024 pCommand->command = eSmeCommandRoam;
2025 pCommand->sessionId = (tANI_U8)sessionId;
2026 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocSta;
2027 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2028 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2029 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2030 if( !HAL_STATUS_SUCCESS( status ) )
2031 {
2032 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2033 csrReleaseCommandRoam( pMac, pCommand );
2034 }
2035 }while(0);
2036
2037 return status;
2038}
2039
2040
Jeff Johnson295189b2012-06-20 16:38:30 -07002041/* ---------------------------------------------------------------------------
2042 \fn csrRoamIssueDeauthSta
2043 \brief csr function that HDD calls to delete a associated station
2044 \param sessionId - session Id for Soft AP
2045 \param pPeerMacAddr - MAC of associated station to delete
2046 \param reason - reason code, be one of the tSirMacReasonCodes
2047 \return eHalStatus
2048 ---------------------------------------------------------------------------*/
2049eHalStatus csrRoamIssueDeauthStaCmd( tpAniSirGlobal pMac,
2050 tANI_U32 sessionId,
2051 tANI_U8 *pPeerMacAddr,
2052 tANI_U32 reason)
2053{
2054 eHalStatus status = eHAL_STATUS_SUCCESS;
2055 tSmeCmd *pCommand;
2056
2057 do
2058 {
2059 pCommand = csrGetCommandBuffer( pMac );
2060 if ( !pCommand )
2061 {
2062 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2063 status = eHAL_STATUS_RESOURCES;
2064 break;
2065 }
2066 pCommand->command = eSmeCommandRoam;
2067 pCommand->sessionId = (tANI_U8)sessionId;
2068 pCommand->u.roamCmd.roamReason = eCsrForcedDeauthSta;
2069 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2070 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2071 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2072 if( !HAL_STATUS_SUCCESS( status ) )
2073 {
2074 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2075 csrReleaseCommandRoam( pMac, pCommand );
2076 }
2077 }while(0);
2078
2079 return status;
2080}
Jeff Johnson295189b2012-06-20 16:38:30 -07002081eHalStatus
2082csrRoamIssueTkipCounterMeasures( tpAniSirGlobal pMac, tANI_U32 sessionId,
2083 tANI_BOOLEAN bEnable )
2084{
2085 eHalStatus status = eHAL_STATUS_FAILURE;
2086 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2087 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002088 if (!pSession)
2089 {
2090 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:CSR Session not found\n");
2091 return (status);
2092 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002093 if (pSession->pConnectBssDesc)
2094 {
2095 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2096 }
2097 else
2098 {
2099 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:Connected BSS Description in CSR Session not found\n");
2100 return (status);
2101 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 smsLog( pMac, LOG2, "CSR issuing tkip counter measures for Bssid = %02x-%02x-%02x-%02x-%02x-%02x, Enable = %d\n",
2103 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2104 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] , bEnable);
Jeff Johnson295189b2012-06-20 16:38:30 -07002105 status = csrSendMBTkipCounterMeasuresReqMsg( pMac, sessionId, bEnable, bssId );
2106 return (status);
2107}
Jeff Johnson295189b2012-06-20 16:38:30 -07002108eHalStatus
2109csrRoamGetAssociatedStas( tpAniSirGlobal pMac, tANI_U32 sessionId,
2110 VOS_MODULE_ID modId, void *pUsrContext,
2111 void *pfnSapEventCallback, v_U8_t *pAssocStasBuf )
2112{
2113 eHalStatus status = eHAL_STATUS_SUCCESS;
2114 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2115 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002116 if (!pSession)
2117 {
2118 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:CSR Session not found\n");
2119 return (status);
2120 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002121 if(pSession->pConnectBssDesc)
2122 {
2123 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2124 }
2125 else
2126 {
2127 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:Connected BSS Description in CSR Session not found\n");
2128 return (status);
2129 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002130 smsLog( pMac, LOG2, "CSR getting associated stations for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2131 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2132 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002133 status = csrSendMBGetAssociatedStasReqMsg( pMac, sessionId, modId, bssId, pUsrContext, pfnSapEventCallback, pAssocStasBuf );
2134 return (status);
2135}
Jeff Johnson295189b2012-06-20 16:38:30 -07002136eHalStatus
2137csrRoamGetWpsSessionOverlap( tpAniSirGlobal pMac, tANI_U32 sessionId,
2138 void *pUsrContext, void *pfnSapEventCallback, v_MACADDR_t pRemoveMac )
2139{
2140 eHalStatus status = eHAL_STATUS_SUCCESS;
2141 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2142 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2143
2144 if (!pSession)
2145 {
2146 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:CSR Session not found\n");
2147 return (status);
2148 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002149 if(pSession->pConnectBssDesc)
2150 {
2151 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2152 }
2153 else
2154 {
2155 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:Connected BSS Description in CSR Session not found\n");
2156 return (status);
2157 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002158 smsLog( pMac, LOG2, "CSR getting WPS Session Overlap for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2159 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2160 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
2161
2162 status = csrSendMBGetWPSPBCSessions( pMac, sessionId, bssId, pUsrContext, pfnSapEventCallback, pRemoveMac);
2163
2164 return (status);
2165}
Jeff Johnson295189b2012-06-20 16:38:30 -07002166#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002167eHalStatus csrRoamIssueDeauth( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
2168{
2169 eHalStatus status = eHAL_STATUS_SUCCESS;
2170 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2171 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07002172
2173 if (!pSession)
2174 {
2175 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2176 return eHAL_STATUS_FAILURE;
2177 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002178
2179 if(pSession->pConnectBssDesc)
2180 {
2181 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2182 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002183 smsLog( pMac, LOG2, "CSR Attempting to Deauth Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
2184 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2185 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002186 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
2187
2188 status = csrSendMBDeauthReqMsg( pMac, sessionId, bssId, eSIR_MAC_DISASSOC_LEAVING_BSS_REASON );
2189
2190 return (status);
2191}
2192
Jeff Johnson295189b2012-06-20 16:38:30 -07002193eHalStatus csrRoamSaveConnectedBssDesc( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDesc )
2194{
2195 eHalStatus status = eHAL_STATUS_SUCCESS;
2196 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2197 tANI_U32 size;
Jeff Johnson32d95a32012-09-10 13:15:23 -07002198
2199 if(!pSession)
2200 {
2201 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2202 return eHAL_STATUS_FAILURE;
2203 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002204
2205 // If no BSS description was found in this connection (happens with start IBSS), then
2206 // nix the BSS description that we keep around for the connected BSS) and get out...
2207 if(NULL == pBssDesc)
2208 {
2209 csrFreeConnectBssDesc(pMac, sessionId);
2210 }
2211 else
2212 {
2213 size = pBssDesc->length + sizeof( pBssDesc->length );
2214 if(NULL != pSession->pConnectBssDesc)
2215 {
2216 if(((pSession->pConnectBssDesc->length) + sizeof(pSession->pConnectBssDesc->length)) < size)
2217 {
2218 //not enough room for the new BSS, pMac->roam.pConnectBssDesc is freed inside
2219 csrFreeConnectBssDesc(pMac, sessionId);
2220 }
2221 }
2222 if(NULL == pSession->pConnectBssDesc)
2223 {
2224 status = palAllocateMemory( pMac->hHdd, (void **)&pSession->pConnectBssDesc, size);
2225 }
2226 if ( HAL_STATUS_SUCCESS(status) && pSession->pConnectBssDesc )
2227 {
2228 palCopyMemory( pMac->hHdd, pSession->pConnectBssDesc, pBssDesc, size );
2229 }
2230 }
2231
2232 return (status);
2233}
2234
Jeff Johnson295189b2012-06-20 16:38:30 -07002235eHalStatus csrRoamPrepareBssConfig(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2236 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
2237 tDot11fBeaconIEs *pIes)
2238{
2239 eHalStatus status = eHAL_STATUS_SUCCESS;
2240 eCsrCfgDot11Mode cfgDot11Mode;
Jeff Johnson295189b2012-06-20 16:38:30 -07002241#if defined(VOSS_ENABLED)
2242 VOS_ASSERT( pIes != NULL );
2243#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07002244
Jeff Johnson295189b2012-06-20 16:38:30 -07002245 do
2246 {
2247 palCopyMemory(pMac->hHdd, &pBssConfig->BssCap, &pBssDesc->capabilityInfo, sizeof(tSirMacCapabilityInfo));
2248 //get qos
2249 pBssConfig->qosType = csrGetQoSFromBssDesc(pMac, pBssDesc, pIes);
2250 //get SSID
2251 if(pIes->SSID.present)
2252 {
2253 palCopyMemory(pMac->hHdd, &pBssConfig->SSID.ssId, pIes->SSID.ssid, pIes->SSID.num_ssid);
2254 pBssConfig->SSID.length = pIes->SSID.num_ssid;
2255 }
2256 else
2257 pBssConfig->SSID.length = 0;
2258 if(csrIsNULLSSID(pBssConfig->SSID.ssId, pBssConfig->SSID.length))
2259 {
2260 smsLog(pMac, LOGW, " BSS desc SSID is a wildcard\n");
2261 //Return failed if profile doesn't have an SSID either.
2262 if(pProfile->SSIDs.numOfSSIDs == 0)
2263 {
2264 smsLog(pMac, LOGW, " Both BSS desc and profile doesn't have SSID\n");
2265 status = eHAL_STATUS_FAILURE;
2266 break;
2267 }
2268 }
2269 if(CSR_IS_CHANNEL_5GHZ(pBssDesc->channelId))
2270 {
2271 pBssConfig->eBand = eCSR_BAND_5G;
2272 }
2273 else
2274 {
2275 pBssConfig->eBand = eCSR_BAND_24;
2276 }
2277 //phymode
2278 if(csrIsPhyModeMatch( pMac, pProfile->phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes ))
2279 {
2280 pBssConfig->uCfgDot11Mode = cfgDot11Mode;
2281 }
2282 else
2283 {
2284 smsLog(pMac, LOGW, " Can not find match phy mode\n");
2285 //force it
2286 if(eCSR_BAND_24 == pBssConfig->eBand)
2287 {
2288 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2289 }
2290 else
2291 {
2292 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2293 }
2294 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002295 //Qos
2296 if ((pBssConfig->uCfgDot11Mode != eCSR_CFG_DOT11_MODE_11N) &&
2297 (pMac->roam.configParam.WMMSupportMode == eCsrRoamWmmNoQos))
2298 {
2299 //Joining BSS is not 11n capable and WMM is disabled on client.
2300 //Disable QoS and WMM
2301 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2302 }
2303
2304 //auth type
2305 switch( pProfile->negotiatedAuthType )
2306 {
2307 default:
2308 case eCSR_AUTH_TYPE_WPA:
2309 case eCSR_AUTH_TYPE_WPA_PSK:
2310 case eCSR_AUTH_TYPE_WPA_NONE:
2311 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2312 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2313 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002314 case eCSR_AUTH_TYPE_SHARED_KEY:
2315 pBssConfig->authType = eSIR_SHARED_KEY;
2316 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002317 case eCSR_AUTH_TYPE_AUTOSWITCH:
2318 pBssConfig->authType = eSIR_AUTO_SWITCH;
2319 break;
2320 }
2321 //short slot time
2322 if( eCSR_CFG_DOT11_MODE_11B != cfgDot11Mode )
2323 {
2324 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2325 }
2326 else
2327 {
2328 pBssConfig->uShortSlotTime = 0;
2329 }
2330 if(pBssConfig->BssCap.ibss)
2331 {
2332 //We don't support 11h on IBSS
2333 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2334 }
2335 else
2336 {
2337 pBssConfig->f11hSupport = pMac->roam.configParam.Is11hSupportEnabled;
2338 }
2339 //power constraint
2340 pBssConfig->uPowerLimit = csrGet11hPowerConstraint(pMac, &pIes->PowerConstraints);
2341 //heartbeat
2342 if ( CSR_IS_11A_BSS( pBssDesc ) )
2343 {
2344 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2345 }
2346 else
2347 {
2348 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2349 }
2350 //Join timeout
2351 // if we find a BeaconInterval in the BssDescription, then set the Join Timeout to
Jeff Johnsone7245742012-09-05 17:12:55 -07002352 // be 10 x the BeaconInterval.
Jeff Johnson295189b2012-06-20 16:38:30 -07002353 if ( pBssDesc->beaconInterval )
2354 {
2355 //Make sure it is bigger than the minimal
Jeff Johnsone7245742012-09-05 17:12:55 -07002356 pBssConfig->uJoinTimeOut = CSR_ROAM_MAX(10 * pBssDesc->beaconInterval, CSR_JOIN_FAILURE_TIMEOUT_MIN);
Jeff Johnson295189b2012-06-20 16:38:30 -07002357 }
2358 else
2359 {
2360 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
2361 }
2362 //validate CB
2363 pBssConfig->cbMode = csrGetCBModeFromIes(pMac, pBssDesc->channelId, pIes);
2364 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002365 return (status);
2366}
2367
Jeff Johnson295189b2012-06-20 16:38:30 -07002368static eHalStatus csrRoamPrepareBssConfigFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2369 tBssConfigParam *pBssConfig, tSirBssDescription *pBssDesc)
2370{
2371 eHalStatus status = eHAL_STATUS_SUCCESS;
2372 tANI_U8 operationChannel = 0;
2373 tANI_U8 qAPisEnabled = FALSE;
2374 //SSID
2375 pBssConfig->SSID.length = 0;
2376 if(pProfile->SSIDs.numOfSSIDs)
2377 {
2378 //only use the first one
2379 palCopyMemory(pMac->hHdd, &pBssConfig->SSID, &pProfile->SSIDs.SSIDList[0].SSID, sizeof(tSirMacSSid));
2380 }
2381 else
2382 {
2383 //SSID must present
2384 return eHAL_STATUS_FAILURE;
2385 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002386 //Settomg up the capabilities
2387 if( csrIsBssTypeIBSS(pProfile->BSSType) )
2388 {
2389 pBssConfig->BssCap.ibss = 1;
2390 }
2391 else
2392 {
2393 pBssConfig->BssCap.ess = 1;
2394 }
2395 if( eCSR_ENCRYPT_TYPE_NONE != pProfile->EncryptionType.encryptionType[0] )
2396 {
2397 pBssConfig->BssCap.privacy = 1;
2398 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002399 pBssConfig->eBand = pMac->roam.configParam.eBand;
2400 //phymode
2401 if(pProfile->ChannelInfo.ChannelList)
2402 {
2403 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2404 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002405#ifdef WLAN_SOFTAP_FEATURE
2406 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, operationChannel,
2407 &pBssConfig->eBand);
2408#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002409 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel,
2410 &pBssConfig->eBand);
2411#endif
2412 //QOS
2413 //Is this correct to always set to this //***
Jeff Johnson295189b2012-06-20 16:38:30 -07002414 if ( pBssConfig->BssCap.ess == 1 )
2415 {
2416#ifdef WLAN_SOFTAP_FEATURE
2417 /*For Softap case enable WMM*/
2418 if(CSR_IS_INFRA_AP(pProfile) && (eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode )){
2419 qAPisEnabled = TRUE;
2420 }
2421 else
2422#endif
2423 if (csrRoamGetQosInfoFromBss(pMac, pBssDesc) == eHAL_STATUS_SUCCESS) {
2424 qAPisEnabled = TRUE;
2425 } else {
2426 qAPisEnabled = FALSE;
2427 }
2428 } else {
2429 qAPisEnabled = TRUE;
2430 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002431 if (( eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode && qAPisEnabled) ||
2432 (( eCSR_CFG_DOT11_MODE_11N == pBssConfig->uCfgDot11Mode && qAPisEnabled) ||
2433 ( eCSR_CFG_DOT11_MODE_TAURUS == pBssConfig->uCfgDot11Mode ) ) //For 11n, need QoS
2434 )
2435 {
2436 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP;
2437 } else {
2438 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2439 }
2440
2441 //auth type
2442 switch( pProfile->AuthType.authType[0] ) //Take the prefered Auth type.
2443 {
2444 default:
2445 case eCSR_AUTH_TYPE_WPA:
2446 case eCSR_AUTH_TYPE_WPA_PSK:
2447 case eCSR_AUTH_TYPE_WPA_NONE:
2448 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2449 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2450 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002451 case eCSR_AUTH_TYPE_SHARED_KEY:
2452 pBssConfig->authType = eSIR_SHARED_KEY;
2453 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002454 case eCSR_AUTH_TYPE_AUTOSWITCH:
2455 pBssConfig->authType = eSIR_AUTO_SWITCH;
2456 break;
2457 }
2458 //short slot time
2459 if( WNI_CFG_PHY_MODE_11B != pBssConfig->uCfgDot11Mode )
2460 {
2461 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2462 }
2463 else
2464 {
2465 pBssConfig->uShortSlotTime = 0;
2466 }
2467 //power constraint. We don't support 11h on IBSS
2468 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2469 pBssConfig->uPowerLimit = 0;
2470 //heartbeat
2471 if ( eCSR_BAND_5G == pBssConfig->eBand )
2472 {
2473 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2474 }
2475 else
2476 {
2477 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2478 }
2479 //Join timeout
2480 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
Jeff Johnsone7245742012-09-05 17:12:55 -07002481
Jeff Johnson295189b2012-06-20 16:38:30 -07002482 return (status);
2483}
Jeff Johnson295189b2012-06-20 16:38:30 -07002484static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc)
2485{
2486 eHalStatus status = eHAL_STATUS_FAILURE;
2487 tDot11fBeaconIEs *pIes = NULL;
2488
2489 do
2490 {
2491 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIes)))
2492 {
2493 //err msg
2494 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
2495 "csrRoamGetQosInfoFromBss() failed\n");
Jeff Johnson295189b2012-06-20 16:38:30 -07002496 break;
2497 }
2498 //check if the AP is QAP & it supports APSD
2499 if( CSR_IS_QOS_BSS(pIes) )
2500 {
2501 return eHAL_STATUS_SUCCESS;
2502 }
2503 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002504 return status;
2505}
2506
Jeff Johnson295189b2012-06-20 16:38:30 -07002507void csrSetCfgPrivacy( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, tANI_BOOLEAN fPrivacy )
2508{
Jeff Johnson295189b2012-06-20 16:38:30 -07002509 // !! Note: the only difference between this function and the csrSetCfgPrivacyFromProfile() is the
2510 // setting of the privacy CFG based on the advertised privacy setting from the AP for WPA associations.
2511 // See !!Note: below in this function...
2512 tANI_U32 PrivacyEnabled = 0;
2513 tANI_U32 RsnEnabled = 0;
2514 tANI_U32 WepDefaultKeyId = 0;
2515 tANI_U32 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5; /* default 40 bits */
2516 tANI_U32 Key0Length = 0;
2517 tANI_U32 Key1Length = 0;
2518 tANI_U32 Key2Length = 0;
2519 tANI_U32 Key3Length = 0;
2520
2521 // Reserve for the biggest key
2522 tANI_U8 Key0[ WNI_CFG_WEP_DEFAULT_KEY_1_LEN ];
2523 tANI_U8 Key1[ WNI_CFG_WEP_DEFAULT_KEY_2_LEN ];
2524 tANI_U8 Key2[ WNI_CFG_WEP_DEFAULT_KEY_3_LEN ];
2525 tANI_U8 Key3[ WNI_CFG_WEP_DEFAULT_KEY_4_LEN ];
2526
2527 switch ( pProfile->negotiatedUCEncryptionType )
2528 {
2529 case eCSR_ENCRYPT_TYPE_NONE:
2530
2531 // for NO encryption, turn off Privacy and Rsn.
2532 PrivacyEnabled = 0;
2533 RsnEnabled = 0;
2534
2535 // WEP key length and Wep Default Key ID don't matter in this case....
2536
2537 // clear out the WEP keys that may be hanging around.
2538 Key0Length = 0;
2539 Key1Length = 0;
2540 Key2Length = 0;
2541 Key3Length = 0;
2542
2543 break;
2544
2545 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
2546
2547 // Privacy is ON. NO RSN for Wep40 static key.
2548 PrivacyEnabled = 1;
2549 RsnEnabled = 0;
2550
2551 // Set the Wep default key ID.
2552 WepDefaultKeyId = pProfile->Keys.defaultIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07002553 // Wep key size if 5 bytes (40 bits).
2554 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5;
2555
2556 // set encryption keys in the CFG database or clear those that are not present in this profile.
2557 if ( pProfile->Keys.KeyLength[0] )
2558 {
2559 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[0], WNI_CFG_WEP_KEY_LENGTH_5 );
2560 Key0Length = WNI_CFG_WEP_KEY_LENGTH_5;
2561 }
2562 else
2563 {
2564 Key0Length = 0;
2565 }
2566
2567 if ( pProfile->Keys.KeyLength[1] )
2568 {
2569 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[1], WNI_CFG_WEP_KEY_LENGTH_5 );
2570 Key1Length = WNI_CFG_WEP_KEY_LENGTH_5;
2571 }
2572 else
2573 {
2574 Key1Length = 0;
2575 }
2576
2577 if ( pProfile->Keys.KeyLength[2] )
2578 {
2579 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[2], WNI_CFG_WEP_KEY_LENGTH_5 );
2580 Key2Length = WNI_CFG_WEP_KEY_LENGTH_5;
2581 }
2582 else
2583 {
2584 Key2Length = 0;
2585 }
2586
2587 if ( pProfile->Keys.KeyLength[3] )
2588 {
2589 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[3], WNI_CFG_WEP_KEY_LENGTH_5 );
2590 Key3Length = WNI_CFG_WEP_KEY_LENGTH_5;
2591 }
2592 else
2593 {
2594 Key3Length = 0;
2595 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002596 break;
2597
2598 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
2599
2600 // Privacy is ON. NO RSN for Wep40 static key.
2601 PrivacyEnabled = 1;
2602 RsnEnabled = 0;
2603
2604 // Set the Wep default key ID.
2605 WepDefaultKeyId = pProfile->Keys.defaultIndex;
2606
2607 // Wep key size if 13 bytes (104 bits).
2608 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_13;
2609
2610 // set encryption keys in the CFG database or clear those that are not present in this profile.
2611 if ( pProfile->Keys.KeyLength[0] )
2612 {
2613 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[ 0 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2614 Key0Length = WNI_CFG_WEP_KEY_LENGTH_13;
2615 }
2616 else
2617 {
2618 Key0Length = 0;
2619 }
2620
2621 if ( pProfile->Keys.KeyLength[1] )
2622 {
2623 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[ 1 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2624 Key1Length = WNI_CFG_WEP_KEY_LENGTH_13;
2625 }
2626 else
2627 {
2628 Key1Length = 0;
2629 }
2630
2631 if ( pProfile->Keys.KeyLength[2] )
2632 {
2633 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[ 2 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2634 Key2Length = WNI_CFG_WEP_KEY_LENGTH_13;
2635 }
2636 else
2637 {
2638 Key2Length = 0;
2639 }
2640
2641 if ( pProfile->Keys.KeyLength[3] )
2642 {
2643 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[ 3 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2644 Key3Length = WNI_CFG_WEP_KEY_LENGTH_13;
2645 }
2646 else
2647 {
2648 Key3Length = 0;
2649 }
2650
2651 break;
2652
2653 case eCSR_ENCRYPT_TYPE_WEP40:
2654 case eCSR_ENCRYPT_TYPE_WEP104:
2655 case eCSR_ENCRYPT_TYPE_TKIP:
2656 case eCSR_ENCRYPT_TYPE_AES:
2657#ifdef FEATURE_WLAN_WAPI
2658 case eCSR_ENCRYPT_TYPE_WPI:
2659#endif /* FEATURE_WLAN_WAPI */
2660 // !! Note: this is the only difference between this function and the csrSetCfgPrivacyFromProfile()
2661 // (setting of the privacy CFG based on the advertised privacy setting from the AP for WPA/WAPI associations ).
2662 PrivacyEnabled = (0 != fPrivacy);
2663
2664 // turn on RSN enabled for WPA associations
2665 RsnEnabled = 1;
2666
2667 // WEP key length and Wep Default Key ID don't matter in this case....
2668
2669 // clear out the static WEP keys that may be hanging around.
2670 Key0Length = 0;
2671 Key1Length = 0;
2672 Key2Length = 0;
2673 Key3Length = 0;
2674
2675 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002676 default:
2677 PrivacyEnabled = 0;
2678 RsnEnabled = 0;
2679 break;
2680 }
2681
2682 ccmCfgSetInt(pMac, WNI_CFG_PRIVACY_ENABLED, PrivacyEnabled, NULL, eANI_BOOLEAN_FALSE);
2683 ccmCfgSetInt(pMac, WNI_CFG_RSN_ENABLED, RsnEnabled, NULL, eANI_BOOLEAN_FALSE);
2684 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_1, Key0, Key0Length, NULL, eANI_BOOLEAN_FALSE);
2685 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_2, Key1, Key1Length, NULL, eANI_BOOLEAN_FALSE);
2686 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_3, Key2, Key2Length, NULL, eANI_BOOLEAN_FALSE);
2687 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_4, Key3, Key3Length, NULL, eANI_BOOLEAN_FALSE);
2688 ccmCfgSetInt(pMac, WNI_CFG_WEP_KEY_LENGTH, WepKeyLength, NULL, eANI_BOOLEAN_FALSE);
2689 ccmCfgSetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, WepDefaultKeyId, NULL, eANI_BOOLEAN_FALSE);
2690}
2691
Jeff Johnson295189b2012-06-20 16:38:30 -07002692static void csrSetCfgSsid( tpAniSirGlobal pMac, tSirMacSSid *pSSID )
2693{
2694 tANI_U32 len = 0;
2695 if(pSSID->length <= WNI_CFG_SSID_LEN)
2696 {
2697 len = pSSID->length;
2698 }
2699 ccmCfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *)pSSID->ssId, len, NULL, eANI_BOOLEAN_FALSE);
2700}
2701
Jeff Johnson295189b2012-06-20 16:38:30 -07002702eHalStatus csrSetQosToCfg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrMediaAccessType qosType )
2703{
2704 eHalStatus status = eHAL_STATUS_SUCCESS;
2705 tANI_U32 QoSEnabled;
2706 tANI_U32 WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002707 // set the CFG enable/disable variables based on the qosType being configured...
2708 switch( qosType )
2709 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002710 case eCSR_MEDIUM_ACCESS_WMM_eDCF_802dot1p:
2711 QoSEnabled = FALSE;
2712 WmeEnabled = TRUE;
2713 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002714 case eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP:
2715 QoSEnabled = FALSE;
2716 WmeEnabled = TRUE;
2717 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002718 case eCSR_MEDIUM_ACCESS_WMM_eDCF_NoClassify:
2719 QoSEnabled = FALSE;
2720 WmeEnabled = TRUE;
2721 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002722 case eCSR_MEDIUM_ACCESS_11e_eDCF:
2723 QoSEnabled = TRUE;
2724 WmeEnabled = FALSE;
2725 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002726 case eCSR_MEDIUM_ACCESS_11e_HCF:
2727 QoSEnabled = TRUE;
2728 WmeEnabled = FALSE;
2729 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002730 default:
2731 case eCSR_MEDIUM_ACCESS_DCF:
2732 QoSEnabled = FALSE;
2733 WmeEnabled = FALSE;
2734 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002735 }
2736 //save the WMM setting for later use
2737 pMac->roam.roamSession[sessionId].fWMMConnection = (tANI_BOOLEAN)WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002738 status = ccmCfgSetInt(pMac, WNI_CFG_QOS_ENABLED, QoSEnabled, NULL, eANI_BOOLEAN_FALSE);
2739 status = ccmCfgSetInt(pMac, WNI_CFG_WME_ENABLED, WmeEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002740 return (status);
2741}
Jeff Johnson295189b2012-06-20 16:38:30 -07002742static eHalStatus csrGetRateSet( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tSirBssDescription *pBssDesc,
2743 tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet)
2744{
2745 eHalStatus status = eHAL_STATUS_FAILURE;
2746 int i;
2747 eCsrCfgDot11Mode cfgDot11Mode;
2748 tANI_U8 *pDstRate;
Jeff Johnson295189b2012-06-20 16:38:30 -07002749 palZeroMemory(pMac->hHdd, pOpRateSet, sizeof(tSirMacRateSet));
2750 palZeroMemory(pMac->hHdd, pExRateSet, sizeof(tSirMacRateSet));
Jeff Johnson295189b2012-06-20 16:38:30 -07002751#if defined(VOSS_ENABLED)
2752 VOS_ASSERT( pIes != NULL );
2753#endif
2754
2755 if( NULL != pIes )
2756 {
2757 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002758 // Originally, we thought that for 11a networks, the 11a rates are always
2759 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2760 // appear in the Operational Rate set. Consequently, in either case, we
2761 // would blindly put the rates we support into our Operational Rate set
2762 // (including the basic rates, which we have already verified are
2763 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002764 // However, it turns out that this is not always the case. Some AP's
2765 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2766 // too. Now, we're a little more careful:
2767 pDstRate = pOpRateSet->rate;
2768 if(pIes->SuppRates.present)
2769 {
2770 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2771 {
2772 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) )
2773 {
2774 *pDstRate++ = pIes->SuppRates.rates[ i ];
2775 pOpRateSet->numRates++;;
2776 }
2777 }
2778 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002779 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2780 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2781 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2782 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2783 {
2784 // If there are Extended Rates in the beacon, we will reflect those
2785 // extended rates that we support in out Extended Operational Rate
2786 // set:
2787 pDstRate = pExRateSet->rate;
2788 if(pIes->ExtSuppRates.present)
2789 {
2790 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2791 {
2792 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) )
2793 {
2794 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2795 pExRateSet->numRates++;
2796 }
2797 }
2798 }
2799 }
2800 }//Parsing BSSDesc
2801 else
2802 {
2803 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2804 }
2805 if (pOpRateSet->numRates > 0 || pExRateSet->numRates > 0) status = eHAL_STATUS_SUCCESS;
2806 return status;
2807}
2808
2809static void csrSetCfgRateSet( tpAniSirGlobal pMac, eCsrPhyMode phyMode, tCsrRoamProfile *pProfile,
2810 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
2811{
2812 int i;
2813 tANI_U8 *pDstRate;
2814 eCsrCfgDot11Mode cfgDot11Mode;
2815 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2816 tANI_U32 OperationalRatesLength = 0;
2817 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2818 tANI_U32 ExtendedOperationalRatesLength = 0;
2819 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2820 tANI_U32 ProprietaryOperationalRatesLength = 0;
2821 tANI_U32 PropRatesEnable = 0;
2822 tANI_U8 MCSRateIdxSet[ SIZE_OF_SUPPORTED_MCS_SET ];
2823 tANI_U32 MCSRateLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002824#if defined(VOSS_ENABLED)
2825 VOS_ASSERT( pIes != NULL );
2826#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002827 if( NULL != pIes )
2828 {
2829 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002830 // Originally, we thought that for 11a networks, the 11a rates are always
2831 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2832 // appear in the Operational Rate set. Consequently, in either case, we
2833 // would blindly put the rates we support into our Operational Rate set
2834 // (including the basic rates, which we have already verified are
2835 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002836 // However, it turns out that this is not always the case. Some AP's
2837 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2838 // too. Now, we're a little more careful:
2839 pDstRate = OperationalRates;
2840 if(pIes->SuppRates.present)
2841 {
2842 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2843 {
2844 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) &&
2845 ( OperationalRatesLength < CSR_DOT11_SUPPORTED_RATES_MAX ))
2846 {
2847 *pDstRate++ = pIes->SuppRates.rates[ i ];
2848 OperationalRatesLength++;
2849 }
2850 }
2851 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002852 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2853 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2854 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2855 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2856 {
2857 // If there are Extended Rates in the beacon, we will reflect those
2858 // extended rates that we support in out Extended Operational Rate
2859 // set:
2860 pDstRate = ExtendedOperationalRates;
2861 if(pIes->ExtSuppRates.present)
2862 {
2863 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2864 {
2865 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) &&
2866 ( ExtendedOperationalRatesLength < CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ))
2867 {
2868 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2869 ExtendedOperationalRatesLength++;
2870 }
2871 }
2872 }
2873 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002874 // Enable proprietary MAC features if peer node is Airgo node and STA
2875 // user wants to use them
2876 if( pIes->Airgo.present && pMac->roam.configParam.ProprietaryRatesEnabled )
2877 {
2878 PropRatesEnable = 1;
2879 }
2880 else
2881 {
2882 PropRatesEnable = 0;
2883 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002884 // For ANI network companions, we need to populate the proprietary rate
2885 // set with any proprietary rates we found in the beacon, only if user
2886 // allows them...
2887 if ( PropRatesEnable && pIes->Airgo.PropSuppRates.present &&
2888 ( pIes->Airgo.PropSuppRates.num_rates > 0 ))
2889 {
2890 ProprietaryOperationalRatesLength = pIes->Airgo.PropSuppRates.num_rates;
2891 if ( ProprietaryOperationalRatesLength > sizeof(ProprietaryOperationalRates) )
2892 {
2893 ProprietaryOperationalRatesLength = sizeof (ProprietaryOperationalRates);
2894 }
2895 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates, pIes->Airgo.PropSuppRates.rates, ProprietaryOperationalRatesLength );
2896 }
2897 else {
2898 // No proprietary modes...
2899 ProprietaryOperationalRatesLength = 0;
2900 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002901 /* Get MCS Rate */
2902 pDstRate = MCSRateIdxSet;
2903 if ( pIes->HTCaps.present )
2904 {
2905 for ( i = 0; i < VALID_MAX_MCS_INDEX; i++ )
2906 {
2907 if ( (unsigned int)pIes->HTCaps.supportedMCSSet[0] & (1 << i) )
2908 {
2909 MCSRateLength++;
2910 *pDstRate++ = i;
2911 }
2912 }
2913 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002914 // Set the operational rate set CFG variables...
2915 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
2916 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2917 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
2918 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2919 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
2920 ProprietaryOperationalRates,
2921 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2922 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
2923 ccmCfgSetStr(pMac, WNI_CFG_CURRENT_MCS_SET, MCSRateIdxSet,
2924 MCSRateLength, NULL, eANI_BOOLEAN_FALSE);
2925 }//Parsing BSSDesc
2926 else
2927 {
2928 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2929 }
2930}
2931
Jeff Johnson295189b2012-06-20 16:38:30 -07002932static void csrSetCfgRateSetFromProfile( tpAniSirGlobal pMac,
2933 tCsrRoamProfile *pProfile )
2934{
2935 tSirMacRateSetIE DefaultSupportedRates11a = { SIR_MAC_RATESET_EID,
2936 { 8,
2937 { SIR_MAC_RATE_6,
2938 SIR_MAC_RATE_9,
2939 SIR_MAC_RATE_12,
2940 SIR_MAC_RATE_18,
2941 SIR_MAC_RATE_24,
2942 SIR_MAC_RATE_36,
2943 SIR_MAC_RATE_48,
2944 SIR_MAC_RATE_54 } } };
Jeff Johnson295189b2012-06-20 16:38:30 -07002945 tSirMacRateSetIE DefaultSupportedRates11b = { SIR_MAC_RATESET_EID,
2946 { 4,
2947 { SIR_MAC_RATE_1,
2948 SIR_MAC_RATE_2,
2949 SIR_MAC_RATE_5_5,
2950 SIR_MAC_RATE_11 } } };
2951
2952
2953 tSirMacPropRateSet DefaultSupportedPropRates = { 3,
2954 { SIR_MAC_RATE_72,
2955 SIR_MAC_RATE_96,
2956 SIR_MAC_RATE_108 } };
2957 eCsrCfgDot11Mode cfgDot11Mode;
2958 eCsrBand eBand;
2959 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2960 tANI_U32 OperationalRatesLength = 0;
2961 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2962 tANI_U32 ExtendedOperationalRatesLength = 0;
2963 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2964 tANI_U32 ProprietaryOperationalRatesLength = 0;
2965 tANI_U32 PropRatesEnable = 0;
2966 tANI_U8 operationChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002967 if(pProfile->ChannelInfo.ChannelList)
2968 {
2969 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2970 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002971#ifdef WLAN_SOFTAP_FEATURE
2972 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
2973#else
2974 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
2975#endif
2976 // For 11a networks, the 11a rates go into the Operational Rate set. For 11b and 11g
2977 // networks, the 11b rates appear in the Operational Rate set. In either case,
2978 // we can blindly put the rates we support into our Operational Rate set
2979 // (including the basic rates, which we have already verified are supported
2980 // earlier in the roaming decision).
2981 if ( eCSR_BAND_5G == eBand )
2982 {
2983 // 11a rates into the Operational Rate Set.
2984 OperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
2985 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
2986 palCopyMemory( pMac->hHdd, OperationalRates,
2987 DefaultSupportedRates11a.supportedRateSet.rate,
2988 OperationalRatesLength );
2989
2990 // Nothing in the Extended rate set.
2991 ExtendedOperationalRatesLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002992 // populate proprietary rates if user allows them
2993 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
2994 {
2995 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
2996 sizeof(*DefaultSupportedPropRates.propRate);
2997 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
2998 DefaultSupportedPropRates.propRate,
2999 ProprietaryOperationalRatesLength );
3000 }
3001 else
3002 {
3003 // No proprietary modes
3004 ProprietaryOperationalRatesLength = 0;
3005 }
3006 }
3007 else if ( eCSR_CFG_DOT11_MODE_11B == cfgDot11Mode )
3008 {
3009 // 11b rates into the Operational Rate Set.
3010 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3011 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3012 palCopyMemory( pMac->hHdd, OperationalRates,
3013 DefaultSupportedRates11b.supportedRateSet.rate,
3014 OperationalRatesLength );
3015 // Nothing in the Extended rate set.
3016 ExtendedOperationalRatesLength = 0;
3017 // No proprietary modes
3018 ProprietaryOperationalRatesLength = 0;
3019 }
3020 else
3021 {
3022 // 11G
3023
3024 // 11b rates into the Operational Rate Set.
3025 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3026 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3027 palCopyMemory( pMac->hHdd, OperationalRates,
3028 DefaultSupportedRates11b.supportedRateSet.rate,
3029 OperationalRatesLength );
3030
3031 // 11a rates go in the Extended rate set.
3032 ExtendedOperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3033 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3034 palCopyMemory( pMac->hHdd, ExtendedOperationalRates,
3035 DefaultSupportedRates11a.supportedRateSet.rate,
3036 ExtendedOperationalRatesLength );
3037
3038 // populate proprietary rates if user allows them
3039 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3040 {
3041 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3042 sizeof(*DefaultSupportedPropRates.propRate);
3043 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3044 DefaultSupportedPropRates.propRate,
3045 ProprietaryOperationalRatesLength );
3046 }
3047 else
3048 {
3049 // No proprietary modes
3050 ProprietaryOperationalRatesLength = 0;
3051 }
3052 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003053 // set this to 1 if prop. rates need to be advertised in to the IBSS beacon and user wants to use them
3054 if ( ProprietaryOperationalRatesLength && pMac->roam.configParam.ProprietaryRatesEnabled )
3055 {
3056 PropRatesEnable = 1;
3057 }
3058 else
3059 {
3060 PropRatesEnable = 0;
3061 }
3062
3063 // Set the operational rate set CFG variables...
3064 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
3065 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3066 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
3067 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3068 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
3069 ProprietaryOperationalRates,
3070 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3071 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003072}
Jeff Johnson295189b2012-06-20 16:38:30 -07003073void csrRoamCcmCfgSetCallback(tHalHandle hHal, tANI_S32 result)
3074{
3075 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
Jeff Johnsone7245742012-09-05 17:12:55 -07003076
Jeff Johnson295189b2012-06-20 16:38:30 -07003077 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
3078 tANI_U32 sessionId;
3079 tSmeCmd *pCommand = NULL;
3080
3081 if(NULL == pEntry)
3082 {
3083 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
3084 return;
3085 }
3086 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
3087 sessionId = pCommand->sessionId;
3088
3089 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
3090 {
3091 csrRoamingStateConfigCnfProcessor(pMac, (tANI_U32)result);
3092 }
3093}
3094
Jeff Johnson295189b2012-06-20 16:38:30 -07003095//This function is very dump. It is here because PE still need WNI_CFG_PHY_MODE
3096tANI_U32 csrRoamGetPhyModeFromDot11Mode(eCsrCfgDot11Mode dot11Mode, eCsrBand band)
3097{
3098 if(eCSR_CFG_DOT11_MODE_11B == dot11Mode)
3099 {
3100 return (WNI_CFG_PHY_MODE_11B);
3101 }
3102 else
3103 {
3104 if(eCSR_BAND_24 == band)
3105 return (WNI_CFG_PHY_MODE_11G);
3106 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003107 return (WNI_CFG_PHY_MODE_11A);
3108}
Jeff Johnson295189b2012-06-20 16:38:30 -07003109
Jeff Johnsone7245742012-09-05 17:12:55 -07003110
3111#ifdef WLAN_FEATURE_11AC
3112ePhyChanBondState csrGetHTCBStateFromVHTCBState(ePhyChanBondState aniCBMode)
3113{
3114 switch ( aniCBMode )
3115 {
3116 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3117 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3118 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3119 return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
3120 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3121 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3122 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3123 return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
3124 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
3125 default :
3126 return PHY_SINGLE_CHANNEL_CENTERED;
3127 }
3128}
3129#endif
3130
Jeff Johnson295189b2012-06-20 16:38:30 -07003131//pIes may be NULL
3132eHalStatus csrRoamSetBssConfigCfg(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3133 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
3134 tDot11fBeaconIEs *pIes)
3135{
3136 eHalStatus status = eHAL_STATUS_SUCCESS;
3137 tANI_U32 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3138 tANI_U8 channel = 0;
3139 //Make sure we have the domain info for the BSS we try to connect to.
3140 //Do we need to worry about sequence for OSs that are not Windows??
3141 if(pBssDesc)
3142 {
3143 if(csrLearnCountryInformation(pMac, pBssDesc, pIes, eANI_BOOLEAN_TRUE))
3144 {
3145 //Make sure the 11d info from this BSSDesc can be applied
3146 pMac->scan.fAmbiguous11dInfoFound = eANI_BOOLEAN_FALSE;
3147 csrApplyCountryInformation( pMac, TRUE );
3148 }
3149 }
3150
3151 //Qos
3152 csrSetQosToCfg( pMac, sessionId, pBssConfig->qosType );
3153 //SSID
3154 csrSetCfgSsid(pMac, &pBssConfig->SSID );
3155 //fragment threshold
3156 //ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3157 //RTS threshold
3158 //ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3159
3160 //ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, csrTranslateToWNICfgDot11Mode(pMac, pBssConfig->uCfgDot11Mode), NULL, eANI_BOOLEAN_FALSE);
3161
3162 //Auth type
3163 ccmCfgSetInt(pMac, WNI_CFG_AUTHENTICATION_TYPE, pBssConfig->authType, NULL, eANI_BOOLEAN_FALSE);
3164 //encryption type
3165 csrSetCfgPrivacy(pMac, pProfile, (tANI_BOOLEAN)pBssConfig->BssCap.privacy );
3166 //short slot time
3167 ccmCfgSetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, pBssConfig->uShortSlotTime, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003168#ifdef WLAN_SOFTAP_FEATURE
3169 //11d
3170 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
3171 ((pBssConfig->f11hSupport) ? pBssConfig->f11hSupport : pProfile->ieee80211d),
3172 NULL, eANI_BOOLEAN_FALSE);
3173#endif
3174 /*//11h
3175 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
3176 */
3177 ccmCfgSetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, pBssConfig->uPowerLimit, NULL, eANI_BOOLEAN_FALSE);
3178 //CB
Jeff Johnsone7245742012-09-05 17:12:55 -07003179
Jeff Johnson295189b2012-06-20 16:38:30 -07003180 if(CSR_IS_INFRA_AP(pProfile) || CSR_IS_WDS_AP(pProfile))
3181 {
3182 channel = pProfile->operationChannel;
3183 }
3184 else
3185 {
3186 if(pBssDesc)
3187 {
3188 channel = pBssDesc->channelId;
3189 }
3190 }
3191 if(0 != channel)
3192 {
3193 if(CSR_IS_CHANNEL_24GHZ(channel))
3194 {//for now if we are on 2.4 Ghz, CB will be always disabled
3195 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3196 }
3197 else
3198 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003199 cfgCb = pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003200 }
3201 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003202#ifdef WLAN_FEATURE_11AC
3203 if(cfgCb > 2 )
3204 {
3205 if(!WDA_getFwWlanFeatCaps(DOT11AC)) {
3206 cfgCb = csrGetHTCBStateFromVHTCBState(cfgCb);
3207 }
3208 else
3209 {
3210 ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, pMac->roam.configParam.nVhtChannelWidth, NULL, eANI_BOOLEAN_FALSE);
3211 }
3212 }
3213 else
3214#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003215 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, cfgCb, NULL, eANI_BOOLEAN_FALSE);
3216 //Rate
3217 //Fixed Rate
3218 if(pBssDesc)
3219 {
3220 csrSetCfgRateSet(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile, pBssDesc, pIes);
3221 }
3222 else
3223 {
3224 csrSetCfgRateSetFromProfile(pMac, pProfile);
3225 }
3226 //Make this the last CFG to set. The callback will trigger a join_req
3227 //Join time out
3228 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_CONFIG, sessionId );
3229
3230 ccmCfgSetInt(pMac, WNI_CFG_JOIN_FAILURE_TIMEOUT, pBssConfig->uJoinTimeOut, (tCcmCfgSetCallback)csrRoamCcmCfgSetCallback, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003231 return (status);
3232}
3233
Jeff Johnson295189b2012-06-20 16:38:30 -07003234eHalStatus csrRoamStopNetwork( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3235 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
3236{
3237 eHalStatus status;
3238 tBssConfigParam *pBssConfig;
3239 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003240
3241 if(!pSession)
3242 {
3243 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3244 return eHAL_STATUS_FAILURE;
3245 }
3246
Jeff Johnson295189b2012-06-20 16:38:30 -07003247 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
3248 if(HAL_STATUS_SUCCESS(status))
3249 {
3250 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
3251 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, pBssConfig, pIes);
3252 if(HAL_STATUS_SUCCESS(status))
3253 {
3254 pSession->bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003255 /* This will allow to pass cbMode during join req */
3256 pSession->bssParams.cbMode= pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003257 //For IBSS, we need to prepare some more information
3258 if( csrIsBssTypeIBSS(pProfile->BSSType) || CSR_IS_WDS( pProfile )
3259#ifdef WLAN_SOFTAP_FEATURE
3260 || CSR_IS_INFRA_AP(pProfile)
3261#endif
3262 )
3263 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003264 csrRoamPrepareBssParams(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07003265 }
3266 // If we are in an IBSS, then stop the IBSS...
3267 ////Not worry about WDS connection for now
3268 if ( csrIsConnStateIbss( pMac, sessionId ) )
3269 {
3270 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
3271 }
3272 else
3273 {
3274 // if we are in an Infrastructure association....
3275 if ( csrIsConnStateInfra( pMac, sessionId ) )
3276 {
3277 // and the new Bss is an Ibss OR we are roaming from Infra to Infra
3278 // across SSIDs (roaming to a new SSID)... //
3279 //Not worry about WDS connection for now
3280 if ( pBssDesc && ( ( csrIsIbssBssDesc( pBssDesc ) ) ||
3281 !csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIes ) ) )
3282 {
3283 // then we need to disassociate from the Infrastructure network...
3284 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
3285 }
3286 else
3287 {
3288 // In an Infrastucture and going to an Infrastructure network with the same SSID. This
3289 // calls for a Reassociation sequence. So issue the CFG sets for this new AP.
3290 if ( pBssDesc )
3291 {
3292 // Set parameters for this Bss.
3293 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3294 }
3295 }
3296 }
3297 else
3298 {
3299 // Neiher in IBSS nor in Infra. We can go ahead and set the CFG for tne new network...
3300 // Nothing to stop.
3301 if ( pBssDesc || CSR_IS_WDS_AP( pProfile )
3302#ifdef WLAN_SOFTAP_FEATURE
3303 || CSR_IS_INFRA_AP(pProfile)
3304#endif
3305 )
3306 {
3307 // Set parameters for this Bss.
3308 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3309 }
3310 }
3311 }
3312 }//Success getting BSS config info
3313 palFreeMemory(pMac->hHdd, pBssConfig);
3314 }//Allocate memory
3315
3316 return (status);
3317}
3318
Jeff Johnson295189b2012-06-20 16:38:30 -07003319eCsrJoinState csrRoamJoin( tpAniSirGlobal pMac, tANI_U32 sessionId,
3320 tCsrScanResultInfo *pScanResult, tCsrRoamProfile *pProfile )
3321{
3322 eCsrJoinState eRoamState = eCsrContinueRoaming;
3323 eHalStatus status;
3324 tSirBssDescription *pBssDesc = &pScanResult->BssDescriptor;
3325 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)( pScanResult->pvIes ); //This may be NULL
3326 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003327
3328 if(!pSession)
3329 {
3330 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3331 return (eCsrStopRoaming);
3332 }
3333
Jeff Johnson295189b2012-06-20 16:38:30 -07003334 if( CSR_IS_WDS_STA( pProfile ) )
3335 {
3336 status = csrRoamStartWds( pMac, sessionId, pProfile, pBssDesc );
3337 if( !HAL_STATUS_SUCCESS( status ) )
3338 {
3339 eRoamState = eCsrStopRoaming;
3340 }
3341 }
3342 else
3343 {
3344 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
3345 {
3346 smsLog(pMac, LOGE, FL(" fail to parse IEs"));
3347 return (eCsrStopRoaming);
3348 }
3349 if ( csrIsInfraBssDesc( pBssDesc ) )
3350 {
3351 // If we are connected in infrastructure mode and the Join Bss description is for the same BssID, then we are
3352 // attempting to join the AP we are already connected with. In that case, see if the Bss or Sta capabilities
3353 // have changed and handle the changes (without disturbing the current association).
3354
3355 if ( csrIsConnStateConnectedInfra(pMac, sessionId) &&
3356 csrIsBssIdEqual( pMac, pBssDesc, pSession->pConnectBssDesc ) &&
3357 csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIesLocal )
3358 )
3359 {
3360 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
3361 // with Authenticating first. To force this, stop the current association (Disassociate) and
3362 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
3363 // a new Association.
3364 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3365 {
3366 smsLog(pMac, LOGW, FL(" detect same profile authType = %d encryType = %d\n"), pProfile->AuthType, pProfile->EncryptionType);
3367 if(csrRoamIsSameProfileKeys(pMac, &pSession->connectedProfile, pProfile))
3368 {
3369 eRoamState = eCsrReassocToSelfNoCapChange;
3370 }
3371 else
3372 {
3373 tBssConfigParam bssConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07003374 //The key changes
3375 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(bssConfig));
3376 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, &bssConfig, pIesLocal);
3377 if(HAL_STATUS_SUCCESS(status))
3378 {
3379 pSession->bssParams.uCfgDot11Mode = bssConfig.uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003380 pSession->bssParams.cbMode = bssConfig.cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003381 //Reapply the config including Keys so reassoc is happening.
3382 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, &bssConfig, pIesLocal);
3383 if(!HAL_STATUS_SUCCESS(status))
3384 {
3385 eRoamState = eCsrStopRoaming;
3386 }
3387 }
3388 else
3389 {
3390 eRoamState = eCsrStopRoaming;
3391 }
3392 }//same profile
3393 }
3394 else
3395 {
3396 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, sessionId,
3397 eCSR_ROAM_SUBSTATE_DISASSOC_REQ, FALSE )))
3398 {
3399 smsLog(pMac, LOGW, FL(" fail to issue disassociate\n"));
3400 eRoamState = eCsrStopRoaming;
3401 }
3402 }
3403 }
3404 else
3405 {
3406 // note: we used to pre-auth here with open authentication networks but that was not working so well.
3407 // we had a lot of join timeouts when testing at Samsung. removing this step helped associations
3408 // work much better.
3409 //
3410 //
3411 // stop the existing network before attempting to join the new network...
3412 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3413 {
3414 eRoamState = eCsrStopRoaming;
3415 }
3416 }
3417 }//Infra
3418 else
3419 {
3420 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3421 {
3422 eRoamState = eCsrStopRoaming;
3423 }
3424 }
3425 if( pIesLocal && !pScanResult->pvIes )
3426 {
3427 palFreeMemory(pMac->hHdd, pIesLocal);
3428 }
3429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003430 return( eRoamState );
3431}
3432
Jeff Johnson295189b2012-06-20 16:38:30 -07003433eHalStatus csrRoamShouldRoam(tpAniSirGlobal pMac, tANI_U32 sessionId,
3434 tSirBssDescription *pBssDesc, tANI_U32 roamId)
3435{
3436 eHalStatus status = eHAL_STATUS_SUCCESS;
3437 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07003438 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3439 roamInfo.pBssDesc = pBssDesc;
3440 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, roamId, eCSR_ROAM_SHOULD_ROAM, eCSR_ROAM_RESULT_NONE);
3441 return (status);
3442}
Jeff Johnson295189b2012-06-20 16:38:30 -07003443//In case no matching BSS is found, use whatever default we can find
3444static void csrRoamAssignDefaultParam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3445{
3446 //Need to get all negotiated types in place first
3447 //auth type
3448 switch( pCommand->u.roamCmd.roamProfile.AuthType.authType[0] ) //Take the prefered Auth type.
3449 {
3450 default:
3451 case eCSR_AUTH_TYPE_WPA:
3452 case eCSR_AUTH_TYPE_WPA_PSK:
3453 case eCSR_AUTH_TYPE_WPA_NONE:
3454 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3455 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3456 break;
3457
3458 case eCSR_AUTH_TYPE_SHARED_KEY:
3459 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
3460 break;
3461
3462 case eCSR_AUTH_TYPE_AUTOSWITCH:
3463 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
3464 break;
3465 }
3466 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType =
3467 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3468 //In this case, the multicast encryption needs to follow the uncast ones.
3469 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType =
3470 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3471}
3472
3473static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fUseSameBss )
3474{
3475 eHalStatus status;
3476 tCsrScanResult *pScanResult = NULL;
3477 eCsrJoinState eRoamState = eCsrStopRoaming;
3478 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
3479 tANI_BOOLEAN fDone = eANI_BOOLEAN_FALSE;
3480 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
3481#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3482 v_U8_t acm_mask = 0;
3483#endif
3484 tANI_U32 sessionId = pCommand->sessionId;
3485 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
3486 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
3487 tANI_U8 concurrentChannel = 0;
Jeff Johnson32d95a32012-09-10 13:15:23 -07003488
3489 if(!pSession)
3490 {
3491 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3492 return (eCsrStopRoaming);
3493 }
3494
Jeff Johnson295189b2012-06-20 16:38:30 -07003495 do
3496 {
3497 // Check for Cardbus eject condition, before trying to Roam to any BSS
3498 //***if( !balIsCardPresent(pAdapter) ) break;
3499
3500 if(NULL != pBSSList)
3501 {
3502 // When handling AP's capability change, continue to associate to
3503 // same BSS and make sure pRoamBssEntry is not Null.
3504 if((eANI_BOOLEAN_FALSE == fUseSameBss) || (pCommand->u.roamCmd.pRoamBssEntry == NULL))
3505 {
3506 if(pCommand->u.roamCmd.pRoamBssEntry == NULL)
3507 {
3508 //Try the first BSS
3509 pCommand->u.roamCmd.pLastRoamBss = NULL;
3510 pCommand->u.roamCmd.pRoamBssEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
3511 }
3512 else
3513 {
3514 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3515 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3516 {
3517 //Done with all the BSSs
3518 //In this case, will tell HDD the completion
3519 break;
3520 }
3521 else
3522 {
3523 //We need to indicate to HDD that we are done with this one.
3524 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3525 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss; //this shall not be NULL
3526 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
3527 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
3528 pRoamInfo = &roamInfo;
3529 }
3530 }
3531 while(pCommand->u.roamCmd.pRoamBssEntry)
3532 {
3533 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
Jeff Johnson295189b2012-06-20 16:38:30 -07003534 /*If concurrency enabled take the concurrent connected channel first. */
3535 /* Valid multichannel concurrent sessions exempted */
Jeff Johnsone7245742012-09-05 17:12:55 -07003536 if (vos_concurrent_sessions_running() &&
3537 !csrIsValidMcConcurrentSession(pMac, sessionId, &pScanResult->Result.BssDescriptor))
Jeff Johnson295189b2012-06-20 16:38:30 -07003538 {
3539 concurrentChannel =
3540 csrGetConcurrentOperationChannel(pMac);
3541 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH, "%s: "
3542 " csr Concurrent Channel = %d", __FUNCTION__, concurrentChannel);
Jeff Johnson295189b2012-06-20 16:38:30 -07003543 if ((concurrentChannel) &&
3544 (concurrentChannel ==
3545 pScanResult->Result.BssDescriptor.channelId))
3546 {
3547 //make this 0 because we do not want the
3548 //below check to pass as we don't want to
3549 //connect on other channel
3550 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3551 FL("Concurrent channel match =%d"),
3552 concurrentChannel);
3553 concurrentChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003554 }
3555 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003556
3557 if (!concurrentChannel)
3558 {
3559
3560 if(HAL_STATUS_SUCCESS(csrRoamShouldRoam(pMac,
3561 sessionId, &pScanResult->Result.BssDescriptor,
3562 pCommand->u.roamCmd.roamId)))
3563 {
3564 //Ok to roam this
3565 break;
3566 }
3567 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003568 else
3569 {
3570 eRoamState = eCsrStopRoamingDueToConcurrency;
3571 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003572 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3573 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3574 {
3575 //Done with all the BSSs
3576 fDone = eANI_BOOLEAN_TRUE;
3577 break;
3578 }
3579 }
3580 if(fDone)
3581 {
3582 break;
3583 }
3584 }
3585 }
3586 //We have something to roam, tell HDD when it is infra.
3587 //For IBSS, the indication goes back to HDD via eCSR_ROAM_IBSS_IND
3588 //For WDS, the indication is eCSR_ROAM_WDS_IND
3589 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
3590 {
3591 if(pRoamInfo)
3592 {
3593 pSession->bRefAssocStartCnt--;
3594 //Complete the last association attemp because a new one is about to be tried
3595 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3596 eCSR_ROAM_ASSOCIATION_COMPLETION,
3597 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3598 }
3599 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
3600 if(pScanResult)
3601 {
3602 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07003603 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, &pScanResult->Result.BssDescriptor, &pIesLocal))) )
3604 {
3605 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
3606 fDone = eANI_BOOLEAN_TRUE;
3607 eRoamState = eCsrStopRoaming;
3608 break;
3609 }
3610 roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor;
3611 pCommand->u.roamCmd.pLastRoamBss = roamInfo.pBssDesc;
3612 //No need to put uapsd_mask in if the BSS doesn't support uAPSD
3613 if( pCommand->u.roamCmd.roamProfile.uapsd_mask &&
3614 CSR_IS_QOS_BSS(pIesLocal) &&
3615 CSR_IS_UAPSD_BSS(pIesLocal) )
3616 {
3617#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson295189b2012-06-20 16:38:30 -07003618 acm_mask = sme_QosGetACMMask(pMac, &pScanResult->Result.BssDescriptor,
3619 pIesLocal);
3620 pCommand->u.roamCmd.roamProfile.uapsd_mask &= ~(acm_mask);
3621#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
Jeff Johnson295189b2012-06-20 16:38:30 -07003622 }
3623 else
3624 {
3625 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3626 }
3627 if( pIesLocal && !pScanResult->Result.pvIes)
3628 {
3629 palFreeMemory(pMac->hHdd, pIesLocal);
3630 }
3631 }
3632 else
3633 {
3634 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3635 }
3636 roamInfo.pProfile = pProfile;
3637 pSession->bRefAssocStartCnt++;
3638 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3639 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3640 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003641 if ( NULL == pCommand->u.roamCmd.pRoamBssEntry )
3642 {
3643 // If this is a start IBSS profile, then we need to start the IBSS.
3644 if ( CSR_IS_START_IBSS(pProfile) )
3645 {
3646 tANI_BOOLEAN fSameIbss = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003647 // Attempt to start this IBSS...
3648 csrRoamAssignDefaultParam( pMac, pCommand );
3649 status = csrRoamStartIbss( pMac, sessionId, pProfile, &fSameIbss );
3650 if(HAL_STATUS_SUCCESS(status))
3651 {
3652 if ( fSameIbss )
3653 {
3654 eRoamState = eCsrStartIbssSameIbss;
3655 }
3656 else
3657 {
3658 eRoamState = eCsrContinueRoaming;
3659 }
3660 }
3661 else
3662 {
3663 //it somehow fail need to stop
3664 eRoamState = eCsrStopRoaming;
3665 }
3666 break;
3667 }
3668 else if ( (CSR_IS_WDS_AP(pProfile))
3669#ifdef WLAN_SOFTAP_FEATURE
3670 || (CSR_IS_INFRA_AP(pProfile))
3671#endif
3672 )
3673 {
3674 // Attempt to start this WDS...
3675 csrRoamAssignDefaultParam( pMac, pCommand );
3676 /* For AP WDS, we dont have any BSSDescription */
3677 status = csrRoamStartWds( pMac, sessionId, pProfile, NULL );
3678 if(HAL_STATUS_SUCCESS(status))
3679 {
3680 eRoamState = eCsrContinueRoaming;
3681 }
3682 else
3683 {
3684 //it somehow fail need to stop
3685 eRoamState = eCsrStopRoaming;
3686 }
3687 }
3688 else
3689 {
3690 //Nothing we can do
3691 smsLog(pMac, LOGW, FL("cannot continue without BSS list\n"));
3692 eRoamState = eCsrStopRoaming;
3693 break;
3694 }
3695 }
3696 else //We have BSS
3697 {
3698 //Need to assign these value because they are used in csrIsSameProfile
3699 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3700 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType = pScanResult->ucEncryptionType; //Negotiated while building scan result.
3701 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType = pScanResult->mcEncryptionType;
3702 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = pScanResult->authType;
3703 if ( CSR_IS_START_IBSS(&pCommand->u.roamCmd.roamProfile) )
3704 {
3705 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3706 {
3707 eRoamState = eCsrStartIbssSameIbss;
3708 break;
3709 }
3710 }
3711 if( pCommand->u.roamCmd.fReassocToSelfNoCapChange )
3712 {
3713 //trying to connect to the one already connected
3714 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_FALSE;
3715 eRoamState = eCsrReassocToSelfNoCapChange;
3716 break;
3717 }
3718 // Attempt to Join this Bss...
3719 eRoamState = csrRoamJoin( pMac, sessionId, &pScanResult->Result, pProfile );
3720 break;
3721 }
3722
3723 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07003724 if( (eCsrStopRoaming == eRoamState) && (CSR_IS_INFRASTRUCTURE( pProfile )) )
3725 {
3726 //Need to indicate association_completion if association_start has been done
3727 if(pSession->bRefAssocStartCnt > 0)
3728 {
3729 pSession->bRefAssocStartCnt--;
3730 //Complete the last association attemp because a new one is about to be tried
3731 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3732 eCSR_ROAM_ASSOCIATION_COMPLETION,
3733 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3734 }
3735 }
3736
3737 return( eRoamState );
3738}
3739
Jeff Johnson295189b2012-06-20 16:38:30 -07003740static eHalStatus csrRoam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3741{
3742 eHalStatus status = eHAL_STATUS_SUCCESS;
3743 eCsrJoinState RoamState;
3744 tANI_U32 sessionId = pCommand->sessionId;
3745
Jeff Johnson295189b2012-06-20 16:38:30 -07003746 //***if( hddIsRadioStateOn( pAdapter ) )
3747 {
3748 // Attept to join a Bss...
3749 RoamState = csrRoamJoinNextBss( pMac, pCommand, eANI_BOOLEAN_FALSE );
Jeff Johnsone7245742012-09-05 17:12:55 -07003750
Jeff Johnson295189b2012-06-20 16:38:30 -07003751 // if nothing to join..
Jeff Johnsone7245742012-09-05 17:12:55 -07003752 if (( eCsrStopRoaming == RoamState ) || ( eCsrStopRoamingDueToConcurrency == RoamState))
Jeff Johnson295189b2012-06-20 16:38:30 -07003753 {
3754 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003755 // and if connected in Infrastructure mode...
3756 if ( csrIsConnStateInfra(pMac, sessionId) )
3757 {
3758 //... then we need to issue a disassociation
3759 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISASSOC_NOTHING_TO_JOIN, FALSE );
3760 if(!HAL_STATUS_SUCCESS(status))
3761 {
3762 smsLog(pMac, LOGW, FL(" failed to issue disassociate, status = %d\n"), status);
3763 //roam command is completed by caller in the failed case
3764 fComplete = eANI_BOOLEAN_TRUE;
3765 }
3766 }
3767 else if( csrIsConnStateIbss(pMac, sessionId) )
3768 {
3769 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3770 if(!HAL_STATUS_SUCCESS(status))
3771 {
3772 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3773 //roam command is completed by caller in the failed case
3774 fComplete = eANI_BOOLEAN_TRUE;
3775 }
3776 }
3777#ifdef WLAN_SOFTAP_FEATURE
3778 else if (csrIsConnStateConnectedInfraAp(pMac, sessionId))
3779 {
3780 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3781 if(!HAL_STATUS_SUCCESS(status))
3782 {
3783 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3784 //roam command is completed by caller in the failed case
3785 fComplete = eANI_BOOLEAN_TRUE;
3786 }
3787 }
3788#endif
3789 else
3790 {
3791 fComplete = eANI_BOOLEAN_TRUE;
3792 }
3793 if(fComplete)
3794 {
3795 // ... otherwise, we can complete the Roam command here.
Jeff Johnsone7245742012-09-05 17:12:55 -07003796 if(eCsrStopRoamingDueToConcurrency == RoamState)
3797 {
3798 csrRoamComplete( pMac, eCsrJoinFailureDueToConcurrency, NULL );
3799 }
3800 else
3801 {
3802 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
3803 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003804 }
3805 }
3806 else if ( eCsrReassocToSelfNoCapChange == RoamState )
3807 {
3808 csrRoamComplete( pMac, eCsrSilentlyStopRoamingSaveState, NULL );
3809 }
3810 else if ( eCsrStartIbssSameIbss == RoamState )
3811 {
3812 csrRoamComplete( pMac, eCsrSilentlyStopRoaming, NULL );
3813 }
3814 }//hddIsRadioStateOn
3815
3816 return status;
3817}
Jeff Johnson295189b2012-06-20 16:38:30 -07003818eHalStatus csrProcessFTReassocRoamCommand ( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3819{
3820 tANI_U32 sessionId;
3821 tCsrRoamSession *pSession;
3822 tCsrScanResult *pScanResult = NULL;
3823 tSirBssDescription *pBssDesc = NULL;
3824 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003825 sessionId = pCommand->sessionId;
3826 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003827
3828 if(!pSession)
3829 {
3830 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3831 return eHAL_STATUS_FAILURE;
3832 }
3833
Jeff Johnson295189b2012-06-20 16:38:30 -07003834 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
3835 {
3836 //the roaming is cancelled. Simply complete the command
3837 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3838 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3839 return eHAL_STATUS_FAILURE;
3840 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003841 if (pCommand->u.roamCmd.pRoamBssEntry)
3842 {
3843 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3844 pBssDesc = &pScanResult->Result.BssDescriptor;
3845 }
3846 else
3847 {
3848 //the roaming is cancelled. Simply complete the command
3849 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3850 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3851 return eHAL_STATUS_FAILURE;
3852 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003853 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
3854 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
3855 return status;
3856}
3857
Jeff Johnson295189b2012-06-20 16:38:30 -07003858eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3859{
3860 eHalStatus status = eHAL_STATUS_SUCCESS;
3861 tCsrRoamInfo roamInfo;
3862 tANI_U32 sessionId = pCommand->sessionId;
3863 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003864
3865 if(!pSession)
3866 {
3867 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3868 return eHAL_STATUS_FAILURE;
3869 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003870
3871 switch ( pCommand->u.roamCmd.roamReason )
3872 {
3873 case eCsrForcedDisassoc:
3874 csrFreeRoamProfile(pMac, sessionId);
3875 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3876 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003877 case eCsrSmeIssuedDisassocForHandoff:
3878 //Not to free pMac->roam.pCurRoamProfile (via csrFreeRoamProfile) because it is needed after disconnect
3879#if 0 // TODO : Confirm this change
3880 status = csrRoamProcessDisassociate( pMac, pCommand, FALSE );
3881#else
3882 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3883#endif
3884
3885 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003886 case eCsrForcedDisassocMICFailure:
3887 csrFreeRoamProfile(pMac, sessionId);
3888 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, TRUE );
3889 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003890 case eCsrForcedDeauth:
3891 csrFreeRoamProfile(pMac, sessionId);
3892 status = csrRoamProcessDisassocDeauth( pMac, pCommand, FALSE, FALSE );
3893 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003894 case eCsrHddIssuedReassocToSameAP:
3895 case eCsrSmeIssuedReassocToSameAP:
3896 {
3897 tDot11fBeaconIEs *pIes = NULL;
3898
Jeff Johnson295189b2012-06-20 16:38:30 -07003899 if( pSession->pConnectBssDesc )
3900 {
3901 status = csrGetParsedBssDescriptionIEs(pMac, pSession->pConnectBssDesc, &pIes);
3902 if(!HAL_STATUS_SUCCESS(status) )
3903 {
3904 smsLog(pMac, LOGE, FL(" fail to parse IEs\n"));
3905 }
3906 else
3907 {
3908 roamInfo.reasonCode = eCsrRoamReasonStaCapabilityChanged;
3909 csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
3910 pSession->roamingReason = eCsrReassocRoaming;
Jeff Johnson295189b2012-06-20 16:38:30 -07003911 roamInfo.pBssDesc = pSession->pConnectBssDesc;
3912 roamInfo.pProfile = &pCommand->u.roamCmd.roamProfile;
3913 pSession->bRefAssocStartCnt++;
3914 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3915 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3916
3917 smsLog(pMac, LOG1, FL(" calling csrRoamIssueReassociate\n"));
3918 csrRoamIssueReassociate( pMac, sessionId, pSession->pConnectBssDesc, pIes,
3919 &pCommand->u.roamCmd.roamProfile );
3920 palFreeMemory(pMac->hHdd, pIes);
3921 pIes = NULL;
3922 }
3923 }
3924 break;
3925 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003926 case eCsrCapsChange:
3927 smsLog(pMac, LOGE, FL("received eCsrCapsChange \n"));
3928 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
3929 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE);
3930 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003931 case eCsrSmeIssuedFTReassoc:
3932 smsLog(pMac, LOGE, FL("received FT Reassoc Req \n"));
3933 status = csrProcessFTReassocRoamCommand(pMac, pCommand);
3934 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07003935
Jeff Johnson295189b2012-06-20 16:38:30 -07003936 case eCsrStopBss:
3937 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3938 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3939 break;
3940
3941 case eCsrForcedDisassocSta:
3942 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3943 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DISASSOC_REQ, sessionId);
3944 status = csrSendMBDisassocReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
3945 pCommand->u.roamCmd.reason);
3946 break;
3947
3948 case eCsrForcedDeauthSta:
3949 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3950 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DEAUTH_REQ, sessionId);
3951 status = csrSendMBDeauthReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
3952 pCommand->u.roamCmd.reason);
3953 break;
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07003954#if 1
3955 /*Varun*/
3956 case eCsrPerformPreauth:
3957 smsLog(pMac, LOGE, FL("Attempting FT PreAuth Req \n"));
3958 status = csrRoamIssueFTPreauthReq(pMac, sessionId,
3959 pCommand->u.roamCmd.pLastRoamBss);
3960 break;
3961#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003962
3963 default:
3964 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
3965
3966 if( pCommand->u.roamCmd.fUpdateCurRoamProfile )
3967 {
3968 //Remember the roaming profile
3969 csrFreeRoamProfile(pMac, sessionId);
3970 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pSession->pCurRoamProfile, sizeof(tCsrRoamProfile))))
3971 {
3972 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
3973 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, &pCommand->u.roamCmd.roamProfile);
3974 }
3975 }
3976
3977 //At this point, original uapsd_mask is saved in pCurRoamProfile
3978 //uapsd_mask in the pCommand may change from this point on.
3979
3980 // Attempt to roam with the new scan results (if we need to..)
3981 status = csrRoam( pMac, pCommand );
3982 break;
3983 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003984 return (status);
3985}
3986
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07003987void csrReinitPreauthCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
3988{
3989 pCommand->u.roamCmd.pLastRoamBss = NULL;
3990 pCommand->u.roamCmd.pRoamBssEntry = NULL;
3991 //Because u.roamCmd is union and share with scanCmd and StatusChange
3992 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
3993}
3994
Jeff Johnson295189b2012-06-20 16:38:30 -07003995void csrReinitRoamCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
3996{
3997 if(pCommand->u.roamCmd.fReleaseBssList)
3998 {
3999 csrScanResultPurge(pMac, pCommand->u.roamCmd.hBSSList);
4000 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
4001 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
4002 }
4003 if(pCommand->u.roamCmd.fReleaseProfile)
4004 {
4005 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
4006 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
4007 }
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 csrReinitWmStatusChangeCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4014{
4015 palZeroMemory(pMac->hHdd, &pCommand->u.wmStatusChangeCmd, sizeof(tWmStatusChangeCmd));
4016}
Jeff Johnson295189b2012-06-20 16:38:30 -07004017void csrRoamComplete( tpAniSirGlobal pMac, eCsrRoamCompleteResult Result, void *Context )
4018{
4019 tListElem *pEntry;
4020 tSmeCmd *pCommand;
4021 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004022 smsLog( pMac, LOG2, "roamQ: Roam Completion ...\n" );
Jeff Johnson295189b2012-06-20 16:38:30 -07004023 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
4024 if ( pEntry )
4025 {
4026 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07004027 // If the head of the queue is Active and it is a ROAM command, remove
4028 // and put this on the Free queue.
4029 if ( eSmeCommandRoam == pCommand->command )
4030 {
4031 //we need to process the result first before removing it from active list because state changes
4032 //still happening insides roamQProcessRoamResults so no other roam command should be issued
4033 fReleaseCommand = csrRoamProcessResults( pMac, pCommand, Result, Context );
4034 if( fReleaseCommand )
4035 {
4036 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
4037 {
4038 csrReleaseCommandRoam( pMac, pCommand );
4039 }
4040 else
4041 {
4042 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4043 pCommand->u.roamCmd.roamReason );
4044 }
4045 }
4046 else
4047 {
4048 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4049 pCommand->u.roamCmd.roamReason );
4050 }
4051 }
4052 else
4053 {
4054 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
4055 }
4056 }
4057 else
4058 {
4059 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
4060 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004061 if( fReleaseCommand )
4062 {
4063 smeProcessPendingQueue( pMac );
4064 }
4065}
4066
Jeff Johnson295189b2012-06-20 16:38:30 -07004067void csrResetPMKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4068{
4069 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004070 if(!pSession)
4071 {
4072 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4073 return;
4074 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004075 palZeroMemory( pMac->hHdd, &(pSession->PmkidCandidateInfo[0]), sizeof(tPmkidCandidateInfo) * CSR_MAX_PMKID_ALLOWED );
4076 pSession->NumPmkidCandidate = 0;
4077}
Jeff Johnson295189b2012-06-20 16:38:30 -07004078#ifdef FEATURE_WLAN_WAPI
4079void csrResetBKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4080{
4081 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004082 if(!pSession)
4083 {
4084 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4085 return;
4086 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004087 palZeroMemory( pMac->hHdd, &(pSession->BkidCandidateInfo[0]), sizeof(tBkidCandidateInfo) * CSR_MAX_BKID_ALLOWED );
4088 pSession->NumBkidCandidate = 0;
4089}
4090#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07004091extern tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ];
4092
Jeff Johnson295189b2012-06-20 16:38:30 -07004093static eHalStatus csrRoamSaveSecurityRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrAuthType authType,
4094 tSirBssDescription *pSirBssDesc,
4095 tDot11fBeaconIEs *pIes)
4096{
4097 eHalStatus status = eHAL_STATUS_SUCCESS;
4098 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4099 tDot11fBeaconIEs *pIesLocal = pIes;
Jeff Johnson32d95a32012-09-10 13:15:23 -07004100
4101 if(!pSession)
4102 {
4103 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4104 return eHAL_STATUS_FAILURE;
4105 }
4106
Jeff Johnson295189b2012-06-20 16:38:30 -07004107 if((eCSR_AUTH_TYPE_WPA == authType) ||
4108 (eCSR_AUTH_TYPE_WPA_PSK == authType) ||
4109 (eCSR_AUTH_TYPE_RSN == authType) ||
4110 (eCSR_AUTH_TYPE_RSN_PSK == authType)
4111#if defined WLAN_FEATURE_VOWIFI_11R
4112 ||
4113 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4114 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType)
4115#endif /* FEATURE_WLAN_WAPI */
4116#ifdef FEATURE_WLAN_WAPI
4117 ||
4118 (eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4119 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType)
4120#endif /* FEATURE_WLAN_WAPI */
4121 )
4122 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004123 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4124 {
4125 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
4126 }
4127 if( pIesLocal )
4128 {
4129 tANI_U32 nIeLen;
4130 tANI_U8 *pIeBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07004131 if((eCSR_AUTH_TYPE_RSN == authType) ||
4132#if defined WLAN_FEATURE_VOWIFI_11R
4133 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4134 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType) ||
4135#endif /* WLAN_FEATURE_VOWIFI_11R */
4136 (eCSR_AUTH_TYPE_RSN_PSK == authType))
4137 {
4138 if(pIesLocal->RSN.present)
4139 {
4140 //Calculate the actual length
4141 nIeLen = 8 //version + gp_cipher_suite + pwise_cipher_suite_count
4142 + pIesLocal->RSN.pwise_cipher_suite_count * 4 //pwise_cipher_suites
4143 + 2 //akm_suite_count
4144 + pIesLocal->RSN.akm_suite_count * 4 //akm_suites
4145 + 2; //reserved
4146 if( pIesLocal->RSN.pmkid_count )
4147 {
4148 nIeLen += 2 + pIesLocal->RSN.pmkid_count * 4; //pmkid
4149 }
4150 //nIeLen doesn't count EID and length fields
4151 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4152 {
4153 pSession->pWpaRsnRspIE[0] = DOT11F_EID_RSN;
4154 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4155 //copy upto akm_suites
4156 pIeBuf = pSession->pWpaRsnRspIE + 2;
4157 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.version, 8);
4158 pIeBuf += 8;
4159 if( pIesLocal->RSN.pwise_cipher_suite_count )
4160 {
4161 //copy pwise_cipher_suites
4162 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.pwise_cipher_suites,
4163 pIesLocal->RSN.pwise_cipher_suite_count * 4);
4164 pIeBuf += pIesLocal->RSN.pwise_cipher_suite_count * 4;
4165 }
4166 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.akm_suite_count, 2);
4167 pIeBuf += 2;
4168 if( pIesLocal->RSN.akm_suite_count )
4169 {
4170 //copy akm_suites
4171 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites,
4172 pIesLocal->RSN.akm_suite_count * 4);
4173 pIeBuf += pIesLocal->RSN.akm_suite_count * 4;
4174 }
4175 //copy the rest
4176 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites +
4177 pIesLocal->RSN.akm_suite_count * 4,
4178 2 + pIesLocal->RSN.pmkid_count * 4);
4179 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4180 }
4181 }
4182 }
4183 else if((eCSR_AUTH_TYPE_WPA == authType) ||
4184 (eCSR_AUTH_TYPE_WPA_PSK == authType))
4185 {
4186 if(pIesLocal->WPA.present)
4187 {
4188 //Calculate the actual length
4189 nIeLen = 12 //OUI + version + multicast_cipher + unicast_cipher_count
4190 + pIesLocal->WPA.unicast_cipher_count * 4 //unicast_ciphers
4191 + 2 //auth_suite_count
4192 + pIesLocal->WPA.auth_suite_count * 4; //auth_suites
4193 // The WPA capabilities follows the Auth Suite (two octects)--
4194 // this field is optional, and we always "send" zero, so just
4195 // remove it. This is consistent with our assumptions in the
4196 // frames compiler; c.f. bug 15234:
4197 //nIeLen doesn't count EID and length fields
4198 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4199 {
4200 pSession->pWpaRsnRspIE[0] = DOT11F_EID_WPA;
4201 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4202 pIeBuf = pSession->pWpaRsnRspIE + 2;
4203 //Copy WPA OUI
4204 palCopyMemory(pMac->hHdd, pIeBuf, &csrWpaOui[1], 4);
4205 pIeBuf += 4;
4206 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.version, 8 +
4207 pIesLocal->WPA.unicast_cipher_count * 4);
4208 pIeBuf += 8 + pIesLocal->WPA.unicast_cipher_count * 4;
4209 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.auth_suite_count, 2 +
4210 pIesLocal->WPA.auth_suite_count * 4);
4211 pIeBuf += pIesLocal->WPA.auth_suite_count * 4;
4212 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4213 }
4214 }
4215 }
4216#ifdef FEATURE_WLAN_WAPI
4217 else if((eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4218 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType))
4219 {
4220 if(pIesLocal->WAPI.present)
4221 {
4222 //Calculate the actual length
4223 nIeLen = 4 //version + akm_suite_count
4224 + pIesLocal->WAPI.akm_suite_count * 4 // akm_suites
4225 + 2 //pwise_cipher_suite_count
4226 + pIesLocal->WAPI.unicast_cipher_suite_count * 4 //pwise_cipher_suites
4227 + 6; //gp_cipher_suite + preauth + reserved
4228 if( pIesLocal->WAPI.bkid_count )
4229 {
4230 nIeLen += 2 + pIesLocal->WAPI.bkid_count * 4; //bkid
4231 }
4232
4233 //nIeLen doesn't count EID and length fields
4234 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiRspIE, nIeLen + 2))))
4235 {
4236 pSession->pWapiRspIE[0] = DOT11F_EID_WAPI;
4237 pSession->pWapiRspIE[1] = (tANI_U8)nIeLen;
4238 pIeBuf = pSession->pWapiRspIE + 2;
4239 //copy upto akm_suite_count
4240 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.version, 4);
4241 pIeBuf += 4;
4242 if( pIesLocal->WAPI.akm_suite_count )
4243 {
4244 //copy akm_suites
4245 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.akm_suites,
4246 pIesLocal->WAPI.akm_suite_count * 4);
4247 pIeBuf += pIesLocal->WAPI.akm_suite_count * 4;
4248 }
4249 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.unicast_cipher_suite_count, 2);
4250 pIeBuf += 2;
Jeff Johnson295189b2012-06-20 16:38:30 -07004251 if( pIesLocal->WAPI.unicast_cipher_suite_count )
4252 {
4253 //copy pwise_cipher_suites
4254 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.unicast_cipher_suites,
4255 pIesLocal->WAPI.unicast_cipher_suite_count * 4);
4256 pIeBuf += pIesLocal->WAPI.unicast_cipher_suite_count * 4;
4257 }
4258 //gp_cipher_suite + preauth + reserved + bkid_count
4259 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.multicast_cipher_suite, 8);
4260 pIeBuf += 8;
4261 if( pIesLocal->WAPI.bkid_count )
4262 {
4263 //copy akm_suites
4264 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.bkid, pIesLocal->WAPI.bkid_count * 4);
4265 pIeBuf += pIesLocal->WAPI.bkid_count * 4;
4266 }
4267 pSession->nWapiRspIeLength = nIeLen + 2;
4268 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004269 }
4270 }
4271#endif /* FEATURE_WLAN_WAPI */
4272 if( !pIes )
4273 {
4274 //locally allocated
4275 palFreeMemory(pMac->hHdd, pIesLocal);
4276 }
4277 }
4278 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004279 return (status);
4280}
4281
Jeff Johnson295189b2012-06-20 16:38:30 -07004282static void csrCheckAndUpdateACWeight( tpAniSirGlobal pMac, tDot11fBeaconIEs *pIEs )
4283{
4284 v_U8_t bACWeights[WLANTL_MAX_AC];
4285 v_U8_t paramBk, paramBe, paramVi, paramVo;
4286 v_BOOL_t fWeightChange = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004287 //Compare two ACs' EDCA parameters, from low to high (BK, BE, VI, VO)
4288 //The "formula" is, if lower AC's AIFSN+CWMin is bigger than a fixed amount
4289 //of the higher AC one, make the higher AC has the same weight as the lower AC.
4290 //This doesn't address the case where the lower AC needs a real higher weight
4291 if( pIEs->WMMParams.present )
4292 {
4293 //no change to the lowest ones
4294 bACWeights[WLANTL_AC_BK] = pMac->roam.ucACWeights[WLANTL_AC_BK];
4295 bACWeights[WLANTL_AC_BE] = pMac->roam.ucACWeights[WLANTL_AC_BE];
4296 bACWeights[WLANTL_AC_VI] = pMac->roam.ucACWeights[WLANTL_AC_VI];
4297 bACWeights[WLANTL_AC_VO] = pMac->roam.ucACWeights[WLANTL_AC_VO];
4298 paramBk = pIEs->WMMParams.acbk_aifsn + pIEs->WMMParams.acbk_acwmin;
4299 paramBe = pIEs->WMMParams.acbe_aifsn + pIEs->WMMParams.acbe_acwmin;
4300 paramVi = pIEs->WMMParams.acvi_aifsn + pIEs->WMMParams.acvi_acwmin;
4301 paramVo = pIEs->WMMParams.acvo_aifsn + pIEs->WMMParams.acvo_acwmin;
4302 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramBe) )
4303 {
4304 bACWeights[WLANTL_AC_BE] = bACWeights[WLANTL_AC_BK];
4305 fWeightChange = VOS_TRUE;
4306 }
4307 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVi) )
4308 {
4309 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BK];
4310 fWeightChange = VOS_TRUE;
4311 }
4312 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVi) )
4313 {
4314 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BE];
4315 fWeightChange = VOS_TRUE;
4316 }
4317 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVo) )
4318 {
4319 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BK];
4320 fWeightChange = VOS_TRUE;
4321 }
4322 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVo) )
4323 {
4324 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BE];
4325 fWeightChange = VOS_TRUE;
4326 }
4327 else if( SME_DETECT_AC_WEIGHT_DIFF(paramVi, paramVo) )
4328 {
4329 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_VI];
4330 fWeightChange = VOS_TRUE;
4331 }
4332 if(fWeightChange)
4333 {
4334 smsLog(pMac, LOGE, FL(" change AC weights (%d-%d-%d-%d)\n"), bACWeights[0], bACWeights[1],
4335 bACWeights[2], bACWeights[3]);
4336 WLANTL_SetACWeights(pMac->roam.gVosContext, bACWeights);
4337 }
4338 }
4339}
Jeff Johnson295189b2012-06-20 16:38:30 -07004340#ifdef WLAN_FEATURE_VOWIFI_11R
4341//Returns whether the current association is a 11r assoc or not
4342tANI_BOOLEAN csrRoamIs11rAssoc(tpAniSirGlobal pMac)
4343{
4344#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4345 return csrNeighborRoamIs11rAssoc(pMac);
4346#else
4347 return eANI_BOOLEAN_FALSE;
4348#endif
4349}
4350#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004351#ifdef FEATURE_WLAN_CCX
4352//Returns whether the current association is a CCX assoc or not
4353tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac)
4354{
4355#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4356 return csrNeighborRoamIsCCXAssoc(pMac);
4357#else
4358 return eANI_BOOLEAN_FALSE;
4359#endif
4360}
4361#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004362#ifdef FEATURE_WLAN_LFR
4363//Returns whether "Legacy Fast Roaming" is currently enabled...or not
4364tANI_BOOLEAN csrRoamIsFastRoamEnabled(tpAniSirGlobal pMac)
4365{
Madan Mohan Koyyalamudi9ce36ec2012-10-15 16:03:17 -07004366 return (pMac->roam.configParam.isFastRoamIniFeatureEnabled &&
4367 (!csrIsConcurrentInfraConnected(pMac)));
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004368}
4369#endif
4370
Jeff Johnson295189b2012-06-20 16:38:30 -07004371//Return true means the command can be release, else not
4372static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
4373 eCsrRoamCompleteResult Result, void *Context )
4374{
4375 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
4376 tSirBssDescription *pSirBssDesc = NULL;
4377 tSirMacAddr BroadcastMac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4378 tCsrScanResult *pScanResult = NULL;
4379 tCsrRoamInfo roamInfo;
4380 sme_QosAssocInfo assocInfo;
4381 sme_QosCsrEventIndType ind_qos;//indication for QoS module in SME
4382 tANI_U8 acm_mask = 0; //HDD needs the ACM mask in the assoc rsp callback
4383 tDot11fBeaconIEs *pIes = NULL;
4384 tANI_U32 sessionId = pCommand->sessionId;
4385 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4386 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
4387 eRoamCmdStatus roamStatus;
4388 eCsrRoamResult roamResult;
4389 eHalStatus status;
4390 tANI_U32 key_timeout_interval = 0;
4391#ifdef WLAN_SOFTAP_FEATURE
4392 tSirSmeStartBssRsp *pSmeStartBssRsp = NULL;
4393#endif
4394
Jeff Johnson32d95a32012-09-10 13:15:23 -07004395 if(!pSession)
4396 {
4397 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4398 return eANI_BOOLEAN_FALSE;
4399 }
4400
Jeff Johnson295189b2012-06-20 16:38:30 -07004401 smsLog( pMac, LOG1, FL("Processing ROAM results...\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004402 switch( Result )
4403 {
4404 case eCsrJoinSuccess:
4405 // reset the IDLE timer
4406 // !!
4407 // !! fall through to the next CASE statement here is intentional !!
4408 // !!
4409 case eCsrReassocSuccess:
4410 if(eCsrReassocSuccess == Result)
4411 {
4412 ind_qos = SME_QOS_CSR_REASSOC_COMPLETE;
4413 }
4414 else
4415 {
4416 ind_qos = SME_QOS_CSR_ASSOC_COMPLETE;
4417 }
4418 // Success Join Response from LIM. Tell NDIS we are connected and save the
4419 // Connected state...
4420 smsLog(pMac, LOGW, FL("receives association indication\n"));
4421 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4422 //always free the memory here
4423 if(pSession->pWpaRsnRspIE)
4424 {
4425 pSession->nWpaRsnRspIeLength = 0;
4426 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
4427 pSession->pWpaRsnRspIE = NULL;
4428 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004429#ifdef FEATURE_WLAN_WAPI
4430 if(pSession->pWapiRspIE)
4431 {
4432 pSession->nWapiRspIeLength = 0;
4433 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
4434 pSession->pWapiRspIE = NULL;
4435 }
4436#endif /* FEATURE_WLAN_WAPI */
4437#ifdef FEATURE_WLAN_BTAMP_UT_RF
4438 //Reset counter so no join retry is needed.
4439 pSession->maxRetryCount = 0;
4440 csrRoamStopJoinRetryTimer(pMac, sessionId);
4441#endif
4442 /* This creates problem since we have not saved the connected profile.
4443 So moving this after saving the profile
4444 */
4445 //csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED );
4446 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
4447 {
4448 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED;
4449 }
4450 else
4451 {
4452 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;
4453 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004454 //Use the last connected bssdesc for reassoc-ing to the same AP.
4455 //NOTE: What to do when reassoc to a different AP???
4456 if( (eCsrHddIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) ||
4457 (eCsrSmeIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) )
4458 {
4459 pSirBssDesc = pSession->pConnectBssDesc;
4460 if(pSirBssDesc)
4461 {
4462 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4463 }
4464 }
4465 else
4466 {
4467
4468 if(pCommand->u.roamCmd.pRoamBssEntry)
4469 {
4470 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
4471 if(pScanResult != NULL)
4472 {
4473 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4474 //this can be NULL
4475 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4476 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4477 }
4478 }
4479 }
4480 if( pSirBssDesc )
4481 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004482 roamInfo.staId = HAL_STA_INVALID_IDX;
Jeff Johnson295189b2012-06-20 16:38:30 -07004483 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4484 //Save WPA/RSN IE
4485 csrRoamSaveSecurityRspIE(pMac, sessionId, pProfile->negotiatedAuthType, pSirBssDesc, pIes);
4486#ifdef FEATURE_WLAN_CCX
4487 roamInfo.isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
4488#endif
4489
4490 // csrRoamStateChange also affects sub-state. Hence, csrRoamStateChange happens first and then
4491 // substate change.
4492 // Moving even save profile above so that below mentioned conditon is also met.
4493 // JEZ100225: Moved to after saving the profile. Fix needed in main/latest
4494 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07004495 // Make sure the Set Context is issued before link indication to NDIS. After link indication is
4496 // made to NDIS, frames could start flowing. If we have not set context with LIM, the frames
4497 // will be dropped for the security context may not be set properly.
4498 //
4499 // this was causing issues in the 2c_wlan_wep WHQL test when the SetContext was issued after the link
4500 // indication. (Link Indication happens in the profFSMSetConnectedInfra call).
4501 //
4502 // this reordering was done on titan_prod_usb branch and is being replicated here.
4503 //
4504
4505 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) &&
4506 !pProfile->bWPSAssociation)
4507 {
4508 // Issue the set Context request to LIM to establish the Unicast STA context
4509 if( !HAL_STATUS_SUCCESS( csrRoamIssueSetContextReq( pMac, sessionId,
4510 pProfile->negotiatedUCEncryptionType,
4511 pSirBssDesc, &(pSirBssDesc->bssId),
4512 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ) ) ) // NO keys... these key parameters don't matter.
4513 {
4514 smsLog( pMac, LOGE, FL(" Set context for unicast fail\n") );
4515 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4516 }
4517 // Issue the set Context request to LIM to establish the Broadcast STA context
4518 csrRoamIssueSetContextReq( pMac, sessionId, pProfile->negotiatedMCEncryptionType,
4519 pSirBssDesc, &BroadcastMac,
4520 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4521 }
4522 else
4523 {
4524 //Need to wait for supplicant authtication
4525 roamInfo.fAuthRequired = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004526 //Set the subestate to WaitForKey in case authentiation is needed
4527 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY, sessionId );
4528
Jeff Johnson295189b2012-06-20 16:38:30 -07004529 if(pProfile->bWPSAssociation)
4530 {
4531 key_timeout_interval = CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD;
4532 }
4533 else
4534 {
4535 key_timeout_interval = CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD;
4536 }
4537
4538 //Save sessionId in case of timeout
4539 pMac->roam.WaitForKeyTimerInfo.sessionId = (tANI_U8)sessionId;
4540 //This time should be long enough for the rest of the process plus setting key
4541 if(!HAL_STATUS_SUCCESS( csrRoamStartWaitForKeyTimer( pMac, key_timeout_interval ) ) )
4542 {
4543 //Reset our state so nothting is blocked.
4544 smsLog( pMac, LOGE, FL(" Failed to start pre-auth timer\n") );
4545 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
4546 }
4547 }
4548
4549 assocInfo.pBssDesc = pSirBssDesc; //could be NULL
4550 assocInfo.pProfile = pProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07004551 if(Context)
4552 {
4553 tSirSmeJoinRsp *pJoinRsp = (tSirSmeJoinRsp *)Context;
4554 tANI_U32 len;
Jeff Johnson295189b2012-06-20 16:38:30 -07004555 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4556 len = pJoinRsp->assocReqLength + pJoinRsp->assocRspLength + pJoinRsp->beaconLength;
4557#ifdef WLAN_FEATURE_VOWIFI_11R
4558 len += pJoinRsp->parsedRicRspLen;
4559#endif /* WLAN_FEATURE_VOWIFI_11R */
4560#ifdef FEATURE_WLAN_CCX
4561 len += pJoinRsp->tspecIeLen;
4562#endif
4563 if(len)
4564 {
4565 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
4566 (void **)&pSession->connectedInfo.pbFrames, len)))
4567 {
4568 if(HAL_STATUS_SUCCESS( palCopyMemory(pMac->hHdd,
4569 pSession->connectedInfo.pbFrames, pJoinRsp->frames, len) ))
4570 {
4571 pSession->connectedInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4572 pSession->connectedInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4573 pSession->connectedInfo.nBeaconLength = pJoinRsp->beaconLength;
4574#ifdef WLAN_FEATURE_VOWIFI_11R
4575 pSession->connectedInfo.nRICRspLength = pJoinRsp->parsedRicRspLen;
4576#endif /* WLAN_FEATURE_VOWIFI_11R */
4577#ifdef FEATURE_WLAN_CCX
4578 pSession->connectedInfo.nTspecIeLength = pJoinRsp->tspecIeLen;
4579#endif
4580 roamInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4581 roamInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4582 roamInfo.nBeaconLength = pJoinRsp->beaconLength;
4583 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4584 }
4585 else
4586 {
4587 smsLog(pMac, LOGE, "%s: Copying of memory failed for %d bytes !!!\n",
4588 __FUNCTION__, len);
4589 palFreeMemory( pMac->hHdd, pSession->connectedInfo.pbFrames );
4590 pSession->connectedInfo.pbFrames = NULL;
4591 }
4592 }
4593 }
4594 if(pCommand->u.roamCmd.fReassoc)
4595 {
4596 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4597 }
4598 pSession->connectedInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4599 roamInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4600 roamInfo.ucastSig = ( tANI_U8 )pJoinRsp->ucastSig;
4601 roamInfo.bcastSig = ( tANI_U8 )pJoinRsp->bcastSig;
4602 }
4603 else
4604 {
4605 if(pCommand->u.roamCmd.fReassoc)
4606 {
4607 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4608 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4609 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4610 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4611 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4612 }
4613 }
4614#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4615 // Indicate SME-QOS with reassoc success event, only after
4616 // copying the frames
4617 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, ind_qos, &assocInfo);
4618#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004619 roamInfo.pBssDesc = pSirBssDesc;
4620 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4621 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4622#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4623 acm_mask = sme_QosGetACMMask(pMac, pSirBssDesc, NULL);
4624#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
4625 pSession->connectedProfile.acm_mask = acm_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004626#ifdef FEATURE_WLAN_UAPSD_FW_TRG_FRAMES
4627 //start UAPSD if uapsd_mask is not 0 because HDD will configure for trigger frame
4628 //It may be better to let QoS do this????
4629 if( pSession->connectedProfile.modifyProfileFields.uapsd_mask )
4630 {
4631 smsLog(pMac, LOGE, " uapsd_mask (0x%X) set, request UAPSD now\n",
4632 pSession->connectedProfile.modifyProfileFields.uapsd_mask);
4633 pmcStartUapsd( pMac, NULL, NULL );
4634 }
4635#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004636 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4637 if( pSession->bRefAssocStartCnt > 0 )
4638 {
4639 pSession->bRefAssocStartCnt--;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004640 //Remove this code once SLM_Sessionization is supported
4641 //BMPS_WORKAROUND_NOT_NEEDED
4642 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) && ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004643 {
4644 pMac->roam.configParam.doBMPSWorkaround = 1;
4645 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004646 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4647 }
4648
4649 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_NONE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004650 // reset the PMKID candidate list
4651 csrResetPMKIDCandidateList( pMac, sessionId );
4652 //Update TL's AC weight base on the current EDCA parameters
4653 //These parameters may change in the course of the connection, that sictuation
4654 //is not taken care here. This change is mainly to address a WIFI WMM test where
4655 //BE has a equal or higher TX priority than VI.
4656 //We only do this for infra link
4657 if( csrIsConnStateConnectedInfra(pMac, sessionId ) && pIes )
4658 {
4659 csrCheckAndUpdateACWeight(pMac, pIes);
4660 }
4661#ifdef FEATURE_WLAN_WAPI
4662 // reset the BKID candidate list
4663 csrResetBKIDCandidateList( pMac, sessionId );
4664#endif /* FEATURE_WLAN_WAPI */
4665 }
4666 else
4667 {
4668 smsLog(pMac, LOGW, " Roam command doesn't have a BSS desc\n");
4669 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004670 csrScanCancelIdleScan(pMac);
4671 //Not to signal link up because keys are yet to be set.
4672 //The linkup function will overwrite the sub-state that we need to keep at this point.
4673 if( !CSR_IS_WAIT_FOR_KEY(pMac, sessionId) )
4674 {
4675 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
4676 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004677 //Check if BMPS is required and start the BMPS retry timer. Timer period is large
4678 //enough to let security and DHCP handshake succeed before entry into BMPS
4679 if (pmcShouldBmpsTimerRun(pMac))
4680 {
4681 if (pmcStartTrafficTimer(pMac, BMPS_TRAFFIC_TIMER_ALLOW_SECURITY_DHCP)
4682 != eHAL_STATUS_SUCCESS)
4683 {
4684 smsLog(pMac, LOGP, FL("Cannot start BMPS Retry timer"));
4685 }
4686 smsLog(pMac, LOG2, FL("BMPS Retry Timer already running or started"));
4687 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004688 break;
4689
Jeff Johnson295189b2012-06-20 16:38:30 -07004690 case eCsrStartBssSuccess:
4691 // on the StartBss Response, LIM is returning the Bss Description that we
4692 // are beaconing. Add this Bss Description to our scan results and
4693 // chain the Profile to this Bss Description. On a Start BSS, there was no
4694 // detected Bss description (no partner) so we issued the Start Bss to
4695 // start the Ibss without any Bss description. Lim was kind enough to return
4696 // the Bss Description that we start beaconing for the newly started Ibss.
4697 smsLog(pMac, LOG2, FL("receives start BSS ok indication\n"));
4698 status = eHAL_STATUS_FAILURE;
4699#ifdef WLAN_SOFTAP_FEATURE
4700 pSmeStartBssRsp = (tSirSmeStartBssRsp *)Context;
4701#endif
4702 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4703 if( CSR_IS_IBSS( pProfile ) )
4704 {
4705 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
4706 }
4707#ifdef WLAN_SOFTAP_FEATURE
4708 else if (CSR_IS_INFRA_AP(pProfile))
4709 {
4710 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
4711 }
4712#endif
4713 else
4714 {
4715 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
4716 }
4717 if( !CSR_IS_WDS_STA( pProfile ) )
4718 {
4719 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4720#ifdef WLAN_SOFTAP_FEATURE
4721 pSirBssDesc = &pSmeStartBssRsp->bssDescription;
4722#else
4723 pSirBssDesc = (tSirBssDescription *)Context;
4724#endif
4725 if( !HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs( pMac, pSirBssDesc, &pIes )) )
4726 {
4727 smsLog(pMac, LOG2, FL("cannot parse IBSS IEs\n"));
4728 roamInfo.pBssDesc = pSirBssDesc;
4729 //We need to associate_complete it first, becasue Associate_start already indicated.
4730 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4731 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_START_FAILED );
4732 break;
4733 }
4734#ifdef WLAN_SOFTAP_FEATURE
4735 if (!CSR_IS_INFRA_AP(pProfile))
4736#endif
4737 {
4738 pScanResult = csrScanAppendBssDescription( pMac, pSirBssDesc, pIes );
4739 }
4740 csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
4741 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4742 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4743 if(pSirBssDesc)
4744 {
4745 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4746 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4747 }
4748 //We are doen with the IEs so free it
4749 palFreeMemory(pMac->hHdd, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07004750#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4751 {
4752 vos_log_ibss_pkt_type *pIbssLog;
4753 tANI_U32 bi;
4754
4755 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4756 if(pIbssLog)
4757 {
4758 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4759 {
4760 //We start the IBSS (didn't find any matched IBSS out there)
4761 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_RSP;
4762 }
4763 else
4764 {
4765 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_RSP;
4766 }
4767 if(pSirBssDesc)
4768 {
4769 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pSirBssDesc->bssId, 6);
4770 pIbssLog->operatingChannel = pSirBssDesc->channelId;
4771 }
4772 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
4773 {
4774 //***U8 is not enough for beacon interval
4775 pIbssLog->beaconInterval = (v_U8_t)bi;
4776 }
4777 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4778 }
4779 }
4780#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4781 //Only set context for non-WDS_STA. We don't even need it for WDS_AP. But since the encryption
4782 //is WPA2-PSK so it won't matter.
Jeff Johnson295189b2012-06-20 16:38:30 -07004783#ifdef WLAN_SOFTAP_FEATURE
4784 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) && !CSR_IS_INFRA_AP( pSession->pCurRoamProfile ))
4785 {
4786#else
4787 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ))
4788 {
4789#endif
4790 // Issue the set Context request to LIM to establish the Broadcast STA context for the Ibss.
4791 csrRoamIssueSetContextReq( pMac, sessionId,
4792 pProfile->negotiatedMCEncryptionType,
4793 pSirBssDesc, &BroadcastMac,
4794 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4795 }
4796 }
4797 else
4798 {
4799 //Keep the state to eCSR_ROAMING_STATE_JOINING
4800 //Need to send join_req.
4801 if(pCommand->u.roamCmd.pRoamBssEntry)
4802 {
4803 if((pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link)))
4804 {
4805 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4806 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4807 // Set the roaming substate to 'join attempt'...
4808 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
4809 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
4810 }
4811 }
4812 else
4813 {
4814 smsLog( pMac, LOGE, " StartBSS for WDS station with no BssDesc\n" );
4815 VOS_ASSERT( 0 );
4816 }
4817 }
4818 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4819 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4820 //trigger the connection start indication in Vista
4821 if( !CSR_IS_JOIN_TO_IBSS( pProfile ) )
4822 {
4823 roamStatus = eCSR_ROAM_IBSS_IND;
4824 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4825 if( CSR_IS_WDS( pProfile ) )
4826 {
4827 roamStatus = eCSR_ROAM_WDS_IND;
4828 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4829 }
4830#ifdef WLAN_SOFTAP_FEATURE
4831 if( CSR_IS_INFRA_AP( pProfile ) )
4832 {
4833 roamStatus = eCSR_ROAM_INFRA_IND;
4834 roamResult = eCSR_ROAM_RESULT_INFRA_STARTED;
4835 }
4836#endif
4837
4838 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4839 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4840 //trigger the connection start indication in Vista
4841 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4842 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4843 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4844 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4845 {
4846 //We start the IBSS (didn't find any matched IBSS out there)
4847 roamInfo.pBssDesc = pSirBssDesc;
4848 }
4849#ifdef WLAN_SOFTAP_FEATURE
4850 roamInfo.staId = (tANI_U8)pSmeStartBssRsp->staId;
4851#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004852 //Remove this code once SLM_Sessionization is supported
4853 //BMPS_WORKAROUND_NOT_NEEDED
4854 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -07004855 ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004856 {
4857 pMac->roam.configParam.doBMPSWorkaround = 1;
4858 }
Mohit Khanna349bc392012-09-11 17:24:52 -07004859
Jeff Johnson295189b2012-06-20 16:38:30 -07004860 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4861 }
4862
4863 csrScanCancelIdleScan(pMac);
4864 //Only use this timer for ibss. BAP has its own timer for WDS
4865 if( CSR_IS_IBSS( pProfile) && CSR_INVALID_SCANRESULT_HANDLE != pCommand->u.roamCmd.hBSSList)
4866 {
4867 //start the join IBSS timer
4868 csrRoamStartIbssJoinTimer(pMac, sessionId, CSR_IBSS_JOIN_TIMEOUT_PERIOD); //interval
4869 pSession->ibss_join_pending = TRUE;
4870 }
4871 if( HAL_STATUS_SUCCESS( status ) )
4872 {
4873 //Already sent join_req for the WDS station
4874 fReleaseCommand = eANI_BOOLEAN_FALSE;
4875 }
4876 else if( CSR_IS_WDS_STA( pProfile ) )
4877 {
4878 //need to send stop BSS because we fail to send join_req
4879 csrRoamIssueDisassociateCmd( pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED );
4880 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4881 eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_STOPPED );
4882 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004883 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004884 case eCsrStartBssFailure:
4885#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4886 {
4887 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07004888 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4889 if(pIbssLog)
4890 {
4891 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
4892 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4893 }
4894 }
4895#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07004896 roamStatus = eCSR_ROAM_IBSS_IND;
4897 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4898 if( CSR_IS_WDS( pProfile ) )
4899 {
4900 roamStatus = eCSR_ROAM_WDS_IND;
4901 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4902 }
4903#ifdef WLAN_SOFTAP_FEATURE
4904 if( CSR_IS_INFRA_AP( pProfile ) )
4905 {
4906 roamStatus = eCSR_ROAM_INFRA_IND;
4907 roamResult = eCSR_ROAM_RESULT_INFRA_START_FAILED;
4908 }
4909#endif
4910 if(Context)
4911 {
4912 pSirBssDesc = (tSirBssDescription *)Context;
4913 }
4914 else
4915 {
4916 pSirBssDesc = NULL;
4917 }
4918 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4919 roamInfo.pBssDesc = pSirBssDesc;
4920 //We need to associate_complete it first, becasue Associate_start already indicated.
4921 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4922 csrSetDefaultDot11Mode( pMac );
4923 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004924 case eCsrSilentlyStopRoaming:
4925 // We are here because we try to start the same IBSS
4926 //No message to PE
4927 // return the roaming state to Joined.
4928 smsLog(pMac, LOGW, FL("receives silently roaming indication\n"));
4929 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4930 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4931 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4932 roamInfo.pBssDesc = pSession->pConnectBssDesc;
4933 if( roamInfo.pBssDesc )
4934 {
4935 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
4936 }
4937 //Since there is no change in the current state, simply pass back no result otherwise
4938 //HDD may be mistakenly mark to disconnected state.
4939 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4940 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_NONE );
Jeff Johnson295189b2012-06-20 16:38:30 -07004941 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004942 case eCsrSilentlyStopRoamingSaveState:
4943 //We are here because we try to connect to the same AP
4944 //No message to PE
4945 smsLog(pMac, LOGW, FL("receives silently stop roaming indication\n"));
4946 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4947
4948 //to aviod resetting the substate to NONE
4949 pMac->roam.curState[sessionId] = eCSR_ROAMING_STATE_JOINED;
4950 //No need to change substate to wai_for_key because there is no state change
4951 roamInfo.pBssDesc = pSession->pConnectBssDesc;
4952 if( roamInfo.pBssDesc )
4953 {
4954 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
4955 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004956 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4957 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4958 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4959 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4960 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4961 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4962 roamInfo.staId = pSession->connectedInfo.staId;
4963 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4964#if defined(VOSS_ENABLED)
4965 VOS_ASSERT( roamInfo.staId != 0 );
4966#endif
4967 pSession->bRefAssocStartCnt--;
4968 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4969 eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4970 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_ASSOCIATED, eANI_BOOLEAN_TRUE);
4971 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004972 case eCsrReassocFailure:
4973#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4974 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_REASSOC_FAILURE, NULL);
4975#endif
4976 case eCsrJoinWdsFailure:
4977 smsLog(pMac, LOGW, FL("failed to join WDS\n"));
4978 csrFreeConnectBssDesc(pMac, sessionId);
4979 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4980 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4981 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4982 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
4983 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4984 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4985 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4986 eCSR_ROAM_WDS_IND,
4987 eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED);
4988 //Need to issue stop_bss
4989 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004990 case eCsrJoinFailure:
4991 case eCsrNothingToJoin:
Jeff Johnsone7245742012-09-05 17:12:55 -07004992 case eCsrJoinFailureDueToConcurrency:
Jeff Johnson295189b2012-06-20 16:38:30 -07004993 default:
4994 {
4995 smsLog(pMac, LOGW, FL("receives no association indication\n"));
4996 if( CSR_IS_INFRASTRUCTURE( &pSession->connectedProfile ) ||
4997 CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, sessionId ) )
4998 {
4999 //do not free for the other profiles as we need to send down stop BSS later
5000 csrFreeConnectBssDesc(pMac, sessionId);
5001 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
5002 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
5003 csrSetDefaultDot11Mode( pMac );
5004 }
5005
5006 switch( pCommand->u.roamCmd.roamReason )
5007 {
5008 // If this transition is because of an 802.11 OID, then we transition
5009 // back to INIT state so we sit waiting for more OIDs to be issued and
5010 // we don't start the IDLE timer.
Jeff Johnsone7245742012-09-05 17:12:55 -07005011 case eCsrSmeIssuedFTReassoc:
Jeff Johnson295189b2012-06-20 16:38:30 -07005012 case eCsrSmeIssuedAssocToSimilarAP:
5013 case eCsrHddIssued:
5014 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5015 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5016 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5017 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5018 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07005019 /* Defeaturize this later if needed */
5020#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
5021 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
5022 if (csrRoamIsHandoffInProgress(pMac))
5023 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005024 /* Should indicate neighbor roam algorithm about the connect failure here */
5025 csrNeighborRoamIndicateConnect(pMac, (tANI_U8)sessionId, VOS_STATUS_E_FAILURE);
5026 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005027#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005028 if(pSession->bRefAssocStartCnt > 0)
5029 {
5030 pSession->bRefAssocStartCnt--;
Jeff Johnsone7245742012-09-05 17:12:55 -07005031 if(eCsrJoinFailureDueToConcurrency == Result)
5032 {
5033 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5034 eCSR_ROAM_ASSOCIATION_COMPLETION,
5035 eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL);
5036 }
5037 else
5038 {
5039 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
Jeff Johnson295189b2012-06-20 16:38:30 -07005040 eCSR_ROAM_ASSOCIATION_COMPLETION,
5041 eCSR_ROAM_RESULT_FAILURE);
Jeff Johnsone7245742012-09-05 17:12:55 -07005042 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005043 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005044 smsLog(pMac, LOG1, FL(" roam(reason %d) failed\n"), pCommand->u.roamCmd.roamReason);
5045#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5046 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5047#endif
5048 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5049 csrScanStartIdleScan(pMac);
5050#ifdef FEATURE_WLAN_BTAMP_UT_RF
5051 //For WDS STA. To fix the issue where the WDS AP side may be too busy by
5052 //BT activity and not able to recevie WLAN traffic. Retry the join
5053 if( CSR_IS_WDS_STA(pProfile) )
5054 {
5055 csrRoamStartJoinRetryTimer(pMac, sessionId, CSR_JOIN_RETRY_TIMEOUT_PERIOD);
5056 }
5057#endif
5058 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005059 case eCsrHddIssuedReassocToSameAP:
5060 case eCsrSmeIssuedReassocToSameAP:
5061 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5062
5063 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5064#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5065 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5066#endif
5067 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5068 csrScanStartIdleScan(pMac);
5069 break;
5070 case eCsrForcedDisassoc:
5071 case eCsrForcedDeauth:
5072 case eCsrSmeIssuedIbssJoinFailure:
5073 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5074
5075 if(eCsrSmeIssuedIbssJoinFailure == pCommand->u.roamCmd.roamReason)
5076 {
5077 // Notify HDD that IBSS join failed
5078 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
5079 }
5080 else
5081 {
5082 csrRoamCallCallback(pMac, sessionId, NULL,
5083 pCommand->u.roamCmd.roamId,
5084 eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5085 }
5086#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5087 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5088#endif
5089 csrRoamLinkDown(pMac, sessionId);
5090 csrScanStartIdleScan(pMac);
5091 break;
5092 case eCsrForcedIbssLeave:
5093 csrRoamCallCallback(pMac, sessionId, NULL,
5094 pCommand->u.roamCmd.roamId,
5095 eCSR_ROAM_IBSS_LEAVE,
5096 eCSR_ROAM_RESULT_IBSS_STOP);
5097 break;
5098 case eCsrForcedDisassocMICFailure:
5099 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5100
5101 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_MIC_FAILURE);
5102#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5103 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
5104#endif
5105 csrScanStartIdleScan(pMac);
5106 break;
5107#ifdef WLAN_SOFTAP_FEATURE
5108 case eCsrStopBss:
5109 csrRoamCallCallback(pMac, sessionId, NULL,
5110 pCommand->u.roamCmd.roamId,
5111 eCSR_ROAM_INFRA_IND,
5112 eCSR_ROAM_RESULT_INFRA_STOPPED);
5113 break;
5114 case eCsrForcedDisassocSta:
5115 case eCsrForcedDeauthSta:
5116 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId);
5117 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
5118 {
5119 pSession = CSR_GET_SESSION(pMac, sessionId);
5120 if (!pSession)
5121 break;
5122
5123 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
5124 {
5125 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5126 palCopyMemory(pMac->hHdd, roamInfo.peerMac,
5127 pCommand->u.roamCmd.peerMac, sizeof(tSirMacAddr));
5128 roamInfo.reasonCode = eCSR_ROAM_RESULT_FORCED;
5129 roamInfo.statusCode = eSIR_SME_SUCCESS;
5130 status = csrRoamCallCallback(pMac, sessionId,
5131 &roamInfo, pCommand->u.roamCmd.roamId,
5132 eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
5133 }
5134 }
5135 break;
5136#endif
5137 case eCsrLostLink1:
5138 // if lost link roam1 failed, then issue lost link Scan2 ...
5139 csrScanRequestLostLink2(pMac, sessionId);
5140 break;
5141 case eCsrLostLink2:
5142 // if lost link roam2 failed, then issue lost link scan3 ...
5143 csrScanRequestLostLink3(pMac, sessionId);
5144 break;
5145 case eCsrLostLink3:
5146 default:
5147 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5148
5149 //We are done with one round of lostlink roaming here
5150 csrScanHandleFailedLostlink3(pMac, sessionId);
5151 break;
5152 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005153 break;
5154 }
5155 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005156 return ( fReleaseCommand );
5157}
5158
Jeff Johnson295189b2012-06-20 16:38:30 -07005159eHalStatus csrRoamRegisterCallback(tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext)
5160{
5161 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005162 return (status);
5163}
5164
Jeff Johnson295189b2012-06-20 16:38:30 -07005165eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile, tCsrRoamProfile *pSrcProfile)
5166{
5167 eHalStatus status = eHAL_STATUS_SUCCESS;
5168 tANI_U32 size = 0;
5169
5170 do
5171 {
5172 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5173 if(pSrcProfile->BSSIDs.numOfBSSIDs)
5174 {
5175 size = sizeof(tCsrBssid) * pSrcProfile->BSSIDs.numOfBSSIDs;
5176 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, size);
5177 if(!HAL_STATUS_SUCCESS(status))
5178 {
5179 break;
5180 }
5181 pDstProfile->BSSIDs.numOfBSSIDs = pSrcProfile->BSSIDs.numOfBSSIDs;
5182 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->BSSIDs.bssid, size);
5183 }
5184 if(pSrcProfile->SSIDs.numOfSSIDs)
5185 {
5186 size = sizeof(tCsrSSIDInfo) * pSrcProfile->SSIDs.numOfSSIDs;
5187 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, size);
5188 if(!HAL_STATUS_SUCCESS(status))
5189 {
5190 break;
5191 }
5192 pDstProfile->SSIDs.numOfSSIDs = pSrcProfile->SSIDs.numOfSSIDs;
5193 palCopyMemory(pMac->hHdd, pDstProfile->SSIDs.SSIDList, pSrcProfile->SSIDs.SSIDList, size);
5194 }
5195 if(pSrcProfile->nWPAReqIELength)
5196 {
5197 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5198 if(!HAL_STATUS_SUCCESS(status))
5199 {
5200 break;
5201 }
5202 pDstProfile->nWPAReqIELength = pSrcProfile->nWPAReqIELength;
5203 palCopyMemory(pMac->hHdd, pDstProfile->pWPAReqIE, pSrcProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5204 }
5205 if(pSrcProfile->nRSNReqIELength)
5206 {
5207 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5208 if(!HAL_STATUS_SUCCESS(status))
5209 {
5210 break;
5211 }
5212 pDstProfile->nRSNReqIELength = pSrcProfile->nRSNReqIELength;
5213 palCopyMemory(pMac->hHdd, pDstProfile->pRSNReqIE, pSrcProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5214 }
5215#ifdef FEATURE_WLAN_WAPI
5216 if(pSrcProfile->nWAPIReqIELength)
5217 {
5218 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5219 if(!HAL_STATUS_SUCCESS(status))
5220 {
5221 break;
5222 }
5223 pDstProfile->nWAPIReqIELength = pSrcProfile->nWAPIReqIELength;
5224 palCopyMemory(pMac->hHdd, pDstProfile->pWAPIReqIE, pSrcProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5225 }
5226#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07005227 if(pSrcProfile->nAddIEScanLength)
5228 {
5229 status = palAllocateMemory(pMac->hHdd,
5230 (void **)&pDstProfile->pAddIEScan, pSrcProfile->nAddIEScanLength);
5231 if(!HAL_STATUS_SUCCESS(status))
5232 {
5233 break;
5234 }
5235 pDstProfile->nAddIEScanLength = pSrcProfile->nAddIEScanLength;
5236 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEScan, pSrcProfile->pAddIEScan,
5237 pSrcProfile->nAddIEScanLength);
5238 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005239 if(pSrcProfile->nAddIEAssocLength)
5240 {
5241 status = palAllocateMemory(pMac->hHdd,
5242 (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5243 if(!HAL_STATUS_SUCCESS(status))
5244 {
5245 break;
5246 }
5247 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5248 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5249 pSrcProfile->nAddIEAssocLength);
5250 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005251 if(pSrcProfile->ChannelInfo.ChannelList)
5252 {
5253 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5254 if(!HAL_STATUS_SUCCESS(status))
5255 {
5256 break;
5257 }
5258 pDstProfile->ChannelInfo.numOfChannels = pSrcProfile->ChannelInfo.numOfChannels;
5259 palCopyMemory(pMac->hHdd, pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5260 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005261 pDstProfile->AuthType = pSrcProfile->AuthType;
5262 pDstProfile->EncryptionType = pSrcProfile->EncryptionType;
5263 pDstProfile->mcEncryptionType = pSrcProfile->mcEncryptionType;
5264 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->negotiatedUCEncryptionType;
5265 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->negotiatedMCEncryptionType;
5266 pDstProfile->negotiatedAuthType = pSrcProfile->negotiatedAuthType;
5267 pDstProfile->BSSType = pSrcProfile->BSSType;
5268 pDstProfile->phyMode = pSrcProfile->phyMode;
5269 pDstProfile->csrPersona = pSrcProfile->csrPersona;
5270
5271#ifdef FEATURE_WLAN_WAPI
5272 if(csrIsProfileWapi(pSrcProfile))
5273 {
5274 if(pDstProfile->phyMode & eCSR_DOT11_MODE_11n)
5275 {
5276 pDstProfile->phyMode &= ~eCSR_DOT11_MODE_11n;
5277 }
5278 }
5279#endif /* FEATURE_WLAN_WAPI */
5280 pDstProfile->CBMode = pSrcProfile->CBMode;
5281 /*Save the WPS info*/
5282 pDstProfile->bWPSAssociation = pSrcProfile->bWPSAssociation;
5283 pDstProfile->uapsd_mask = pSrcProfile->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005284 pDstProfile->beaconInterval = pSrcProfile->beaconInterval;
5285#ifdef WLAN_SOFTAP_FEATURE
5286 pDstProfile->privacy = pSrcProfile->privacy;
5287 pDstProfile->fwdWPSPBCProbeReq = pSrcProfile->fwdWPSPBCProbeReq;
5288 pDstProfile->csr80211AuthType = pSrcProfile->csr80211AuthType;
5289 pDstProfile->dtimPeriod = pSrcProfile->dtimPeriod;
5290 pDstProfile->ApUapsdEnable = pSrcProfile->ApUapsdEnable;
5291 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->SSIDs.SSIDList[0].ssidHidden;
5292 pDstProfile->protEnabled = pSrcProfile->protEnabled;
5293 pDstProfile->obssProtEnabled = pSrcProfile->obssProtEnabled;
5294 pDstProfile->cfg_protection = pSrcProfile->cfg_protection;
5295 pDstProfile->wps_state = pSrcProfile->wps_state;
5296 pDstProfile->ieee80211d = pSrcProfile->ieee80211d;
5297#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005298 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
Jeff Johnson295189b2012-06-20 16:38:30 -07005299#ifdef WLAN_FEATURE_VOWIFI_11R
5300 if (pSrcProfile->MDID.mdiePresent)
5301 {
5302 pDstProfile->MDID.mdiePresent = 1;
5303 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5304 }
5305#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005306 }while(0);
5307
5308 if(!HAL_STATUS_SUCCESS(status))
5309 {
5310 csrReleaseProfile(pMac, pDstProfile);
5311 pDstProfile = NULL;
5312 }
5313
5314 return (status);
5315}
Jeff Johnson295189b2012-06-20 16:38:30 -07005316eHalStatus csrRoamCopyConnectedProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pDstProfile )
5317{
5318 eHalStatus status = eHAL_STATUS_SUCCESS;
5319 tCsrRoamConnectedProfile *pSrcProfile = &pMac->roam.roamSession[sessionId].connectedProfile;
5320 do
5321 {
5322 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5323 if(pSrcProfile->bssid)
5324 {
5325 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, sizeof(tCsrBssid));
5326 if(!HAL_STATUS_SUCCESS(status))
5327 {
5328 break;
5329 }
5330 pDstProfile->BSSIDs.numOfBSSIDs = 1;
5331 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->bssid, sizeof(tCsrBssid));
5332 }
5333 if(pSrcProfile->SSID.ssId)
5334 {
5335 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
5336 if(!HAL_STATUS_SUCCESS(status))
5337 {
5338 break;
5339 }
5340 pDstProfile->SSIDs.numOfSSIDs = 1;
5341 pDstProfile->SSIDs.SSIDList[0].handoffPermitted = pSrcProfile->handoffPermitted;
5342 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->ssidHidden;
5343 palCopyMemory(pMac->hHdd, &pDstProfile->SSIDs.SSIDList[0].SSID, &pSrcProfile->SSID, sizeof(tSirMacSSid));
5344 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005345 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, 1);
5346 if(!HAL_STATUS_SUCCESS(status))
5347 {
5348 break;
5349 }
5350 pDstProfile->ChannelInfo.numOfChannels = 1;
5351 pDstProfile->ChannelInfo.ChannelList[0] = pSrcProfile->operationChannel;
Jeff Johnson295189b2012-06-20 16:38:30 -07005352 pDstProfile->AuthType.numEntries = 1;
5353 pDstProfile->AuthType.authType[0] = pSrcProfile->AuthType;
5354 pDstProfile->negotiatedAuthType = pSrcProfile->AuthType;
5355 pDstProfile->EncryptionType.numEntries = 1;
5356 pDstProfile->EncryptionType.encryptionType[0] = pSrcProfile->EncryptionType;
5357 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->EncryptionType;
5358 pDstProfile->mcEncryptionType.numEntries = 1;
5359 pDstProfile->mcEncryptionType.encryptionType[0] = pSrcProfile->mcEncryptionType;
5360 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->mcEncryptionType;
5361 pDstProfile->BSSType = pSrcProfile->BSSType;
5362 pDstProfile->CBMode = pSrcProfile->CBMode;
5363 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
5364#ifdef WLAN_FEATURE_VOWIFI_11R
5365 if (pSrcProfile->MDID.mdiePresent)
5366 {
5367 pDstProfile->MDID.mdiePresent = 1;
5368 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5369 }
5370#endif
5371
5372 }while(0);
5373
5374 if(!HAL_STATUS_SUCCESS(status))
5375 {
5376 csrReleaseProfile(pMac, pDstProfile);
5377 pDstProfile = NULL;
5378 }
5379
5380 return (status);
5381}
5382
Jeff Johnson295189b2012-06-20 16:38:30 -07005383eHalStatus csrRoamIssueConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5384 tScanResultHandle hBSSList,
5385 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate,
5386 tANI_BOOLEAN fClearScan)
5387{
5388 eHalStatus status = eHAL_STATUS_SUCCESS;
5389 tSmeCmd *pCommand;
5390
5391 pCommand = csrGetCommandBuffer(pMac);
5392 if(NULL == pCommand)
5393 {
5394 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5395 status = eHAL_STATUS_RESOURCES;
5396 }
5397 else
5398 {
5399 if( fClearScan )
5400 {
5401 csrScanCancelIdleScan(pMac);
5402 csrScanAbortMacScanNotForConnect(pMac);
5403 }
5404 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5405 if(NULL == pProfile)
5406 {
5407 //We can roam now
5408 //Since pProfile is NULL, we need to build our own profile, set everything to default
5409 //We can only support open and no encryption
5410 pCommand->u.roamCmd.roamProfile.AuthType.numEntries = 1;
5411 pCommand->u.roamCmd.roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5412 pCommand->u.roamCmd.roamProfile.EncryptionType.numEntries = 1;
5413 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5414 pCommand->u.roamCmd.roamProfile.csrPersona = VOS_STA_MODE;
5415 }
5416 else
5417 {
5418 //make a copy of the profile
5419 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5420 if(HAL_STATUS_SUCCESS(status))
5421 {
5422 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5423 }
5424 }
5425 pCommand->command = eSmeCommandRoam;
5426 pCommand->sessionId = (tANI_U8)sessionId;
5427 pCommand->u.roamCmd.hBSSList = hBSSList;
5428 pCommand->u.roamCmd.roamId = roamId;
5429 pCommand->u.roamCmd.roamReason = reason;
5430 //We need to free the BssList when the command is done
5431 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_TRUE;
5432 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005433 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
5434 FL("CSR PERSONA=%d"),
5435 pCommand->u.roamCmd.roamProfile.csrPersona);
Jeff Johnson295189b2012-06-20 16:38:30 -07005436 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5437 if( !HAL_STATUS_SUCCESS( status ) )
5438 {
5439 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5440 csrReleaseCommandRoam( pMac, pCommand );
5441 }
5442 }
5443
5444 return (status);
5445}
Jeff Johnson295189b2012-06-20 16:38:30 -07005446eHalStatus csrRoamIssueReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5447 tCsrRoamModifyProfileFields *pMmodProfileFields,
5448 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5449{
5450 eHalStatus status = eHAL_STATUS_SUCCESS;
5451 tSmeCmd *pCommand;
5452
5453 pCommand = csrGetCommandBuffer(pMac);
5454 if(NULL == pCommand)
5455 {
5456 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5457 status = eHAL_STATUS_RESOURCES;
5458 }
5459 else
5460 {
5461 csrScanCancelIdleScan(pMac);
5462 csrScanAbortMacScanNotForConnect(pMac);
5463 if(pProfile)
5464 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005465 //This is likely trying to reassoc to different profile
5466 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5467 //make a copy of the profile
5468 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5469 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005470 }
5471 else
5472 {
5473 status = csrRoamCopyConnectedProfile(pMac, sessionId, &pCommand->u.roamCmd.roamProfile);
5474 //how to update WPA/WPA2 info in roamProfile??
5475 pCommand->u.roamCmd.roamProfile.uapsd_mask = pMmodProfileFields->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005476 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005477 if(HAL_STATUS_SUCCESS(status))
5478 {
5479 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5480 }
5481 pCommand->command = eSmeCommandRoam;
5482 pCommand->sessionId = (tANI_U8)sessionId;
5483 pCommand->u.roamCmd.roamId = roamId;
5484 pCommand->u.roamCmd.roamReason = reason;
5485 //We need to free the BssList when the command is done
5486 //For reassoc there is no BSS list, so the boolean set to false
5487 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
5488 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
5489 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005490 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5491 if( !HAL_STATUS_SUCCESS( status ) )
5492 {
5493 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5494 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5495 csrReleaseCommandRoam( pMac, pCommand );
5496 }
5497 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005498 return (status);
5499}
5500
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07005501eHalStatus csrRoamEnqueuePreauth(tpAniSirGlobal pMac, tANI_U32 sessionId, tpSirBssDescription pBssDescription,
5502 eCsrRoamReason reason, tANI_BOOLEAN fImmediate)
5503// , eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5504{
5505 eHalStatus status = eHAL_STATUS_SUCCESS;
5506 tSmeCmd *pCommand;
5507
5508 pCommand = csrGetCommandBuffer(pMac);
5509 if(NULL == pCommand)
5510 {
5511 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5512 status = eHAL_STATUS_RESOURCES;
5513 }
5514 else
5515 {
5516 if(pBssDescription)
5517 {
5518 //copy over the parameters we need later
5519 pCommand->command = eSmeCommandRoam;
5520 pCommand->sessionId = (tANI_U8)sessionId;
5521 pCommand->u.roamCmd.roamReason = reason;
5522 //this is the important parameter
5523 //in this case we are using this field for the "next" BSS
5524 pCommand->u.roamCmd.pLastRoamBss = pBssDescription;
5525 status = csrQueueSmeCommand(pMac, pCommand, fImmediate);
5526 if( !HAL_STATUS_SUCCESS( status ) )
5527 {
5528 smsLog( pMac, LOGE, FL(" fail to enqueue preauth command, status = %d\n"), status );
5529 csrReleaseCommandPreauth( pMac, pCommand );
5530 }
5531 }
5532 else
5533 {
5534 //Return failure
5535 status = eHAL_STATUS_RESOURCES;
5536 }
5537 }
5538 return (status);
5539}
5540
5541eHalStatus csrRoamDequeuePreauth(tpAniSirGlobal pMac)
5542{
5543 tListElem *pEntry;
5544 tSmeCmd *pCommand;
5545 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
5546 if ( pEntry )
5547 {
5548 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
5549 if ( (eSmeCommandRoam == pCommand->command) &&
5550 (eCsrPerformPreauth == pCommand->u.roamCmd.roamReason))
5551 {
5552 smsLog( pMac, LOGE, FL("DQ-Command = %d, Reason = %d \n"),
5553 pCommand->command, pCommand->u.roamCmd.roamReason);
5554 if (csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK )) {
5555 csrReleaseCommandPreauth( pMac, pCommand );
5556 }
5557 } else {
5558 smsLog( pMac, LOGE, FL("Command = %d, Reason = %d \n"),
5559 pCommand->command, pCommand->u.roamCmd.roamReason);
5560 }
5561 }
5562 else {
5563 smsLog( pMac, LOGE, FL("pEntry NULL for eWNI_SME_FT_PRE_AUTH_RSP\n"));
5564 }
5565 smeProcessPendingQueue( pMac );
5566 return eHAL_STATUS_SUCCESS;
5567}
5568
Jeff Johnson295189b2012-06-20 16:38:30 -07005569eHalStatus csrRoamConnectWithBSSList(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5570 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5571{
5572 eHalStatus status = eHAL_STATUS_FAILURE;
5573 tScanResultHandle hBSSList;
5574 tANI_U32 roamId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005575 status = csrScanCopyResultList(pMac, hBssListIn, &hBSSList);
5576 if(HAL_STATUS_SUCCESS(status))
5577 {
5578 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5579 if(pRoamId)
5580 {
5581 *pRoamId = roamId;
5582 }
5583 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5584 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5585 if(!HAL_STATUS_SUCCESS(status))
5586 {
5587 smsLog(pMac, LOGE, FL("failed to start a join process\n"));
5588 csrScanResultPurge(pMac, hBSSList);
5589 }
5590 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005591 return (status);
5592}
5593
Jeff Johnson295189b2012-06-20 16:38:30 -07005594eHalStatus csrRoamConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5595 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5596{
5597 eHalStatus status = eHAL_STATUS_SUCCESS;
5598 tScanResultHandle hBSSList;
5599 tCsrScanResultFilter *pScanFilter;
5600 tANI_U32 roamId = 0;
5601 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_FALSE;
5602 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005603 if (NULL == pProfile)
5604 {
5605 smsLog(pMac, LOGP, FL("No profile specified"));
5606 return eHAL_STATUS_FAILURE;
5607 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005608 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"),
5609 pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07005610 if( CSR_IS_WDS( pProfile ) &&
5611 !HAL_STATUS_SUCCESS( status = csrIsBTAMPAllowed( pMac, pProfile->operationChannel ) ) )
5612 {
5613 return status;
5614 }
5615 csrRoamCancelRoaming(pMac, sessionId);
5616 csrScanRemoveFreshScanCommand(pMac, sessionId);
5617 csrScanCancelIdleScan(pMac);
5618 //Only abort the scan if it is not used for other roam/connect purpose
5619 csrScanAbortMacScan(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07005620#ifdef WLAN_SOFTAP_FEATURE
5621 if (!vos_concurrent_sessions_running() && (VOS_STA_SAP_MODE == pProfile->csrPersona))//In case of AP mode we do not want idle mode scan
5622 {
5623 csrScanDisable(pMac);
5624 }
5625#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005626 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5627 //Check whether ssid changes
5628 if(csrIsConnStateConnected(pMac, sessionId))
5629 {
5630 if(pProfile->SSIDs.numOfSSIDs && !csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5631 {
5632 csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5633 }
5634 }
5635#ifdef FEATURE_WLAN_BTAMP_UT_RF
5636 pSession->maxRetryCount = CSR_JOIN_MAX_RETRY_COUNT;
5637#endif
5638 if(CSR_INVALID_SCANRESULT_HANDLE != hBssListIn)
5639 {
5640 smsLog(pMac, LOGW, FL("is called with BSSList\n"));
5641 status = csrRoamConnectWithBSSList(pMac, sessionId, pProfile, hBssListIn, pRoamId);
5642 if(pRoamId)
5643 {
5644 roamId = *pRoamId;
5645 }
5646 if(!HAL_STATUS_SUCCESS(status))
5647 {
5648 fCallCallback = eANI_BOOLEAN_TRUE;
5649 }
5650 }
5651 else
5652 {
5653 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5654 if(HAL_STATUS_SUCCESS(status))
5655 {
5656 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5657 //Try to connect to any BSS
5658 if(NULL == pProfile)
5659 {
5660 //No encryption
5661 pScanFilter->EncryptionType.numEntries = 1;
5662 pScanFilter->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5663 }//we don't have a profile
5664 else
5665 {
5666 //Here is the profile we need to connect to
5667 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5668 }//We have a profile
5669 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5670 if(pRoamId)
5671 {
5672 *pRoamId = roamId;
5673 }
5674
5675 if(HAL_STATUS_SUCCESS(status))
5676 {
5677 /*Save the WPS info*/
5678 if(NULL != pProfile)
5679 {
5680 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
5681 }
5682 else
5683 {
5684 pScanFilter->bWPSAssociation = 0;
5685 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005686 do
5687 {
5688 if( (pProfile && CSR_IS_WDS_AP( pProfile ) )
5689#ifdef WLAN_SOFTAP_FEATURE
5690 || (pProfile && CSR_IS_INFRA_AP ( pProfile ))
5691#endif
5692 )
5693 {
5694 //This can be start right away
5695 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5696 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5697 if(!HAL_STATUS_SUCCESS(status))
5698 {
5699 fCallCallback = eANI_BOOLEAN_TRUE;
5700 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005701 break;
5702 }
5703 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
Mohit Khanna23863762012-09-11 17:40:09 -07005704 smsLog(pMac, LOG1, "************ csrScanGetResult Status ********* %d\n", status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005705 if(HAL_STATUS_SUCCESS(status))
5706 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005707 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5708 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5709 if(!HAL_STATUS_SUCCESS(status))
5710 {
5711 csrScanResultPurge(pMac, hBSSList);
5712 fCallCallback = eANI_BOOLEAN_TRUE;
5713 }
5714 }//Have scan result
5715 else if(NULL != pProfile)
5716 {
5717 //Check whether it is for start ibss
5718 if(CSR_IS_START_IBSS(pProfile))
5719 {
5720 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5721 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5722 if(!HAL_STATUS_SUCCESS(status))
5723 {
5724 smsLog(pMac, LOGE, " CSR failed to issue startIBSS command with status = 0x%08X\n", status);
5725 fCallCallback = eANI_BOOLEAN_TRUE;
5726 }
5727 }
5728 else
5729 {
5730 //scan for this SSID
5731 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5732 if(!HAL_STATUS_SUCCESS(status))
5733 {
5734 fCallCallback = eANI_BOOLEAN_TRUE;
5735 }
5736 }
5737 }
5738 else
5739 {
5740 fCallCallback = eANI_BOOLEAN_TRUE;
5741 }
5742 } while (0);
5743 if(NULL != pProfile)
5744 {
5745 //we need to free memory for filter if profile exists
5746 csrFreeScanFilter(pMac, pScanFilter);
5747 }
5748 }//Got the scan filter from profile
5749
5750 palFreeMemory(pMac->hHdd, pScanFilter);
5751 }//allocated memory for pScanFilter
5752 }//No Bsslist coming in
5753 //tell the caller if we fail to trigger a join request
5754 if( fCallCallback )
5755 {
5756 csrRoamCallCallback(pMac, sessionId, NULL, roamId, eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5757 }
5758
5759 return (status);
5760}
Jeff Johnson295189b2012-06-20 16:38:30 -07005761eHalStatus csrRoamReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5762 tCsrRoamModifyProfileFields modProfileFields,
5763 tANI_U32 *pRoamId)
5764{
5765 eHalStatus status = eHAL_STATUS_SUCCESS;
5766 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_TRUE;
5767 tANI_U32 roamId = 0;
5768 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005769 if (NULL == pProfile)
5770 {
5771 smsLog(pMac, LOGP, FL("No profile specified"));
5772 return eHAL_STATUS_FAILURE;
5773 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005774 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"), pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
5775 csrRoamCancelRoaming(pMac, sessionId);
5776 csrScanRemoveFreshScanCommand(pMac, sessionId);
5777 csrScanCancelIdleScan(pMac);
5778 csrScanAbortMacScanNotForConnect(pMac);
5779 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssuedReassocToSameAP);
Jeff Johnson295189b2012-06-20 16:38:30 -07005780 if(csrIsConnStateConnected(pMac, sessionId))
5781 {
5782 if(pProfile)
5783 {
5784 if(pProfile->SSIDs.numOfSSIDs &&
5785 csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5786 {
5787 fCallCallback = eANI_BOOLEAN_FALSE;
5788 }
5789 else
5790 {
5791 smsLog(pMac, LOG1, FL("Not connected to the same SSID asked in the profile\n"));
5792 }
5793 }
5794 else if(!palEqualMemory(pMac->hHdd, &modProfileFields,
5795 &pSession->connectedProfile.modifyProfileFields,
5796 sizeof(tCsrRoamModifyProfileFields)))
5797 {
5798 fCallCallback = eANI_BOOLEAN_FALSE;
5799 }
5800 else
5801 {
5802 smsLog(pMac, LOG1, FL("Either the profile is NULL or none of the fields "
5803 "in tCsrRoamModifyProfileFields got modified\n"));
5804 }
5805 }
5806 else
5807 {
5808 smsLog(pMac, LOG1, FL("Not connected! No need to reassoc\n"));
5809 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005810 if(!fCallCallback)
5811 {
5812 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5813 if(pRoamId)
5814 {
5815 *pRoamId = roamId;
5816 }
5817
Jeff Johnson295189b2012-06-20 16:38:30 -07005818 status = csrRoamIssueReassoc(pMac, sessionId, pProfile, &modProfileFields,
5819 eCsrHddIssuedReassocToSameAP, roamId, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005820 }
5821 else
5822 {
5823 status = csrRoamCallCallback(pMac, sessionId, NULL, roamId,
5824 eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5825 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005826 return status;
5827}
Jeff Johnson295189b2012-06-20 16:38:30 -07005828eHalStatus csrRoamJoinLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5829{
5830 eHalStatus status = eHAL_STATUS_FAILURE;
5831 tScanResultHandle hBSSList = NULL;
5832 tCsrScanResultFilter *pScanFilter = NULL;
5833 tANI_U32 roamId;
5834 tCsrRoamProfile *pProfile = NULL;
5835 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07005836
5837 if(!pSession)
5838 {
5839 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
5840 return eHAL_STATUS_FAILURE;
5841 }
5842
Jeff Johnson295189b2012-06-20 16:38:30 -07005843 do
5844 {
5845 if(pSession->pCurRoamProfile)
5846 {
5847 csrScanCancelIdleScan(pMac);
5848 csrScanAbortMacScanNotForConnect(pMac);
5849 //We have to make a copy of pCurRoamProfile because it will be free inside csrRoamIssueConnect
5850 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile, sizeof(tCsrRoamProfile));
5851 if(!HAL_STATUS_SUCCESS(status))
5852 break;
5853 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamProfile));
5854 status = csrRoamCopyProfile(pMac, pProfile, pSession->pCurRoamProfile);
5855 if(!HAL_STATUS_SUCCESS(status))
5856 break;
5857 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5858 if(!HAL_STATUS_SUCCESS(status))
5859 {
5860 break;
5861 }
5862 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5863 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5864 if(!HAL_STATUS_SUCCESS(status))
5865 {
5866 break;
5867 }
5868 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5869 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
5870 if(HAL_STATUS_SUCCESS(status))
5871 {
5872 //we want to put the last connected BSS to the very beginning, if possible
5873 csrMoveBssToHeadFromBSSID(pMac, &pSession->connectedProfile.bssid, hBSSList);
5874 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5875 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5876 if(!HAL_STATUS_SUCCESS(status))
5877 {
5878 csrScanResultPurge(pMac, hBSSList);
5879 break;
5880 }
5881 }
5882 else
5883 {
5884 //Do a scan on this profile
5885 //scan for this SSID only in case the AP suppresses SSID
5886 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5887 if(!HAL_STATUS_SUCCESS(status))
5888 {
5889 break;
5890 }
5891 }
5892 }//We have a profile
5893 else
5894 {
5895 smsLog(pMac, LOGW, FL("cannot find a roaming profile\n"));
5896 break;
5897 }
5898 }while(0);
5899 if(pScanFilter)
5900 {
5901 csrFreeScanFilter(pMac, pScanFilter);
5902 palFreeMemory(pMac->hHdd, pScanFilter);
5903 }
5904 if(NULL != pProfile)
5905 {
5906 csrReleaseProfile(pMac, pProfile);
5907 palFreeMemory(pMac->hHdd, pProfile);
5908 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005909 return (status);
5910}
Jeff Johnson295189b2012-06-20 16:38:30 -07005911eHalStatus csrRoamReconnect(tpAniSirGlobal pMac, tANI_U32 sessionId)
5912{
5913 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005914 if(csrIsConnStateConnected(pMac, sessionId))
5915 {
5916 status = csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5917 if(HAL_STATUS_SUCCESS(status))
5918 {
5919 status = csrRoamJoinLastProfile(pMac, sessionId);
5920 }
5921 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005922 return (status);
5923}
5924
Jeff Johnson295189b2012-06-20 16:38:30 -07005925eHalStatus csrRoamConnectToLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5926{
5927 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005928 smsLog(pMac, LOGW, FL("is called\n"));
5929 csrRoamCancelRoaming(pMac, sessionId);
5930 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5931 if(csrIsConnStateDisconnected(pMac, sessionId))
5932 {
5933 status = csrRoamJoinLastProfile(pMac, sessionId);
5934 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005935 return (status);
5936}
5937
Jeff Johnson295189b2012-06-20 16:38:30 -07005938eHalStatus csrRoamProcessDisassocDeauth( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fDisassoc, tANI_BOOLEAN fMICFailure )
5939{
5940 eHalStatus status = eHAL_STATUS_SUCCESS;
5941 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
5942 eCsrRoamSubState NewSubstate;
5943 tANI_U32 sessionId = pCommand->sessionId;
5944
5945 // change state to 'Roaming'...
5946 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
5947
5948 if ( csrIsConnStateIbss( pMac, sessionId ) )
5949 {
5950 // If we are in an IBSS, then stop the IBSS...
5951 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
5952 fComplete = (!HAL_STATUS_SUCCESS(status));
5953 }
5954 else if ( csrIsConnStateInfra( pMac, sessionId ) )
5955 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07005956 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 -07005957 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
5958 //Restore AC weight in case we change it
5959 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
5960 // in Infrasturcture, we need to disassociate from the Infrastructure network...
5961 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_FORCED;
5962 if(eCsrSmeIssuedDisassocForHandoff == pCommand->u.roamCmd.roamReason)
5963 {
5964 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF;
5965 }
5966 if( fDisassoc )
5967 {
5968 status = csrRoamIssueDisassociate( pMac, sessionId, NewSubstate, fMICFailure );
5969 }
5970 else
5971 {
5972 status = csrRoamIssueDeauth( pMac, sessionId, eCSR_ROAM_SUBSTATE_DEAUTH_REQ );
5973 }
5974 fComplete = (!HAL_STATUS_SUCCESS(status));
5975 }
5976 else if ( csrIsConnStateWds( pMac, sessionId ) )
5977 {
5978 if( CSR_IS_WDS_AP( &pMac->roam.roamSession[sessionId].connectedProfile ) )
5979 {
5980 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
5981 fComplete = (!HAL_STATUS_SUCCESS(status));
5982 }
5983 //This has to be WDS station
5984 else if( csrIsConnStateConnectedWds( pMac, sessionId ) ) //This has to be WDS station
5985 {
5986
5987 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
5988 if( fDisassoc )
5989 {
5990 status = csrRoamIssueDisassociate( pMac, sessionId,
5991 eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, fMICFailure );
5992 fComplete = (!HAL_STATUS_SUCCESS(status));
5993 }
5994 }
5995 } else {
5996 // we got a dis-assoc request while not connected to any peer
5997 // just complete the command
5998 fComplete = eANI_BOOLEAN_TRUE;
5999 status = eHAL_STATUS_FAILURE;
6000 }
6001 if(fComplete)
6002 {
6003 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6004 }
6005
6006 if(HAL_STATUS_SUCCESS(status))
6007 {
6008 if ( csrIsConnStateInfra( pMac, sessionId ) )
6009 {
6010 //Set the state to disconnect here
6011 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6012 }
6013 }
6014 return (status);
6015}
6016
Jeff Johnson295189b2012-06-20 16:38:30 -07006017/* This is been removed from latest code base */
6018/*
6019static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand )
6020{
6021 eHalStatus status;
6022 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07006023 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING );
6024 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
Jeff Johnson295189b2012-06-20 16:38:30 -07006025 return ( status );
6026}
6027*/
6028
Jeff Johnson295189b2012-06-20 16:38:30 -07006029eHalStatus csrRoamIssueDisassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason )
6030{
6031 eHalStatus status = eHAL_STATUS_SUCCESS;
6032 tSmeCmd *pCommand;
6033 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006034 do
6035 {
6036 smsLog( pMac, LOGE, FL(" reason = %d\n"), reason );
6037 pCommand = csrGetCommandBuffer( pMac );
6038 if ( !pCommand )
6039 {
6040 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6041 status = eHAL_STATUS_RESOURCES;
6042 break;
6043 }
6044 //Change the substate in case it is wait-for-key
6045 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6046 {
6047 csrRoamStopWaitForKeyTimer( pMac );
6048 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6049 }
6050 pCommand->command = eSmeCommandRoam;
6051 pCommand->sessionId = (tANI_U8)sessionId;
6052 switch ( reason )
6053 {
6054 case eCSR_DISCONNECT_REASON_MIC_ERROR:
6055 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocMICFailure;
6056 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006057 case eCSR_DISCONNECT_REASON_DEAUTH:
6058 pCommand->u.roamCmd.roamReason = eCsrForcedDeauth;
6059 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006060 case eCSR_DISCONNECT_REASON_HANDOFF:
6061 fHighPriority = eANI_BOOLEAN_TRUE;
6062 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedDisassocForHandoff;
6063 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006064 case eCSR_DISCONNECT_REASON_UNSPECIFIED:
6065 case eCSR_DISCONNECT_REASON_DISASSOC:
6066 pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc;
6067 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006068 case eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE:
6069 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedIbssJoinFailure;
6070 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006071 case eCSR_DISCONNECT_REASON_IBSS_LEAVE:
6072 pCommand->u.roamCmd.roamReason = eCsrForcedIbssLeave;
6073 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006074 default:
6075 break;
6076 }
6077 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6078 if( !HAL_STATUS_SUCCESS( status ) )
6079 {
6080 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6081 csrReleaseCommandRoam( pMac, pCommand );
6082 }
6083 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07006084 return( status );
6085}
6086
Jeff Johnson295189b2012-06-20 16:38:30 -07006087eHalStatus csrRoamIssueStopBssCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN fHighPriority )
6088{
6089 eHalStatus status = eHAL_STATUS_SUCCESS;
6090 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006091 pCommand = csrGetCommandBuffer( pMac );
6092 if ( NULL != pCommand )
6093 {
6094 //Change the substate in case it is wait-for-key
6095 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
6096 {
6097 csrRoamStopWaitForKeyTimer( pMac );
6098 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6099 }
6100 pCommand->command = eSmeCommandRoam;
6101 pCommand->sessionId = (tANI_U8)sessionId;
6102 pCommand->u.roamCmd.roamReason = eCsrStopBss;
6103 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6104 if( !HAL_STATUS_SUCCESS( status ) )
6105 {
6106 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6107 csrReleaseCommandRoam( pMac, pCommand );
6108 }
6109 }
6110 else
6111 {
6112 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6113 status = eHAL_STATUS_RESOURCES;
6114 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006115 return ( status );
6116}
6117
Jeff Johnson295189b2012-06-20 16:38:30 -07006118eHalStatus csrRoamDisconnectInternal(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6119{
6120 eHalStatus status = eHAL_STATUS_SUCCESS;
6121 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006122
6123 if(!pSession)
6124 {
6125 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6126 return eHAL_STATUS_FAILURE;
6127 }
6128
Jeff Johnson295189b2012-06-20 16:38:30 -07006129#ifdef FEATURE_WLAN_BTAMP_UT_RF
6130 //Stop te retry
6131 pSession->maxRetryCount = 0;
6132 csrRoamStopJoinRetryTimer(pMac, sessionId);
6133#endif
6134 //Not to call cancel roaming here
6135 //Only issue disconnect when necessary
6136 if(csrIsConnStateConnected(pMac, sessionId) || csrIsBssTypeIBSS(pSession->connectedProfile.BSSType)
6137 || csrIsBssTypeWDS(pSession->connectedProfile.BSSType)
6138 || csrIsRoamCommandWaitingForSession(pMac, sessionId) )
6139
6140 {
6141 smsLog(pMac, LOG2, FL("called\n"));
6142 status = csrRoamIssueDisassociateCmd(pMac, sessionId, reason);
6143 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006144 return (status);
6145}
6146
Jeff Johnson295189b2012-06-20 16:38:30 -07006147eHalStatus csrRoamDisconnect(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6148{
6149 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006150
6151 if(!pSession)
6152 {
6153 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6154 return eHAL_STATUS_FAILURE;
6155 }
6156
Jeff Johnson295189b2012-06-20 16:38:30 -07006157 csrRoamCancelRoaming(pMac, sessionId);
6158 pSession->ibss_join_pending = FALSE;
6159 csrRoamStopIbssJoinTimer(pMac, sessionId);
6160 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrForcedDisassoc);
6161
6162 return (csrRoamDisconnectInternal(pMac, sessionId, reason));
6163}
6164
Jeff Johnson295189b2012-06-20 16:38:30 -07006165eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
6166 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes)
6167{
6168 eHalStatus status = eHAL_STATUS_SUCCESS;
6169 tDot11fBeaconIEs *pIesTemp = pIes;
6170 tANI_U8 index;
6171 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
6172 tCsrRoamConnectedProfile *pConnectProfile = &pSession->connectedProfile;
Jeff Johnson32d95a32012-09-10 13:15:23 -07006173
6174 if(!pSession)
6175 {
6176 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6177 return eHAL_STATUS_FAILURE;
6178 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006179
6180 palZeroMemory(pMac->hHdd, &pSession->connectedProfile, sizeof(tCsrRoamConnectedProfile));
6181 pConnectProfile->AuthType = pProfile->negotiatedAuthType;
6182 pConnectProfile->AuthInfo = pProfile->AuthType;
6183 pConnectProfile->CBMode = pProfile->CBMode; //*** this may not be valid
6184 pConnectProfile->EncryptionType = pProfile->negotiatedUCEncryptionType;
6185 pConnectProfile->EncryptionInfo = pProfile->EncryptionType;
6186 pConnectProfile->mcEncryptionType = pProfile->negotiatedMCEncryptionType;
6187 pConnectProfile->mcEncryptionInfo = pProfile->mcEncryptionType;
6188 pConnectProfile->BSSType = pProfile->BSSType;
6189 pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask;
6190 pConnectProfile->operationChannel = pSirBssDesc->channelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07006191 pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval;
6192
Jeff Johnson295189b2012-06-20 16:38:30 -07006193 palCopyMemory(pMac->hHdd, &pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys));
6194 //Save bssid
6195 csrGetBssIdBssDesc(pMac, pSirBssDesc, &pConnectProfile->bssid);
6196#ifdef WLAN_FEATURE_VOWIFI_11R
6197 if (pSirBssDesc->mdiePresent)
6198 {
6199 pConnectProfile->MDID.mdiePresent = 1;
6200 pConnectProfile->MDID.mobilityDomain = (pSirBssDesc->mdie[1] << 8) | (pSirBssDesc->mdie[0]);
6201 }
6202#endif
6203#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006204 if ((csrIsProfileCCX(pProfile) ||
6205 ((pIesTemp->CCXVersion.present)
6206 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
6207 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
6208 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
6209 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
6210 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
6211 && (!(csrIsProfile11r( pProfile )))
6212 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -07006213 {
6214 pConnectProfile->isCCXAssoc = 1;
6215 }
6216#endif
6217 //save ssid
6218 if( NULL == pIesTemp )
6219 {
6220 status = csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesTemp);
6221 }
6222 if(HAL_STATUS_SUCCESS(status))
6223 {
6224 if(pIesTemp->SSID.present)
6225 {
6226 pConnectProfile->SSID.length = pIesTemp->SSID.num_ssid;
6227 palCopyMemory(pMac->hHdd, pConnectProfile->SSID.ssId,
6228 pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid);
6229 }
6230
6231 //Save the bss desc
6232 status = csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006233 if( CSR_IS_QOS_BSS(pIesTemp) )
6234 {
6235 pConnectProfile->qap = TRUE;
6236 }
6237 else
6238 {
6239 pConnectProfile->qap = FALSE;
6240 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006241 if ( NULL == pIes )
6242 {
6243 //Free memory if it allocated locally
6244 palFreeMemory(pMac->hHdd, pIesTemp);
6245 }
6246 }
6247 //Save Qos connection
6248 pConnectProfile->qosConnection = pMac->roam.roamSession[sessionId].fWMMConnection;
6249
6250 if(!HAL_STATUS_SUCCESS(status))
6251 {
6252 csrFreeConnectBssDesc(pMac, sessionId);
6253 }
6254 for(index = 0; index < pProfile->SSIDs.numOfSSIDs; index++)
6255 {
6256 if((pProfile->SSIDs.SSIDList[index].SSID.length == pConnectProfile->SSID.length) &&
6257 palEqualMemory(pMac->hHdd, pProfile->SSIDs.SSIDList[index].SSID.ssId,
6258 pConnectProfile->SSID.ssId, pConnectProfile->SSID.length))
6259 {
6260 pConnectProfile->handoffPermitted = pProfile->SSIDs.SSIDList[index].handoffPermitted;
6261 break;
6262 }
6263 pConnectProfile->handoffPermitted = FALSE;
6264 }
6265
6266 return (status);
6267}
6268
Jeff Johnson295189b2012-06-20 16:38:30 -07006269static void csrRoamJoinRspProcessor( tpAniSirGlobal pMac, tSirSmeJoinRsp *pSmeJoinRsp )
6270{
6271 tListElem *pEntry = NULL;
6272 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006273 //The head of the active list is the request we sent
6274 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6275 if(pEntry)
6276 {
6277 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6278 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006279 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6280 {
6281 if(pCommand && eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason)
6282 {
6283#ifndef WLAN_MDM_CODE_REDUCTION_OPT
6284 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6285#endif
6286 }
6287 csrRoamComplete( pMac, eCsrJoinSuccess, (void *)pSmeJoinRsp );
6288 }
6289 else
6290 {
6291 tANI_U32 roamId = 0;
6292 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pSmeJoinRsp->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006293 if(!pSession)
6294 {
6295 smsLog(pMac, LOGE, FL(" session %d not found "), pSmeJoinRsp->sessionId);
6296 return;
6297 }
6298
Jeff Johnson295189b2012-06-20 16:38:30 -07006299
6300 //The head of the active list is the request we sent
6301 //Try to get back the same profile and roam again
6302 if(pCommand)
6303 {
6304 roamId = pCommand->u.roamCmd.roamId;
6305 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006306 pSession->joinFailStatusCode.statusCode = pSmeJoinRsp->statusCode;
6307 pSession->joinFailStatusCode.reasonCode = pSmeJoinRsp->protStatusCode;
6308 smsLog( pMac, LOGW, "SmeJoinReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6309#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6310 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
6311 if (csrRoamIsHandoffInProgress(pMac))
6312 {
6313 csrRoamCallCallback(pMac, pSmeJoinRsp->sessionId, NULL, roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
6314 /* Should indicate neighbor roam algorithm about the connect failure here */
6315 csrNeighborRoamIndicateConnect(pMac, pSmeJoinRsp->sessionId, VOS_STATUS_E_FAILURE);
6316 }
6317#endif
6318 if (pCommand)
6319 {
6320 if(CSR_IS_WDS_STA( &pCommand->u.roamCmd.roamProfile ))
6321 {
6322 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6323 pSession->connectedProfile.BSSType = eCSR_BSS_TYPE_WDS_STA;
6324 csrRoamReissueRoamCommand(pMac);
6325 }
6326 else if( CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile ) )
6327 {
6328 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6329 }
6330 else
6331 {
6332 csrRoam(pMac, pCommand);
6333 }
6334 }
6335 else
6336 {
6337 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6338 }
6339 } /*else: ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode ) */
6340}
6341
Jeff Johnson295189b2012-06-20 16:38:30 -07006342eHalStatus csrRoamIssueJoin( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6343 tDot11fBeaconIEs *pIes,
6344 tCsrRoamProfile *pProfile, tANI_U32 roamId )
6345{
6346 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006347 smsLog( pMac, LOG1, "Attempting to Join Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
6348 pSirBssDesc->bssId[ 0 ],pSirBssDesc->bssId[ 1 ],pSirBssDesc->bssId[ 2 ],
6349 pSirBssDesc->bssId[ 3 ],pSirBssDesc->bssId[ 4 ],pSirBssDesc->bssId[ 5 ] );
6350
6351 // Set the roaming substate to 'join attempt'...
6352 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006353 // attempt to Join this BSS...
6354 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07006355 return (status);
6356}
6357
Jeff Johnson295189b2012-06-20 16:38:30 -07006358static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6359 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile)
6360{
6361 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006362 // Set the roaming substate to 'join attempt'...
6363 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_REASSOC_REQ, sessionId );
6364
6365 smsLog(pMac, LOGE, FL(" calling csrSendSmeReassocReqMsg\n"));
6366
6367 // attempt to Join this BSS...
6368 return csrSendSmeReassocReqMsg( pMac, sessionId, pSirBssDesc, pIes, pProfile );
6369}
6370
Jeff Johnson295189b2012-06-20 16:38:30 -07006371void csrRoamReissueRoamCommand(tpAniSirGlobal pMac)
6372{
6373 tListElem *pEntry;
6374 tSmeCmd *pCommand;
6375 tCsrRoamInfo roamInfo;
6376 tANI_U32 sessionId;
6377 tCsrRoamSession *pSession;
6378
6379 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6380 if(pEntry)
6381 {
6382 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6383 if ( eSmeCommandRoam == pCommand->command )
6384 {
6385 sessionId = pCommand->sessionId;
6386 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006387
6388 if(!pSession)
6389 {
6390 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6391 return;
6392 }
6393
Jeff Johnson295189b2012-06-20 16:38:30 -07006394 if( pCommand->u.roamCmd.fStopWds )
6395 {
6396 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
6397 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
6398 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
6399 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
6400#ifdef WLAN_SOFTAP_FEATURE
6401 if (CSR_IS_WDS(&pSession->connectedProfile)){
6402#endif
6403 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
6404 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6405 eCSR_ROAM_WDS_IND,
6406 eCSR_ROAM_RESULT_WDS_DISASSOCIATED);
6407#ifdef WLAN_SOFTAP_FEATURE
6408 }else if (CSR_IS_INFRA_AP(&pSession->connectedProfile)){
6409 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
6410 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6411 eCSR_ROAM_INFRA_IND,
6412 eCSR_ROAM_RESULT_INFRA_DISASSOCIATED);
6413 }
6414
6415#endif
6416
Jeff Johnson295189b2012-06-20 16:38:30 -07006417 if( !HAL_STATUS_SUCCESS( csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ ) ) )
6418 {
6419 smsLog(pMac, LOGE, " Failed to reissue stop_bss command for WDS after disassociated\n");
6420 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6421 }
6422 }
6423 else if(eCsrStopRoaming == csrRoamJoinNextBss(pMac, pCommand, eANI_BOOLEAN_TRUE))
6424 {
6425 smsLog(pMac, LOGW, " Failed to reissue join command after disassociated\n");
6426 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6427 }
6428 }
6429 else
6430 {
6431 smsLog(pMac, LOGW, " Command is not roaming after disassociated\n");
6432 }
6433 }
6434 else
6435 {
6436 smsLog(pMac, LOGE, " Disassoc rsp cannot continue because no command is available\n");
6437 }
6438}
6439
Jeff Johnson295189b2012-06-20 16:38:30 -07006440tANI_BOOLEAN csrIsRoamCommandWaitingForSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
6441{
6442 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6443 tListElem *pEntry;
6444 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006445 //alwasy lock active list before locking pending list
6446 csrLLLock( &pMac->sme.smeCmdActiveList );
6447 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6448 if(pEntry)
6449 {
6450 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6451 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6452 {
6453 fRet = eANI_BOOLEAN_TRUE;
6454 }
6455 }
6456 if(eANI_BOOLEAN_FALSE == fRet)
6457 {
6458 csrLLLock(&pMac->sme.smeCmdPendingList);
6459 pEntry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK);
6460 while(pEntry)
6461 {
6462 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6463 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6464 {
6465 fRet = eANI_BOOLEAN_TRUE;
6466 break;
6467 }
6468 pEntry = csrLLNext(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK);
6469 }
6470 csrLLUnlock(&pMac->sme.smeCmdPendingList);
6471 }
6472 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006473 return (fRet);
6474}
6475
Jeff Johnson295189b2012-06-20 16:38:30 -07006476tANI_BOOLEAN csrIsRoamCommandWaiting(tpAniSirGlobal pMac)
6477{
6478 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6479 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07006480 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
6481 {
6482 if( CSR_IS_SESSION_VALID( pMac, i ) && ( fRet = csrIsRoamCommandWaitingForSession( pMac, i ) ) )
6483 {
6484 break;
6485 }
6486 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006487 return ( fRet );
6488}
6489
Jeff Johnson295189b2012-06-20 16:38:30 -07006490tANI_BOOLEAN csrIsCommandWaiting(tpAniSirGlobal pMac)
6491{
6492 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006493 //alwasy lock active list before locking pending list
6494 csrLLLock( &pMac->sme.smeCmdActiveList );
6495 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6496 if(eANI_BOOLEAN_FALSE == fRet)
6497 {
6498 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
6499 }
6500 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006501 return (fRet);
6502}
6503
Jeff Johnson295189b2012-06-20 16:38:30 -07006504tANI_BOOLEAN csrIsScanForRoamCommandActive( tpAniSirGlobal pMac )
6505{
6506 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6507 tListElem *pEntry;
6508 tCsrCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006509 //alwasy lock active list before locking pending list
6510 csrLLLock( &pMac->sme.smeCmdActiveList );
6511 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6512 if( pEntry )
6513 {
6514 pCommand = GET_BASE_ADDR(pEntry, tCsrCmd, Link);
6515 if( ( eCsrRoamCommandScan == pCommand->command ) &&
6516 ( ( eCsrScanForSsid == pCommand->u.scanCmd.reason ) ||
6517 ( eCsrScanForCapsChange == pCommand->u.scanCmd.reason ) ||
6518 ( eCsrScanP2PFindPeer == pCommand->u.scanCmd.reason ) ) )
6519 {
6520 fRet = eANI_BOOLEAN_TRUE;
6521 }
6522 }
6523 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006524 return (fRet);
6525}
Jeff Johnson295189b2012-06-20 16:38:30 -07006526eHalStatus csrRoamIssueReassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId )
6527{
6528 eHalStatus status = eHAL_STATUS_SUCCESS;
6529 tSmeCmd *pCommand = NULL;
6530 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_TRUE;
6531 tANI_BOOLEAN fRemoveCmd = FALSE;
6532 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -07006533 // Delete the old assoc command. All is setup for reassoc to be serialized
6534 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6535 if ( pEntry )
6536 {
6537 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
6538 if ( !pCommand )
6539 {
6540 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6541 return eHAL_STATUS_RESOURCES;
6542 }
6543 if ( eSmeCommandRoam == pCommand->command )
6544 {
6545 if (pCommand->u.roamCmd.roamReason == eCsrSmeIssuedAssocToSimilarAP)
6546 {
6547 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
6548 }
6549 else
6550 {
6551 smsLog( pMac, LOGE, FL(" Unexpected active roam command present \n") );
6552 }
6553 if (fRemoveCmd == FALSE)
6554 {
6555 // Implies we did not get the serialized assoc command we
6556 // were expecting
6557 pCommand = NULL;
6558 }
6559 }
6560 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006561 if(NULL == pCommand)
6562 {
6563 smsLog( pMac, LOGE, FL(" fail to get command buffer as expected based on previous connect roam command\n") );
6564 return eHAL_STATUS_RESOURCES;
6565 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006566 do
6567 {
6568 //Change the substate in case it is wait-for-key
6569 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6570 {
6571 csrRoamStopWaitForKeyTimer( pMac );
6572 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
6573 }
6574 pCommand->command = eSmeCommandRoam;
6575 pCommand->sessionId = (tANI_U8)sessionId;
6576 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedFTReassoc;
Jeff Johnson295189b2012-06-20 16:38:30 -07006577 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6578 if( !HAL_STATUS_SUCCESS( status ) )
6579 {
6580 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6581 csrReleaseCommandRoam( pMac, pCommand );
6582 }
6583 } while( 0 );
6584
Jeff Johnson295189b2012-06-20 16:38:30 -07006585 return( status );
6586}
6587static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result )
6588{
6589 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6590 tCsrScanResult *pScanResult = NULL;
6591 tSirBssDescription *pBssDesc = NULL;
6592 tSmeCmd *pCommand = NULL;
6593 tANI_U32 sessionId;
6594 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07006595 if(NULL == pEntry)
6596 {
6597 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
6598 return;
6599 }
6600 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6601 sessionId = pCommand->sessionId;
6602 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006603
6604 if(!pSession)
6605 {
6606 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6607 return;
6608 }
6609
Jeff Johnson295189b2012-06-20 16:38:30 -07006610 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
6611 {
6612 //the roaming is cancelled. Simply complete the command
6613 smsLog(pMac, LOGW, FL(" Roam command cancelled\n"));
6614 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
6615 }
6616 else
6617 {
6618 if ( CCM_IS_RESULT_SUCCESS(result) )
6619 {
6620 smsLog(pMac, LOG2, "Cfg sequence complete\n");
6621 // Successfully set the configuration parameters for the new Bss. Attempt to
6622 // join the roaming Bss.
6623 if(pCommand->u.roamCmd.pRoamBssEntry)
6624 {
6625 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
6626 pBssDesc = &pScanResult->Result.BssDescriptor;
6627 }
6628 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) ||
6629 CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile )
6630#ifdef WLAN_SOFTAP_FEATURE
6631 || CSR_IS_INFRA_AP(&pCommand->u.roamCmd.roamProfile)
6632#endif
6633 )
6634 {
6635 if(!HAL_STATUS_SUCCESS(csrRoamIssueStartBss( pMac, sessionId,
6636 &pSession->bssParams, &pCommand->u.roamCmd.roamProfile,
6637 pBssDesc, pCommand->u.roamCmd.roamId )))
6638 {
6639 smsLog(pMac, LOGW, " CSR start BSS failed\n");
6640 //We need to complete the command
6641 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6642 }
6643 }
6644 else
6645 {
6646 if (!pCommand->u.roamCmd.pRoamBssEntry)
6647 {
6648 smsLog(pMac, LOGW, " pRoamBssEntry is NULL\n");
6649 //We need to complete the command
6650 csrRoamComplete(pMac, eCsrJoinFailure, NULL);
6651 return;
6652 }
6653 // If we are roaming TO an Infrastructure BSS...
6654 VOS_ASSERT(pScanResult != NULL);
6655 if ( csrIsInfraBssDesc( pBssDesc ) )
6656 {
6657 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07006658 if(pIesLocal || (HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
6659 {
6660 // ..and currently in an Infrastructure connection....
6661 if( csrIsConnStateConnectedInfra( pMac, sessionId ) )
6662 {
6663 // ...and the SSIDs are equal, then we Reassoc.
6664 if ( csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc,
6665 pIesLocal ) )
6666 // ..and currently in an infrastructure connection
6667 {
6668 // then issue a Reassoc.
6669 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
6670 csrRoamIssueReassociate( pMac, sessionId, pBssDesc, pIesLocal,
6671 &pCommand->u.roamCmd.roamProfile );
6672 }
6673 else
6674 {
6675
6676 // otherwise, we have to issue a new Join request to LIM because we disassociated from the
6677 // previously associated AP.
6678 if(!HAL_STATUS_SUCCESS(csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6679 pIesLocal,
6680 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId )))
6681 {
6682 //try something else
6683 csrRoam( pMac, pCommand );
6684 }
6685 }
6686 }
6687 else
6688 {
6689 eHalStatus status = eHAL_STATUS_SUCCESS;
6690
6691 /* We need to come with other way to figure out that this is because of HO in BMP
6692 The below API will be only available for Android as it uses a different HO algorithm */
6693 /* Reassoc request will be used only for CCX and 11r handoff whereas other legacy roaming should
6694 * use join request */
6695#ifdef WLAN_FEATURE_VOWIFI_11R
6696 if (csrRoamIsHandoffInProgress(pMac) &&
6697 csrRoamIs11rAssoc(pMac))
6698 {
6699 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
6700 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
6701 }
6702 else
6703#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006704#ifdef FEATURE_WLAN_CCX
6705 if (csrRoamIsHandoffInProgress(pMac) &&
6706 csrRoamIsCCXAssoc(pMac))
6707 {
6708 // Now serialize the reassoc command.
6709 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6710 }
6711 else
6712#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006713#ifdef FEATURE_WLAN_LFR
6714 if (csrRoamIsHandoffInProgress(pMac) &&
6715 csrRoamIsFastRoamEnabled(pMac))
6716 {
6717 // Now serialize the reassoc command.
6718 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6719 }
6720 else
6721#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006722 // else we are not connected and attempting to Join. Issue the
6723 // Join request.
6724 {
6725 status = csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6726 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ),
6727 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId );
6728 }
6729 if(!HAL_STATUS_SUCCESS(status))
6730 {
6731 //try something else
6732 csrRoam( pMac, pCommand );
6733 }
6734 }
6735 if( !pScanResult->Result.pvIes )
6736 {
6737 //Locally allocated
6738 palFreeMemory(pMac->hHdd, pIesLocal);
6739 }
6740 }
6741 }//if ( csrIsInfraBssDesc( pBssDesc ) )
6742 else
6743 {
6744 smsLog(pMac, LOGW, FL(" found BSSType mismatching the one in BSS description\n"));
6745 }
6746 }//else
6747 }//if ( WNI_CFG_SUCCESS == result )
6748 else
6749 {
6750 // In the event the configuration failed, for infra let the roam processor
6751 //attempt to join something else...
6752 if( pCommand->u.roamCmd.pRoamBssEntry && CSR_IS_INFRASTRUCTURE( &pCommand->u.roamCmd.roamProfile ) )
6753 {
6754 csrRoam(pMac, pCommand);
6755 }
6756 else
6757 {
6758 //We need to complete the command
6759 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) )
6760 {
6761 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6762 }
6763 else
6764 {
6765 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6766 }
6767 }
6768 }
6769 }//we have active entry
6770}
6771
Jeff Johnson295189b2012-06-20 16:38:30 -07006772static void csrRoamRoamingStateAuthRspProcessor( tpAniSirGlobal pMac, tSirSmeAuthRsp *pSmeAuthRsp )
6773{
6774 //No one is sending eWNI_SME_AUTH_REQ to PE.
6775 smsLog(pMac, LOGW, FL("is no-op\n"));
6776 if ( eSIR_SME_SUCCESS == pSmeAuthRsp->statusCode )
6777 {
6778 smsLog( pMac, LOGW, "CSR SmeAuthReq Successful\n" );
6779 // Successfully authenticated with a new Bss. Attempt to stop the current Bss and
6780 // join the new one...
6781 /***pBssDesc = profGetRoamingBssDesc( pAdapter, &pHddProfile );
Jeff Johnson295189b2012-06-20 16:38:30 -07006782 roamStopNetwork( pAdapter, &pBssDesc->SirBssDescription );***/
6783 }
6784 else {
6785 smsLog( pMac, LOGW, "CSR SmeAuthReq failed with statusCode= 0x%08lX [%d]\n", pSmeAuthRsp->statusCode, pSmeAuthRsp->statusCode );
6786 /***profHandleLostLinkAfterReset(pAdapter);
6787 // In the event the authenticate fails, let the roam processor attempt to join something else...
6788 roamRoam( pAdapter );***/
6789 }
6790}
6791
Jeff Johnson295189b2012-06-20 16:38:30 -07006792static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSmeJoinRsp pSmeJoinRsp )
6793{
6794 eCsrRoamCompleteResult result;
6795 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
6796 tCsrRoamInfo roamInfo;
6797 tANI_U32 roamId = 0;
6798
6799 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6800 {
6801 smsLog( pMac, LOGW, "CSR SmeReassocReq Successful\n" );
6802 result = eCsrReassocSuccess;
Jeff Johnson295189b2012-06-20 16:38:30 -07006803 /* Defeaturize this part later if needed */
6804#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
6805 /* Since the neighbor roam algorithm uses reassoc req for handoff instead of join,
6806 * we need the response contents while processing the result in csrRoamProcessResults() */
6807 if (csrRoamIsHandoffInProgress(pMac))
6808 {
6809 /* Need to dig more on indicating events to SME QoS module */
6810 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6811 csrRoamComplete( pMac, result, pSmeJoinRsp);
6812 }
6813 else
6814#endif
6815 {
6816 csrRoamComplete( pMac, result, NULL );
6817 }
6818 }
6819 /* Should we handle this similar to handling the join failure? Is it ok
6820 * to call csrRoamComplete() with state as CsrJoinFailure */
6821 else
6822 {
6823 smsLog( pMac, LOGW, "CSR SmeReassocReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6824 result = eCsrReassocFailure;
6825#ifdef WLAN_FEATURE_VOWIFI_11R
6826 if ((eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE == pSmeJoinRsp->statusCode) ||
6827 (eSIR_SME_FT_REASSOC_FAILURE == pSmeJoinRsp->statusCode))
6828 {
6829 // Inform HDD to turn off FT flag in HDD
6830 if (pNeighborRoamInfo)
6831 {
6832 vos_mem_zero(&roamInfo, sizeof(tCsrRoamInfo));
6833 csrRoamCallCallback(pMac, pNeighborRoamInfo->csrSessionId,
6834 &roamInfo, roamId, eCSR_ROAM_FT_REASSOC_FAILED, eSIR_SME_SUCCESS);
6835 }
6836 }
6837#endif
6838 // In the event that the Reassociation fails, then we need to Disassociate the current association and keep
6839 // roaming. Note that we will attempt to Join the AP instead of a Reassoc since we may have attempted a
6840 // 'Reassoc to self', which AP's that don't support Reassoc will force a Disassoc.
6841 //The disassoc rsp message will remove the command from active list
6842 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, pSmeJoinRsp->sessionId,
6843 eCSR_ROAM_SUBSTATE_DISASSOC_REASSOC_FAILURE, FALSE )))
6844 {
6845 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6846 }
6847 }
6848}
6849
Jeff Johnson295189b2012-06-20 16:38:30 -07006850static void csrRoamRoamingStateStopBssRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSmeRsp)
6851{
Jeff Johnson295189b2012-06-20 16:38:30 -07006852#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
6853 {
6854 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07006855 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
6856 if(pIbssLog)
6857 {
6858 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_RSP;
6859 if(eSIR_SME_SUCCESS != pSmeRsp->statusCode)
6860 {
6861 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
6862 }
6863 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
6864 }
6865 }
6866#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07006867 pMac->roam.roamSession[pSmeRsp->sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6868 if(CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, pSmeRsp->sessionId))
6869 {
6870 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6871 }
6872 else if(CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId))
6873 {
6874 csrRoamReissueRoamCommand(pMac);
6875 }
6876}
6877
Jeff Johnson295189b2012-06-20 16:38:30 -07006878void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisassocRsp *pSmeRsp )
6879{
6880 tSirResultCodes statusCode;
6881#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6882 tScanResultHandle hBSSList;
6883 tANI_BOOLEAN fCallCallback, fRemoveCmd;
6884 eHalStatus status;
6885 tCsrRoamInfo roamInfo;
6886 tCsrScanResultFilter *pScanFilter = NULL;
6887 tANI_U32 roamId = 0;
6888 tCsrRoamProfile *pCurRoamProfile = NULL;
6889 tListElem *pEntry = NULL;
6890 tSmeCmd *pCommand = NULL;
6891#endif
6892 tANI_U32 sessionId;
6893 tCsrRoamSession *pSession;
Jeff Johnsone7245742012-09-05 17:12:55 -07006894
Jeff Johnson295189b2012-06-20 16:38:30 -07006895 tSirSmeDisassocRsp SmeDisassocRsp;
6896
6897 csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, &SmeDisassocRsp);
6898 sessionId = SmeDisassocRsp.sessionId;
6899 statusCode = SmeDisassocRsp.statusCode;
6900
6901 smsLog( pMac, LOG2, "csrRoamRoamingStateDisassocRspProcessor sessionId %d\n", sessionId);
6902
6903 if ( csrIsConnStateInfra( pMac, sessionId ) )
6904 {
6905 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6906 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006907 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006908
6909 if(!pSession)
6910 {
6911 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6912 return;
6913 }
6914
Jeff Johnson295189b2012-06-20 16:38:30 -07006915 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, sessionId ) )
6916 {
6917 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6918 }
6919 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, sessionId ) ||
6920 CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, sessionId ) )
6921 {
6922 if ( eSIR_SME_SUCCESS == statusCode )
6923 {
6924 smsLog( pMac, LOG2, "CSR SmeDisassocReq force disassociated Successfully\n" );
6925 //A callback to HDD will be issued from csrRoamComplete so no need to do anything here
6926 }
6927 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6928 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006929 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, sessionId ) )
6930 {
6931 smsLog( pMac, LOGE, "CSR SmeDisassocReq due to HO\n" );
6932#if defined (WLAN_FEATURE_NEIGHBOR_ROAMING)
6933 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6934 if ( pEntry )
6935 {
6936 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07006937 // If the head of the queue is Active and it is a ROAM command, remove
6938 // and put this on the Free queue.
6939 if ( eSmeCommandRoam == pCommand->command )
6940 {
Jeff Johnsone7245742012-09-05 17:12:55 -07006941
Jeff Johnson295189b2012-06-20 16:38:30 -07006942 //we need to process the result first before removing it from active list because state changes
6943 //still happening insides roamQProcessRoamResults so no other roam command should be issued
6944 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
6945 if(pCommand->u.roamCmd.fReleaseProfile)
6946 {
6947 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
6948 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
6949 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006950 if( fRemoveCmd )
6951 {
6952 csrReleaseCommandRoam( pMac, pCommand );
6953 }
6954 else
6955 {
6956 smsLog( pMac, LOGE, " ********csrRoamRoamingStateDisassocRspProcessor fail to remove cmd reason %d\n",
6957 pCommand->u.roamCmd.roamReason );
6958 }
6959 }
6960 else
6961 {
6962 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
6963 }
6964 }
6965 else
6966 {
6967 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
6968 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006969 //notify HDD for handoff, providing the BSSID too
6970 roamInfo.reasonCode = eCsrRoamReasonBetterAP;
6971
6972 palCopyMemory(pMac->hHdd, roamInfo.bssid, pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
6973
Jeff Johnsone7245742012-09-05 17:12:55 -07006974 csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
Jeff Johnson295189b2012-06-20 16:38:30 -07006975
6976 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
6977 if(HAL_STATUS_SUCCESS(status))
6978 {
6979 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
6980 status = csrRoamPrepareFilterFromProfile(pMac, &pMac->roam.neighborRoamInfo.csrNeighborRoamProfile, pScanFilter);
6981 if(!HAL_STATUS_SUCCESS(status))
6982 {
6983 smsLog(pMac, LOGE, FL(" csrRoamPrepareFilterFromProfile fail to create scan filter\n"));
6984 }
6985
6986 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
6987 if(HAL_STATUS_SUCCESS(status))
6988 {
6989 //copy over the connected profile to apply the same for this connection as well
6990 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pCurRoamProfile, sizeof(tCsrRoamProfile))))
6991 {
6992 palZeroMemory(pMac->hHdd, pCurRoamProfile, sizeof(tCsrRoamProfile));
6993 csrRoamCopyProfile(pMac, pCurRoamProfile, pSession->pCurRoamProfile);
6994 }
6995 //make sure to put it at the head of the cmd queue
6996 status = csrRoamIssueConnect(pMac, sessionId, pCurRoamProfile,
6997 hBSSList, eCsrSmeIssuedAssocToSimilarAP,
6998 roamId, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
6999 if(!HAL_STATUS_SUCCESS(status))
7000 {
7001 //msg
7002 fCallCallback = eANI_BOOLEAN_TRUE;
7003 }
7004 /* Notify sub-modules like QoS etc. that handoff happening */
7005 sme_QosCsrEventInd(pMac, sessionId, SME_QOS_CSR_HANDOFF_ASSOC_REQ, NULL);
7006 palFreeMemory(pMac->hHdd, pCurRoamProfile);
7007 }
7008 else
7009 {
7010 //msg
7011 smsLog( pMac, LOGE,"csrRoamRoamingStateDisassocRspProcessor: csrScanGetResult failed");
7012 // should have asserted, sending up roam complete instead. Let upper layer
7013 // decide what to do next
7014 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7015 }
7016 }
7017 else
7018 {
7019 smsLog(pMac, LOGE, FL(" fail to allocate memory for scan filter\n"));
7020 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7021 }
7022 if( pScanFilter )
7023 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007024
Jeff Johnson295189b2012-06-20 16:38:30 -07007025 csrFreeScanFilter(pMac, pScanFilter);
7026 palFreeMemory( pMac->hHdd, pScanFilter );
7027 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007028#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07007029
Jeff Johnson295189b2012-06-20 16:38:30 -07007030 } //else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac ) )
7031 else if ( CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, sessionId ) )
7032 {
7033 // Disassoc due to Reassoc failure falls into this codepath....
7034 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
7035 }
7036 else
7037 {
7038 if ( eSIR_SME_SUCCESS == statusCode )
7039 {
7040 // Successfully disassociated from the 'old' Bss...
7041 //
7042 // We get Disassociate response in three conditions.
7043 // - First is the case where we are disasociating from an Infra Bss to start an IBSS.
7044 // - Second is the when we are disassociating from an Infra Bss to join an IBSS or a new
7045 // Infrastructure network.
7046 // - Third is where we are doing an Infra to Infra roam between networks with different
7047 // SSIDs. In all cases, we set the new Bss configuration here and attempt to join
7048
7049 smsLog( pMac, LOG2, "CSR SmeDisassocReq disassociated Successfully\n" );
7050 }
7051 else
7052 {
7053 smsLog( pMac, LOGE, "SmeDisassocReq failed with statusCode= 0x%08lX\n", statusCode );
7054 }
7055 //We are not done yet. Get the data and continue roaming
7056 csrRoamReissueRoamCommand(pMac);
7057 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007058}
7059
Jeff Johnson295189b2012-06-20 16:38:30 -07007060static void csrRoamRoamingStateDeauthRspProcessor( tpAniSirGlobal pMac, tSirSmeDeauthRsp *pSmeRsp )
7061{
7062 tSirResultCodes statusCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07007063 //No one is sending eWNI_SME_DEAUTH_REQ to PE.
7064 smsLog(pMac, LOGW, FL("is no-op\n"));
7065 statusCode = csrGetDeAuthRspStatusCode( pSmeRsp );
7066 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId) )
7067 {
7068 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7069 }
7070 else
7071 {
7072 if ( eSIR_SME_SUCCESS == statusCode )
7073 {
7074 // Successfully deauth from the 'old' Bss...
7075 //
7076 smsLog( pMac, LOG2, "CSR SmeDeauthReq disassociated Successfully\n" );
7077 }
7078 else
7079 {
7080 smsLog( pMac, LOGW, "SmeDeauthReq failed with statusCode= 0x%08lX\n", statusCode );
7081 }
7082 //We are not done yet. Get the data and continue roaming
7083 csrRoamReissueRoamCommand(pMac);
7084 }
7085}
7086
Jeff Johnson295189b2012-06-20 16:38:30 -07007087static void csrRoamRoamingStateStartBssRspProcessor( tpAniSirGlobal pMac, tSirSmeStartBssRsp *pSmeStartBssRsp )
7088{
7089 eCsrRoamCompleteResult result;
7090
7091 if ( eSIR_SME_SUCCESS == pSmeStartBssRsp->statusCode )
7092 {
7093 smsLog( pMac, LOGW, "SmeStartBssReq Successful\n" );
7094 result = eCsrStartBssSuccess;
7095 }
7096 else
7097 {
7098 smsLog( pMac, LOGW, "SmeStartBssReq failed with statusCode= 0x%08lX\n", pSmeStartBssRsp->statusCode );
7099 //Let csrRoamComplete decide what to do
7100 result = eCsrStartBssFailure;
7101 }
7102#ifdef WLAN_SOFTAP_FEATURE
7103 csrRoamComplete( pMac, result, pSmeStartBssRsp);
7104#else
7105 csrRoamComplete( pMac, result, &pSmeStartBssRsp->bssDescription );
7106#endif
7107}
7108
Jeff Johnson295189b2012-06-20 16:38:30 -07007109/*
7110 We need to be careful on whether to cast pMsgBuf (pSmeRsp) to other type of strucutres.
7111 It depends on how the message is constructed. If the message is sent by limSendSmeRsp,
7112 the pMsgBuf is only a generic response and can only be used as pointer to tSirSmeRsp.
7113 For the messages where sender allocates memory for specific structures, then it can be
7114 cast accordingly.
7115*/
7116void csrRoamingStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7117{
7118 tSirSmeRsp *pSmeRsp;
7119 tSmeIbssPeerInd *pIbssPeerInd;
7120 tCsrRoamInfo roamInfo;
7121 // TODO Session Id need to be acquired in this function
7122 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07007123 pSmeRsp = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007124 smsLog( pMac, LOG2, "Message %d[0x%04X] received in substate %d\n",
7125 pSmeRsp->messageType, pSmeRsp->messageType,
7126 pMac->roam.curSubState[pSmeRsp->sessionId] );
7127#if defined ANI_PRODUCT_TYPE_AP
7128 pSmeRsp->messageType = pal_be16_to_cpu(pSmeRsp->messageType);
7129 pSmeRsp->length = pal_be16_to_cpu(pSmeRsp->length);
7130 pSmeRsp->statusCode = pal_be32_to_cpu(pSmeRsp->statusCode);
7131#else
7132 pSmeRsp->messageType = (pSmeRsp->messageType);
7133 pSmeRsp->length = (pSmeRsp->length);
7134 pSmeRsp->statusCode = (pSmeRsp->statusCode);
7135#endif
7136 switch (pSmeRsp->messageType)
7137 {
7138
7139 case eWNI_SME_JOIN_RSP: // in Roaming state, process the Join response message...
7140 if (CSR_IS_ROAM_SUBSTATE_JOIN_REQ(pMac, pSmeRsp->sessionId))
7141 {
7142 //We sent a JOIN_REQ
7143 csrRoamJoinRspProcessor( pMac, (tSirSmeJoinRsp *)pSmeRsp );
7144 }
7145 break;
7146
7147 case eWNI_SME_AUTH_RSP: // or the Authenticate response message...
7148 if (CSR_IS_ROAM_SUBSTATE_AUTH_REQ( pMac, pSmeRsp->sessionId) )
7149 {
7150 //We sent a AUTH_REQ
7151 csrRoamRoamingStateAuthRspProcessor( pMac, (tSirSmeAuthRsp *)pSmeRsp );
7152 }
7153 break;
7154
7155 case eWNI_SME_REASSOC_RSP: // or the Reassociation response message...
7156 if (CSR_IS_ROAM_SUBSTATE_REASSOC_REQ( pMac, pSmeRsp->sessionId) )
7157 {
7158 csrRoamRoamingStateReassocRspProcessor( pMac, (tpSirSmeJoinRsp )pSmeRsp );
7159 }
7160 break;
7161
7162 case eWNI_SME_STOP_BSS_RSP: // or the Stop Bss response message...
7163 {
7164 csrRoamRoamingStateStopBssRspProcessor(pMac, pSmeRsp);
7165 }
7166 break;
7167
7168 case eWNI_SME_DISASSOC_RSP: // or the Disassociate response message...
7169 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, pSmeRsp->sessionId ) ||
7170 CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, pSmeRsp->sessionId ) ||
7171 CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, pSmeRsp->sessionId ) ||
7172 CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, pSmeRsp->sessionId ) ||
7173 CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId ) ||
7174//HO
7175 CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, pSmeRsp->sessionId ) )
7176 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07007177 smsLog(pMac, LOG1, FL("eWNI_SME_DISASSOC_RSP subState = %d\n"), pMac->roam.curSubState[pSmeRsp->sessionId]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007178 csrRoamRoamingStateDisassocRspProcessor( pMac, (tSirSmeDisassocRsp *)pSmeRsp );
7179 }
7180 break;
7181
7182 case eWNI_SME_DEAUTH_RSP: // or the Deauthentication response message...
7183 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId ) )
7184 {
7185 csrRoamRoamingStateDeauthRspProcessor( pMac, (tSirSmeDeauthRsp *)pSmeRsp );
7186 }
7187 break;
7188
7189 case eWNI_SME_START_BSS_RSP: // or the Start BSS response message...
7190 if (CSR_IS_ROAM_SUBSTATE_START_BSS_REQ( pMac, pSmeRsp->sessionId ) )
7191 {
7192 csrRoamRoamingStateStartBssRspProcessor( pMac, (tSirSmeStartBssRsp *)pSmeRsp );
7193 }
7194 break;
7195
7196 case WNI_CFG_SET_CNF: // process the Config Confirm messages when we are in 'Config' substate...
7197 if ( CSR_IS_ROAM_SUBSTATE_CONFIG( pMac, pSmeRsp->sessionId ) )
7198 {
7199 csrRoamingStateConfigCnfProcessor( pMac, ((tCsrCfgSetRsp *)pSmeRsp)->respStatus );
7200 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007201 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007202 //In case CSR issues STOP_BSS, we need to tell HDD about peer departed becasue PE is removing them
7203 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
7204 pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
7205 smsLog(pMac, LOGE, "CSR: Peer departed notification from LIM in joining state\n");
7206 palZeroMemory( pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo) );
7207 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
7208 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
7209 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
7210 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
7211 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
7212 eCSR_ROAM_CONNECT_STATUS_UPDATE,
7213 eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
7214 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007215 default:
7216 smsLog( pMac, LOG1, "Unexpected message type = %d[0x%X] received in substate %d\n",
7217 pSmeRsp->messageType, pSmeRsp->messageType,
7218 pMac->roam.curSubState[pSmeRsp->sessionId] );
7219
7220 //If we are connected, check the link status change
7221 if(!csrIsConnStateDisconnected(pMac, sessionId))
7222 {
7223 csrRoamCheckForLinkStatusChange( pMac, pSmeRsp );
7224 }
7225 break;
7226 }
7227}
7228
Jeff Johnson295189b2012-06-20 16:38:30 -07007229void csrRoamJoinedStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7230{
7231 tSirSmeRsp *pSirMsg = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007232 switch (pSirMsg->messageType)
7233 {
7234 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07007235 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007236 csrRoamStatsRspProcessor( pMac, pSirMsg );
7237 break;
7238#ifdef WLAN_SOFTAP_FEATURE
7239 case eWNI_SME_UPPER_LAYER_ASSOC_CNF:
7240 {
7241 tCsrRoamSession *pSession;
7242 tSirSmeAssocIndToUpperLayerCnf *pUpperLayerAssocCnf;
7243 tCsrRoamInfo roamInfo;
7244 tCsrRoamInfo *pRoamInfo = NULL;
7245 tANI_U32 sessionId;
7246 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007247 smsLog( pMac, LOG1, FL("ASSOCIATION confirmation can be given to upper layer \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007248 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
7249 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007250 pUpperLayerAssocCnf = (tSirSmeAssocIndToUpperLayerCnf *)pMsgBuf;
7251 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pUpperLayerAssocCnf->bssId, &sessionId );
7252 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07007253
7254 if(!pSession)
7255 {
7256 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7257 return;
7258 }
7259
Jeff Johnson295189b2012-06-20 16:38:30 -07007260 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
7261 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07007262 pRoamInfo->staId = (tANI_U8)pUpperLayerAssocCnf->aid;
7263 pRoamInfo->rsnIELen = (tANI_U8)pUpperLayerAssocCnf->rsnIE.length;
7264 pRoamInfo->prsnIE = pUpperLayerAssocCnf->rsnIE.rsnIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007265 pRoamInfo->addIELen = (tANI_U8)pUpperLayerAssocCnf->addIE.length;
7266 pRoamInfo->paddIE = pUpperLayerAssocCnf->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007267 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pUpperLayerAssocCnf->peerMacAddr, sizeof(tSirMacAddr));
7268 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pUpperLayerAssocCnf->bssId, sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07007269 pRoamInfo->wmmEnabledSta = pUpperLayerAssocCnf->wmmEnabledSta;
Jeff Johnson295189b2012-06-20 16:38:30 -07007270 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) )
7271 {
7272 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED;
7273 pRoamInfo->fReassocReq = pUpperLayerAssocCnf->reassocReq;
7274 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
7275 }
7276 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
7277 {
7278 vos_sleep( 100 );
7279 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;//Sta
7280 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
7281 }
7282
Jeff Johnson295189b2012-06-20 16:38:30 -07007283 }
7284 break;
7285#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007286 default:
7287 csrRoamCheckForLinkStatusChange( pMac, pSirMsg );
7288 break;
7289 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007290}
7291
Jeff Johnson295189b2012-06-20 16:38:30 -07007292eHalStatus csrRoamIssueSetContextReq( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrEncryptionType EncryptType,
7293 tSirBssDescription *pBssDescription,
7294 tSirMacAddr *bssId, tANI_BOOLEAN addKey,
7295 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
7296 tANI_U8 keyId, tANI_U16 keyLength,
7297 tANI_U8 *pKey, tANI_U8 paeRole )
7298{
7299 eHalStatus status = eHAL_STATUS_SUCCESS;
7300 tAniEdType edType;
7301
7302 if(eCSR_ENCRYPT_TYPE_UNKNOWN == EncryptType)
7303 {
7304 EncryptType = eCSR_ENCRYPT_TYPE_NONE; //***
7305 }
7306
7307 edType = csrTranslateEncryptTypeToEdType( EncryptType );
7308
7309 // Allow 0 keys to be set for the non-WPA encrypt types... For WPA encrypt types, the num keys must be non-zero
7310 // or LIM will reject the set context (assumes the SET_CONTEXT does not occur until the keys are distrubuted).
7311 if ( CSR_IS_ENC_TYPE_STATIC( EncryptType ) ||
7312 addKey )
7313 {
7314 tCsrRoamSetKey setKey;
Jeff Johnson295189b2012-06-20 16:38:30 -07007315 setKey.encType = EncryptType;
7316 setKey.keyDirection = aniKeyDirection; //Tx, Rx or Tx-and-Rx
7317 palCopyMemory( pMac->hHdd, &setKey.peerMac, bssId, sizeof(tCsrBssid) );
7318 setKey.paeRole = paeRole; //0 for supplicant
7319 setKey.keyId = keyId; // Kye index
7320 setKey.keyLength = keyLength;
7321 if( keyLength )
7322 {
7323 palCopyMemory( pMac->hHdd, setKey.Key, pKey, keyLength );
7324 }
7325 status = csrRoamIssueSetKeyCommand( pMac, sessionId, &setKey, 0 );
7326 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007327 return (status);
7328}
7329
Jeff Johnson295189b2012-06-20 16:38:30 -07007330static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7331 tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7332{
7333 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7334 tSmeCmd *pCommand = NULL;
7335#ifdef FEATURE_WLAN_CCX
7336 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7337#endif /* FEATURE_WLAN_CCX */
7338
7339 do
7340 {
7341 pCommand = csrGetCommandBuffer(pMac);
7342 if(NULL == pCommand)
7343 {
7344 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7345 status = eHAL_STATUS_RESOURCES;
7346 break;
7347 }
7348 pCommand->command = eSmeCommandSetKey;
7349 pCommand->sessionId = (tANI_U8)sessionId;
7350 // validate the key length, Adjust if too long...
7351 // for static WEP the keys are not set thru' SetContextReq
7352 if ( ( eCSR_ENCRYPT_TYPE_WEP40 == pSetKey->encType ) ||
7353 ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pSetKey->encType ) )
7354 {
7355 //KeyLength maybe 0 for static WEP
7356 if( pSetKey->keyLength )
7357 {
7358 if ( pSetKey->keyLength < CSR_WEP40_KEY_LEN )
7359 {
7360 smsLog( pMac, LOGW, "Invalid WEP40 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7361 break;
7362 }
7363
7364 pCommand->u.setKeyCmd.keyLength = CSR_WEP40_KEY_LEN;
7365 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP40_KEY_LEN );
7366 }
7367 }
7368 else if ( ( eCSR_ENCRYPT_TYPE_WEP104 == pSetKey->encType ) ||
7369 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pSetKey->encType ) )
7370 {
7371 //KeyLength maybe 0 for static WEP
7372 if( pSetKey->keyLength )
7373 {
7374 if ( pSetKey->keyLength < CSR_WEP104_KEY_LEN )
7375 {
7376 smsLog( pMac, LOGW, "Invalid WEP104 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7377 break;
7378 }
7379
7380 pCommand->u.setKeyCmd.keyLength = CSR_WEP104_KEY_LEN;
7381 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP104_KEY_LEN );
7382 }
7383 }
7384 else if ( eCSR_ENCRYPT_TYPE_TKIP == pSetKey->encType )
7385 {
7386 if ( pSetKey->keyLength < CSR_TKIP_KEY_LEN )
7387 {
7388 smsLog( pMac, LOGW, "Invalid TKIP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7389 break;
7390 }
7391 pCommand->u.setKeyCmd.keyLength = CSR_TKIP_KEY_LEN;
7392 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_TKIP_KEY_LEN );
7393 }
7394 else if ( eCSR_ENCRYPT_TYPE_AES == pSetKey->encType )
7395 {
7396 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7397 {
7398 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7399 break;
7400 }
7401 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7402 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7403 }
7404#ifdef FEATURE_WLAN_WAPI
7405 else if ( eCSR_ENCRYPT_TYPE_WPI == pSetKey->encType )
7406 {
7407 if ( pSetKey->keyLength < CSR_WAPI_KEY_LEN )
7408 {
7409 smsLog( pMac, LOGW, "Invalid WAPI keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7410 break;
7411 }
7412 pCommand->u.setKeyCmd.keyLength = CSR_WAPI_KEY_LEN;
7413 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WAPI_KEY_LEN );
7414 }
7415#endif /* FEATURE_WLAN_WAPI */
7416#ifdef FEATURE_WLAN_CCX
7417 else if ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7418 {
7419 if ( pSetKey->keyLength < CSR_KRK_KEY_LEN )
7420 {
7421 smsLog( pMac, LOGW, "Invalid KRK keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7422 break;
7423 }
7424 palCopyMemory( pMac->hHdd, pSession->ccxCckmInfo.krk, pSetKey->Key, CSR_KRK_KEY_LEN );
7425 pSession->ccxCckmInfo.reassoc_req_num=1;
7426 pSession->ccxCckmInfo.krk_plumbed = eANI_BOOLEAN_TRUE;
7427 status = eHAL_STATUS_SUCCESS;
7428 break;
7429 }
7430#endif /* FEATURE_WLAN_CCX */
Jeff Johnsone7245742012-09-05 17:12:55 -07007431
Jeff Johnson295189b2012-06-20 16:38:30 -07007432#ifdef WLAN_FEATURE_11W
7433 //Check for 11w BIP
7434 else if ( eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType )
7435 {
7436 tANI_U16 count = 0;
7437 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7438 {
7439 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7440 break;
7441 }
7442 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7443 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7444 }
7445#endif
7446 status = eHAL_STATUS_SUCCESS;
7447 pCommand->u.setKeyCmd.roamId = roamId;
7448 pCommand->u.setKeyCmd.encType = pSetKey->encType;
7449 pCommand->u.setKeyCmd.keyDirection = pSetKey->keyDirection; //Tx, Rx or Tx-and-Rx
7450 palCopyMemory( pMac->hHdd, &pCommand->u.setKeyCmd.peerMac, &pSetKey->peerMac, sizeof(tCsrBssid) );
7451 pCommand->u.setKeyCmd.paeRole = pSetKey->paeRole; //0 for supplicant
7452 pCommand->u.setKeyCmd.keyId = pSetKey->keyId;
7453 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.keyRsc, pSetKey->keyRsc, CSR_MAX_RSC_LEN );
7454 //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
7455
7456 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
7457 if( !HAL_STATUS_SUCCESS( status ) )
7458 {
7459 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7460 }
7461 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007462 // Free the command if there has been a failure, or it is a
7463 // "local" operation like the set CCX CCKM KRK key.
7464 if( (!HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ))
7465#ifdef FEATURE_WLAN_CCX
7466 || ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7467#endif /* FEATURE_WLAN_CCX */
7468 )
7469 {
7470 csrReleaseCommandSetKey( pMac, pCommand );
7471 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007472 return( status );
7473}
7474
Jeff Johnson295189b2012-06-20 16:38:30 -07007475eHalStatus csrRoamIssueRemoveKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7476 tCsrRoamRemoveKey *pRemoveKey, tANI_U32 roamId )
7477{
7478 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7479 tSmeCmd *pCommand = NULL;
7480 tANI_BOOLEAN fImediate = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07007481 do
7482 {
7483 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7484 {
7485 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7486 status = eHAL_STATUS_CSR_WRONG_STATE;
7487 break;
7488 }
7489 pCommand = csrGetCommandBuffer(pMac);
7490 if(NULL == pCommand)
7491 {
7492 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7493 status = eHAL_STATUS_RESOURCES;
7494 break;
7495 }
7496 pCommand->command = eSmeCommandRemoveKey;
7497 pCommand->sessionId = (tANI_U8)sessionId;
7498 pCommand->u.removeKeyCmd.roamId = roamId;
7499 pCommand->u.removeKeyCmd.encType = pRemoveKey->encType;
7500 palCopyMemory( pMac->hHdd, &pCommand->u.removeKeyCmd.peerMac, &pRemoveKey->peerMac, sizeof(tSirMacAddr) );
7501 pCommand->u.removeKeyCmd.keyId = pRemoveKey->keyId;
7502 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7503 {
7504 //in this case, put it to the end of the Q incase there is a set key pending.
7505 fImediate = eANI_BOOLEAN_FALSE;
7506 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007507 smsLog( pMac, LOGE, FL("keyType=%d, keyId=%d, PeerMac=%02x, %02x, %02x, %02x, %02x, %02x\n"),
7508 pRemoveKey->encType, pRemoveKey->keyId,
7509 pCommand->u.removeKeyCmd.peerMac[0],
7510 pCommand->u.removeKeyCmd.peerMac[1],
7511 pCommand->u.removeKeyCmd.peerMac[2],
7512 pCommand->u.removeKeyCmd.peerMac[3],
7513 pCommand->u.removeKeyCmd.peerMac[4],
7514 pCommand->u.removeKeyCmd.peerMac[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007515 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
7516 if( !HAL_STATUS_SUCCESS( status ) )
7517 {
7518 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7519 break;
7520 }
7521 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007522 if( !HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ) )
7523 {
7524 csrReleaseCommandRemoveKey( pMac, pCommand );
7525 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007526 return (status );
7527}
7528
Jeff Johnson295189b2012-06-20 16:38:30 -07007529eHalStatus csrRoamProcessSetKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7530{
7531 eHalStatus status;
7532 tANI_U8 numKeys = ( pCommand->u.setKeyCmd.keyLength ) ? 1 : 0;
7533 tAniEdType edType = csrTranslateEncryptTypeToEdType( pCommand->u.setKeyCmd.encType );
7534 tANI_BOOLEAN fUnicast = ( pCommand->u.setKeyCmd.peerMac[0] == 0xFF ) ? eANI_BOOLEAN_FALSE : eANI_BOOLEAN_TRUE;
7535 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007536#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7537 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7538 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007539 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7540 {
7541 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7542 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7543 {
7544 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_REQ;
7545 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7546 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7547 }
7548 else
7549 {
7550 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_REQ;
7551 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7552 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7553 }
7554 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7555 if(CSR_IS_ENC_TYPE_STATIC(edType))
7556 {
7557 tANI_U32 defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007558 //It has to be static WEP here
7559 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, &defKeyId)))
7560 {
7561 setKeyEvent.keyId = (v_U8_t)defKeyId;
7562 }
7563 }
7564 else
7565 {
7566 setKeyEvent.keyId = pCommand->u.setKeyCmd.keyId;
7567 }
7568 setKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7569 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7570 }
7571#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007572 if( csrIsSetKeyAllowed(pMac, sessionId) )
7573 {
7574 status = csrSendMBSetContextReqMsg( pMac, sessionId,
7575 ( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac,
7576 numKeys, edType, fUnicast, pCommand->u.setKeyCmd.keyDirection,
7577 pCommand->u.setKeyCmd.keyId, pCommand->u.setKeyCmd.keyLength,
7578 pCommand->u.setKeyCmd.Key, pCommand->u.setKeyCmd.paeRole,
7579 pCommand->u.setKeyCmd.keyRsc);
7580 }
7581 else
7582 {
7583 smsLog( pMac, LOGW, FL(" cannot process not connected\n") );
7584 //Set this status so the error handling take care of the case.
7585 status = eHAL_STATUS_CSR_WRONG_STATE;
7586 }
7587 if( !HAL_STATUS_SUCCESS(status) )
7588 {
7589 smsLog( pMac, LOGE, FL(" error status %d\n"), status );
7590 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.setKeyCmd.roamId, eCSR_ROAM_SET_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007591#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7592 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7593 {
7594 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7595 {
7596 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
7597 }
7598 else
7599 {
7600 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
7601 }
7602 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
7603 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7604 }
7605#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007606 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007607 return ( status );
7608}
7609
Jeff Johnson295189b2012-06-20 16:38:30 -07007610eHalStatus csrRoamProcessRemoveKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7611{
7612 eHalStatus status;
7613 tpSirSmeRemoveKeyReq pMsg = NULL;
7614 tANI_U16 wMsgLen = sizeof(tSirSmeRemoveKeyReq);
7615 tANI_U8 *p;
7616 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007617#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7618 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7619 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007620 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7621 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_REQ;
7622 removeKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7623 removeKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7624 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7625 removeKeyEvent.keyId = pCommand->u.removeKeyCmd.keyId;
7626 removeKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7627 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7628#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007629 if( csrIsSetKeyAllowed(pMac, sessionId) )
7630 {
7631 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, wMsgLen );
7632 }
7633 else
7634 {
7635 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7636 //Set the error status so error handling kicks in below
7637 status = eHAL_STATUS_CSR_WRONG_STATE;
7638 }
7639 if( HAL_STATUS_SUCCESS( status ) )
7640 {
7641 palZeroMemory(pMac->hHdd, pMsg, wMsgLen);
7642 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REMOVEKEY_REQ);
7643 pMsg->length = pal_cpu_to_be16(wMsgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -07007644 pMsg->sessionId = (tANI_U8)sessionId;
7645 pMsg->transactionId = 0;
7646 p = (tANI_U8 *)pMsg + sizeof(pMsg->messageType) + sizeof(pMsg->length) +
7647 sizeof(pMsg->sessionId) + sizeof(pMsg->transactionId);
7648 // bssId - copy from session Info
7649 palCopyMemory( pMac->hHdd, p, &pMac->roam.roamSession[sessionId].connectedProfile.bssid, sizeof(tSirMacAddr) );
7650 p += sizeof(tSirMacAddr);
7651 // peerMacAddr
7652 palCopyMemory( pMac->hHdd, p, pCommand->u.removeKeyCmd.peerMac, sizeof(tSirMacAddr) );
7653 p += sizeof(tSirMacAddr);
7654 // edType
7655 *p = (tANI_U8)csrTranslateEncryptTypeToEdType( pCommand->u.removeKeyCmd.encType );
7656 p++;
7657 // weptype
7658 if( ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pCommand->u.removeKeyCmd.encType ) ||
7659 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pCommand->u.removeKeyCmd.encType ) )
7660 {
7661 *p = (tANI_U8)eSIR_WEP_STATIC;
7662 }
7663 else
7664 {
7665 *p = (tANI_U8)eSIR_WEP_DYNAMIC;
7666 }
7667 p++;
7668 //keyid
7669 *p = pCommand->u.removeKeyCmd.keyId;
7670 p++;
7671 *p = (pCommand->u.removeKeyCmd.peerMac[0] == 0xFF ) ? 0 : 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07007672 status = palSendMBMessage(pMac->hHdd, pMsg);
7673 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007674 if( !HAL_STATUS_SUCCESS( status ) )
7675 {
7676 smsLog( pMac, LOGE, FL(" error status \n"), status );
Jeff Johnson295189b2012-06-20 16:38:30 -07007677#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7678 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
7679 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;;
7680 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7681#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007682 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.removeKeyCmd.roamId, eCSR_ROAM_REMOVE_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
7683 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007684 return ( status );
7685}
7686
Jeff Johnson295189b2012-06-20 16:38:30 -07007687eHalStatus csrRoamSetKey( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7688{
7689 eHalStatus status;
7690
7691 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7692 {
7693 status = eHAL_STATUS_CSR_WRONG_STATE;
7694 }
7695 else
7696 {
7697 status = csrRoamIssueSetKeyCommand( pMac, sessionId, pSetKey, roamId );
7698 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007699 return ( status );
7700}
7701
Jeff Johnson295189b2012-06-20 16:38:30 -07007702/*
7703 Prepare a filter base on a profile for parsing the scan results.
7704 Upon successful return, caller MUST call csrFreeScanFilter on
7705 pScanFilter when it is done with the filter.
7706*/
7707eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
7708 tCsrScanResultFilter *pScanFilter)
7709{
7710 eHalStatus status = eHAL_STATUS_SUCCESS;
7711 tANI_U32 size = 0;
7712 tANI_U8 index = 0;
7713
7714 do
7715 {
7716 if(pProfile->BSSIDs.numOfBSSIDs)
7717 {
7718 size = sizeof(tCsrBssid) * pProfile->BSSIDs.numOfBSSIDs;
7719 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, size);
7720 if(!HAL_STATUS_SUCCESS(status))
7721 {
7722 break;
7723 }
7724 pScanFilter->BSSIDs.numOfBSSIDs = pProfile->BSSIDs.numOfBSSIDs;
7725 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, pProfile->BSSIDs.bssid, size);
7726 }
7727 if(pProfile->SSIDs.numOfSSIDs)
7728 {
7729 if( !CSR_IS_WDS_STA( pProfile ) )
7730 {
7731 pScanFilter->SSIDs.numOfSSIDs = pProfile->SSIDs.numOfSSIDs;
7732 }
7733 else
7734 {
7735 //For WDS station
7736 //We always use index 1 for self SSID. Index 0 for peer's SSID that we want to join
7737 pScanFilter->SSIDs.numOfSSIDs = 1;
7738 }
7739 size = sizeof(tCsrSSIDInfo) * pProfile->SSIDs.numOfSSIDs;
7740 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, size);
7741 if(!HAL_STATUS_SUCCESS(status))
7742 {
7743 break;
7744 }
7745 palCopyMemory(pMac->hHdd, pScanFilter->SSIDs.SSIDList, pProfile->SSIDs.SSIDList, size);
7746 }
7747 if(!pProfile->ChannelInfo.ChannelList || (pProfile->ChannelInfo.ChannelList[0] == 0) )
7748 {
7749 pScanFilter->ChannelInfo.numOfChannels = 0;
7750 pScanFilter->ChannelInfo.ChannelList = NULL;
7751 }
7752 else if(pProfile->ChannelInfo.numOfChannels)
7753 {
7754 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->ChannelInfo.ChannelList, sizeof(*pScanFilter->ChannelInfo.ChannelList) * pProfile->ChannelInfo.numOfChannels);
7755 pScanFilter->ChannelInfo.numOfChannels = 0;
7756 if(HAL_STATUS_SUCCESS(status))
7757 {
7758 for(index = 0; index < pProfile->ChannelInfo.numOfChannels; index++)
7759 {
7760 if(csrRoamIsChannelValid(pMac, pProfile->ChannelInfo.ChannelList[index]))
7761 {
7762 pScanFilter->ChannelInfo.ChannelList[pScanFilter->ChannelInfo.numOfChannels]
7763 = pProfile->ChannelInfo.ChannelList[index];
7764 pScanFilter->ChannelInfo.numOfChannels++;
7765 }
7766 else
7767 {
7768 smsLog(pMac, LOG1, FL("process a channel (%d) that is invalid\n"), pProfile->ChannelInfo.ChannelList[index]);
7769 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007770 }
7771 }
7772 else
7773 {
7774 break;
7775 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007776 }
7777 else
7778 {
7779 smsLog(pMac, LOGW, FL("Channel list empty\n"));
7780 status = eHAL_STATUS_FAILURE;
7781 break;
7782 }
7783 pScanFilter->uapsd_mask = pProfile->uapsd_mask;
7784 pScanFilter->authType = pProfile->AuthType;
7785 pScanFilter->EncryptionType = pProfile->EncryptionType;
7786 pScanFilter->mcEncryptionType = pProfile->mcEncryptionType;
7787 pScanFilter->BSSType = pProfile->BSSType;
7788 pScanFilter->phyMode = pProfile->phyMode;
7789#ifdef FEATURE_WLAN_WAPI
7790 //check if user asked for WAPI with 11n or auto mode, in that case modify
7791 //the phymode to 11g
7792 if(csrIsProfileWapi(pProfile))
7793 {
7794 if(pScanFilter->phyMode & eCSR_DOT11_MODE_11n)
7795 {
7796 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_11n;
7797 }
7798 if(pScanFilter->phyMode & eCSR_DOT11_MODE_AUTO)
7799 {
7800 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_AUTO;
7801 }
7802 if(!pScanFilter->phyMode)
7803 {
7804 pScanFilter->phyMode = eCSR_DOT11_MODE_11g;
7805 }
7806 }
7807#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07007808 /*Save the WPS info*/
7809 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
Jeff Johnson295189b2012-06-20 16:38:30 -07007810 if( pProfile->countryCode[0] )
7811 {
7812 //This causes the matching function to use countryCode as one of the criteria.
7813 palCopyMemory( pMac->hHdd, pScanFilter->countryCode, pProfile->countryCode,
7814 WNI_CFG_COUNTRY_CODE_LEN );
7815 }
7816#ifdef WLAN_FEATURE_VOWIFI_11R
7817 if (pProfile->MDID.mdiePresent)
7818 {
7819 pScanFilter->MDID.mdiePresent = 1;
7820 pScanFilter->MDID.mobilityDomain = pProfile->MDID.mobilityDomain;
7821 }
7822#endif
7823
7824 }while(0);
7825
7826 if(!HAL_STATUS_SUCCESS(status))
7827 {
7828 csrFreeScanFilter(pMac, pScanFilter);
7829 }
7830
7831 return(status);
7832}
7833
Jeff Johnson295189b2012-06-20 16:38:30 -07007834tANI_BOOLEAN csrRoamIssueWmStatusChange( tpAniSirGlobal pMac, tANI_U32 sessionId,
7835 eCsrRoamWmStatusChangeTypes Type, tSirSmeRsp *pSmeRsp )
7836{
7837 tANI_BOOLEAN fCommandQueued = eANI_BOOLEAN_FALSE;
7838 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07007839 do
7840 {
7841 // Validate the type is ok...
7842 if ( ( eCsrDisassociated != Type ) && ( eCsrDeauthenticated != Type ) ) break;
7843 pCommand = csrGetCommandBuffer( pMac );
7844 if ( !pCommand )
7845 {
7846 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7847 break;
7848 }
7849 //Change the substate in case it is waiting for key
7850 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7851 {
7852 csrRoamStopWaitForKeyTimer( pMac );
7853 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
7854 }
7855 pCommand->command = eSmeCommandWmStatusChange;
7856 pCommand->sessionId = (tANI_U8)sessionId;
7857 pCommand->u.wmStatusChangeCmd.Type = Type;
7858 if ( eCsrDisassociated == Type )
7859 {
7860 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg, pSmeRsp,
7861 sizeof( pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg ) );
7862 }
7863 else
7864 {
7865 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg, pSmeRsp,
7866 sizeof( pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg ) );
7867 }
7868 if( HAL_STATUS_SUCCESS( csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE) ) )
7869 {
7870 fCommandQueued = eANI_BOOLEAN_TRUE;
7871 }
7872 else
7873 {
7874 smsLog( pMac, LOGE, FL(" fail to send message \n") );
7875 csrReleaseCommandWmStatusChange( pMac, pCommand );
7876 }
7877
Jeff Johnson295189b2012-06-20 16:38:30 -07007878 /* AP has issued Dissac/Deauth, Set the operating mode value to configured value */
7879 csrSetDefaultDot11Mode( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -07007880 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07007881 return( fCommandQueued );
7882}
7883
Jeff Johnson295189b2012-06-20 16:38:30 -07007884static void csrUpdateRssi(tpAniSirGlobal pMac, void* pMsg)
7885{
7886 v_S7_t rssi = 0;
7887 tAniGetRssiReq *pGetRssiReq = (tAniGetRssiReq*)pMsg;
7888 if(pGetRssiReq)
7889 {
7890 if(NULL != pGetRssiReq->pVosContext)
7891 {
7892 WLANTL_GetRssi(pGetRssiReq->pVosContext, pGetRssiReq->staId, &rssi);
7893 }
7894 else
7895 {
7896 smsLog( pMac, LOGE, FL("pGetRssiReq->pVosContext is NULL\n"));
7897 return;
7898 }
7899
7900 if(NULL != pGetRssiReq->rssiCallback)
7901 {
7902 ((tCsrRssiCallback)(pGetRssiReq->rssiCallback))(rssi, pGetRssiReq->staId, pGetRssiReq->pDevContext);
7903 }
7904 else
7905 {
7906 smsLog( pMac, LOGE, FL("pGetRssiReq->rssiCallback is NULL\n"));
7907 return;
7908 }
7909 }
7910 else
7911 {
7912 smsLog( pMac, LOGE, FL("pGetRssiReq is NULL\n"));
7913 }
7914 return;
7915}
Jeff Johnsone7245742012-09-05 17:12:55 -07007916static void csrRoamRssiIndHdlr(tpAniSirGlobal pMac, void* pMsg)
7917{
7918 WLANTL_TlIndicationReq *pTlRssiInd = (WLANTL_TlIndicationReq*)pMsg;
7919 if(pTlRssiInd)
7920 {
7921 if(NULL != pTlRssiInd->tlCallback)
7922 {
7923 ((WLANTL_RSSICrossThresholdCBType)(pTlRssiInd->tlCallback))
7924 (pTlRssiInd->pAdapter, pTlRssiInd->rssiNotification, pTlRssiInd->pUserCtxt);
7925 }
7926 else
7927 {
7928 smsLog( pMac, LOGE, FL("pTlRssiInd->tlCallback is NULL\n"));
7929 }
7930 }
7931 else
7932 {
7933 smsLog( pMac, LOGE, FL("pTlRssiInd is NULL\n"));
7934 }
7935 return;
7936}
Jeff Johnson295189b2012-06-20 16:38:30 -07007937
7938void csrRoamCheckForLinkStatusChange( tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg )
7939{
7940 tSirSmeAssocInd *pAssocInd;
7941 tSirSmeDisassocInd *pDisassocInd;
7942 tSirSmeDeauthInd *pDeauthInd;
7943 tSirSmeWmStatusChangeNtf *pStatusChangeMsg;
7944 tSirSmeNewBssInfo *pNewBss;
7945 tSmeIbssPeerInd *pIbssPeerInd;
7946 tSirMacAddr Broadcastaddr = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
7947 tSirSmeApNewCaps *pApNewCaps;
7948 eCsrRoamResult result = eCSR_ROAM_RESULT_NONE;
7949 eRoamCmdStatus roamStatus = eCSR_ROAM_FAILED;
7950 tCsrRoamInfo *pRoamInfo = NULL;
7951 tCsrRoamInfo roamInfo;
7952 eHalStatus status;
7953 tANI_U32 sessionId = CSR_SESSION_ID_INVALID;
7954 tCsrRoamSession *pSession = NULL;
7955 tpSirSmeSwitchChannelInd pSwitchChnInd;
7956 tSmeMaxAssocInd *pSmeMaxAssocInd;
Jeff Johnson295189b2012-06-20 16:38:30 -07007957#if defined ANI_PRODUCT_TYPE_AP
7958 pSirMsg->messageType = pal_be16_to_cpu(pSirMsg->messageType);
7959 pSirMsg->length = pal_be16_to_cpu(pSirMsg->length);
7960 pSirMsg->statusCode = pal_be32_to_cpu(pSirMsg->statusCode);
7961#else
7962 pSirMsg->messageType = (pSirMsg->messageType);
7963 pSirMsg->length = (pSirMsg->length);
7964 pSirMsg->statusCode = (pSirMsg->statusCode);
7965#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007966 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
Jeff Johnson295189b2012-06-20 16:38:30 -07007967 switch( pSirMsg->messageType )
7968 {
7969 case eWNI_SME_ASSOC_IND:
7970 {
7971 tCsrRoamSession *pSession;
7972 smsLog( pMac, LOG1, FL("ASSOCIATION Indication from SME\n"));
7973 pAssocInd = (tSirSmeAssocInd *)pSirMsg;
7974 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pAssocInd->bssId, &sessionId );
7975 if( HAL_STATUS_SUCCESS( status ) )
7976 {
7977 pSession = CSR_GET_SESSION(pMac, sessionId);
7978
Jeff Johnson32d95a32012-09-10 13:15:23 -07007979 if(!pSession)
7980 {
7981 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7982 return;
7983 }
7984
Jeff Johnson295189b2012-06-20 16:38:30 -07007985 pRoamInfo = &roamInfo;
7986
7987 // Required for indicating the frames to upper layer
7988 pRoamInfo->assocReqLength = pAssocInd->assocReqLength;
7989 pRoamInfo->assocReqPtr = pAssocInd->assocReqPtr;
7990
7991 pRoamInfo->beaconPtr = pAssocInd->beaconPtr;
7992 pRoamInfo->beaconLength = pAssocInd->beaconLength;
7993 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
7994 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
7995
7996 pRoamInfo->staId = (tANI_U8)pAssocInd->staId;
7997 pRoamInfo->rsnIELen = (tANI_U8)pAssocInd->rsnIE.length;
7998 pRoamInfo->prsnIE = pAssocInd->rsnIE.rsnIEdata;
7999
8000 pRoamInfo->addIELen = (tANI_U8)pAssocInd->addIE.length;
8001 pRoamInfo->paddIE = pAssocInd->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07008002 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
8003 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pAssocInd->bssId, sizeof(tCsrBssid));
8004#ifdef WLAN_SOFTAP_FEATURE
8005 pRoamInfo->wmmEnabledSta = pAssocInd->wmmEnabledSta;
8006 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8007#endif
8008 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
8009#ifdef WLAN_SOFTAP_FEATURE
8010 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile))
8011 {
8012 if( CSR_IS_ENC_TYPE_STATIC( pSession->pCurRoamProfile->negotiatedUCEncryptionType ))
8013 {
8014 csrRoamIssueSetContextReq( pMac, sessionId, pSession->pCurRoamProfile->negotiatedUCEncryptionType,
8015 pSession->pConnectBssDesc,
8016 &(pRoamInfo->peerMac),
8017 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8018 pRoamInfo->fAuthRequired = FALSE;
8019 }
8020 else
8021 {
8022 pRoamInfo->fAuthRequired = TRUE;
8023 }
8024 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_IND);
8025 if (!HAL_STATUS_SUCCESS(status))
8026 pRoamInfo->statusCode = eSIR_SME_ASSOC_REFUSED;// Refused due to Mac filtering
8027 }
8028#endif
8029 /* Send Association completion message to PE */
8030 status = csrSendAssocCnfMsg( pMac, pAssocInd, status );//Sta
8031
8032 /* send a message to CSR itself just to avoid the EAPOL frames going
8033 * OTA before association response */
Jeff Johnson295189b2012-06-20 16:38:30 -07008034 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8035 {
8036 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8037 }
8038#ifdef WLAN_SOFTAP_FEATURE
8039 else if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) && (pRoamInfo->statusCode != eSIR_SME_ASSOC_REFUSED))
8040 {
8041 pRoamInfo->fReassocReq = pAssocInd->reassocReq;
8042 //status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
8043 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8044 }
8045#endif
8046 }
8047 }
8048 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008049 case eWNI_SME_DISASSOC_IND:
8050 smsLog( pMac, LOGE, FL("DISASSOCIATION Indication from MAC\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008051 // Check if AP dis-associated us because of MIC failure. If so,
8052 // then we need to take action immediately and not wait till the
8053 // the WmStatusChange requests is pushed and processed
8054 pDisassocInd = (tSirSmeDisassocInd *)pSirMsg;
8055 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDisassocInd->bssId, &sessionId );
8056 if( HAL_STATUS_SUCCESS( status ) )
8057 {
8058 // If we are in neighbor preauth done state then on receiving
8059 // disassoc or deauth we dont roam instead we just disassoc
8060 // from current ap and then go to disconnected state
8061 // This happens for CCX and 11r FT connections ONLY.
8062#ifdef WLAN_FEATURE_VOWIFI_11R
8063 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8064 {
8065 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8066 }
8067#endif
8068#ifdef FEATURE_WLAN_CCX
8069 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8070 {
8071 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8072 }
8073#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008074#ifdef FEATURE_WLAN_LFR
8075 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8076 {
8077 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8078 }
8079#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008080 pSession = CSR_GET_SESSION( pMac, sessionId );
8081
Jeff Johnson32d95a32012-09-10 13:15:23 -07008082 if(!pSession)
8083 {
8084 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8085 return;
8086 }
8087
Jeff Johnson295189b2012-06-20 16:38:30 -07008088 if ( csrIsConnStateInfra( pMac, sessionId ) )
8089 {
8090 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8091 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008092#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8093 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8094#endif
8095 csrRoamLinkDown(pMac, sessionId);
8096 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDisassociated, pSirMsg );
8097#ifdef WLAN_SOFTAP_FEATURE
8098 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8099 {
8100
8101 pRoamInfo = &roamInfo;
8102
8103 pRoamInfo->statusCode = pDisassocInd->statusCode;
8104 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8105
8106 pRoamInfo->staId = (tANI_U8)pDisassocInd->staId;
8107
8108 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocInd->peerMacAddr, sizeof(tSirMacAddr));
8109 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDisassocInd->bssId, sizeof(tCsrBssid));
8110
8111 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DISASSOC_IND);
8112 }
8113#endif
8114 }
8115 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008116 case eWNI_SME_DEAUTH_IND:
8117 smsLog( pMac, LOG1, FL("DEAUTHENTICATION Indication from MAC\n"));
8118 pDeauthInd = (tpSirSmeDeauthInd)pSirMsg;
8119 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDeauthInd->bssId, &sessionId );
8120 if( HAL_STATUS_SUCCESS( status ) )
8121 {
8122 // If we are in neighbor preauth done state then on receiving
8123 // disassoc or deauth we dont roam instead we just disassoc
8124 // from current ap and then go to disconnected state
8125 // This happens for CCX and 11r FT connections ONLY.
8126#ifdef WLAN_FEATURE_VOWIFI_11R
8127 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8128 {
8129 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8130 }
8131#endif
8132#ifdef FEATURE_WLAN_CCX
8133 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8134 {
8135 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8136 }
8137#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008138#ifdef FEATURE_WLAN_LFR
8139 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8140 {
8141 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8142 }
8143#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008144 pSession = CSR_GET_SESSION( pMac, sessionId );
8145
Jeff Johnson32d95a32012-09-10 13:15:23 -07008146 if(!pSession)
8147 {
8148 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8149 return;
8150 }
8151
Jeff Johnson295189b2012-06-20 16:38:30 -07008152 if ( csrIsConnStateInfra( pMac, sessionId ) )
8153 {
8154 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8155 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008156#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8157 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8158#endif
8159 csrRoamLinkDown(pMac, sessionId);
8160 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDeauthenticated, pSirMsg );
8161#ifdef WLAN_SOFTAP_FEATURE
8162 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8163 {
8164
8165 pRoamInfo = &roamInfo;
8166
8167 pRoamInfo->statusCode = pDeauthInd->statusCode;
8168 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8169
8170 pRoamInfo->staId = (tANI_U8)pDeauthInd->staId;
8171
8172 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthInd->peerMacAddr, sizeof(tSirMacAddr));
8173 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDeauthInd->bssId, sizeof(tCsrBssid));
8174
8175 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DEAUTH_IND);
8176 }
8177#endif
8178 }
8179 break;
8180
8181 case eWNI_SME_SWITCH_CHL_REQ: // in case of STA, the SWITCH_CHANNEL originates from its AP
8182 smsLog( pMac, LOGW, FL("eWNI_SME_SWITCH_CHL_REQ from SME\n"));
8183 pSwitchChnInd = (tpSirSmeSwitchChannelInd)pSirMsg;
8184 //Update with the new channel id.
8185 //The channel id is hidden in the statusCode.
8186 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pSwitchChnInd->bssId, &sessionId );
8187 if( HAL_STATUS_SUCCESS( status ) )
8188 {
8189 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008190 if(!pSession)
8191 {
8192 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8193 return;
8194 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008195 pSession->connectedProfile.operationChannel = (tANI_U8)pSwitchChnInd->newChannelId;
8196 if(pSession->pConnectBssDesc)
8197 {
8198 pSession->pConnectBssDesc->channelId = (tANI_U8)pSwitchChnInd->newChannelId;
8199 }
8200 }
8201 break;
8202
8203 case eWNI_SME_DEAUTH_RSP:
8204 smsLog( pMac, LOGW, FL("eWNI_SME_DEAUTH_RSP from SME\n"));
8205#ifdef WLAN_SOFTAP_FEATURE
8206 {
8207 tSirSmeDeauthRsp* pDeauthRsp = (tSirSmeDeauthRsp *)pSirMsg;
8208 sessionId = pDeauthRsp->sessionId;
8209 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8210 {
8211 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008212 if(!pSession)
8213 {
8214 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8215 return;
8216 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008217 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8218 {
8219 pRoamInfo = &roamInfo;
8220 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8221 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthRsp->peerMacAddr, sizeof(tSirMacAddr));
8222 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8223 pRoamInfo->statusCode = pDeauthRsp->statusCode;
8224 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8225 }
8226 }
8227 }
8228#endif
8229 break;
8230
8231 case eWNI_SME_DISASSOC_RSP:
8232 smsLog( pMac, LOGW, FL("eWNI_SME_DISASSOC_RSP from SME subState = %d\n"), pMac->roam.curSubState[sessionId]);
8233#ifdef WLAN_SOFTAP_FEATURE
8234 {
8235 tSirSmeDisassocRsp *pDisassocRsp = (tSirSmeDisassocRsp *)pSirMsg;
8236 sessionId = pDisassocRsp->sessionId;
8237 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8238 {
8239 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008240 if(!pSession)
8241 {
8242 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8243 return;
8244 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008245 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8246 {
8247 pRoamInfo = &roamInfo;
8248 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8249 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocRsp->peerMacAddr, sizeof(tSirMacAddr));
8250 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8251 pRoamInfo->statusCode = pDisassocRsp->statusCode;
8252 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8253 }
8254 }
8255 }
8256#endif
8257 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008258 case eWNI_SME_MIC_FAILURE_IND:
8259 {
8260 tpSirSmeMicFailureInd pMicInd = (tpSirSmeMicFailureInd)pSirMsg;
8261 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
8262 eCsrRoamResult result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
Jeff Johnson295189b2012-06-20 16:38:30 -07008263#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8264 {
8265 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008266 if(!pSession)
8267 {
8268 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8269 return;
8270 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008271 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
8272 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
8273 secEvent.eventId = WLAN_SECURITY_EVENT_MIC_ERROR;
8274 secEvent.encryptionModeMulticast =
8275 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8276 secEvent.encryptionModeUnicast =
8277 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8278 secEvent.authMode =
8279 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8280 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
8281 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
8282 }
8283#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008284 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pMicInd->bssId, &sessionId );
8285 if( HAL_STATUS_SUCCESS( status ) )
8286 {
8287 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8288 roamInfo.u.pMICFailureInfo = &pMicInd->info;
8289 pRoamInfo = &roamInfo;
8290 if(pMicInd->info.multicast)
8291 {
8292 result = eCSR_ROAM_RESULT_MIC_ERROR_GROUP;
8293 }
8294 else
8295 {
8296 result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
8297 }
8298 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_MIC_ERROR_IND, result);
8299 }
8300 }
8301 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008302#ifdef WLAN_SOFTAP_FEATURE
8303 case eWNI_SME_WPS_PBC_PROBE_REQ_IND:
8304 {
8305 tpSirSmeProbeReqInd pProbeReqInd = (tpSirSmeProbeReqInd)pSirMsg;
8306 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008307 smsLog( pMac, LOG1, FL("WPS PBC Probe request Indication from SME\n"));
8308
8309 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pProbeReqInd->bssId, &sessionId );
8310 if( HAL_STATUS_SUCCESS( status ) )
8311 {
8312 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8313 roamInfo.u.pWPSPBCProbeReq = &pProbeReqInd->WPSPBCProbeReq;
8314 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_WPS_PBC_PROBE_REQ_IND,
8315 eCSR_ROAM_RESULT_WPS_PBC_PROBE_REQ_IND);
8316 }
8317 }
8318 break;
8319#endif
8320
Jeff Johnson295189b2012-06-20 16:38:30 -07008321 case eWNI_SME_WM_STATUS_CHANGE_NTF:
8322 pStatusChangeMsg = (tSirSmeWmStatusChangeNtf *)pSirMsg;
8323 switch( pStatusChangeMsg->statusChangeCode )
8324 {
8325 case eSIR_SME_IBSS_ACTIVE:
8326 sessionId = csrFindIbssSession( pMac );
8327 if( CSR_SESSION_ID_INVALID != sessionId )
8328 {
8329 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008330 if(!pSession)
8331 {
8332 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8333 return;
8334 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008335 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED;
8336 if(pSession->pConnectBssDesc)
8337 {
8338 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8339 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
8340 pRoamInfo = &roamInfo;
8341 }
8342 else
8343 {
8344 smsLog(pMac, LOGE, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8345 }
8346 result = eCSR_ROAM_RESULT_IBSS_CONNECT;
8347 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8348 }
8349 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008350 case eSIR_SME_IBSS_INACTIVE:
8351 sessionId = csrFindIbssSession( pMac );
8352 if( CSR_SESSION_ID_INVALID != sessionId )
8353 {
8354 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008355 if(!pSession)
8356 {
8357 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8358 return;
8359 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008360 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
8361 result = eCSR_ROAM_RESULT_IBSS_INACTIVE;
8362 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8363 }
8364 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008365 case eSIR_SME_JOINED_NEW_BSS: // IBSS coalescing.
8366 sessionId = csrFindIbssSession( pMac );
8367 if( CSR_SESSION_ID_INVALID != sessionId )
8368 {
8369 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008370 if(!pSession)
8371 {
8372 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8373 return;
8374 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008375 // update the connection state information
8376 pNewBss = &pStatusChangeMsg->statusChangeInfo.newBssInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008377#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8378 {
8379 vos_log_ibss_pkt_type *pIbssLog;
8380 tANI_U32 bi;
Jeff Johnson295189b2012-06-20 16:38:30 -07008381 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8382 if(pIbssLog)
8383 {
8384 pIbssLog->eventId = WLAN_IBSS_EVENT_COALESCING;
8385 if(pNewBss)
8386 {
8387 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pNewBss->bssId, 6);
8388 if(pNewBss->ssId.length)
8389 {
8390 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pNewBss->ssId.ssId, pNewBss->ssId.length);
8391 }
8392 pIbssLog->operatingChannel = pNewBss->channelNumber;
8393 }
8394 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
8395 {
8396 //***U8 is not enough for beacon interval
8397 pIbssLog->beaconInterval = (v_U8_t)bi;
8398 }
8399 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8400 }
8401 }
8402#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008403 csrRoamUpdateConnectedProfileFromNewBss( pMac, sessionId, pNewBss );
8404 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8405 pSession->pConnectBssDesc,
8406 &Broadcastaddr,
8407 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 );
8408 result = eCSR_ROAM_RESULT_IBSS_COALESCED;
8409 roamStatus = eCSR_ROAM_IBSS_IND;
8410 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pNewBss->bssId, sizeof(tCsrBssid));
8411 pRoamInfo = &roamInfo;
8412 //This BSSID is th ereal BSSID, let's save it
8413 if(pSession->pConnectBssDesc)
8414 {
8415 palCopyMemory(pMac->hHdd, pSession->pConnectBssDesc->bssId, &pNewBss->bssId, sizeof(tCsrBssid));
8416 }
8417 // Stop the join IBSS timer in case of join, for
8418 // genuine merge do nothing
8419 if(pSession->ibss_join_pending)
8420 {
8421 pSession->ibss_join_pending = FALSE;
8422 csrRoamStopIbssJoinTimer(pMac, sessionId);
8423 result = eCSR_ROAM_RESULT_IBSS_JOIN_SUCCESS;
8424 }
8425 }
8426 smsLog(pMac, LOGW, "CSR: eSIR_SME_JOINED_NEW_BSS received from PE\n");
8427 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008428 // detection by LIM that the capabilities of the associated AP have changed.
8429 case eSIR_SME_AP_CAPS_CHANGED:
8430 pApNewCaps = &pStatusChangeMsg->statusChangeInfo.apNewCaps;
8431 smsLog(pMac, LOGW, "CSR handling eSIR_SME_AP_CAPS_CHANGED\n");
8432 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pApNewCaps->bssId, &sessionId );
8433 if( HAL_STATUS_SUCCESS( status ) )
8434 {
8435 csrScanForCapabilityChange( pMac, pApNewCaps );
8436 result = eCSR_ROAM_RESULT_CAP_CHANGED;
8437 roamStatus = eCSR_ROAM_GEN_INFO;
8438 }
8439 break;
8440
8441 default:
8442 roamStatus = eCSR_ROAM_FAILED;
8443 result = eCSR_ROAM_RESULT_NONE;
8444 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008445 } // end switch on statusChangeCode
8446 if(eCSR_ROAM_RESULT_NONE != result)
8447 {
8448 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, roamStatus, result);
8449 }
8450 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008451 case eWNI_SME_IBSS_NEW_PEER_IND:
8452 pIbssPeerInd = (tSmeIbssPeerInd *)pSirMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07008453#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8454 {
8455 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07008456 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8457 if(pIbssLog)
8458 {
8459 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_JOIN;
8460 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8461 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8462 }
8463 }
8464#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008465 sessionId = csrFindIbssSession( pMac );
8466 if( CSR_SESSION_ID_INVALID != sessionId )
8467 {
8468 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008469
8470 if(!pSession)
8471 {
8472 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8473 return;
8474 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008475 // Issue the set Context request to LIM to establish the Unicast STA context for the new peer...
8476 if(pSession->pConnectBssDesc)
8477 {
8478 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8479 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8480 if(pIbssPeerInd->mesgLen > sizeof(tSmeIbssPeerInd))
8481 {
8482 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pbFrames,
8483 (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd)));
8484 if(HAL_STATUS_SUCCESS(status))
8485 {
8486 roamInfo.nBeaconLength = (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd));
8487 palCopyMemory(pMac->hHdd, roamInfo.pbFrames, ((tANI_U8 *)pIbssPeerInd) + sizeof(tSmeIbssPeerInd),
8488 roamInfo.nBeaconLength);
8489 }
8490 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8491 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8492 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8493 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pBssDesc,
8494 pSession->pConnectBssDesc->length);
8495 if(HAL_STATUS_SUCCESS(status))
8496 {
8497 palCopyMemory(pMac->hHdd, roamInfo.pBssDesc, pSession->pConnectBssDesc,
8498 pSession->pConnectBssDesc->length);
8499 }
8500 if(HAL_STATUS_SUCCESS(status))
8501 {
8502 pRoamInfo = &roamInfo;
8503 }
8504 else
8505 {
8506 if(roamInfo.pbFrames)
8507 {
8508 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8509 }
8510 if(roamInfo.pBssDesc)
8511 {
8512 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8513 }
8514 }
8515 }
8516 else
8517 {
8518 pRoamInfo = &roamInfo;
8519 }
8520 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8521 pSession->pConnectBssDesc,
8522 &(pIbssPeerInd->peerAddr),
8523 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8524 }
8525 else
8526 {
8527 smsLog(pMac, LOGW, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8528 }
8529 //send up the sec type for the new peer
8530 if (pRoamInfo)
8531 {
8532 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8533 }
8534 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0,
8535 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_NEW_PEER);
8536 if(pRoamInfo)
8537 {
8538 if(roamInfo.pbFrames)
8539 {
8540 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8541 }
8542 if(roamInfo.pBssDesc)
8543 {
8544 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8545 }
8546 }
8547 }
8548 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008549 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
8550 pIbssPeerInd = (tSmeIbssPeerInd*)pSirMsg;
8551 sessionId = csrFindIbssSession( pMac );
8552 if( CSR_SESSION_ID_INVALID != sessionId )
8553 {
Jeff Johnson295189b2012-06-20 16:38:30 -07008554#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8555 {
8556 vos_log_ibss_pkt_type *pIbssLog;
8557
8558 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8559 if(pIbssLog)
8560 {
8561 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_LEAVE;
8562 if(pIbssPeerInd)
8563 {
8564 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8565 }
8566 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8567 }
8568 }
8569#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008570 smsLog(pMac, LOGW, "CSR: Peer departed notification from LIM\n");
8571 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8572 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8573 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8574 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8575 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8576 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
8577 }
8578 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008579 case eWNI_SME_SETCONTEXT_RSP:
8580 {
8581 tSirSmeSetContextRsp *pRsp = (tSirSmeSetContextRsp *)pSirMsg;
8582 tListElem *pEntry;
8583 tSmeCmd *pCommand;
8584
8585 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8586 if ( pEntry )
8587 {
8588 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8589 if ( eSmeCommandSetKey == pCommand->command )
8590 {
8591 sessionId = pCommand->sessionId;
8592 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008593
8594 if(!pSession)
8595 {
8596 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8597 return;
8598 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008599
8600#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8601 if(eCSR_ENCRYPT_TYPE_NONE != pSession->connectedProfile.EncryptionType)
8602 {
8603 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
8604 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8605 if( pRsp->peerMacAddr[0] & 0x01 )
8606 {
8607 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
8608 }
8609 else
8610 {
8611 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
8612 }
8613 setKeyEvent.encryptionModeMulticast =
8614 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8615 setKeyEvent.encryptionModeUnicast =
8616 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8617 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8618 setKeyEvent.authMode =
8619 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8620 if( eSIR_SUCCESS != pRsp->statusCode )
8621 {
8622 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8623 }
8624 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
8625 }
8626#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
8627 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
8628 {
8629 //We are done with authentication, whethere succeed or not
8630 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
8631
8632 csrRoamStopWaitForKeyTimer( pMac );
8633 //We do it here because this linkup function is not called after association
8634 //when a key needs to be set.
8635 if( csrIsConnStateConnectedInfra(pMac, sessionId) )
8636 {
8637 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
8638 }
8639 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008640 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008641 {
8642 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
Jeff Johnsone7245742012-09-05 17:12:55 -07008643 //Make sure we install the GTK before indicating to HDD as authenticated
8644 //This is to prevent broadcast packets go out after PTK and before GTK.
8645 if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr,
8646 sizeof(tSirMacAddr) ) )
8647 {
8648 result = eCSR_ROAM_RESULT_AUTHENTICATED;
8649 }
8650 else
8651 {
8652 result = eCSR_ROAM_RESULT_NONE;
8653 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008654 pRoamInfo = &roamInfo;
8655 }
8656 else
8657 {
8658 result = eCSR_ROAM_RESULT_FAILURE;
8659 smsLog( pMac, LOGE, "CSR: Roam Completion setkey command failed(%d) PeerMac %02X-%02X-%02X-%02X-%02X-%02X...\n",
8660 pRsp->statusCode, pRsp->peerMacAddr[0], pRsp->peerMacAddr[1], pRsp->peerMacAddr[2],
8661 pRsp->peerMacAddr[3], pRsp->peerMacAddr[4], pRsp->peerMacAddr[5] );
8662 }
8663 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8664 eCSR_ROAM_SET_KEY_COMPLETE, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07008665 // Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS
8666 // can go ahead and initiate the TSPEC if any are pending
8667 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -07008668#ifdef FEATURE_WLAN_CCX
8669 //Send Adjacent AP repot to new AP.
8670 if (result == eCSR_ROAM_RESULT_AUTHENTICATED &&
8671 pSession->isPrevApInfoValid &&
8672 pSession->connectedProfile.isCCXAssoc)
8673 {
8674#ifdef WLAN_FEATURE_VOWIFI
8675 csrCcxSendAdjacentApRepMsg(pMac, pSession);
8676#endif
8677 pSession->isPrevApInfoValid = FALSE;
8678 }
8679#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008680 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8681 {
8682 csrReleaseCommandSetKey( pMac, pCommand );
8683 }
8684 }
8685 else
8686 {
8687 smsLog( pMac, LOGE, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8688 }
8689 }
8690 else
8691 {
8692 smsLog( pMac, LOGE, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8693 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008694 smeProcessPendingQueue( pMac );
8695 }
8696 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008697 case eWNI_SME_REMOVEKEY_RSP:
8698 {
8699 tSirSmeRemoveKeyRsp *pRsp = (tSirSmeRemoveKeyRsp *)pSirMsg;
8700 tListElem *pEntry;
8701 tSmeCmd *pCommand;
8702
8703 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8704 if ( pEntry )
8705 {
8706 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8707 if ( eSmeCommandRemoveKey == pCommand->command )
8708 {
8709 sessionId = pCommand->sessionId;
8710 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008711
8712 if(!pSession)
8713 {
8714 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8715 return;
8716 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008717#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8718 {
8719 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
8720 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8721 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
8722 removeKeyEvent.encryptionModeMulticast =
8723 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8724 removeKeyEvent.encryptionModeUnicast =
8725 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8726 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8727 removeKeyEvent.authMode =
8728 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8729 if( eSIR_SUCCESS != pRsp->statusCode )
8730 {
8731 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8732 }
8733 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
8734 }
8735#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson43971f52012-07-17 12:26:56 -07008736 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008737 {
8738 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
8739 result = eCSR_ROAM_RESULT_NONE;
8740 pRoamInfo = &roamInfo;
8741 }
8742 else
8743 {
8744 result = eCSR_ROAM_RESULT_FAILURE;
8745 }
8746 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8747 eCSR_ROAM_REMOVE_KEY_COMPLETE, result);
8748 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8749 {
8750 csrReleaseCommandRemoveKey( pMac, pCommand );
8751 }
8752 }
8753 else
8754 {
8755 smsLog( pMac, LOGW, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8756 }
8757 }
8758 else
8759 {
8760 smsLog( pMac, LOGW, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8761 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008762 smeProcessPendingQueue( pMac );
8763 }
8764 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008765 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07008766 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008767 csrRoamStatsRspProcessor( pMac, pSirMsg );
8768 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008769 case eWNI_SME_GET_RSSI_REQ:
Mohit Khanna23863762012-09-11 17:40:09 -07008770 smsLog( pMac, LOG2, FL("GetRssiReq from self\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008771 csrUpdateRssi( pMac, pSirMsg );
8772 break;
8773
Jeff Johnson295189b2012-06-20 16:38:30 -07008774#ifdef WLAN_FEATURE_VOWIFI_11R
8775 case eWNI_SME_FT_PRE_AUTH_RSP:
8776 csrRoamFTPreAuthRspProcessor( pMac, (tpSirFTPreAuthRsp)pSirMsg );
8777 break;
8778#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008779 case eWNI_SME_MAX_ASSOC_EXCEEDED:
8780 pSmeMaxAssocInd = (tSmeMaxAssocInd*)pSirMsg;
8781 smsLog( pMac, LOG1, FL("send indication that max assoc have been reached and the new peer cannot be accepted\n"));
8782 sessionId = pSmeMaxAssocInd->sessionId;
8783 roamInfo.sessionId = sessionId;
8784 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pSmeMaxAssocInd->peerMac, sizeof(tCsrBssid));
8785 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8786 eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED);
8787 break;
8788
8789 case eWNI_SME_BTAMP_LOG_LINK_IND:
8790 smsLog( pMac, LOG1, FL("Establish logical link req from HCI serialized through MC thread\n"));
8791 btampEstablishLogLinkHdlr( pSirMsg );
8792 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07008793 case eWNI_SME_RSSI_IND:
8794 smsLog( pMac, LOG1, FL("RSSI indication from TL serialized through MC thread\n"));
8795 csrRoamRssiIndHdlr( pMac, pSirMsg );
8796 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008797
8798 default:
8799 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008800 } // end switch on message type
Jeff Johnson295189b2012-06-20 16:38:30 -07008801}
8802
Jeff Johnson295189b2012-06-20 16:38:30 -07008803void csrCallRoamingCompletionCallback(tpAniSirGlobal pMac, tCsrRoamSession *pSession,
8804 tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, eCsrRoamResult roamResult)
8805{
8806 if(pSession)
8807 {
8808 if(pSession->bRefAssocStartCnt)
8809 {
8810 pSession->bRefAssocStartCnt--;
8811 VOS_ASSERT( pSession->bRefAssocStartCnt == 0);
8812 //Need to call association_completion because there is an assoc_start pending.
8813 csrRoamCallCallback(pMac, pSession->sessionId, NULL, roamId,
8814 eCSR_ROAM_ASSOCIATION_COMPLETION,
8815 eCSR_ROAM_RESULT_FAILURE);
8816 }
8817 csrRoamCallCallback(pMac, pSession->sessionId, pRoamInfo, roamId, eCSR_ROAM_ROAMING_COMPLETION, roamResult);
8818 }
8819 else
8820 {
8821 smsLog(pMac, LOGW, FL(" pSession is NULL"));
8822 }
8823}
8824
8825
8826eHalStatus csrRoamStartRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamingReason roamingReason)
8827{
8828 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07008829 if(CSR_IS_LOSTLINK_ROAMING(roamingReason) &&
8830 (eANI_BOOLEAN_FALSE == pMac->roam.roamSession[sessionId].fCancelRoaming))
8831 {
8832 status = csrScanRequestLostLink1( pMac, sessionId );
8833 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008834 return(status);
8835}
8836
Jeff Johnson295189b2012-06-20 16:38:30 -07008837//return a boolean to indicate whether roaming completed or continue.
8838tANI_BOOLEAN csrRoamCompleteRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId,
8839 tANI_BOOLEAN fForce, eCsrRoamResult roamResult)
8840{
8841 tANI_BOOLEAN fCompleted = eANI_BOOLEAN_TRUE;
8842 tANI_TIMESTAMP roamTime = (tANI_TIMESTAMP)(pMac->roam.configParam.nRoamingTime * PAL_TICKS_PER_SECOND);
8843 tANI_TIMESTAMP curTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
8844 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07008845 //Check whether time is up
8846 if(pSession->fCancelRoaming || fForce ||
8847 ((curTime - pSession->roamingStartTime) > roamTime) ||
8848 eCsrReassocRoaming == pSession->roamingReason ||
8849 eCsrDynamicRoaming == pSession->roamingReason)
8850 {
8851 smsLog(pMac, LOGW, FL(" indicates roaming completion\n"));
8852 if(pSession->fCancelRoaming && CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason))
8853 {
8854 //roaming is cancelled, tell HDD to indicate disconnect
8855 //Because LIM overload deauth_ind for both deauth frame and missed beacon
8856 //we need to use this logic to detinguish it. For missed beacon, LIM set reason
8857 //to be eSIR_BEACON_MISSED
8858 if(eSIR_BEACON_MISSED == pSession->roamingStatusCode)
8859 {
8860 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8861 }
8862 else if(eCsrLostlinkRoamingDisassoc == pSession->roamingReason)
8863 {
8864 roamResult = eCSR_ROAM_RESULT_DISASSOC_IND;
8865 }
8866 else if(eCsrLostlinkRoamingDeauth == pSession->roamingReason)
8867 {
8868 roamResult = eCSR_ROAM_RESULT_DEAUTH_IND;
8869 }
8870 else
8871 {
8872 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8873 }
8874 }
8875 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8876 pSession->roamingReason = eCsrNotRoaming;
8877 }
8878 else
8879 {
8880 pSession->roamResult = roamResult;
8881 if(!HAL_STATUS_SUCCESS(csrRoamStartRoamingTimer(pMac, sessionId, PAL_TIMER_TO_SEC_UNIT)))
8882 {
8883 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8884 pSession->roamingReason = eCsrNotRoaming;
8885 }
8886 else
8887 {
8888 fCompleted = eANI_BOOLEAN_FALSE;
8889 }
8890 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008891 return(fCompleted);
8892}
8893
Jeff Johnson295189b2012-06-20 16:38:30 -07008894void csrRoamCancelRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId)
8895{
8896 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008897
8898 if(!pSession)
8899 {
8900 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8901 return;
8902 }
8903
Jeff Johnson295189b2012-06-20 16:38:30 -07008904 if(CSR_IS_ROAMING(pSession))
8905 {
8906 smsLog(pMac, LOGW, " Cancelling roaming\n");
8907 pSession->fCancelRoaming = eANI_BOOLEAN_TRUE;
8908 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
8909 {
8910 //No need to do anything in here because the handler takes care of it
8911 }
8912 else
8913 {
8914 eCsrRoamResult roamResult = CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason) ?
8915 eCSR_ROAM_RESULT_LOSTLINK : eCSR_ROAM_RESULT_NONE;
8916 //Roaming is stopped after here
8917 csrRoamCompleteRoaming(pMac, sessionId, eANI_BOOLEAN_TRUE, roamResult);
8918 //Since CSR may be in lostlink roaming situation, abort all roaming related activities
8919 csrScanAbortMacScan(pMac);
8920 csrRoamStopRoamingTimer(pMac, sessionId);
8921 }
8922 }
8923}
8924
Jeff Johnson295189b2012-06-20 16:38:30 -07008925void csrRoamRoamingTimerHandler(void *pv)
8926{
8927 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
8928 tpAniSirGlobal pMac = pInfo->pMac;
8929 tANI_U32 sessionId = pInfo->sessionId;
8930 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008931
8932 if(!pSession)
8933 {
8934 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8935 return;
8936 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008937
8938 if(eANI_BOOLEAN_FALSE == pSession->fCancelRoaming)
8939 {
8940 if(!HAL_STATUS_SUCCESS(csrRoamStartRoaming(pMac, sessionId, pSession->roamingReason)))
8941 {
8942 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, pSession->roamResult);
8943 pSession->roamingReason = eCsrNotRoaming;
8944 }
8945 }
8946}
8947
Jeff Johnson295189b2012-06-20 16:38:30 -07008948eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
8949{
8950 eHalStatus status;
8951 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008952
8953 if(!pSession)
8954 {
8955 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8956 return eHAL_STATUS_FAILURE;
8957 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008958
8959 smsLog(pMac, LOG1, " csrScanStartRoamingTimer \n ");
8960 pSession->roamingTimerInfo.sessionId = (tANI_U8)sessionId;
8961 status = palTimerStart(pMac->hHdd, pSession->hTimerRoaming, interval, eANI_BOOLEAN_FALSE);
8962
8963 return (status);
8964}
8965
Jeff Johnson295189b2012-06-20 16:38:30 -07008966eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
8967{
8968 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerRoaming));
8969}
8970
Jeff Johnson295189b2012-06-20 16:38:30 -07008971void csrRoamWaitForKeyTimeOutHandler(void *pv)
8972{
8973 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
8974 tpAniSirGlobal pMac = pInfo->pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07008975 if( CSR_IS_WAIT_FOR_KEY( pMac, pInfo->sessionId ) )
8976 {
8977 smsLog(pMac, LOGW, " SME pre-auth state timeout. \n ");
8978 //Change the substate so command queue is unblocked.
8979 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, pInfo->sessionId);
8980 }
8981
8982}
8983
Jeff Johnson295189b2012-06-20 16:38:30 -07008984eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval)
8985{
8986 eHalStatus status;
8987
8988 smsLog(pMac, LOG1, " csrScanStartWaitForKeyTimer \n ");
8989 status = palTimerStart(pMac->hHdd, pMac->roam.hTimerWaitForKey, interval, eANI_BOOLEAN_FALSE);
8990
8991 return (status);
8992}
8993
Jeff Johnson295189b2012-06-20 16:38:30 -07008994eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac)
8995{
8996 return (palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey));
8997}
8998
Jeff Johnson295189b2012-06-20 16:38:30 -07008999void csrRoamIbssJoinTimerHandler(void *pv)
9000{
9001 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9002 tpAniSirGlobal pMac = pInfo->pMac;
9003 eCsrRoamDisconnectReason reason = eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE;
9004 tANI_U32 sessionId = pInfo->sessionId;
9005 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009006
9007 if(!pSession)
9008 {
9009 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9010 return;
9011 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009012
9013 pSession->ibss_join_pending = FALSE;
9014 // JEZ100225: As of main/latest "tip", we are no longer doing this. Check on this.
9015 //csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
9016 // Send an IBSS stop request to PE
9017 csrRoamDisconnectInternal(pMac, sessionId, reason);
Jeff Johnson295189b2012-06-20 16:38:30 -07009018}
Jeff Johnson295189b2012-06-20 16:38:30 -07009019eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9020{
9021 eHalStatus status;
9022 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009023
9024 if(!pSession)
9025 {
9026 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9027 return eHAL_STATUS_FAILURE;
9028 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009029
9030 smsLog(pMac, LOG1, " csrRoamStartIbssJoinTimer \n ");
9031 pSession->ibssJoinTimerInfo.sessionId = (tANI_U8)sessionId;
9032 status = palTimerStart(pMac->hHdd, pSession->hTimerIbssJoining, interval, eANI_BOOLEAN_FALSE);
9033
9034 return (status);
9035}
Jeff Johnson295189b2012-06-20 16:38:30 -07009036eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9037{
9038 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerIbssJoining));
9039}
Jeff Johnson295189b2012-06-20 16:38:30 -07009040void csrRoamCompletion(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo, tSmeCmd *pCommand,
9041 eCsrRoamResult roamResult, tANI_BOOLEAN fSuccess)
9042{
9043 eRoamCmdStatus roamStatus = csrGetRoamCompleteStatus(pMac, sessionId);
9044 tANI_U32 roamId = 0;
9045
9046 if(pCommand)
9047 {
9048 roamId = pCommand->u.roamCmd.roamId;
9049#if defined(VOSS_ENABLED)
9050 VOS_ASSERT( sessionId == pCommand->sessionId );
9051#endif
9052 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009053 if(eCSR_ROAM_ROAMING_COMPLETION == roamStatus)
9054 {
9055 //if success, force roaming completion
9056 csrRoamCompleteRoaming(pMac, sessionId, fSuccess, roamResult);
9057 }
9058 else
9059 {
9060 VOS_ASSERT((CSR_GET_SESSION( pMac, sessionId ))->bRefAssocStartCnt == 0);
9061 smsLog(pMac, LOGW, FL(" indicates association completion. roamResult = %d\n"), roamResult);
9062 csrRoamCallCallback(pMac, sessionId, pRoamInfo, roamId, roamStatus, roamResult);
9063 }
9064}
9065
Jeff Johnson295189b2012-06-20 16:38:30 -07009066eHalStatus csrRoamLostLink( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 type, tSirSmeRsp *pSirMsg)
9067{
9068 eHalStatus status = eHAL_STATUS_SUCCESS;
9069 tSirSmeDeauthInd *pDeauthIndMsg = NULL;
9070 tSirSmeDisassocInd *pDisassocIndMsg = NULL;
9071 eCsrRoamResult result = eCSR_ROAM_RESULT_LOSTLINK;
9072 tCsrRoamInfo *pRoamInfo = NULL;
9073 tCsrRoamInfo roamInfo;
9074 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
9075 //Only need to roam for infra station. In this case P2P client will roam as well
9076 tANI_BOOLEAN fToRoam = CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile);
Jeff Johnson295189b2012-06-20 16:38:30 -07009077 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
9078 if ( eWNI_SME_DISASSOC_IND == type )
9079 {
9080 result = eCSR_ROAM_RESULT_DISASSOC_IND;
9081 pDisassocIndMsg = (tSirSmeDisassocInd *)pSirMsg;
9082 pSession->roamingStatusCode = pDisassocIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009083 pSession->joinFailStatusCode.reasonCode = pDisassocIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009084 }
9085 else if ( eWNI_SME_DEAUTH_IND == type )
9086 {
9087 result = eCSR_ROAM_RESULT_DEAUTH_IND;
9088 pDeauthIndMsg = (tSirSmeDeauthInd *)pSirMsg;
9089 pSession->roamingStatusCode = pDeauthIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009090 pSession->joinFailStatusCode.reasonCode = pDeauthIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009091 }
9092 else
9093 {
9094 smsLog(pMac, LOGW, FL("gets an unknown type (%d)\n"), type);
9095 result = eCSR_ROAM_RESULT_NONE;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009096 pSession->joinFailStatusCode.reasonCode = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07009097 }
9098
9099 // call profile lost link routine here
9100#ifdef WLAN_SOFTAP_FEATURE
9101 if(!CSR_IS_INFRA_AP(&pSession->connectedProfile))
9102#endif
9103 {
9104 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_LOSTLINK_DETECTED, result);
9105 }
9106
9107 if ( eWNI_SME_DISASSOC_IND == type )
9108 {
9109 status = csrSendMBDisassocCnfMsg(pMac, pDisassocIndMsg);
9110 }
9111 else if ( eWNI_SME_DEAUTH_IND == type )
9112 {
9113 status = csrSendMBDeauthCnfMsg(pMac, pDeauthIndMsg);
9114 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009115 if(!HAL_STATUS_SUCCESS(status))
9116 {
9117 //If fail to send confirmation to PE, not to trigger roaming
9118 fToRoam = eANI_BOOLEAN_FALSE;
9119 }
9120
9121 //tell HDD to disconnect
9122 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9123 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9124 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9125#ifdef WLAN_SOFTAP_FEATURE
9126 if( eWNI_SME_DISASSOC_IND == type)
9127 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009128 //staMacAddr
9129 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9130 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009132 else if( eWNI_SME_DEAUTH_IND == type )
9133 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009134 //staMacAddr
9135 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9136 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9137 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009138#endif
9139 smsLog(pMac, LOGW, FL("roamInfo.staId (%d)\n"), roamInfo.staId);
9140 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9141 if(fToRoam)
9142 {
9143 //Only remove the connected BSS in infrastructure mode
9144 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9145 //Not to do anying for lostlink with WDS
9146 if( pMac->roam.configParam.nRoamingTime )
9147 {
9148 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac, sessionId,
9149 ( eWNI_SME_DEAUTH_IND == type ) ?
9150 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc)))
9151 {
9152 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9153 //For IBSS, we need to give some more info to HDD
9154 if(csrIsBssTypeIBSS(pSession->connectedProfile.BSSType))
9155 {
9156 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
9157 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9158 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9159 }
9160 else
9161 {
9162 roamInfo.reasonCode = eCsrRoamReasonSmeIssuedForLostLink;
9163 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009164 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07009165 pSession->roamingReason = ( eWNI_SME_DEAUTH_IND == type ) ?
9166 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc;
9167 pSession->roamingStartTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
9168 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_LOSTLINK);
9169 }
9170 else
9171 {
9172 smsLog(pMac, LOGW, " %s Fail to start roaming, status = %d", __FUNCTION__, status);
9173 fToRoam = eANI_BOOLEAN_FALSE;
9174 }
9175 }
9176 else
9177 {
9178 //We are told not to roam, indicate lostlink
9179 fToRoam = eANI_BOOLEAN_FALSE;
9180 }
9181 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009182 if(!fToRoam)
9183 {
9184 if( eWNI_SME_DISASSOC_IND == type)
9185 {
9186 //staMacAddr
9187 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9188 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9189 }
9190 else if( eWNI_SME_DEAUTH_IND == type )
9191 {
9192 //staMacAddr
9193 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9194 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9195 }
9196 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9197
9198 /*No need to start idle scan in case of IBSS/SAP
9199 Still enable idle scan for polling in case concurrent sessions are running */
9200 if(CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile))
9201 {
9202 csrScanStartIdleScan(pMac);
9203 }
9204 }
9205
9206 return (status);
9207}
9208
Jeff Johnson295189b2012-06-20 16:38:30 -07009209eHalStatus csrRoamLostLinkAfterhandoffFailure( tpAniSirGlobal pMac,tANI_U32 sessionId)
9210{
9211 eHalStatus status = eHAL_STATUS_SUCCESS;
9212 tListElem *pEntry = NULL;
9213 tSmeCmd *pCommand = NULL;
9214 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009215
9216 if(!pSession)
9217 {
9218 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9219 return eHAL_STATUS_FAILURE;
9220 }
9221
Jeff Johnson295189b2012-06-20 16:38:30 -07009222 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07009223 //Only remove the connected BSS in infrastructure mode
9224 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9225 if(pMac->roam.configParam.nRoamingTime)
9226 {
9227 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac,sessionId, pSession->roamingReason)))
9228 {
9229 //before starting the lost link logic release the roam command for handoff
9230 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
9231 if(pEntry)
9232 {
9233 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
9234 }
9235 if(pCommand)
9236 {
9237 if (( eSmeCommandRoam == pCommand->command ) &&
9238 ( eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason))
9239 {
9240 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9241 {
9242 csrReleaseCommandRoam( pMac, pCommand );
9243 }
9244 }
9245 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009246 smsLog( pMac, LOGW, "Lost link roaming started ...\n");
9247 }
9248 }
9249 else
9250 {
9251 //We are told not to roam, indicate lostlink
9252 status = eHAL_STATUS_FAILURE;
9253 }
9254
9255 return (status);
9256}
Jeff Johnson295189b2012-06-20 16:38:30 -07009257void csrRoamWmStatusChangeComplete( tpAniSirGlobal pMac )
9258{
9259 tListElem *pEntry;
9260 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07009261 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
9262 if ( pEntry )
9263 {
9264 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
9265 if ( eSmeCommandWmStatusChange == pCommand->command )
9266 {
9267 // Nothing to process in a Lost Link completion.... It just kicks off a
9268 // roaming sequence.
9269 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9270 {
9271 csrReleaseCommandWmStatusChange( pMac, pCommand );
9272 }
9273 else
9274 {
9275 smsLog( pMac, LOGE, " ******csrRoamWmStatusChangeComplete fail to release command\n");
9276 }
9277
9278 }
9279 else
9280 {
9281 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but LOST LINK command is not ACTIVE ...\n" );
9282 }
9283 }
9284 else
9285 {
9286 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but NO commands are ACTIVE ...\n" );
9287 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009288 smeProcessPendingQueue( pMac );
9289}
9290
Jeff Johnson295189b2012-06-20 16:38:30 -07009291void csrRoamProcessWmStatusChangeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
9292{
9293 eHalStatus status = eHAL_STATUS_FAILURE;
9294 tSirSmeRsp *pSirSmeMsg;
9295 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pCommand->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009296
9297 if(!pSession)
9298 {
9299 smsLog(pMac, LOGE, FL(" session %d not found "), pCommand->sessionId);
9300 return;
9301 }
9302
Jeff Johnson295189b2012-06-20 16:38:30 -07009303 switch ( pCommand->u.wmStatusChangeCmd.Type )
9304 {
9305 case eCsrDisassociated:
9306 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg;
9307 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DISASSOC_IND, pSirSmeMsg);
9308 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009309 case eCsrDeauthenticated:
9310 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg;
9311 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DEAUTH_IND, pSirSmeMsg);
9312 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009313 default:
9314 smsLog(pMac, LOGW, FL("gets an unknown command %d\n"), pCommand->u.wmStatusChangeCmd.Type);
9315 break;
9316 }
9317 //For WDS, we want to stop BSS as well when it is indicated that it is disconnected.
9318 if( CSR_IS_CONN_WDS(&pSession->connectedProfile) )
9319 {
9320 if( !HAL_STATUS_SUCCESS(csrRoamIssueStopBssCmd( pMac, pCommand->sessionId, eANI_BOOLEAN_TRUE )) )
9321 {
9322 //This is not good
9323 smsLog(pMac, LOGE, FL(" failed to issue stopBSS command\n"));
9324 }
9325 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009326 // Lost Link just triggers a roaming sequence. We can complte the Lost Link
9327 // command here since there is nothing else to do.
9328 csrRoamWmStatusChangeComplete( pMac );
9329}
9330
Jeff Johnson295189b2012-06-20 16:38:30 -07009331//This function returns band and mode information.
9332//The only tricky part is that if phyMode is set to 11abg, this function may return eCSR_CFG_DOT11_MODE_11B
9333//instead of eCSR_CFG_DOT11_MODE_11G if everything is set to auto-pick.
9334#ifdef WLAN_SOFTAP_FEATURE
9335static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9336 tANI_U8 operationChn, eCsrBand *pBand )
9337#else
9338static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn,
9339 tANI_U8 operationChn, eCsrBand *pBand )
9340#endif
9341{
Jeff Johnson295189b2012-06-20 16:38:30 -07009342#ifdef WLAN_SOFTAP_FEATURE
9343 eCsrPhyMode phyModeIn = (eCsrPhyMode)pProfile->phyMode;
9344 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pProfile, phyModeIn,
9345 pMac->roam.configParam.ProprietaryRatesEnabled);
9346#else
9347 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(phyModeIn,
9348 pMac->roam.configParam.ProprietaryRatesEnabled);
9349#endif
9350 eCsrBand eBand;
9351
9352 //If the global setting for dot11Mode is set to auto/abg, we overwrite the setting in the profile.
9353#ifdef WLAN_SOFTAP_FEATURE
9354 if( ((!CSR_IS_INFRA_AP(pProfile )&& !CSR_IS_WDS(pProfile )) &&
9355 ((eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9356 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode))) ||
9357 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
9358#else
9359 if( (eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9360 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode) ||
9361 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
Jeff Johnson295189b2012-06-20 16:38:30 -07009362#endif
9363 {
9364 switch( pMac->roam.configParam.uCfgDot11Mode )
9365 {
9366 case eCSR_CFG_DOT11_MODE_11A:
9367 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9368 eBand = eCSR_BAND_5G;
9369 break;
9370 case eCSR_CFG_DOT11_MODE_11B:
9371 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9372 eBand = eCSR_BAND_24;
9373 break;
9374 case eCSR_CFG_DOT11_MODE_11G:
9375 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9376 eBand = eCSR_BAND_24;
9377 break;
9378 case eCSR_CFG_DOT11_MODE_11N:
9379 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
9380 eBand = eCSR_BAND_24;
9381 break;
9382 //case eCSR_CFG_DOT11_MODE_BEST:
9383 // cfgDot11Mode = eCSR_CFG_DOT11_MODE_BEST;
9384 // eBand = eCSR_BAND_24;
9385 // break;
9386 default:
9387 // Global dot11 Mode setting is 11a/b/g.
9388 // use the channel number to determine the Mode setting.
9389 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9390 {
9391 eBand = pMac->roam.configParam.eBand;
9392 if(eCSR_BAND_24 == eBand)
9393 {
9394 //See reason in else if ( CSR_IS_CHANNEL_24GHZ(operationChn) ) to pick 11B
9395 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9396 }
9397 else
9398 {
9399 //prefer 5GHz
9400 eBand = eCSR_BAND_5G;
9401 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9402 }
9403 }
9404 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9405 {
9406 // channel is a 2.4GHz channel. Set mode to 11g.
9407 //
9408 // !!LAC - WiFi tests require IBSS networks to start in 11b mode without any change to the
9409 // default parameter settings on the adapter. We use ACU to start an IBSS through creation
9410 // of a startIBSS profile. this startIBSS profile has Auto MACProtocol and the
9411 // adapter property setting for dot11Mode is also AUTO. So in this case, let's start
9412 // the IBSS network in 11b mode instead of 11g mode.
9413 //
9414 // so this is for Auto=profile->MacProtocol && Auto=Global.dot11Mode && profile->channel is < 14,
9415 // then start the IBSS in b mode.
9416 //
9417 // Note: we used to have this start as an 11g IBSS for best performance... now to specify that
9418 // the user will have to set the do11Mode in the property page to 11g to force it.
9419 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9420 eBand = eCSR_BAND_24;
9421 }
9422 else
9423 {
9424 // else, it's a 5.0GHz channel. Set mode to 11a.
9425 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9426 eBand = eCSR_BAND_5G;
9427 }
9428 break;
9429 }//switch
9430 }//if( eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
9431 else
9432 {
9433 //dot11 mode is set, lets pick the band
9434 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9435 {
9436 // channel is Auto also.
9437 eBand = pMac->roam.configParam.eBand;
9438 if(eCSR_BAND_ALL == eBand)
9439 {
9440 //prefer 5GHz
9441 eBand = eCSR_BAND_5G;
9442 }
9443 }
9444 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9445 {
9446 eBand = eCSR_BAND_24;
9447 }
9448 else
9449 {
9450 eBand = eCSR_BAND_5G;
9451 }
9452 }
9453 if(pBand)
9454 {
9455 *pBand = eBand;
9456 }
9457
9458 if (operationChn == 14){
9459 smsLog(pMac, LOGE, FL(" Switching to Dot11B mode \n"));
9460 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9461 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009462 return( cfgDot11Mode );
9463}
9464
Jeff Johnson295189b2012-06-20 16:38:30 -07009465eHalStatus csrRoamIssueStopBss( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
9466{
9467 eHalStatus status;
9468 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009469
9470 if(!pSession)
9471 {
9472 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9473 return eHAL_STATUS_FAILURE;
9474 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009475
9476#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
9477 {
9478 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07009479 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
9480 if(pIbssLog)
9481 {
9482 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_REQ;
9483 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
9484 }
9485 }
9486#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07009487 pSession->ibss_join_pending = FALSE;
9488 csrRoamStopIbssJoinTimer(pMac, sessionId );
9489 // Set the roaming substate to 'stop Bss request'...
9490 csrRoamSubstateChange( pMac, NewSubstate, sessionId );
9491
9492 // attempt to stop the Bss (reason code is ignored...)
9493 status = csrSendMBStopBssReqMsg( pMac, sessionId );
9494
9495 return (status);
9496}
9497
Jeff Johnson295189b2012-06-20 16:38:30 -07009498//pNumChan is a caller allocated space with the sizeof pChannels
9499eHalStatus csrGetCfgValidChannels(tpAniSirGlobal pMac, tANI_U8 *pChannels, tANI_U32 *pNumChan)
9500{
9501
9502 return (ccmCfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
9503 (tANI_U8 *)pChannels,
9504 pNumChan));
9505}
9506
Jeff Johnson295189b2012-06-20 16:38:30 -07009507tANI_BOOLEAN csrRoamIsChannelValid( tpAniSirGlobal pMac, tANI_U8 channel )
9508{
9509 tANI_BOOLEAN fValid = FALSE;
9510 tANI_U32 idxValidChannels;
9511 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9512
9513 if (HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, pMac->roam.validChannelList, &len)))
9514 {
9515 for ( idxValidChannels = 0; ( idxValidChannels < len ); idxValidChannels++ )
9516 {
9517 if ( channel == pMac->roam.validChannelList[ idxValidChannels ] )
9518 {
9519 fValid = TRUE;
9520 break;
9521 }
9522 }
9523 }
9524 pMac->roam.numValidChannels = len;
9525 return fValid;
9526}
9527
Jeff Johnson295189b2012-06-20 16:38:30 -07009528tANI_BOOLEAN csrRoamIsValid40MhzChannel(tpAniSirGlobal pMac, tANI_U8 channel)
9529{
9530 tANI_BOOLEAN fValid = eANI_BOOLEAN_FALSE;
9531 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009532 for(i = 0; i < pMac->scan.base40MHzChannels.numChannels; i++)
9533 {
9534 if(channel == pMac->scan.base40MHzChannels.channelList[i])
9535 {
9536 fValid = eANI_BOOLEAN_TRUE;
9537 break;
9538 }
9539 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009540 return (fValid);
9541}
9542
Jeff Johnson295189b2012-06-20 16:38:30 -07009543//This function check and validate whether the NIC can do CB (40MHz)
Jeff Johnsone7245742012-09-05 17:12:55 -07009544 static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -07009545{
Jeff Johnsone7245742012-09-05 17:12:55 -07009546 ePhyChanBondState eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009547 tANI_U8 centerChn;
9548 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009549 if(CSR_IS_CHANNEL_24GHZ(primaryChn))
9550 {
9551 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
9552 }
9553 else
9554 {
9555 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
9556 }
9557 //Figure what the other side's CB mode
9558 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
9559 {
9560 if(pIes->HTCaps.present && (eHT_CHANNEL_WIDTH_40MHZ == pIes->HTCaps.supportedChannelWidthSet))
9561 {
9562 if(pIes->HTInfo.present)
9563 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009564 /* This is called during INFRA STA/CLIENT and should use the merged value of
9565 * supported channel width and recommended tx width as per standard
9566 */
9567 smsLog(pMac, LOG1, "scws %u rtws %u sco %u\n",
9568 pIes->HTCaps.supportedChannelWidthSet,
9569 pIes->HTInfo.recommendedTxWidthSet,
9570 pIes->HTInfo.secondaryChannelOffset);
9571
9572 if (pIes->HTInfo.recommendedTxWidthSet == eHT_CHANNEL_WIDTH_40MHZ)
9573 eRet = (ePhyChanBondState)pIes->HTInfo.secondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07009574 else
Jeff Johnsone7245742012-09-05 17:12:55 -07009575 eRet = PHY_SINGLE_CHANNEL_CENTERED;
9576 switch (eRet) {
9577 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
9578 centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
9579 break;
9580 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
9581 centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
9582 break;
9583 case PHY_SINGLE_CHANNEL_CENTERED:
9584 default:
9585 centerChn = primaryChn;
9586 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009587 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009588 if((PHY_SINGLE_CHANNEL_CENTERED != eRet) && !csrRoamIsValid40MhzChannel(pMac, centerChn))
Jeff Johnson295189b2012-06-20 16:38:30 -07009589 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009590 smsLog(pMac, LOGE, " Invalid center channel (%d), disable 40MHz mode\n", centerChn);
9591 //eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009592 }
9593 }
9594 }
9595 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009596 return eRet;
9597}
Jeff Johnson295189b2012-06-20 16:38:30 -07009598tANI_BOOLEAN csrIsEncryptionInList( tpAniSirGlobal pMac, tCsrEncryptionList *pCipherList, eCsrEncryptionType encryptionType )
9599{
9600 tANI_BOOLEAN fFound = FALSE;
9601 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009602 for( idx = 0; idx < pCipherList->numEntries; idx++ )
9603 {
9604 if( pCipherList->encryptionType[idx] == encryptionType )
9605 {
9606 fFound = TRUE;
9607 break;
9608 }
9609 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009610 return fFound;
9611}
Jeff Johnson295189b2012-06-20 16:38:30 -07009612tANI_BOOLEAN csrIsAuthInList( tpAniSirGlobal pMac, tCsrAuthList *pAuthList, eCsrAuthType authType )
9613{
9614 tANI_BOOLEAN fFound = FALSE;
9615 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009616 for( idx = 0; idx < pAuthList->numEntries; idx++ )
9617 {
9618 if( pAuthList->authType[idx] == authType )
9619 {
9620 fFound = TRUE;
9621 break;
9622 }
9623 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009624 return fFound;
9625}
Jeff Johnson295189b2012-06-20 16:38:30 -07009626tANI_BOOLEAN csrIsSameProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile1, tCsrRoamProfile *pProfile2)
9627{
9628 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9629 tCsrScanResultFilter *pScanFilter = NULL;
9630 eHalStatus status = eHAL_STATUS_SUCCESS;
9631
9632 if(pProfile1 && pProfile2)
9633 {
9634 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
9635 if(HAL_STATUS_SUCCESS(status))
9636 {
9637 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
9638 status = csrRoamPrepareFilterFromProfile(pMac, pProfile2, pScanFilter);
9639 if(HAL_STATUS_SUCCESS(status))
9640 {
9641 fCheck = eANI_BOOLEAN_FALSE;
9642 do
9643 {
9644 tANI_U32 i;
9645 for(i = 0; i < pScanFilter->SSIDs.numOfSSIDs; i++)
9646 {
9647 fCheck = csrIsSsidMatch( pMac, pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
9648 pScanFilter->SSIDs.SSIDList[i].SSID.length,
9649 pProfile1->SSID.ssId, pProfile1->SSID.length, eANI_BOOLEAN_FALSE );
9650 if ( fCheck ) break;
9651 }
9652 if(!fCheck)
9653 {
9654 break;
9655 }
9656 if( !csrIsAuthInList( pMac, &pProfile2->AuthType, pProfile1->AuthType)
9657 || pProfile2->BSSType != pProfile1->BSSType
9658 || !csrIsEncryptionInList( pMac, &pProfile2->EncryptionType, pProfile1->EncryptionType )
9659 )
9660 {
9661 fCheck = eANI_BOOLEAN_FALSE;
9662 break;
9663 }
9664#ifdef WLAN_FEATURE_VOWIFI_11R
9665 if (pProfile1->MDID.mdiePresent || pProfile2->MDID.mdiePresent)
9666 {
9667 if (pProfile1->MDID.mobilityDomain != pProfile2->MDID.mobilityDomain)
9668 {
9669 fCheck = eANI_BOOLEAN_FALSE;
9670 break;
9671 }
9672 }
9673#endif
9674 //Match found
9675 fCheck = eANI_BOOLEAN_TRUE;
9676 }while(0);
9677 csrFreeScanFilter(pMac, pScanFilter);
9678 }
9679 palFreeMemory(pMac->hHdd, pScanFilter);
9680 }
9681 }
9682
9683 return (fCheck);
9684}
9685
Jeff Johnson295189b2012-06-20 16:38:30 -07009686tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2)
9687{
9688 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9689 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009690 do
9691 {
9692 //Only check for static WEP
9693 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP40_STATICKEY) &&
9694 !csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP104_STATICKEY))
9695 {
9696 fCheck = eANI_BOOLEAN_TRUE;
9697 break;
9698 }
9699 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, pConnProfile->EncryptionType)) break;
9700 if(pConnProfile->Keys.defaultIndex != pProfile2->Keys.defaultIndex) break;
9701 for(i = 0; i < CSR_MAX_NUM_KEY; i++)
9702 {
9703 if(pConnProfile->Keys.KeyLength[i] != pProfile2->Keys.KeyLength[i]) break;
9704 if(!palEqualMemory(pMac->hHdd, &pConnProfile->Keys.KeyMaterial[i],
9705 &pProfile2->Keys.KeyMaterial[i], pProfile2->Keys.KeyLength[i]))
9706 {
9707 break;
9708 }
9709 }
9710 if( i == CSR_MAX_NUM_KEY)
9711 {
9712 fCheck = eANI_BOOLEAN_TRUE;
9713 }
9714 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009715 return (fCheck);
9716}
9717
Jeff Johnson295189b2012-06-20 16:38:30 -07009718//IBSS
9719
Jeff Johnson295189b2012-06-20 16:38:30 -07009720tANI_U8 csrRoamGetIbssStartChannelNumber50( tpAniSirGlobal pMac )
9721{
9722 tANI_U8 channel = 0;
9723 tANI_U32 idx;
9724 tANI_U32 idxValidChannels;
9725 tANI_BOOLEAN fFound = FALSE;
9726 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9727
9728 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel5G)
9729 {
9730 channel = pMac->roam.configParam.AdHocChannel5G;
9731 if(!csrRoamIsChannelValid(pMac, channel))
9732 {
9733 channel = 0;
9734 }
9735 }
9736 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9737 {
9738 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_50 ) && !fFound; idx++ )
9739 {
9740 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9741 {
9742 if ( csrStartIbssChannels50[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9743 {
9744 fFound = TRUE;
9745 channel = csrStartIbssChannels50[ idx ];
9746 }
9747 }
9748 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009749 // this is rare, but if it does happen, we find anyone in 11a bandwidth and return the first 11a channel found!
9750 if (!fFound)
9751 {
9752 for ( idxValidChannels = 0; idxValidChannels < len ; idxValidChannels++ )
9753 {
9754 if ( CSR_IS_CHANNEL_5GHZ(pMac->roam.validChannelList[ idx ]) ) // the max channel# in 11g is 14
9755 {
9756 channel = csrStartIbssChannels50[ idx ];
9757 break;
9758 }
9759 }
9760 }
9761 }//if
9762
9763 return( channel );
9764}
9765
Jeff Johnson295189b2012-06-20 16:38:30 -07009766tANI_U8 csrRoamGetIbssStartChannelNumber24( tpAniSirGlobal pMac )
9767{
9768 tANI_U8 channel = 1;
9769 tANI_U32 idx;
9770 tANI_U32 idxValidChannels;
9771 tANI_BOOLEAN fFound = FALSE;
9772 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9773
9774 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel24)
9775 {
9776 channel = pMac->roam.configParam.AdHocChannel24;
9777 if(!csrRoamIsChannelValid(pMac, channel))
9778 {
9779 channel = 0;
9780 }
9781 }
9782
9783 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9784 {
9785 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_24 ) && !fFound; idx++ )
9786 {
9787 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9788 {
9789 if ( csrStartIbssChannels24[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9790 {
9791 fFound = TRUE;
9792 channel = csrStartIbssChannels24[ idx ];
9793 }
9794 }
9795 }
9796 }
9797
9798 return( channel );
9799}
9800
Jeff Johnson295189b2012-06-20 16:38:30 -07009801static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9802 tCsrRoamStartBssParams *pParam )
9803{
9804 eCsrCfgDot11Mode cfgDot11Mode;
9805 eCsrBand eBand;
9806 tANI_U8 channel = 0;
9807 tSirNwType nwType;
9808 tANI_U8 operationChannel = 0;
9809
9810 if(pProfile->ChannelInfo.numOfChannels && pProfile->ChannelInfo.ChannelList)
9811 {
9812 operationChannel = pProfile->ChannelInfo.ChannelList[0];
9813 }
9814
9815#ifdef WLAN_SOFTAP_FEATURE
9816 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
9817#else
9818 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
9819#endif
9820
9821#ifdef WLAN_FEATURE_P2P
9822 if( ( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
9823 (pProfile->csrPersona == VOS_P2P_GO_MODE) )
9824 && ( cfgDot11Mode == eCSR_CFG_DOT11_MODE_11B)
9825 )
9826 {
9827 /* This should never happen */
9828 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL,
9829 FL("For P2PClient/P2P-GO (persona %d) cfgDot11Mode is 11B\n"),
9830 pProfile->csrPersona);
9831 VOS_ASSERT(0);
9832 }
9833#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009834 switch( cfgDot11Mode )
9835 {
9836 case eCSR_CFG_DOT11_MODE_11G:
9837 nwType = eSIR_11G_NW_TYPE;
9838 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009839 case eCSR_CFG_DOT11_MODE_11B:
9840 nwType = eSIR_11B_NW_TYPE;
9841 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009842 case eCSR_CFG_DOT11_MODE_11A:
9843 nwType = eSIR_11A_NW_TYPE;
9844 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009845 default:
9846 case eCSR_CFG_DOT11_MODE_11N:
9847 case eCSR_CFG_DOT11_MODE_TAURUS:
9848 //Because LIM only verifies it against 11a, 11b or 11g, set only 11g or 11a here
9849 if(eCSR_BAND_24 == eBand)
9850 {
9851 nwType = eSIR_11G_NW_TYPE;
9852 }
9853 else
9854 {
9855 nwType = eSIR_11A_NW_TYPE;
9856 }
9857 break;
9858 }
9859
9860 pParam->extendedRateSet.numRates = 0;
9861
9862 switch ( nwType )
9863 {
9864 default:
9865 smsLog(pMac, LOGE, FL("sees an unknown pSirNwType (%d)\n"), nwType);
9866 case eSIR_11A_NW_TYPE:
9867
9868 pParam->operationalRateSet.numRates = 8;
9869
9870 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
9871 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
9872 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
9873 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
9874 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
9875 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
9876 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
9877 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
9878
9879 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
9880 {
9881 channel = csrRoamGetIbssStartChannelNumber50( pMac );
9882 if( 0 == channel &&
9883 CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) &&
9884 CSR_IS_PHY_MODE_DUAL_BAND(pMac->roam.configParam.phyMode)
9885 )
9886 {
9887 //We could not find a 5G channel by auto pick, let's try 2.4G channels
9888 //We only do this here because csrRoamGetPhyModeBandForBss always picks 11a for AUTO
9889 nwType = eSIR_11B_NW_TYPE;
9890 channel = csrRoamGetIbssStartChannelNumber24( pMac );
9891 pParam->operationalRateSet.numRates = 4;
9892 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
9893 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
9894 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
9895 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
9896 }
9897 }
9898 else
9899 {
9900 channel = operationChannel;
9901 }
9902 break;
9903
9904 case eSIR_11B_NW_TYPE:
9905 pParam->operationalRateSet.numRates = 4;
9906 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
9907 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
9908 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
9909 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -07009910 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
9911 {
9912 channel = csrRoamGetIbssStartChannelNumber24( pMac );
9913 }
9914 else
9915 {
9916 channel = operationChannel;
9917 }
9918
9919 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009920 case eSIR_11G_NW_TYPE:
9921#ifdef WLAN_FEATURE_P2P
9922 /* For P2P Client and P2P GO, disable 11b rates */
9923 if( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
9924 (pProfile->csrPersona == VOS_P2P_GO_MODE)
9925 )
9926 {
9927 pParam->operationalRateSet.numRates = 8;
9928
9929 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
9930 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
9931 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
9932 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
9933 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
9934 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
9935 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
9936 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
9937 }
9938 else
9939#endif
9940 {
9941 pParam->operationalRateSet.numRates = 4;
Jeff Johnson295189b2012-06-20 16:38:30 -07009942 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
9943 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
9944 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
9945 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
9946
9947 pParam->extendedRateSet.numRates = 8;
Jeff Johnson295189b2012-06-20 16:38:30 -07009948 pParam->extendedRateSet.rate[0] = SIR_MAC_RATE_6;
9949 pParam->extendedRateSet.rate[1] = SIR_MAC_RATE_9;
9950 pParam->extendedRateSet.rate[2] = SIR_MAC_RATE_12;
9951 pParam->extendedRateSet.rate[3] = SIR_MAC_RATE_18;
9952 pParam->extendedRateSet.rate[4] = SIR_MAC_RATE_24;
9953 pParam->extendedRateSet.rate[5] = SIR_MAC_RATE_36;
9954 pParam->extendedRateSet.rate[6] = SIR_MAC_RATE_48;
9955 pParam->extendedRateSet.rate[7] = SIR_MAC_RATE_54;
9956 }
9957
9958 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
9959 {
9960 channel = csrRoamGetIbssStartChannelNumber24( pMac );
9961 }
9962 else
9963 {
9964 channel = operationChannel;
9965 }
9966
9967 break;
9968 }
9969 pParam->operationChn = channel;
9970 pParam->sirNwType = nwType;
9971}
9972
Jeff Johnson295189b2012-06-20 16:38:30 -07009973static void csrRoamGetBssStartParmsFromBssDesc( tpAniSirGlobal pMac, tSirBssDescription *pBssDesc,
9974 tDot11fBeaconIEs *pIes, tCsrRoamStartBssParams *pParam )
9975{
9976
9977 if( pParam )
9978 {
9979 pParam->sirNwType = pBssDesc->nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -07009980 pParam->cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009981 pParam->operationChn = pBssDesc->channelId;
9982 palCopyMemory( pMac->hHdd, &pParam->bssid, pBssDesc->bssId, sizeof(tCsrBssid) );
9983
9984 if( pIes )
9985 {
9986 if(pIes->SuppRates.present)
9987 {
9988 pParam->operationalRateSet.numRates = pIes->SuppRates.num_rates;
9989 if(pIes->SuppRates.num_rates > SIR_MAC_RATESET_EID_MAX)
9990 {
9991 smsLog(pMac, LOGE, FL("num_rates :%d is more than SIR_MAC_RATESET_EID_MAX, resetting to SIR_MAC_RATESET_EID_MAX\n"),
9992 pIes->SuppRates.num_rates);
9993 pIes->SuppRates.num_rates = SIR_MAC_RATESET_EID_MAX;
9994 }
9995 palCopyMemory(pMac->hHdd, pParam->operationalRateSet.rate, pIes->SuppRates.rates,
9996 sizeof(*pIes->SuppRates.rates) * pIes->SuppRates.num_rates);
9997 }
9998 if( pIes->SSID.present )
9999 {
10000 pParam->ssId.length = pIes->SSID.num_ssid;
10001 palCopyMemory(pMac->hHdd, pParam->ssId.ssId, pIes->SSID.ssid, pParam->ssId.length);
10002 }
10003 pParam->cbMode = csrGetCBModeFromIes(pMac, pParam->operationChn, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -070010004 }
10005 else
10006 {
10007 pParam->ssId.length = 0;
10008 pParam->operationalRateSet.numRates = 0;
10009 }
10010 }
10011}
10012
Jeff Johnson295189b2012-06-20 16:38:30 -070010013static void csrRoamDetermineMaxRateForAdHoc( tpAniSirGlobal pMac, tSirMacRateSet *pSirRateSet )
10014{
10015 tANI_U8 MaxRate = 0;
10016 tANI_U32 i;
10017 tANI_U8 *pRate;
10018
10019 pRate = pSirRateSet->rate;
10020 for ( i = 0; i < pSirRateSet->numRates; i++ )
10021 {
10022 MaxRate = CSR_MAX( MaxRate, ( pRate[ i ] & (~CSR_DOT11_BASIC_RATE_MASK) ) );
10023 }
10024
10025 // Save the max rate in the connected state information...
10026
10027 // modify LastRates variable as well
10028
10029 return;
10030}
10031
Jeff Johnson295189b2012-06-20 16:38:30 -070010032//this function finds a valid secondary channel for channel bonding with "channel".
10033//Param: channel -- primary channel, caller must validate it
10034// cbChoice -- CB directory
10035//Return: if 0, no secondary channel is found. Otherwise a valid secondary channel.
10036static tANI_U8 csrRoamGetSecondaryChannel(tpAniSirGlobal pMac, tANI_U8 channel, eCsrCBChoice cbChoice)
10037{
10038 tANI_U8 chnUp = 0, chnDown = 0, chnRet = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010039 switch (cbChoice)
10040 {
10041 case eCSR_CB_OFF:
10042 chnUp = 0;
10043 chnDown = 0;
10044 break;
10045 case eCSR_CB_DOWN:
10046 chnUp = 0;
10047 chnDown = channel - CSR_CB_CHANNEL_GAP;
10048 break;
10049 case eCSR_CB_UP:
10050 chnUp = channel + CSR_CB_CHANNEL_GAP;
10051 chnDown = 0;
10052 break;
10053 case eCSR_CB_AUTO:
10054 //consider every other value means auto
10055 default:
10056 chnUp = channel + CSR_CB_CHANNEL_GAP;
10057 chnDown = channel - CSR_CB_CHANNEL_GAP;
10058 break;
10059 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010060 //if CB_UP or auto, try channel up first
10061 if(chnUp && CSR_IS_SAME_BAND_CHANNELS(chnUp, channel) && csrRoamIsChannelValid(pMac, chnUp))
10062 {
10063 //found a valid up channel for channel bonding
10064 //check whether the center channel is valid
10065 if(csrRoamIsValid40MhzChannel(pMac, channel + CSR_CB_CENTER_CHANNEL_OFFSET))
10066 {
10067 chnRet = chnUp;
10068 }
10069 }
10070 if(chnRet == 0 && chnDown && CSR_IS_SAME_BAND_CHANNELS(chnDown, channel) && csrRoamIsChannelValid(pMac, chnDown))
10071 {
10072 //found a valid down channel for channel bonding
10073 if(csrRoamIsValid40MhzChannel(pMac, channel - CSR_CB_CENTER_CHANNEL_OFFSET))
10074 {
10075 chnRet = chnDown;
10076 }
10077 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010078 return chnRet;
10079}
10080
Jeff Johnson295189b2012-06-20 16:38:30 -070010081eHalStatus csrRoamIssueStartBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamStartBssParams *pParam,
10082 tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc, tANI_U32 roamId )
10083{
10084 eHalStatus status = eHAL_STATUS_SUCCESS;
10085 eCsrBand eBand;
Jeff Johnson295189b2012-06-20 16:38:30 -070010086 // Set the roaming substate to 'Start BSS attempt'...
10087 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_START_BSS_REQ, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070010088#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10089 //Need to figure out whether we need to log WDS???
10090 if( CSR_IS_IBSS( pProfile ) )
10091 {
10092 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -070010093 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
10094 if(pIbssLog)
10095 {
10096 if(pBssDesc)
10097 {
10098 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_REQ;
10099 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pBssDesc->bssId, 6);
10100 }
10101 else
10102 {
10103 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_REQ;
10104 }
10105 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pParam->ssId.ssId,
10106 pParam->ssId.length);
10107 if(pProfile->ChannelInfo.numOfChannels == 0)
10108 {
10109 pIbssLog->channelSetting = AUTO_PICK;
10110 }
10111 else
10112 {
10113 pIbssLog->channelSetting = SPECIFIED;
10114 }
10115 pIbssLog->operatingChannel = pParam->operationChn;
10116 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
10117 }
10118 }
10119#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
10120 //Put RSN information in for Starting BSS
10121 pParam->nRSNIELength = (tANI_U16)pProfile->nRSNReqIELength;
10122 pParam->pRSNIE = pProfile->pRSNReqIE;
10123
Jeff Johnson295189b2012-06-20 16:38:30 -070010124#ifdef WLAN_SOFTAP_FEATURE
10125 pParam->privacy = pProfile->privacy;
10126 pParam->fwdWPSPBCProbeReq = pProfile->fwdWPSPBCProbeReq;
10127 pParam->authType = pProfile->csr80211AuthType;
10128 pParam->beaconInterval = pProfile->beaconInterval;
10129 pParam->dtimPeriod = pProfile->dtimPeriod;
10130 pParam->ApUapsdEnable = pProfile->ApUapsdEnable;
10131 pParam->ssidHidden = pProfile->SSIDs.SSIDList[0].ssidHidden;
10132 if (CSR_IS_INFRA_AP(pProfile)&& (pParam->operationChn != 0))
10133 {
10134 if (csrIsValidChannel(pMac, pParam->operationChn) != eHAL_STATUS_SUCCESS)
10135 {
10136 pParam->operationChn = INFRA_AP_DEFAULT_CHANNEL;
10137 }
10138 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010139 pParam->protEnabled = pProfile->protEnabled;
10140 pParam->obssProtEnabled = pProfile->obssProtEnabled;
10141 pParam->ht_protection = pProfile->cfg_protection;
10142 pParam->wps_state = pProfile->wps_state;
10143#endif
10144
Jeff Johnson295189b2012-06-20 16:38:30 -070010145#ifdef WLAN_SOFTAP_FEATURE
10146 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, pParam->operationChn /* pProfile->operationChannel*/,
10147 &eBand);
10148#else
10149 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile->operationChannel,
10150 &eBand);
10151#endif
10152 pParam->bssPersona = pProfile->csrPersona;
10153 // When starting an IBSS, start on the channel from the Profile.
10154 status = csrSendMBStartBssReqMsg( pMac, sessionId, pProfile->BSSType, pParam, pBssDesc );
Jeff Johnson295189b2012-06-20 16:38:30 -070010155 return (status);
10156}
10157
Jeff Johnson295189b2012-06-20 16:38:30 -070010158static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
Jeff Johnsone7245742012-09-05 17:12:55 -070010159 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -070010160{
10161 tANI_U8 Channel, SecondChn;
Jeff Johnsone7245742012-09-05 17:12:55 -070010162 ePhyChanBondState cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010163 eCsrCBChoice cbChoice;
10164 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010165
10166 if(!pSession)
10167 {
10168 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10169 return;
10170 }
10171
Jeff Johnson295189b2012-06-20 16:38:30 -070010172 if( pBssDesc )
10173 {
10174 csrRoamGetBssStartParmsFromBssDesc( pMac, pBssDesc, pIes, &pSession->bssParams );
10175 //Since csrRoamGetBssStartParmsFromBssDesc fills in the bssid for pSession->bssParams
10176 //The following code has to be do after that.
10177 //For WDS station, use selfMac as the self BSSID
10178 if( CSR_IS_WDS_STA( pProfile ) )
10179 {
10180 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10181 }
10182 }
10183 else
10184 {
10185 csrRoamGetBssStartParms(pMac, pProfile, &pSession->bssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010186 //Use the first SSID
10187 if(pProfile->SSIDs.numOfSSIDs)
10188 {
10189 palCopyMemory(pMac->hHdd, &pSession->bssParams.ssId, pProfile->SSIDs.SSIDList, sizeof(tSirMacSSid));
10190 }
10191 //For WDS station, use selfMac as the self BSSID
10192 if( CSR_IS_WDS_STA( pProfile ) )
10193 {
10194 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10195 }
10196 //Use the first BSSID
10197 else if( pProfile->BSSIDs.numOfBSSIDs )
10198 {
10199 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid, sizeof(tCsrBssid));
10200 }
10201 else
10202 {
10203 palZeroMemory( pMac->hHdd, &pSession->bssParams.bssid, sizeof(tCsrBssid) );
10204 }
10205 }
10206 Channel = pSession->bssParams.operationChn;
Jeff Johnson295189b2012-06-20 16:38:30 -070010207 //Set operating channel in pProfile which will be used
10208 //in csrRoamSetBssConfigCfg() to determine channel bonding
10209 //mode and will be configured in CFG later
10210 pProfile->operationChannel = Channel;
10211
10212 if(Channel == 0)
10213 {
10214 smsLog(pMac, LOGW, " CSR cannot find a channel to start IBSS\n");
10215 }
10216 else
10217 {
10218
10219 csrRoamDetermineMaxRateForAdHoc( pMac, &pSession->bssParams.operationalRateSet );
Jeff Johnsone7245742012-09-05 17:12:55 -070010220 if (CSR_IS_INFRA_AP(pProfile))
10221 {
10222 if(CSR_IS_CHANNEL_24GHZ(Channel))
10223 {
10224 cbMode = pMac->roam.configParam.channelBondingMode24GHz;
10225 }
10226 else
10227 {
10228 cbMode = pMac->roam.configParam.channelBondingMode5GHz;
10229 }
10230 smsLog(pMac, LOG1, "##softap cbMode %d\n", cbMode);
10231 pBssConfig->cbMode = cbMode;
10232 pSession->bssParams.cbMode = cbMode;
10233 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010234
10235 if( CSR_IS_START_IBSS( pProfile ) )
10236 {
10237 //TBH: channel bonding is not supported for Libra
10238 if( pProfile->ChannelInfo.ChannelList && eCSR_OPERATING_CHANNEL_AUTO != pProfile->ChannelInfo.ChannelList[0] )
10239 {
10240 Channel = pProfile->ChannelInfo.ChannelList[0];
10241 cbChoice = pProfile->CBMode;
10242 }
10243 else {
10244 cbChoice = pMac->roam.configParam.cbChoice;
10245 }
10246 pSession->bssParams.operationChn = Channel;
10247 //make sure channel is valid
10248 if(!csrRoamIsChannelValid(pMac, Channel))
10249 {
10250 //set Channel to 0 to let lim know this is invalid
10251 //We still send this request down to lim even though we know the channel is wrong because
10252 //lim will response with error and hdd's eWNI_SME_START_BSS_RSP handler will roam other profile (if any)
10253 Channel = 0;
10254 pSession->bssParams.operationChn = 0;
10255 }
10256 else {
10257 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070010258 if(CSR_IS_CHANNEL_24GHZ(Channel))
10259 {
10260 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
10261 }
10262 else
10263 {
10264 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
10265 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010266 //now we have a valid channel
10267 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
10268 {
10269 //let's pick a secondard channel
10270 SecondChn = csrRoamGetSecondaryChannel(pMac, Channel, cbChoice);
Jeff Johnson295189b2012-06-20 16:38:30 -070010271 if(SecondChn > Channel)
10272 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010273 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010274 }
10275 else if(SecondChn && SecondChn < Channel)
10276 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010277 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010278 }
10279 else
10280 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010281 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010282 }
10283 pSession->bssParams.cbMode = cbMode;
10284 }
10285 else
10286 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010287 pSession->bssParams.cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010288 }
10289 }
10290 }
10291 }
10292}
10293
Jeff Johnson295189b2012-06-20 16:38:30 -070010294static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
10295 tANI_BOOLEAN *pfSameIbss )
10296{
10297 eHalStatus status = eHAL_STATUS_SUCCESS;
10298 tANI_BOOLEAN fSameIbss = FALSE;
10299
10300 if ( csrIsConnStateIbss( pMac, sessionId ) )
10301 {
10302 // Check if any profile parameter has changed ? If any profile parameter
10303 // has changed then stop old BSS and start a new one with new parameters
10304 if ( csrIsSameProfile( pMac, &pMac->roam.roamSession[sessionId].connectedProfile, pProfile ) )
10305 {
10306 fSameIbss = TRUE;
10307 }
10308 else
10309 {
10310 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10311 }
10312 }
10313 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10314 {
10315 // Disassociate from the connected Infrastructure network...
10316 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10317 }
10318 else
10319 {
10320 tBssConfigParam *pBssConfig;
10321
10322 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
10323 if(HAL_STATUS_SUCCESS(status))
10324 {
10325 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
10326 // there is no Bss description before we start an IBSS so we need to adopt
10327 // all Bss configuration parameters from the Profile.
10328 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, pBssConfig, NULL);
10329 if(HAL_STATUS_SUCCESS(status))
10330 {
10331 //save dotMode
10332 pMac->roam.roamSession[sessionId].bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
10333 //Prepare some more parameters for this IBSS
Jeff Johnsone7245742012-09-05 17:12:55 -070010334 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010335 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
10336 }
10337
10338 palFreeMemory(pMac->hHdd, pBssConfig);
10339 }//Allocate memory
10340 }
10341
10342 if(pfSameIbss)
10343 {
10344 *pfSameIbss = fSameIbss;
10345 }
10346 return( status );
10347}
10348
Jeff Johnson295189b2012-06-20 16:38:30 -070010349static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId,
10350 tSirSmeNewBssInfo *pNewBss )
10351{
10352 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010353
10354 if(!pSession)
10355 {
10356 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10357 return;
10358 }
10359
Jeff Johnson295189b2012-06-20 16:38:30 -070010360 if( pNewBss )
10361 {
10362 // Set the operating channel.
10363 pSession->connectedProfile.operationChannel = pNewBss->channelNumber;
10364 // move the BSSId from the BSS description into the connected state information.
10365 palCopyMemory( pMac->hHdd, &pSession->connectedProfile.bssid,
10366 &(pNewBss->bssId), sizeof( tCsrBssid ) );
10367 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010368 return;
10369}
10370
Jeff Johnson295189b2012-06-20 16:38:30 -070010371#ifdef FEATURE_WLAN_WAPI
10372eHalStatus csrRoamSetBKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tBkidCacheInfo *pBKIDCache,
10373 tANI_U32 numItems )
10374{
10375 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10376 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010377 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10378 {
10379 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10380 return status;
10381 }
10382 smsLog(pMac, LOGW, "csrRoamSetBKIDCache called, numItems = %d\n", numItems);
10383 pSession = CSR_GET_SESSION( pMac, sessionId );
10384 if(numItems <= CSR_MAX_BKID_ALLOWED)
10385 {
10386 status = eHAL_STATUS_SUCCESS;
10387 //numItems may be 0 to clear the cache
10388 pSession->NumBkidCache = (tANI_U16)numItems;
10389 if(numItems && pBKIDCache)
10390 {
10391 status = palCopyMemory( pMac->hHdd, pSession->BkidCacheInfo, pBKIDCache,
10392 sizeof(tBkidCacheInfo) * numItems );
10393 }
10394 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010395 return (status);
10396}
Jeff Johnson295189b2012-06-20 16:38:30 -070010397eHalStatus csrRoamGetBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum,
10398 tBkidCacheInfo *pBkidCache)
10399{
10400 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10401 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010402 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10403 {
10404 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10405 return status;
10406 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010407 pSession = CSR_GET_SESSION( pMac, sessionId );
10408 if(pNum && pBkidCache)
10409 {
10410 if(pSession->NumBkidCache == 0)
10411 {
10412 *pNum = 0;
10413 status = eHAL_STATUS_SUCCESS;
10414 }
10415 else if(*pNum >= pSession->NumBkidCache)
10416 {
10417 if(pSession->NumBkidCache > CSR_MAX_PMKID_ALLOWED)
10418 {
10419 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10420 pSession->NumBkidCache);
10421 pSession->NumBkidCache = CSR_MAX_PMKID_ALLOWED;
10422 }
10423 palCopyMemory( pMac->hHdd, pBkidCache, pSession->BkidCacheInfo,
10424 sizeof(tBkidCacheInfo) * pSession->NumBkidCache );
10425 *pNum = pSession->NumBkidCache;
10426 status = eHAL_STATUS_SUCCESS;
10427 }
10428 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010429 return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -070010430}
Jeff Johnson295189b2012-06-20 16:38:30 -070010431tANI_U32 csrRoamGetNumBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10432{
10433 return (pMac->roam.roamSession[sessionId].NumBkidCache);
Jeff Johnson295189b2012-06-20 16:38:30 -070010434}
10435#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010436eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
10437 tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems )
10438{
10439 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10440 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010441
10442 if(!pSession)
10443 {
10444 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10445 return eHAL_STATUS_FAILURE;
10446 }
10447
Jeff Johnson295189b2012-06-20 16:38:30 -070010448 smsLog(pMac, LOGW, "csrRoamSetPMKIDCache called, numItems = %d\n", numItems);
10449 if(numItems <= CSR_MAX_PMKID_ALLOWED)
10450 {
10451#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10452 {
10453 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
10454 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
10455 secEvent.eventId = WLAN_SECURITY_EVENT_PMKID_UPDATE;
10456 secEvent.encryptionModeMulticast =
10457 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
10458 secEvent.encryptionModeUnicast =
10459 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
10460 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
10461 secEvent.authMode =
10462 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
10463 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
10464 }
10465#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -070010466 status = eHAL_STATUS_SUCCESS;
10467 //numItems may be 0 to clear the cache
10468 pSession->NumPmkidCache = (tANI_U16)numItems;
10469 if(numItems && pPMKIDCache)
10470 {
10471 status = palCopyMemory( pMac->hHdd, pSession->PmkidCacheInfo, pPMKIDCache,
10472 sizeof(tPmkidCacheInfo) * numItems );
10473 }
10474 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010475 return (status);
10476}
10477
Jeff Johnson295189b2012-06-20 16:38:30 -070010478tANI_U32 csrRoamGetNumPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10479{
10480 return (pMac->roam.roamSession[sessionId].NumPmkidCache);
10481}
10482
Jeff Johnson295189b2012-06-20 16:38:30 -070010483eHalStatus csrRoamGetPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum, tPmkidCacheInfo *pPmkidCache)
10484{
10485 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10486 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010487
10488 if(!pSession)
10489 {
10490 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10491 return eHAL_STATUS_FAILURE;
10492 }
10493
Jeff Johnson295189b2012-06-20 16:38:30 -070010494 if(pNum && pPmkidCache)
10495 {
10496 if(pSession->NumPmkidCache == 0)
10497 {
10498 *pNum = 0;
10499 status = eHAL_STATUS_SUCCESS;
10500 }
10501 else if(*pNum >= pSession->NumPmkidCache)
10502 {
10503 if(pSession->NumPmkidCache > CSR_MAX_PMKID_ALLOWED)
10504 {
10505 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10506 pSession->NumPmkidCache);
10507 pSession->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
10508 }
10509 palCopyMemory( pMac->hHdd, pPmkidCache, pSession->PmkidCacheInfo,
10510 sizeof(tPmkidCacheInfo) * pSession->NumPmkidCache );
10511 *pNum = pSession->NumPmkidCache;
10512 status = eHAL_STATUS_SUCCESS;
10513 }
10514 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010515 return (status);
10516}
10517
Jeff Johnson295189b2012-06-20 16:38:30 -070010518eHalStatus csrRoamGetWpaRsnReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10519{
10520 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10521 tANI_U32 len;
10522 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010523
10524 if(!pSession)
10525 {
10526 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10527 return eHAL_STATUS_FAILURE;
10528 }
10529
Jeff Johnson295189b2012-06-20 16:38:30 -070010530 if(pLen)
10531 {
10532 len = *pLen;
10533 *pLen = pSession->nWpaRsnReqIeLength;
10534 if(pBuf)
10535 {
10536 if(len >= pSession->nWpaRsnReqIeLength)
10537 {
10538 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnReqIE, pSession->nWpaRsnReqIeLength);
10539 }
10540 }
10541 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010542 return (status);
10543}
10544
Jeff Johnson295189b2012-06-20 16:38:30 -070010545eHalStatus csrRoamGetWpaRsnRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10546{
10547 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10548 tANI_U32 len;
10549 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010550
10551 if(!pSession)
10552 {
10553 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10554 return eHAL_STATUS_FAILURE;
10555 }
10556
Jeff Johnson295189b2012-06-20 16:38:30 -070010557 if(pLen)
10558 {
10559 len = *pLen;
10560 *pLen = pSession->nWpaRsnRspIeLength;
10561 if(pBuf)
10562 {
10563 if(len >= pSession->nWpaRsnRspIeLength)
10564 {
10565 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnRspIE, pSession->nWpaRsnRspIeLength);
10566 }
10567 }
10568 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010569 return (status);
10570}
Jeff Johnson295189b2012-06-20 16:38:30 -070010571#ifdef FEATURE_WLAN_WAPI
10572eHalStatus csrRoamGetWapiReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10573{
10574 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10575 tANI_U32 len;
10576 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010577
10578 if(!pSession)
10579 {
10580 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10581 return eHAL_STATUS_FAILURE;
10582 }
10583
Jeff Johnson295189b2012-06-20 16:38:30 -070010584 if(pLen)
10585 {
10586 len = *pLen;
10587 *pLen = pSession->nWapiReqIeLength;
10588 if(pBuf)
10589 {
10590 if(len >= pSession->nWapiReqIeLength)
10591 {
10592 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiReqIE, pSession->nWapiReqIeLength);
10593 }
10594 }
10595 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010596 return (status);
10597}
Jeff Johnson295189b2012-06-20 16:38:30 -070010598eHalStatus csrRoamGetWapiRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10599{
10600 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10601 tANI_U32 len;
10602 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010603
10604 if(!pSession)
10605 {
10606 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10607 return eHAL_STATUS_FAILURE;
10608 }
10609
Jeff Johnson295189b2012-06-20 16:38:30 -070010610 if(pLen)
10611 {
10612 len = *pLen;
10613 *pLen = pSession->nWapiRspIeLength;
10614 if(pBuf)
10615 {
10616 if(len >= pSession->nWapiRspIeLength)
10617 {
10618 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiRspIE, pSession->nWapiRspIeLength);
10619 }
10620 }
10621 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010622 return (status);
10623}
10624#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010625eRoamCmdStatus csrGetRoamCompleteStatus(tpAniSirGlobal pMac, tANI_U32 sessionId)
10626{
10627 eRoamCmdStatus retStatus = eCSR_ROAM_CONNECT_COMPLETION;
10628 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010629
10630 if(!pSession)
10631 {
10632 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10633 return (retStatus);
10634 }
10635
Jeff Johnson295189b2012-06-20 16:38:30 -070010636 if(CSR_IS_ROAMING(pSession))
10637 {
10638 retStatus = eCSR_ROAM_ROAMING_COMPLETION;
10639 pSession->fRoaming = eANI_BOOLEAN_FALSE;
10640 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010641 return (retStatus);
10642}
10643
Jeff Johnson295189b2012-06-20 16:38:30 -070010644//This function remove the connected BSS from te cached scan result
10645eHalStatus csrRoamRemoveConnectedBssFromScanCache(tpAniSirGlobal pMac,
10646 tCsrRoamConnectedProfile *pConnProfile)
10647{
10648 eHalStatus status = eHAL_STATUS_FAILURE;
10649 tCsrScanResultFilter *pScanFilter = NULL;
10650 tListElem *pEntry;
10651 tCsrScanResult *pResult;
10652 tDot11fBeaconIEs *pIes;
10653 tANI_BOOLEAN fMatch;
Jeff Johnson295189b2012-06-20 16:38:30 -070010654 if(!(csrIsMacAddressZero(pMac, &pConnProfile->bssid) ||
10655 csrIsMacAddressBroadcast(pMac, &pConnProfile->bssid)))
10656 {
10657 do
10658 {
10659 //Prepare the filter. Only fill in the necessary fields. Not all fields are needed
10660 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
10661 if(!HAL_STATUS_SUCCESS(status)) break;
10662 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
10663 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, sizeof(tCsrBssid));
10664 if(!HAL_STATUS_SUCCESS(status)) break;
10665 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, &pConnProfile->bssid, sizeof(tCsrBssid));
10666 pScanFilter->BSSIDs.numOfBSSIDs = 1;
10667 if(!csrIsNULLSSID(pConnProfile->SSID.ssId, pConnProfile->SSID.length))
10668 {
10669 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
10670 if(!HAL_STATUS_SUCCESS(status)) break;
10671 palCopyMemory(pMac->hHdd, &pScanFilter->SSIDs.SSIDList[0].SSID, &pConnProfile->SSID, sizeof(tSirMacSSid));
10672 }
10673 pScanFilter->authType.numEntries = 1;
10674 pScanFilter->authType.authType[0] = pConnProfile->AuthType;
10675 pScanFilter->BSSType = pConnProfile->BSSType;
10676 pScanFilter->EncryptionType.numEntries = 1;
10677 pScanFilter->EncryptionType.encryptionType[0] = pConnProfile->EncryptionType;
10678 pScanFilter->mcEncryptionType.numEntries = 1;
10679 pScanFilter->mcEncryptionType.encryptionType[0] = pConnProfile->mcEncryptionType;
10680 //We ignore the channel for now, BSSID should be enough
10681 pScanFilter->ChannelInfo.numOfChannels = 0;
10682 //Also ignore the following fields
10683 pScanFilter->uapsd_mask = 0;
10684 pScanFilter->bWPSAssociation = eANI_BOOLEAN_FALSE;
10685 pScanFilter->countryCode[0] = 0;
10686 pScanFilter->phyMode = eCSR_DOT11_MODE_TAURUS;
Jeff Johnson295189b2012-06-20 16:38:30 -070010687 csrLLLock(&pMac->scan.scanResultList);
10688 pEntry = csrLLPeekHead( &pMac->scan.scanResultList, LL_ACCESS_NOLOCK );
10689 while( pEntry )
10690 {
10691 pResult = GET_BASE_ADDR( pEntry, tCsrScanResult, Link );
10692 pIes = (tDot11fBeaconIEs *)( pResult->Result.pvIes );
10693 fMatch = csrMatchBSS(pMac, &pResult->Result.BssDescriptor,
10694 pScanFilter, NULL, NULL, NULL, &pIes);
10695 //Release the IEs allocated by csrMatchBSS is needed
10696 if( !pResult->Result.pvIes )
10697 {
10698 //need to free the IEs since it is allocated by csrMatchBSS
10699 palFreeMemory(pMac->hHdd, pIes);
10700 }
10701 if(fMatch)
10702 {
10703 //We found the one
10704 if( csrLLRemoveEntry(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK) )
10705 {
10706 //Free the memory
10707 csrFreeScanResultEntry( pMac, pResult );
10708 }
10709 break;
10710 }
10711 pEntry = csrLLNext(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK);
10712 }//while
10713 csrLLUnlock(&pMac->scan.scanResultList);
10714 }while(0);
10715 if(pScanFilter)
10716 {
10717 csrFreeScanFilter(pMac, pScanFilter);
10718 palFreeMemory(pMac->hHdd, pScanFilter);
10719 }
10720 }
10721 return (status);
10722}
10723
Jeff Johnson295189b2012-06-20 16:38:30 -070010724//BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -070010725eHalStatus csrIsBTAMPAllowed( tpAniSirGlobal pMac, tANI_U32 chnId )
10726{
10727 eHalStatus status = eHAL_STATUS_SUCCESS;
10728 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070010729 for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
10730 {
10731 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
10732 {
10733 if( csrIsConnStateIbss( pMac, sessionId ) || csrIsBTAMP( pMac, sessionId ) )
10734 {
10735 //co-exist with IBSS or BT-AMP is not supported
10736 smsLog( pMac, LOGW, " BTAMP is not allowed due to IBSS/BT-AMP exist in session %d\n", sessionId );
10737 status = eHAL_STATUS_CSR_WRONG_STATE;
10738 break;
10739 }
10740 if( csrIsConnStateInfra( pMac, sessionId ) )
10741 {
10742 if( chnId &&
10743 ( (tANI_U8)chnId != pMac->roam.roamSession[sessionId].connectedProfile.operationChannel ) )
10744 {
10745 smsLog( pMac, LOGW, " BTAMP is not allowed due to channel (%d) diff than infr channel (%d)\n",
10746 chnId, pMac->roam.roamSession[sessionId].connectedProfile.operationChannel );
10747 status = eHAL_STATUS_CSR_WRONG_STATE;
10748 break;
10749 }
10750 }
10751 }
10752 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010753 return ( status );
10754}
10755
Jeff Johnson295189b2012-06-20 16:38:30 -070010756static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc )
10757{
10758 eHalStatus status = eHAL_STATUS_SUCCESS;
10759 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10760 tBssConfigParam bssConfig;
Jeff Johnson32d95a32012-09-10 13:15:23 -070010761
10762 if(!pSession)
10763 {
10764 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10765 return eHAL_STATUS_FAILURE;
10766 }
10767
Jeff Johnson295189b2012-06-20 16:38:30 -070010768 if ( csrIsConnStateIbss( pMac, sessionId ) )
10769 {
10770 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10771 }
10772 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10773 {
10774 // Disassociate from the connected Infrastructure network...
10775 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10776 }
10777 else
10778 {
10779#if defined(VOSS_ENABLED)
10780 //We don't expect Bt-AMP HDD not to disconnect the last connection first at this time.
10781 //Otherwise we need to add code to handle the
10782 //situation just like IBSS. Though for WDS station, we need to send disassoc to PE first then
10783 //send stop_bss to PE, before we can continue.
10784 VOS_ASSERT( !csrIsConnStateWds( pMac, sessionId ) );
10785#endif
10786 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(tBssConfigParam));
10787 /* Assume HDD provide bssid in profile */
10788 palCopyMemory( pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid[0], sizeof(tCsrBssid) );
10789 // there is no Bss description before we start an WDS so we need
10790 // to adopt all Bss configuration parameters from the Profile.
10791 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, &bssConfig, pBssDesc);
10792 if(HAL_STATUS_SUCCESS(status))
10793 {
10794 //Save profile for late use
10795 csrFreeRoamProfile( pMac, sessionId );
10796 if (HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
10797 (void **)&pSession->pCurRoamProfile,
10798 sizeof(tCsrRoamProfile))))
10799 {
10800 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
10801 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, pProfile);
10802 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010803 //Prepare some more parameters for this WDS
Jeff Johnsone7245742012-09-05 17:12:55 -070010804 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010805 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
10806 }
10807 }
10808
10809 return( status );
10810}
10811
Jeff Johnson295189b2012-06-20 16:38:30 -070010812////////////////////Mail box
10813
Jeff Johnson295189b2012-06-20 16:38:30 -070010814//pBuf is caller allocated memory point to &(tSirSmeJoinReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10815//or &(tSirSmeReassocReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10816static void csrPrepareJoinReassocReqBuffer( tpAniSirGlobal pMac,
10817 tSirBssDescription *pBssDescription,
10818 tANI_U8 *pBuf, tANI_U8 uapsdMask)
10819{
10820 tCsrChannelSet channelGroup;
10821 tSirMacCapabilityInfo *pAP_capabilityInfo;
10822 tAniBool fTmp;
10823 tANI_BOOLEAN found = FALSE;
10824 tANI_U32 size = 0;
10825 tANI_U16 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010826 // plug in neighborhood occupancy info (i.e. BSSes on primary or secondary channels)
10827 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundPri
10828 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecDown
10829 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecUp
Jeff Johnson295189b2012-06-20 16:38:30 -070010830 // 802.11h
10831 //We can do this because it is in HOST CPU order for now.
10832 pAP_capabilityInfo = (tSirMacCapabilityInfo *)&pBssDescription->capabilityInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070010833 //tell the target AP my 11H capability only if both AP and STA support 11H and the channel being used is 11a
10834 if ( csrIs11hSupported( pMac ) && pAP_capabilityInfo->spectrumMgt && eSIR_11A_NW_TYPE == pBssDescription->nwType )
10835 {
10836 fTmp = (tAniBool)pal_cpu_to_be32(1);
10837 }
10838 else
10839 fTmp = (tAniBool)0;
10840
10841 // corresponds to --- pMsg->spectrumMgtIndicator = ON;
10842 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&fTmp, sizeof(tAniBool) );
10843 pBuf += sizeof(tAniBool);
10844 *pBuf++ = MIN_STA_PWR_CAP_DBM; // it is for pMsg->powerCap.minTxPower = 0;
10845 found = csrSearchChannelListForTxPower(pMac, pBssDescription, &channelGroup);
Jeff Johnson295189b2012-06-20 16:38:30 -070010846 // This is required for 11k test VoWiFi Ent: Test 2.
10847 // We need the power capabilities for Assoc Req.
10848 // This macro is provided by the halPhyCfg.h. We pick our
10849 // max and min capability by the halPhy provided macros
10850 *pBuf++ = MAX_STA_PWR_CAP_DBM;
Jeff Johnson295189b2012-06-20 16:38:30 -070010851 size = sizeof(pMac->roam.validChannelList);
10852 if(HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &size)))
10853 {
10854 *pBuf++ = (tANI_U8)size; //tSirSupChnl->numChnl
10855 for ( i = 0; i < size; i++)
10856 {
10857 *pBuf++ = pMac->roam.validChannelList[ i ]; //tSirSupChnl->channelList[ i ]
10858
10859 }
10860 }
10861 else
10862 {
10863 smsLog(pMac, LOGE, FL("can not find any valid channel\n"));
10864 *pBuf++ = 0; //tSirSupChnl->numChnl
10865 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010866 //Check whether it is ok to enter UAPSD
10867#ifndef WLAN_MDM_CODE_REDUCTION_OPT
10868 if( btcIsReadyForUapsd(pMac) )
10869#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
10870 {
10871 *pBuf++ = uapsdMask;
10872 }
10873#ifndef WLAN_MDM_CODE_REDUCTION_OPT
10874 else
10875 {
10876 smsLog(pMac, LOGE, FL(" BTC doesn't allow UAPSD for uapsd_mask(0x%X)\n"), uapsdMask);
10877 *pBuf++ = 0;
10878 }
10879#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
10880
Jeff Johnson295189b2012-06-20 16:38:30 -070010881 // move the entire BssDescription into the join request.
10882 palCopyMemory( pMac->hHdd, pBuf, pBssDescription,
10883 pBssDescription->length + sizeof( pBssDescription->length ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070010884 pBuf += pBssDescription->length + sizeof( pBssDescription->length ); // update to new location
10885}
10886
Jeff Johnson295189b2012-06-20 16:38:30 -070010887/*
10888 * The communication between HDD and LIM is thru mailbox (MB).
10889 * Both sides will access the data structure "tSirSmeJoinReq".
10890 * The rule is, while the components of "tSirSmeJoinReq" can be accessed in the regular way like tSirSmeJoinReq.assocType, this guideline
10891 * stops at component tSirRSNie; any acces to the components after tSirRSNie is forbidden because the space from tSirRSNie is quueezed
10892 * with the component "tSirBssDescription". And since the size of actual 'tSirBssDescription' varies, the receiving side (which is the routine
10893 * limJoinReqSerDes() of limSerDesUtils.cc) should keep in mind not to access the components DIRECTLY after tSirRSNie.
10894 */
10895eHalStatus csrSendJoinReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
10896 tCsrRoamProfile *pProfile, tDot11fBeaconIEs *pIes )
10897{
10898 eHalStatus status = eHAL_STATUS_SUCCESS;
10899 tSirSmeJoinReq *pMsg;
10900 tANI_U8 *pBuf;
10901 tANI_U16 msgLen, wTmp, ieLen;
10902 tSirMacRateSet OpRateSet;
10903 tSirMacRateSet ExRateSet;
10904 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10905 tANI_U32 dwTmp;
10906 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070010907
10908 if(!pSession)
10909 {
10910 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10911 return eHAL_STATUS_FAILURE;
10912 }
10913
Jeff Johnson295189b2012-06-20 16:38:30 -070010914 do {
10915 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
10916 pSession->joinFailStatusCode.reasonCode = 0;
10917 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
10918 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
10919 // IE fields, but the length field in the bssDescription needs to be interpreted to
10920 // determine length of the IE fields.
10921 //
10922 // So, take the size of the JoinReq, subtract the size of the bssDescription and
10923 // add in the length from the bssDescription (then add the size of the 'length' field
10924 // itself because that is NOT included in the length field).
10925 msgLen = sizeof( tSirSmeJoinReq ) - sizeof( *pBssDescription ) +
10926 pBssDescription->length + sizeof( pBssDescription->length ) +
10927 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 -070010928 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
10929 if ( !HAL_STATUS_SUCCESS(status) ) break;
10930 palZeroMemory(pMac->hHdd, pMsg, msgLen);
10931 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_JOIN_REQ);
10932 pMsg->length = pal_cpu_to_be16(msgLen);
10933 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070010934 // sessionId
10935 *pBuf = (tANI_U8)sessionId;
10936 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070010937 // transactionId
10938 *pBuf = 0;
10939 *( pBuf + 1 ) = 0;
10940 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070010941 // ssId
10942 if( pIes->SSID.present && pIes->SSID.num_ssid )
10943 {
10944 // ssId len
10945 *pBuf = pIes->SSID.num_ssid;
10946 pBuf++;
10947 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
10948 pBuf += pIes->SSID.num_ssid;
10949 }
10950 else
10951 {
10952 *pBuf = 0;
10953 pBuf++;
10954 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010955 // selfMacAddr
10956 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
10957 pBuf += sizeof(tSirMacAddr);
10958 // bsstype
10959 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
10960 if (dwTmp == eSIR_BTAMP_STA_MODE) dwTmp = eSIR_BTAMP_AP_MODE; // Override BssType for BTAMP
10961 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
10962 pBuf += sizeof(tSirBssType);
10963 // dot11mode
10964 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
10965 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070010966 //Persona
10967 *pBuf = (tANI_U8)pProfile->csrPersona;
10968 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070010969 //CBMode
10970 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
10971 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070010972
10973 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
Jeff Johnsone7245742012-09-05 17:12:55 -070010974 FL("CSR PERSONA=%d CSR CbMode %d"), pProfile->csrPersona, pSession->bssParams.cbMode);
10975
Jeff Johnson295189b2012-06-20 16:38:30 -070010976 // uapsdPerAcBitmask
10977 *pBuf = pProfile->uapsd_mask;
10978 pBuf++;
10979
Jeff Johnsone7245742012-09-05 17:12:55 -070010980
Jeff Johnson295189b2012-06-20 16:38:30 -070010981
10982#if (WNI_POLARIS_FW_PACKAGE == ADVANCED)
10983#endif /*(WNI_POLARIS_FW_PACKAGE == ADVANCED)*/
Jeff Johnson295189b2012-06-20 16:38:30 -070010984 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet);
10985 if (HAL_STATUS_SUCCESS(status) )
10986 {
10987 // OperationalRateSet
10988 if (OpRateSet.numRates) {
10989 *pBuf++ = OpRateSet.numRates;
10990 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
10991 pBuf += OpRateSet.numRates;
10992 } else *pBuf++ = 0;
10993 // ExtendedRateSet
10994 if (ExRateSet.numRates) {
10995 *pBuf++ = ExRateSet.numRates;
10996 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
10997 pBuf += ExRateSet.numRates;
10998 } else *pBuf++ = 0;
10999 }
11000 else
11001 {
11002 *pBuf++ = 0;
11003 *pBuf++ = 0;
11004 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011005 // rsnIE
11006 if ( csrIsProfileWpa( pProfile ) )
11007 {
11008 // Insert the Wpa IE into the join request
11009 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11010 (tCsrWpaIe *)( wpaRsnIE ) );
11011 }
11012 else if( csrIsProfileRSN( pProfile ) )
11013 {
11014 // Insert the RSN IE into the join request
11015 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11016 (tCsrRSNIe *)( wpaRsnIE ) );
11017 }
11018#ifdef FEATURE_WLAN_WAPI
11019 else if( csrIsProfileWapi( pProfile ) )
11020 {
11021 // Insert the WAPI IE into the join request
11022 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11023 (tCsrWapiIe *)( wpaRsnIE ) );
11024 }
11025#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070011026 else
11027 {
11028 ieLen = 0;
11029 }
11030 //remember the IE for future use
11031 if( ieLen )
11032 {
11033 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11034 {
11035 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);
11036 ieLen = DOT11F_IE_RSN_MAX_LEN;
11037 }
11038#ifdef FEATURE_WLAN_WAPI
11039 if( csrIsProfileWapi( pProfile ) )
11040 {
11041 //Check whether we need to allocate more memory
11042 if(ieLen > pSession->nWapiReqIeLength)
11043 {
11044 if(pSession->pWapiReqIE && pSession->nWapiReqIeLength)
11045 {
11046 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11047 }
11048 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiReqIE, ieLen);
11049 if(!HAL_STATUS_SUCCESS(status)) break;
11050 }
11051 pSession->nWapiReqIeLength = ieLen;
11052 palCopyMemory(pMac->hHdd, pSession->pWapiReqIE, wpaRsnIE, ieLen);
11053 wTmp = pal_cpu_to_be16( ieLen );
11054 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11055 pBuf += sizeof(tANI_U16);
11056 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11057 pBuf += ieLen;
11058 }
11059 else//should be WPA/WPA2 otherwise
11060#endif /* FEATURE_WLAN_WAPI */
11061 {
11062 //Check whether we need to allocate more memory
11063 if(ieLen > pSession->nWpaRsnReqIeLength)
11064 {
11065 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11066 {
11067 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11068 }
11069 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11070 if(!HAL_STATUS_SUCCESS(status)) break;
11071 }
11072 pSession->nWpaRsnReqIeLength = ieLen;
11073 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11074 wTmp = pal_cpu_to_be16( ieLen );
11075 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11076 pBuf += sizeof(tANI_U16);
11077 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11078 pBuf += ieLen;
11079 }
11080 }
11081 else
11082 {
11083 //free whatever old info
11084 pSession->nWpaRsnReqIeLength = 0;
11085 if(pSession->pWpaRsnReqIE)
11086 {
11087 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11088 pSession->pWpaRsnReqIE = NULL;
11089 }
11090#ifdef FEATURE_WLAN_WAPI
11091 pSession->nWapiReqIeLength = 0;
11092 if(pSession->pWapiReqIE)
11093 {
11094 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11095 pSession->pWapiReqIE = NULL;
11096 }
11097#endif /* FEATURE_WLAN_WAPI */
11098 //length is two bytes
11099 *pBuf = 0;
11100 *(pBuf + 1) = 0;
11101 pBuf += 2;
11102 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011103#ifdef FEATURE_WLAN_CCX
11104 // Never include the cckmIE in an Join Request
11105 //length is two bytes
11106 *pBuf = 0;
11107 *(pBuf + 1) = 0;
11108 pBuf += 2;
11109#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011110 // addIEScan
11111 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11112 {
11113 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011114 if(ieLen > pSession->nAddIEScanLength)
11115 {
11116 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11117 {
11118 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11119 }
11120 status = palAllocateMemory(pMac->hHdd,
11121 (void **)&pSession->pAddIEScan, ieLen);
11122 if(!HAL_STATUS_SUCCESS(status)) break;
11123 }
11124 pSession->nAddIEScanLength = ieLen;
11125 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11126 pProfile->pAddIEScan, ieLen);
11127 wTmp = pal_cpu_to_be16( ieLen );
11128 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11129 pBuf += sizeof(tANI_U16);
11130 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11131 pBuf += ieLen;
11132 }
11133 else
11134 {
11135 pSession->nAddIEScanLength = 0;
11136 if(pSession->pAddIEScan)
11137 {
11138 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11139 pSession->pAddIEScan = NULL;
11140 }
11141 *pBuf = 0;
11142 *(pBuf + 1) = 0;
11143 pBuf += 2;
11144 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011145 // addIEAssoc
11146 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11147 {
11148 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011149 if(ieLen > pSession->nAddIEAssocLength)
11150 {
11151 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11152 {
11153 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11154 }
11155 status = palAllocateMemory(pMac->hHdd,
11156 (void **)&pSession->pAddIEAssoc, ieLen);
11157 if(!HAL_STATUS_SUCCESS(status)) break;
11158 }
11159 pSession->nAddIEAssocLength = ieLen;
11160 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11161 pProfile->pAddIEAssoc, ieLen);
11162 wTmp = pal_cpu_to_be16( ieLen );
11163 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11164 pBuf += sizeof(tANI_U16);
11165 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11166 pBuf += ieLen;
11167 }
11168 else
11169 {
11170 pSession->nAddIEAssocLength = 0;
11171 if(pSession->pAddIEAssoc)
11172 {
11173 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11174 pSession->pAddIEAssoc = NULL;
11175 }
11176 *pBuf = 0;
11177 *(pBuf + 1) = 0;
11178 pBuf += 2;
11179 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011180 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11181 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11182 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011183 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11184 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11185 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011186#ifdef WLAN_FEATURE_VOWIFI_11R
11187 if (csrIsProfile11r( pProfile ) )
11188 {
11189 // is11Rconnection;
11190 dwTmp = pal_cpu_to_be32(TRUE);
11191 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11192 pBuf += sizeof(tAniBool);
11193 }
11194 else
11195 {
11196 // is11Rconnection;
11197 dwTmp = pal_cpu_to_be32(FALSE);
11198 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11199 pBuf += sizeof(tAniBool);
11200 }
11201#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011202#ifdef FEATURE_WLAN_CCX
11203 /* A profile can not be both CCX and 11R. But an 802.11R AP
11204 * may be advertising support for CCX as well. So if we are
11205 * associating Open or explicitly CCX then we will get CCX.
11206 * If we are associating explictly 11R only then we will get
11207 * 11R.
11208 */
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011209 if ((csrIsProfileCCX(pProfile) ||
11210 ((pIes->CCXVersion.present)
11211 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11212 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11213 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11214 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11215 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11216 && (!(csrIsProfile11r( pProfile )))
11217 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011218 {
11219 // isCCXconnection;
11220 dwTmp = pal_cpu_to_be32(TRUE);
11221 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11222 pBuf += sizeof(tAniBool);
11223 }
11224 else
11225 {
11226 //isCCXconnection;
11227 dwTmp = pal_cpu_to_be32(FALSE);
11228 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11229 pBuf += sizeof(tAniBool);
11230 }
11231 {
11232 tCCXTspecInfo ccxTspec;
11233 // CCX-Tspec IEs in the ASSOC request is presently not supported
11234 // so nullify the TSPEC parameters
11235 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11236 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11237 pBuf += sizeof(tCCXTspecInfo);
11238 }
11239#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011240#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011241 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011242 if (pMac->roam.configParam.isFastTransitionEnabled
11243#ifdef FEATURE_WLAN_LFR
11244 || csrRoamIsFastRoamEnabled(pMac)
11245#endif
11246 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011247 {
11248 dwTmp = pal_cpu_to_be32(TRUE);
11249 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11250 pBuf += sizeof(tAniBool);
11251 }
11252 else
11253 {
11254 dwTmp = pal_cpu_to_be32(FALSE);
11255 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11256 pBuf += sizeof(tAniBool);
11257 }
11258#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011259#ifdef FEATURE_WLAN_LFR
11260 if(csrRoamIsFastRoamEnabled(pMac))
11261 {
11262 //legacy fast roaming enabled
11263 dwTmp = pal_cpu_to_be32(TRUE);
11264 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11265 pBuf += sizeof(tAniBool);
11266 }
11267 else
11268 {
11269 dwTmp = pal_cpu_to_be32(FALSE);
11270 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11271 pBuf += sizeof(tAniBool);
11272 }
11273#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011274 //BssDesc
11275 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf,
11276 (tANI_U8)pProfile->uapsd_mask);
Jeff Johnson295189b2012-06-20 16:38:30 -070011277 status = palSendMBMessage(pMac->hHdd, pMsg );
11278 if(!HAL_STATUS_SUCCESS(status))
11279 {
11280 break;
11281 }
11282 //Tush-QoS: notify QoS module that join happening
11283 else
11284 {
11285#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11286 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_JOIN_REQ, NULL);
11287#endif
11288 }
11289 } while( 0 );
11290 return( status );
11291}
11292
Jeff Johnson295189b2012-06-20 16:38:30 -070011293eHalStatus csrSendSmeReassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11294 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile )
11295{
11296 eHalStatus status;
11297 tSirSmeReassocReq *pMsg;
11298 tANI_U8 *pBuf;
11299 v_U8_t acm_mask = 0, uapsd_mask;
11300 tANI_U16 msgLen, ieLen, wTmp;
11301 tANI_U32 dwTmp;
11302 tSirMacRateSet OpRateSet;
11303 tSirMacRateSet ExRateSet;
11304 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11305 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011306
11307 if(!pSession)
11308 {
11309 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11310 return eHAL_STATUS_FAILURE;
11311 }
11312
Jeff Johnson295189b2012-06-20 16:38:30 -070011313 /* To satisfy klockworks */
11314 if (pBssDescription == NULL)
11315 {
11316 smsLog(pMac, LOGE, FL(" pBssDescription is NULL\n"));
11317 return eHAL_STATUS_FAILURE;
11318 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011319 do {
11320 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11321 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11322 // IE fields, but the length field in the bssDescription needs to be interpreted to
11323 // determine length of the IE fields.
11324 //
11325 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11326 // add in the length from the bssDescription (then add the size of the 'length' field
11327 // itself because that is NOT included in the length field).
11328 msgLen = sizeof( tSirSmeReassocReq ) - sizeof( *pBssDescription ) +
11329 pBssDescription->length + sizeof( pBssDescription->length ) +
11330 sizeof( tCsrWpaIe ) + sizeof( tCsrWpaAuthIe ) + sizeof( tANI_U16 ); // add in the size of the WPA IE that we may build.
11331 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11332 if ( !HAL_STATUS_SUCCESS(status) ) break;
11333 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11334 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REASSOC_REQ);
11335 pMsg->length = pal_cpu_to_be16(msgLen);
11336 pBuf = &pMsg->sessionId;
11337 // sessionId
11338 *pBuf++ = (tANI_U8)sessionId;
11339 // transactionId
11340 *pBuf = 0;
11341 *(pBuf + 1) = 0;
11342 pBuf += sizeof (tANI_U16);
11343 // ssId
11344 if( pIes->SSID.present && pIes->SSID.num_ssid )
11345 {
11346 // ssId len
11347 *pBuf++ = pIes->SSID.num_ssid;
11348 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11349 pBuf += pIes->SSID.num_ssid;
11350 }
11351 else
11352 {
11353 *pBuf++ = 0;
11354 }
11355 // selfMacAddr
11356 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11357 pBuf += sizeof(tSirMacAddr);
11358 // bsstype
11359 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11360 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11361 pBuf += sizeof(tSirBssType);
11362 // dot11mode
11363 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11364 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011365 //Persona
11366 *pBuf = (tANI_U8)pProfile->csrPersona;
11367 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011368 //CBMode
11369 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11370 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011371
Jeff Johnsone7245742012-09-05 17:12:55 -070011372 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
11373 FL("CSR PERSONA=%d CSR CBMode=%u\n"), pProfile->csrPersona, pSession->bssParams.cbMode);
11374
Jeff Johnson295189b2012-06-20 16:38:30 -070011375 // uapsdPerAcBitmask
11376 *pBuf = pProfile->uapsd_mask;
11377 pBuf++;
11378
Jeff Johnson295189b2012-06-20 16:38:30 -070011379 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode,
11380 pBssDescription, pIes, &OpRateSet, &ExRateSet);
11381 if (HAL_STATUS_SUCCESS(status) )
11382 {
11383 // OperationalRateSet
11384 if (OpRateSet.numRates)
11385 {
11386 *pBuf++ = OpRateSet.numRates;
11387 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11388 pBuf += OpRateSet.numRates;
11389 }
11390 else *pBuf++ = 0;
11391 // ExtendedRateSet
11392 if (ExRateSet.numRates)
11393 {
11394 *pBuf++ = ExRateSet.numRates;
11395 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11396 pBuf += ExRateSet.numRates;
11397 }
11398 else *pBuf++ = 0;
11399 }
11400 else
11401 {
11402 *pBuf++ = 0;
11403 *pBuf++ = 0;
11404 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011405 // rsnIE
11406 if ( csrIsProfileWpa( pProfile ) )
11407 {
11408 // Insert the Wpa IE into the join request
11409 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11410 (tCsrWpaIe *)( wpaRsnIE ) );
11411 }
11412 else if( csrIsProfileRSN( pProfile ) )
11413 {
11414 // Insert the RSN IE into the join request
11415 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11416 (tCsrRSNIe *)( wpaRsnIE ) );
11417 }
11418#ifdef FEATURE_WLAN_WAPI
11419 else if( csrIsProfileWapi( pProfile ) )
11420 {
11421 // Insert the WAPI IE into the join request
11422 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11423 (tCsrWapiIe *)( wpaRsnIE) );
11424 }
11425#endif /* FEATURE_WLAN_WAPI */
11426 else
11427 {
11428 ieLen = 0;
11429 }
11430 //remember the IE for future use
11431 if( ieLen )
11432 {
11433 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11434 {
11435 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);
11436 ieLen = DOT11F_IE_RSN_MAX_LEN;
11437 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011438 //Check whether we need to allocate more memory
11439 if(ieLen > pSession->nWpaRsnReqIeLength)
11440 {
11441 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11442 {
11443 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11444 }
11445 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11446 if(!HAL_STATUS_SUCCESS(status)) break;
11447 }
11448 pSession->nWpaRsnReqIeLength = ieLen;
11449 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11450 wTmp = pal_cpu_to_be16( ieLen );
11451 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11452 pBuf += sizeof(tANI_U16);
11453 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11454 pBuf += ieLen;
11455 }
11456 else
11457 {
11458 //free whatever old info
11459 pSession->nWpaRsnReqIeLength = 0;
11460 if(pSession->pWpaRsnReqIE)
11461 {
11462 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11463 pSession->pWpaRsnReqIE = NULL;
11464 }
11465 //length is two bytes
11466 *pBuf = 0;
11467 *(pBuf + 1) = 0;
11468 pBuf += 2;
11469 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011470#ifdef FEATURE_WLAN_CCX
11471 // cckmIE
11472 if( csrIsProfileCCX( pProfile ) )
11473 {
11474 // Insert the CCKM IE into the join request
11475 ieLen = csrConstructCcxCckmIe( pMac,
11476 pSession,
11477 pProfile,
11478 pBssDescription,
11479 pSession->pWpaRsnReqIE,
11480 pSession->nWpaRsnReqIeLength,
11481 (void *)( wpaRsnIE ) );
11482 }
11483 else
11484 {
11485 ieLen = 0;
11486 }
11487 //If present, copy the IE into the eWNI_SME_REASSOC_REQ message buffer
11488 if( ieLen )
11489 {
11490 //Copy the CCKM IE over from the temp buffer (wpaRsnIE)
11491 wTmp = pal_cpu_to_be16( ieLen );
11492 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11493 pBuf += sizeof(tANI_U16);
11494 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11495 pBuf += ieLen;
11496 }
11497 else
11498 {
11499 //Indicate you have no CCKM IE
11500 //length is two bytes
11501 *pBuf = 0;
11502 *(pBuf + 1) = 0;
11503 pBuf += 2;
11504 }
11505#endif /* FEATURE_WLAN_CCX */
Jeff Johnson295189b2012-06-20 16:38:30 -070011506 // addIEScan
11507 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11508 {
11509 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011510 if(ieLen > pSession->nAddIEScanLength)
11511 {
11512 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11513 {
11514 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11515 }
11516 status = palAllocateMemory(pMac->hHdd,
11517 (void **)&pSession->pAddIEScan, ieLen);
11518 if(!HAL_STATUS_SUCCESS(status)) break;
11519 }
11520 pSession->nAddIEScanLength = ieLen;
11521 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11522 pProfile->pAddIEScan, ieLen);
11523 wTmp = pal_cpu_to_be16( ieLen );
11524 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11525 pBuf += sizeof(tANI_U16);
11526 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11527 pBuf += ieLen;
11528 }
11529 else
11530 {
11531 pSession->nAddIEScanLength = 0;
11532 if(pSession->pAddIEScan)
11533 {
11534 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11535 pSession->pAddIEScan = NULL;
11536 }
11537 *pBuf = 0;
11538 *(pBuf + 1) = 0;
11539 pBuf += 2;
11540 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011541 // addIEAssoc
11542 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11543 {
11544 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011545 if(ieLen > pSession->nAddIEAssocLength)
11546 {
11547 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11548 {
11549 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11550 }
11551 status = palAllocateMemory(pMac->hHdd,
11552 (void **)&pSession->pAddIEAssoc, ieLen);
11553 if(!HAL_STATUS_SUCCESS(status)) break;
11554 }
11555 pSession->nAddIEAssocLength = ieLen;
11556 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11557 pProfile->pAddIEAssoc, ieLen);
11558 wTmp = pal_cpu_to_be16( ieLen );
11559 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11560 pBuf += sizeof(tANI_U16);
11561 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11562 pBuf += ieLen;
11563 }
11564 else
11565 {
11566 pSession->nAddIEAssocLength = 0;
11567 if(pSession->pAddIEAssoc)
11568 {
11569 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11570 pSession->pAddIEAssoc = NULL;
11571 }
11572 *pBuf = 0;
11573 *(pBuf + 1) = 0;
11574 pBuf += 2;
11575 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011576 //Unmask any AC in reassoc that is ACM-set
11577 uapsd_mask = (v_U8_t)pProfile->uapsd_mask;
11578 if( uapsd_mask && ( NULL != pBssDescription ) )
11579 {
11580 if( CSR_IS_QOS_BSS(pIes) && CSR_IS_UAPSD_BSS(pIes) )
11581 {
11582#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11583 acm_mask = sme_QosGetACMMask(pMac, pBssDescription, pIes);
11584#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11585 uapsd_mask &= ~(acm_mask);
11586 }
11587 else
11588 {
11589 uapsd_mask = 0;
11590 }
11591 }
11592
11593 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11594 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11595 pBuf += sizeof(tANI_U32);
11596
11597 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11598 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11599 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011600#ifdef WLAN_FEATURE_VOWIFI_11R
11601 // is11Rconnection;
11602 dwTmp = csrIsProfile11r( pProfile )? pal_cpu_to_be32(TRUE) : 0;
11603 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11604 pBuf += sizeof(tAniBool);
Jeff Johnson295189b2012-06-20 16:38:30 -070011605#ifdef FEATURE_WLAN_CCX
11606 //isCCXconnection;
11607 //CCKM profile, ccxversion ie present, not 11r and ini file has CCX enabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011608 dwTmp = ( ((csrIsProfileCCX(pProfile) ||
11609 ((pIes->CCXVersion.present)
11610 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11611 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11612 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11613 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11614 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11615 && (!(csrIsProfile11r( pProfile )))
11616 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
11617 ? pal_cpu_to_be32(TRUE) : 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070011618 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11619 pBuf += sizeof(tAniBool);
11620#endif // FEATURE_WLAN_CCX
11621#endif // WLAN_FEATURE_VOWIFI_11R
Jeff Johnson295189b2012-06-20 16:38:30 -070011622#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011623 if ((csrIsProfileCCX(pProfile) ||
11624 ((pIes->CCXVersion.present)
11625 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11626 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11627 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11628 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11629 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11630 && (!(csrIsProfile11r( pProfile )))
11631 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011632 {
11633 tCCXTspecInfo ccxTspec;
Jeff Johnson295189b2012-06-20 16:38:30 -070011634 // CCX Tspec information
11635 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11636 ccxTspec.numTspecs = sme_QosCCxRetrieveTspecInfo(pMac, sessionId, (tTspecInfo *) &ccxTspec.tspec[0]);
11637 *pBuf = ccxTspec.numTspecs;
11638 pBuf += sizeof(tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070011639 // Copy the TSPEC information only if present
11640 if (ccxTspec.numTspecs) {
11641 palCopyMemory(pMac->hHdd, pBuf, (void*)&ccxTspec.tspec[0], (ccxTspec.numTspecs*sizeof(tTspecInfo)));
11642 }
11643 pBuf += sizeof(ccxTspec.tspec);
11644 }
11645 else
11646 {
11647 {
11648 tCCXTspecInfo ccxTspec;
11649 // CCX-Tspec IEs in the ASSOC request is presently not supported
11650 // so nullify the TSPEC parameters
11651 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11652 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11653 pBuf += sizeof(tCCXTspecInfo);
11654 }
11655 }
11656#endif // FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011657#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011658 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011659 if (pMac->roam.configParam.isFastTransitionEnabled
11660#ifdef FEATURE_WLAN_LFR
11661 || csrRoamIsFastRoamEnabled(pMac)
11662#endif
11663 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011664 {
11665 dwTmp = pal_cpu_to_be32(TRUE);
11666 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11667 pBuf += sizeof(tAniBool);
11668 }
11669 else
11670 {
11671 dwTmp = pal_cpu_to_be32(FALSE);
11672 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11673 pBuf += sizeof(tAniBool);
11674 }
11675#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011676#ifdef FEATURE_WLAN_LFR
11677 if(csrRoamIsFastRoamEnabled(pMac))
11678 {
11679 //legacy fast roaming enabled
11680 dwTmp = pal_cpu_to_be32(TRUE);
11681 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11682 pBuf += sizeof(tAniBool);
11683 }
11684 else
11685 {
11686 dwTmp = pal_cpu_to_be32(FALSE);
11687 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11688 pBuf += sizeof(tAniBool);
11689 }
11690#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011691 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf, uapsd_mask);
11692
11693#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11694 //Tush-QoS: notify QoS module that reassoc happening
11695 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_REASSOC_REQ, NULL);
11696#endif
11697 status = palSendMBMessage( pMac->hHdd, pMsg );
11698 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011699 return( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070011700}
11701
Jeff Johnson295189b2012-06-20 16:38:30 -070011702//
11703eHalStatus csrSendMBDisassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11704{
11705 eHalStatus status = eHAL_STATUS_SUCCESS;
11706 tSirSmeDisassocReq *pMsg;
11707 tANI_U8 *pBuf;
11708 tANI_U16 wTmp;
11709#ifdef WLAN_SOFTAP_FEATURE
11710 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11711 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11712 return eHAL_STATUS_FAILURE;
11713#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011714 do {
11715 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocReq ));
11716 if ( !HAL_STATUS_SUCCESS(status) ) break;
11717 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocReq ));
11718 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_REQ);
11719 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011720 pBuf = &pMsg->sessionId;
11721 // sessionId
11722 *pBuf++ = (tANI_U8)sessionId;
11723 // transactionId
11724 *pBuf = 0;
11725 *( pBuf + 1 ) = 0;
11726 pBuf += sizeof(tANI_U16);
11727
11728#ifdef WLAN_SOFTAP_FEATURE
11729 if ( (pSession->pCurRoamProfile != NULL ) &&
11730 ( reasonCode == eSIR_MAC_UNSPEC_FAILURE_REASON ) &&
11731 ((CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) || (CSR_IS_WDS_AP(pSession->pCurRoamProfile))))
11732 {
11733 // Set the bssid address before sending the message to LIM
11734 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( tSirMacAddr ) );
11735 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011736 // Set the peer MAC address before sending the message to LIM
11737 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) ); //perMacAddr is passed as bssId for softAP
11738 pBuf = pBuf + sizeof ( tSirMacAddr );
11739 }
11740 else
11741 {
11742#endif
11743 // Set the peer MAC address before sending the message to LIM
11744 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) );
11745 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011746 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->bssId ) );
11747 pBuf = pBuf + sizeof ( tSirMacAddr );
11748#ifdef WLAN_SOFTAP_FEATURE
11749 }
11750#endif
11751 if(!HAL_STATUS_SUCCESS(status))
11752 {
11753 palFreeMemory(pMac->hHdd, pMsg);
11754 break;
11755 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011756 // reasonCode
11757 wTmp = pal_cpu_to_be16(reasonCode);
11758 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11759 if(!HAL_STATUS_SUCCESS(status))
11760 {
11761 palFreeMemory(pMac->hHdd, pMsg);
11762 break;
11763 }
11764 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011765 /* The state will be DISASSOC_HANDOFF only when we are doing handoff.
11766 Here we should not send the disassoc over the air to the AP */
11767 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO(pMac, sessionId)
11768#ifdef WLAN_FEATURE_VOWIFI_11R
11769 && csrRoamIs11rAssoc(pMac)
11770#endif
11771 )
11772 {
11773 *pBuf = CSR_DONT_SEND_DISASSOC_OVER_THE_AIR; /* Set DoNotSendOverTheAir flag to 1 only for handoff case */
11774 }
11775 pBuf += sizeof(tANI_U8);
11776 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011777 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011778 return( status );
11779}
Jeff Johnson295189b2012-06-20 16:38:30 -070011780#ifdef WLAN_SOFTAP_FEATURE
11781eHalStatus csrSendMBTkipCounterMeasuresReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN bEnable, tSirMacAddr bssId )
11782{
11783 eHalStatus status = eHAL_STATUS_SUCCESS;
11784 tSirSmeTkipCntrMeasReq *pMsg;
11785 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011786 do
11787 {
11788 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11789 if ( !HAL_STATUS_SUCCESS(status) ) break;
11790 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11791 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_TKIP_CNTR_MEAS_REQ);
11792 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeTkipCntrMeasReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011793 pBuf = &pMsg->sessionId;
11794 // sessionId
11795 *pBuf++ = (tANI_U8)sessionId;
11796 // transactionId
11797 *pBuf = 0;
11798 *( pBuf + 1 ) = 0;
11799 pBuf += sizeof(tANI_U16);
11800 // bssid
11801 status = palCopyMemory( pMac->hHdd, pMsg->bssId, bssId, sizeof( tSirMacAddr ) );
11802 pBuf = pBuf + sizeof ( tSirMacAddr );
11803 // bEnable
11804 *pBuf = (tANI_BOOLEAN)bEnable;
11805 if(!HAL_STATUS_SUCCESS(status))
11806 {
11807 palFreeMemory(pMac->hHdd, pMsg);
11808 break;
11809 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011810 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011811 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011812 return( status );
11813}
Jeff Johnson295189b2012-06-20 16:38:30 -070011814eHalStatus
11815csrSendMBGetAssociatedStasReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
11816 VOS_MODULE_ID modId, tSirMacAddr bssId,
11817 void *pUsrContext, void *pfnSapEventCallback,
11818 tANI_U8 *pAssocStasBuf )
11819{
11820 eHalStatus status = eHAL_STATUS_SUCCESS;
11821 tSirSmeGetAssocSTAsReq *pMsg;
11822 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11823 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011824 do
11825 {
11826 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11827 if (!HAL_STATUS_SUCCESS(status)) break;
11828 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11829 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_ASSOC_STAS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011830 pBuf = (tANI_U8 *)&pMsg->bssId;
11831 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011832 // bssId
11833 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11834 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011835 // modId
11836 dwTmp = pal_cpu_to_be16((tANI_U16)modId);
11837 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U16));
11838 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011839 // pUsrContext
11840 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11841 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11842 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011843 // pfnSapEventCallback
11844 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
11845 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11846 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011847 // pAssocStasBuf
11848 dwTmp = pal_cpu_to_be32((tANI_U32)pAssocStasBuf);
11849 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11850 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011851 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070011852 status = palSendMBMessage( pMac->hHdd, pMsg );
11853 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011854 return( status );
11855 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011856eHalStatus
11857csrSendMBGetWPSPBCSessions( tpAniSirGlobal pMac, tANI_U32 sessionId,
11858 tSirMacAddr bssId, void *pUsrContext, void *pfnSapEventCallback,v_MACADDR_t pRemoveMac)
11859 {
11860 eHalStatus status = eHAL_STATUS_SUCCESS;
11861 tSirSmeGetWPSPBCSessionsReq *pMsg;
11862 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11863 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011864 do
11865 {
11866 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirSmeGetWPSPBCSessionsReq) );
11867 if (!HAL_STATUS_SUCCESS(status)) break;
11868 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetWPSPBCSessionsReq ) );
11869 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_WPSPBC_SESSION_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011870 pBuf = (tANI_U8 *)&pMsg->pUsrContext;
11871 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011872 // pUsrContext
11873 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11874 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11875 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011876 // pSapEventCallback
11877 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
11878 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11879 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011880 // bssId
11881 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11882 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011883 // MAC Address of STA in WPS session
11884 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pRemoveMac.bytes, sizeof(v_MACADDR_t));
11885 pBuf += sizeof(v_MACADDR_t);
Jeff Johnson295189b2012-06-20 16:38:30 -070011886 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
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}
11891#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011892eHalStatus csrSendMBDeauthReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11893{
11894 eHalStatus status = eHAL_STATUS_SUCCESS;
11895 tSirSmeDeauthReq *pMsg;
11896 tANI_U8 *pBuf;
11897 tANI_U16 wTmp;
11898 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11899 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11900 return eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070011901 do {
11902 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthReq ));
11903 if ( !HAL_STATUS_SUCCESS(status) ) break;
11904 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthReq ));
11905 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_REQ);
11906 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthReq ));
11907 //sessionId
11908 pBuf = &pMsg->sessionId;
11909 *pBuf++ = (tANI_U8)sessionId;
11910
11911 //tansactionId
11912 *pBuf = 0;
11913 *(pBuf + 1 ) = 0;
11914 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011915 if ((pSession->pCurRoamProfile != NULL) && (
11916#ifdef WLAN_SOFTAP_FEATURE
11917 (CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) ||
11918#endif
11919 (CSR_IS_WDS_AP(pSession->pCurRoamProfile)))){
11920 // Set the BSSID before sending the message to LIM
11921 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( pMsg->peerMacAddr ) );
11922 pBuf = pBuf + sizeof(tSirMacAddr);
11923 }
11924 else
11925 {
11926 // Set the BSSID before sending the message to LIM
11927 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
11928 pBuf = pBuf + sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011929 }
11930 if(!HAL_STATUS_SUCCESS(status))
11931 {
11932 palFreeMemory(pMac->hHdd, pMsg);
11933 break;
11934 }
11935 // Set the peer MAC address before sending the message to LIM
11936 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *) pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
11937 pBuf = pBuf + sizeof(tSirMacAddr);
11938 if(!HAL_STATUS_SUCCESS(status))
11939 {
11940 palFreeMemory(pMac->hHdd, pMsg);
11941 break;
11942 }
11943 wTmp = pal_cpu_to_be16(reasonCode);
11944 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp,sizeof( tANI_U16 ) );
11945 if(!HAL_STATUS_SUCCESS(status))
11946 {
11947 palFreeMemory(pMac->hHdd, pMsg);
11948 break;
11949 }
11950 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011951 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011952 return( status );
11953}
11954
Jeff Johnson295189b2012-06-20 16:38:30 -070011955eHalStatus csrSendMBDisassocCnfMsg( tpAniSirGlobal pMac, tpSirSmeDisassocInd pDisassocInd )
11956{
11957 eHalStatus status = eHAL_STATUS_SUCCESS;
11958 tSirSmeDisassocCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070011959 do {
11960 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocCnf ));
11961 if ( !HAL_STATUS_SUCCESS(status) ) break;
11962 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocCnf ));
11963 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_CNF);
11964 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
11965 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocCnf ));
11966 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDisassocInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
11967 if(!HAL_STATUS_SUCCESS(status))
11968 {
11969 palFreeMemory(pMac->hHdd, pMsg);
11970 break;
11971 }
11972//To test reconn
11973 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDisassocInd->bssId, sizeof(pMsg->peerMacAddr));
11974 if(!HAL_STATUS_SUCCESS(status))
11975 {
11976 palFreeMemory(pMac->hHdd, pMsg);
11977 break;
11978 }
11979//To test reconn ends
Jeff Johnson295189b2012-06-20 16:38:30 -070011980 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011981 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011982 return( status );
11983}
11984
Jeff Johnson295189b2012-06-20 16:38:30 -070011985eHalStatus csrSendMBDeauthCnfMsg( tpAniSirGlobal pMac, tpSirSmeDeauthInd pDeauthInd )
11986{
11987 eHalStatus status = eHAL_STATUS_SUCCESS;
11988 tSirSmeDeauthCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070011989 do {
11990 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthCnf ));
11991 if ( !HAL_STATUS_SUCCESS(status) ) break;
11992 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthCnf ));
11993 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_CNF);
11994 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
11995 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthCnf ));
11996 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDeauthInd->bssId, sizeof(pMsg->bssId));
11997 if(!HAL_STATUS_SUCCESS(status))
11998 {
11999 palFreeMemory(pMac->hHdd, pMsg);
12000 break;
12001 }
12002 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDeauthInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12003 if(!HAL_STATUS_SUCCESS(status))
12004 {
12005 palFreeMemory(pMac->hHdd, pMsg);
12006 break;
12007 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012008 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012009 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012010 return( status );
12011}
Jeff Johnson295189b2012-06-20 16:38:30 -070012012eHalStatus csrSendAssocCnfMsg( tpAniSirGlobal pMac, tpSirSmeAssocInd pAssocInd, eHalStatus Halstatus )
12013{
12014 eHalStatus status = eHAL_STATUS_SUCCESS;
12015 tSirSmeAssocCnf *pMsg;
12016 tANI_U8 *pBuf;
12017 tSirResultCodes statusCode;
12018 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012019 do {
12020 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocCnf ));
12021 if ( !HAL_STATUS_SUCCESS(status) ) break;
12022 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocCnf ));
12023 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ASSOC_CNF);
12024 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocCnf ));
Jeff Johnson295189b2012-06-20 16:38:30 -070012025 pBuf = (tANI_U8 *)&pMsg->statusCode;
12026 if(HAL_STATUS_SUCCESS(Halstatus))
12027 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12028 else
12029 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12030 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12031 pBuf += sizeof(tSirResultCodes);
12032 // bssId
12033 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12034 pBuf += sizeof (tSirMacAddr);
12035 // peerMacAddr
12036 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12037 pBuf += sizeof (tSirMacAddr);
12038 // aid
12039 wTmp = pal_cpu_to_be16(pAssocInd->aid);
12040 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12041 pBuf += sizeof (tANI_U16);
12042 // alternateBssId
12043 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12044 pBuf += sizeof (tSirMacAddr);
12045 // alternateChannelId
12046 *pBuf = 11;
Jeff Johnson295189b2012-06-20 16:38:30 -070012047 status = palSendMBMessage( pMac->hHdd, pMsg );
12048 if(!HAL_STATUS_SUCCESS(status))
12049 {
12050 //pMsg is freed by palSendMBMessage
12051 break;
12052 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012053 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012054 return( status );
12055}
Jeff Johnson295189b2012-06-20 16:38:30 -070012056#ifdef WLAN_SOFTAP_FEATURE
12057eHalStatus csrSendAssocIndToUpperLayerCnfMsg( tpAniSirGlobal pMac,
12058 tpSirSmeAssocInd pAssocInd,
12059 eHalStatus Halstatus,
12060 tANI_U8 sessionId)
12061{
12062 tSirMsgQ msgQ;
12063 eHalStatus status = eHAL_STATUS_SUCCESS;
12064 tSirSmeAssocIndToUpperLayerCnf *pMsg;
12065 tANI_U8 *pBuf;
12066 tSirResultCodes statusCode;
12067 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012068 do {
12069 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12070 if ( !HAL_STATUS_SUCCESS(status) ) break;
12071 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
Jeff Johnsone7245742012-09-05 17:12:55 -070012072
Jeff Johnson295189b2012-06-20 16:38:30 -070012073 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPPER_LAYER_ASSOC_CNF);
12074 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12075
12076 pMsg->sessionId = sessionId;
12077
12078 pBuf = (tANI_U8 *)&pMsg->statusCode;
12079 if(HAL_STATUS_SUCCESS(Halstatus))
12080 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12081 else
12082 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12083 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12084 pBuf += sizeof(tSirResultCodes);
12085 // bssId
12086 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12087 pBuf += sizeof (tSirMacAddr);
12088 // peerMacAddr
12089 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12090 pBuf += sizeof (tSirMacAddr);
12091 // StaId
12092 wTmp = pal_cpu_to_be16(pAssocInd->staId);
12093 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12094 pBuf += sizeof (tANI_U16);
12095 // alternateBssId
12096 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12097 pBuf += sizeof (tSirMacAddr);
12098 // alternateChannelId
12099 *pBuf = 11;
12100 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012101 // Instead of copying roam Info, we just copy only WmmEnabled , RsnIE information
12102 //Wmm
12103 *pBuf = pAssocInd->wmmEnabledSta;
12104 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012105 //RSN IE
12106 status = palCopyMemory(pMac->hHdd, (tSirRSNie *)pBuf, &pAssocInd->rsnIE, sizeof(tSirRSNie));
12107 pBuf += sizeof (tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012108 //Additional IE
12109 status = palCopyMemory(pMac->hHdd, (void *)pBuf, &pAssocInd->addIE, sizeof(tSirAddie));
12110 pBuf += sizeof (tSirAddie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012111 //reassocReq
12112 *pBuf = pAssocInd->reassocReq;
12113 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012114 msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF;
12115 msgQ.bodyptr = pMsg;
12116 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012117 SysProcessMmhMsg(pMac, &msgQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012118 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012119 return( status );
12120}
12121#endif
12122
Jeff Johnson295189b2012-06-20 16:38:30 -070012123eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId ,
12124 tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType,
12125 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
12126 tANI_U8 keyId, tANI_U8 keyLength, tANI_U8 *pKey, tANI_U8 paeRole,
12127 tANI_U8 *pKeyRsc )
12128{
12129 tSirSmeSetContextReq *pMsg;
12130 tANI_U16 msgLen;
12131 eHalStatus status = eHAL_STATUS_FAILURE;
12132 tAniEdType tmpEdType;
12133 tAniKeyDirection tmpDirection;
12134 tANI_U8 *pBuf;
12135 tANI_U8 *p;
12136 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012137 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012138 if( ( 1 != numKeys ) && ( 0 != numKeys ) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012139 // all of these fields appear in every SET_CONTEXT message. Below we'll add in the size for each
12140 // key set. Since we only support upto one key, we always allocate memory for 1 key
12141 msgLen = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) +
12142 sizeof( tSirMacAddr ) + 1 + sizeof(tANI_U16) +
12143 sizeof( pMsg->keyMaterial.length ) + sizeof( pMsg->keyMaterial.edType ) + sizeof( pMsg->keyMaterial.numKeys ) +
12144 ( sizeof( pMsg->keyMaterial.key ) );
12145
12146 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12147 if ( !HAL_STATUS_SUCCESS(status) ) break;
12148 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12149 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SETCONTEXT_REQ);
12150 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012151 //sessionId
12152 pBuf = &pMsg->sessionId;
12153 *pBuf = (tANI_U8)sessionId;
12154 pBuf++;
12155 // transactionId
12156 *pBuf = 0;
12157 *(pBuf + 1) = 0;
12158 pBuf += sizeof(tANI_U16);
12159 // peerMacAddr
12160 palCopyMemory( pMac->hHdd, pBuf,
12161 (tANI_U8 *)peerMacAddr, sizeof(tSirMacAddr) );
12162
12163 pBuf += sizeof(tSirMacAddr);
12164
12165 // bssId
12166 palCopyMemory( pMac->hHdd, pBuf,
12167 (tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12168
12169 pBuf += sizeof(tSirMacAddr);
12170
12171 p = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012172 // Set the pMsg->keyMaterial.length field (this length is defined as all data that follows the edType field
12173 // in the tSirKeyMaterial keyMaterial; field).
12174 //
12175 // !!NOTE: This keyMaterial.length contains the length of a MAX size key, though the keyLength can be
12176 // shorter than this max size. Is LIM interpreting this ok ?
12177 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 -070012178 // set pMsg->keyMaterial.edType
12179 tmpEdType = (tAniEdType)pal_cpu_to_be32(edType);
12180 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpEdType, sizeof(tAniEdType) );
12181 p += sizeof( pMsg->keyMaterial.edType );
Jeff Johnson295189b2012-06-20 16:38:30 -070012182 // set the pMsg->keyMaterial.numKeys field
12183 *p = numKeys;
12184 p += sizeof( pMsg->keyMaterial.numKeys );
Jeff Johnson295189b2012-06-20 16:38:30 -070012185 // set pSirKey->keyId = keyId;
12186 *p = keyId;
12187 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012188 // set pSirKey->unicast = (tANI_U8)fUnicast;
12189 *p = (tANI_U8)fUnicast;
12190 p += sizeof( pMsg->keyMaterial.key[ 0 ].unicast );
Jeff Johnson295189b2012-06-20 16:38:30 -070012191 // set pSirKey->keyDirection = aniKeyDirection;
12192 tmpDirection = (tAniKeyDirection)pal_cpu_to_be32(aniKeyDirection);
12193 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpDirection, sizeof(tAniKeyDirection) );
12194 p += sizeof(tAniKeyDirection);
12195 // pSirKey->keyRsc = ;;
12196 palCopyMemory( pMac->hHdd, p, pKeyRsc, CSR_MAX_RSC_LEN );
12197 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyRsc );
Jeff Johnson295189b2012-06-20 16:38:30 -070012198 // set pSirKey->paeRole
12199 *p = paeRole; // 0 is Supplicant
12200 p++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012201 // set pSirKey->keyLength = keyLength;
12202 p = pal_set_U16( p, pal_cpu_to_be16(keyLength) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012203 if ( keyLength && pKey )
12204 {
12205 palCopyMemory( pMac->hHdd, p, pKey, keyLength );
12206 if(keyLength == 16)
12207 {
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012208 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 -070012209 keyId, edType, pKey[0], pKey[1], pKey[2], pKey[3], pKey[4],
12210 pKey[5], pKey[6], pKey[7], pKey[8],
12211 pKey[9], pKey[10], pKey[11], pKey[12], pKey[13], pKey[14], pKey[15]);
12212 }
12213 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012214 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012215 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012216 return( status );
12217}
12218
Jeff Johnson295189b2012-06-20 16:38:30 -070012219eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamBssType bssType,
12220 tCsrRoamStartBssParams *pParam, tSirBssDescription *pBssDesc )
12221{
12222 eHalStatus status;
12223 tSirSmeStartBssReq *pMsg;
12224 tANI_U8 *pBuf = NULL;
12225 tANI_U8 *wTmpBuf = NULL;
12226 tANI_U16 msgLen, wTmp;
12227 tANI_U32 dwTmp;
12228 tSirNwType nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070012229 ePhyChanBondState cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070012230#ifdef WLAN_SOFTAP_FEATURE
12231 tANI_U32 authType;
12232#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012233 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012234
12235 if(!pSession)
12236 {
12237 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12238 return eHAL_STATUS_FAILURE;
12239 }
12240
Jeff Johnson295189b2012-06-20 16:38:30 -070012241 do {
12242 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
12243 pSession->joinFailStatusCode.reasonCode = 0;
12244 msgLen = sizeof(tSirSmeStartBssReq);
12245 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12246 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012247 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12248 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BSS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012249 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012250 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012251 //sessionId
12252 *pBuf = (tANI_U8)sessionId;
12253 pBuf++;
12254 // transactionId
12255 *pBuf = 0;
12256 *(pBuf + 1) = 0;
12257 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012258 // bssid
12259 palCopyMemory( pMac->hHdd, pBuf, pParam->bssid, sizeof(tSirMacAddr) );
12260 pBuf += sizeof(tSirMacAddr);
12261 // selfMacAddr
12262 palCopyMemory( pMac->hHdd, pBuf, pSession->selfMacAddr, sizeof(tSirMacAddr) );
12263 pBuf += sizeof(tSirMacAddr);
12264 // beaconInterval
12265 if( pBssDesc && pBssDesc->beaconInterval )
12266 {
12267 wTmp = pal_cpu_to_be16( pBssDesc->beaconInterval );
12268 }
12269#ifdef WLAN_SOFTAP_FEATURE
12270 else if(pParam->beaconInterval)
12271 {
12272 wTmp = pal_cpu_to_be16( pParam->beaconInterval );
12273 }
12274#endif
12275 else
12276 {
12277 wTmp = pal_cpu_to_be16( WNI_CFG_BEACON_INTERVAL_STADEF );
12278 }
Jeff Johnsone7245742012-09-05 17:12:55 -070012279 if(csrIsconcurrentsessionValid (pMac, sessionId,
12280 pParam->bssPersona)
12281 == eHAL_STATUS_SUCCESS )
12282 {
12283 csrValidateBeaconInterval(pMac, pParam->operationChn, &wTmp, sessionId,
12284 pParam->bssPersona);
12285 //Update the beacon Interval
12286 pParam->beaconInterval = wTmp;
12287 }
12288 else
12289 {
12290 smsLog( pMac,LOGE, FL("****Start BSS failed persona already exists***\n"));
12291 status = eHAL_STATUS_FAILURE;
12292 return status;
12293 }
12294
Jeff Johnson295189b2012-06-20 16:38:30 -070012295 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12296 pBuf += sizeof(tANI_U16);
12297 // dot11mode
12298 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pParam->uCfgDot11Mode );
12299 pBuf += 1;
12300 // bssType
12301 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( bssType ) );
12302 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
12303 pBuf += sizeof(tSirBssType);
12304 // ssId
12305 if( pParam->ssId.length )
12306 {
12307 // ssId len
12308 *pBuf = pParam->ssId.length;
12309 pBuf++;
12310 palCopyMemory( pMac->hHdd, pBuf, pParam->ssId.ssId, pParam->ssId.length );
12311 pBuf += pParam->ssId.length;
12312 }
12313 else
12314 {
12315 *pBuf = 0;
12316 pBuf++;
12317 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012318 // set the channel Id
12319 *pBuf = pParam->operationChn;
12320 pBuf++;
12321 //What should we really do for the cbmode.
Jeff Johnsone7245742012-09-05 17:12:55 -070012322 cbMode = (ePhyChanBondState)pal_cpu_to_be32(pParam->cbMode);
12323 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(ePhyChanBondState) );
12324 pBuf += sizeof(ePhyChanBondState);
Jeff Johnson295189b2012-06-20 16:38:30 -070012325
12326#ifdef WLAN_SOFTAP_FEATURE
12327 // Set privacy
12328 *pBuf = pParam->privacy;
12329 pBuf++;
12330
12331 //Set Uapsd
12332 *pBuf = pParam->ApUapsdEnable;
12333 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012334 //Set SSID hidden
12335 *pBuf = pParam->ssidHidden;
12336 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012337 *pBuf = (tANI_U8)pParam->fwdWPSPBCProbeReq;
12338 pBuf++;
12339
12340 //Ht protection Enable/Disable
12341 *pBuf = (tANI_U8)pParam->protEnabled;
12342 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012343 //Enable Beacons to Receive for OBSS protection Enable/Disable
12344 *pBuf = (tANI_U8)pParam->obssProtEnabled;
12345 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012346 //set cfg related to protection
12347 wTmp = pal_cpu_to_be16( pParam->ht_protection );
12348 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12349 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012350 // Set Auth type
12351 authType = pal_cpu_to_be32(pParam->authType);
12352 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&authType, sizeof(tANI_U32));
12353 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012354 // Set DTIM
12355 dwTmp = pal_cpu_to_be32(pParam->dtimPeriod);
12356 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12357 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012358 // Set wps_state
12359 *pBuf = pParam->wps_state;
12360 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012361#endif
12362 //Persona
12363 *pBuf = (tANI_U8)pParam->bssPersona;
12364 pBuf++;
12365
Jeff Johnsone7245742012-09-05 17:12:55 -070012366
Jeff Johnson295189b2012-06-20 16:38:30 -070012367
12368 // set RSN IE
12369 if( pParam->nRSNIELength > sizeof(pMsg->rsnIE.rsnIEdata) )
12370 {
12371 status = eHAL_STATUS_INVALID_PARAMETER;
12372 palFreeMemory( pMac->hHdd, pMsg );
12373 break;
12374 }
12375 wTmp = pal_cpu_to_be16( pParam->nRSNIELength );
12376 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12377 pBuf += sizeof(tANI_U16);
12378 if( wTmp )
12379 {
12380 wTmp = pParam->nRSNIELength;
12381 palCopyMemory( pMac->hHdd, pBuf, pParam->pRSNIE, wTmp );
12382 pBuf += wTmp;
12383 }
12384 nwType = (tSirNwType)pal_cpu_to_be32(pParam->sirNwType);
12385 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&nwType, sizeof(tSirNwType) );
12386 pBuf += sizeof(tSirNwType);
Jeff Johnson295189b2012-06-20 16:38:30 -070012387 *pBuf = pParam->operationalRateSet.numRates; //tSirMacRateSet->numRates
12388 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012389 palCopyMemory( pMac->hHdd, pBuf, pParam->operationalRateSet.rate, pParam->operationalRateSet.numRates );
12390 pBuf += pParam->operationalRateSet.numRates ;
12391 *pBuf++ = pParam->extendedRateSet.numRates;
12392 if(0 != pParam->extendedRateSet.numRates)
12393 {
12394 palCopyMemory( pMac->hHdd, pBuf, pParam->extendedRateSet.rate, pParam->extendedRateSet.numRates );
12395 pBuf += pParam->extendedRateSet.numRates;
12396 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012397 msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
12398 pMsg->length = pal_cpu_to_be16(msgLen);
12399
12400 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012401 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012402 return( status );
12403}
12404
Jeff Johnson295189b2012-06-20 16:38:30 -070012405eHalStatus csrSendMBStopBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId )
12406{
12407 eHalStatus status = eHAL_STATUS_FAILURE;
12408 tSirSmeStopBssReq *pMsg;
12409 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12410 tANI_U8 *pBuf;
12411 tANI_U16 msgLen;
Jeff Johnson32d95a32012-09-10 13:15:23 -070012412
12413 if(!pSession)
12414 {
12415 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12416 return eHAL_STATUS_FAILURE;
12417 }
12418
Jeff Johnson295189b2012-06-20 16:38:30 -070012419 do {
12420 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12421 if ( !HAL_STATUS_SUCCESS(status) ) break;
12422 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12423 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12424 pBuf = &pMsg->sessionId;
12425 //sessionId
12426 *pBuf = (tANI_U8)sessionId;
12427 pBuf++;
12428 // transactionId
12429 *pBuf = 0;
12430 pBuf += sizeof(tANI_U16);
12431 //reason code
12432 *pBuf = 0;
12433 pBuf += sizeof(tSirResultCodes);
12434 // bssid
12435 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12436 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12437 {
12438 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->selfMacAddr, sizeof(tSirMacAddr) );
12439 }
12440 else
12441 {
12442 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12443 }
12444 pBuf += sizeof(tSirMacAddr);
12445 msgLen = sizeof(tANI_U16) + sizeof(tANI_U16) + 1 + sizeof(tANI_U16) + sizeof(tSirResultCodes) + sizeof(tSirMacAddr);
12446 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012447 status = palSendMBMessage( pMac->hHdd, pMsg );
12448#if 0
12449 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12450 if ( !HAL_STATUS_SUCCESS(status) ) break;
12451 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12452 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12453 pMsg->reasonCode = 0;
12454 // bssid
12455 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12456 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12457 {
12458 pbBssid = (tANI_U8 *)&pSession->selfMacAddr;
12459 }
12460 else
12461 {
12462 pbBssid = (tANI_U8 *)&pSession->connectedProfile.bssid;
12463 }
12464 palCopyMemory( pMac->hHdd, &pMsg->bssId, pbBssid, sizeof(tSirMacAddr) );
12465 pMsg->transactionId = 0;
12466 pMsg->sessionId = (tANI_U8)sessionId;
12467 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeStopBssReq ));
12468 status = palSendMBMessage( pMac->hHdd, pMsg );
12469#endif
12470 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012471 return( status );
12472}
12473
Jeff Johnson295189b2012-06-20 16:38:30 -070012474eHalStatus csrReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId,
12475 tCsrRoamModifyProfileFields *pModProfileFields,
12476 tANI_U32 *pRoamId, v_BOOL_t fForce)
12477{
Jeff Johnson295189b2012-06-20 16:38:30 -070012478 eHalStatus status = eHAL_STATUS_FAILURE;
12479 tANI_U32 roamId = 0;
12480 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012481 if((csrIsConnStateConnected(pMac, sessionId)) &&
12482 (fForce || (!palEqualMemory(pMac->hHdd, &pModProfileFields,
12483 &pSession->connectedProfile.modifyProfileFields,
12484 sizeof(tCsrRoamModifyProfileFields)))) )
12485 {
12486 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
12487 if(pRoamId)
12488 {
12489 *pRoamId = roamId;
12490 }
12491
Jeff Johnson295189b2012-06-20 16:38:30 -070012492 status = csrRoamIssueReassoc(pMac, sessionId, NULL, pModProfileFields,
12493 eCsrSmeIssuedReassocToSameAP, roamId,
12494 eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -070012495 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012496 return status;
12497}
Jeff Johnson295189b2012-06-20 16:38:30 -070012498static eHalStatus csrRoamSessionOpened(tpAniSirGlobal pMac, tANI_U32 sessionId)
12499{
12500 eHalStatus status = eHAL_STATUS_SUCCESS;
12501 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070012502 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
12503 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
12504 eCSR_ROAM_SESSION_OPENED, eCSR_ROAM_RESULT_NONE);
12505 return (status);
12506}
Jeff Johnson295189b2012-06-20 16:38:30 -070012507eHalStatus csrProcessAddStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12508{
12509 eHalStatus status = eHAL_STATUS_SUCCESS;
12510 tListElem *pEntry = NULL;
12511 tSmeCmd *pCommand = NULL;
12512 tSirSmeAddStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012513 do
12514 {
12515 if(pMsg == NULL)
12516 {
12517 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
12518 status = eHAL_STATUS_FAILURE;
12519 break;
12520 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012521 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12522 if(pEntry)
12523 {
12524 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12525 if(eSmeCommandAddStaSession == pCommand->command)
12526 {
12527 pRsp = (tSirSmeAddStaSelfRsp*)pMsg;
12528 smsLog( pMac, LOG1, "Add Sta rsp status = %d\n", pRsp->status );
12529 //Nothing to be done. May be indicate the self sta addition success by calling session callback (TODO).
Jeff Johnson295189b2012-06-20 16:38:30 -070012530 csrRoamSessionOpened(pMac, pCommand->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012531 //Remove this command out of the active list
12532 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12533 {
12534 //Now put this command back on the avilable command list
12535 csrReleaseCommand(pMac, pCommand);
12536 }
12537 smeProcessPendingQueue( pMac );
12538 }
12539 else
12540 {
12541 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO Add sta session command are ACTIVE ...\n",
12542 __FUNCTION__);
12543 status = eHAL_STATUS_FAILURE;
12544 break;
12545 }
12546 }
12547 else
12548 {
12549 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
12550 __FUNCTION__);
12551 status = eHAL_STATUS_FAILURE;
12552 break;
12553 }
12554 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012555 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012556}
Jeff Johnson295189b2012-06-20 16:38:30 -070012557eHalStatus csrSendMBAddSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12558{
12559 tSirSmeAddStaSelfReq *pMsg;
12560 tANI_U16 msgLen;
12561 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012562 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012563 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12564 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012565 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12566 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012567 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012568 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ADD_STA_SELF_REQ);
12569 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012570 // self station address
12571 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012572 smsLog( pMac, LOG1, FL("selfMac=%02x, %02x, %02x, %02x, %02x, %02x"),
Jeff Johnson295189b2012-06-20 16:38:30 -070012573 pMsg->selfMacAddr[0],
12574 pMsg->selfMacAddr[1],
12575 pMsg->selfMacAddr[2],
12576 pMsg->selfMacAddr[3],
12577 pMsg->selfMacAddr[4],
12578 pMsg->selfMacAddr[5]);
12579 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012580 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012581 return( status );
12582}
Jeff Johnson295189b2012-06-20 16:38:30 -070012583eHalStatus csrIssueAddStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr sessionMacAddr)
12584{
12585 eHalStatus status = eHAL_STATUS_SUCCESS;
12586 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012587 pCommand = csrGetCommandBuffer(pMac);
12588 if(NULL == pCommand)
12589 {
12590 status = eHAL_STATUS_RESOURCES;
12591 }
12592 else
12593 {
12594 pCommand->command = eSmeCommandAddStaSession;
12595 pCommand->sessionId = (tANI_U8)sessionId;
12596 palCopyMemory( pMac->hHdd, pCommand->u.addStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012597 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12598 if( !HAL_STATUS_SUCCESS( status ) )
12599 {
12600 //Should be panic??
12601 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12602 }
12603 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012604 return (status);
12605}
Jeff Johnson295189b2012-06-20 16:38:30 -070012606eHalStatus csrProcessAddStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12607{
12608 return csrSendMBAddSelfStaReqMsg( pMac,
12609 pCommand->u.addStaSessionCmd.selfMacAddr );
12610}
Jeff Johnson295189b2012-06-20 16:38:30 -070012611eHalStatus csrRoamOpenSession( tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext,
12612 tANI_U8 *pSelfMacAddr, tANI_U8 *pbSessionId )
12613{
12614 eHalStatus status = eHAL_STATUS_SUCCESS;
12615 tANI_U32 i;
12616 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070012617 *pbSessionId = CSR_SESSION_ID_INVALID;
12618 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12619 {
12620 if( !CSR_IS_SESSION_VALID( pMac, i ) )
12621 {
12622 pSession = CSR_GET_SESSION( pMac, i );
12623 status = eHAL_STATUS_SUCCESS;
12624 pSession->sessionActive = eANI_BOOLEAN_TRUE;
12625 pSession->sessionId = (tANI_U8)i;
12626 pSession->callback = callback;
12627 pSession->pContext = pContext;
12628 palCopyMemory( pMac->hHdd, &pSession->selfMacAddr, pSelfMacAddr, sizeof(tCsrBssid) );
12629 *pbSessionId = (tANI_U8)i;
Jeff Johnson295189b2012-06-20 16:38:30 -070012630 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerRoaming, csrRoamRoamingTimerHandler,
12631 &pSession->roamingTimerInfo);
12632 if(!HAL_STATUS_SUCCESS(status))
12633 {
12634 smsLog(pMac, LOGE, FL("cannot allocate memory for Roaming timer\n"));
12635 break;
12636 }
12637#ifdef FEATURE_WLAN_BTAMP_UT_RF
12638 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerJoinRetry, csrRoamJoinRetryTimerHandler,
12639 &pSession->joinRetryTimerInfo);
12640 if(!HAL_STATUS_SUCCESS(status))
12641 {
12642 smsLog(pMac, LOGE, FL("cannot allocate memory for joinretry timer\n"));
12643 break;
12644 }
12645#endif
12646 pSession->ibssJoinTimerInfo.pMac = pMac;
12647 pSession->ibssJoinTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
Jeff Johnson295189b2012-06-20 16:38:30 -070012648 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerIbssJoining, csrRoamIbssJoinTimerHandler,
12649 &pSession->ibssJoinTimerInfo);
12650 if(!HAL_STATUS_SUCCESS(status))
12651 {
12652 smsLog(pMac, LOGE, FL("cannot allocate memory for IbssJoining timer\n"));
12653 break;
12654 }
12655 status = csrIssueAddStaForSessionReq ( pMac, i, pSelfMacAddr );
12656 break;
12657 }
12658 }
12659 if( CSR_ROAM_SESSION_MAX == i )
12660 {
12661 //No session is available
12662 status = eHAL_STATUS_RESOURCES;
12663 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012664 return ( status );
12665}
Jeff Johnson295189b2012-06-20 16:38:30 -070012666eHalStatus csrProcessDelStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12667{
12668 eHalStatus status = eHAL_STATUS_SUCCESS;
12669 tListElem *pEntry = NULL;
12670 tSmeCmd *pCommand = NULL;
12671 tSirSmeDelStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012672 do
12673 {
12674 if(pMsg == NULL)
12675 {
12676 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
12677 status = eHAL_STATUS_FAILURE;
12678 break;
12679 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012680 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12681 if(pEntry)
12682 {
12683 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12684 if(eSmeCommandDelStaSession == pCommand->command)
12685 {
12686 tANI_U8 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012687 pRsp = (tSirSmeDelStaSelfRsp*)pMsg;
12688 smsLog( pMac, LOG1, "Del Sta rsp status = %d\n", pRsp->status );
Jeff Johnson295189b2012-06-20 16:38:30 -070012689 //This session is done.
12690 csrCleanupSession(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012691 if(pCommand->u.delStaSessionCmd.callback)
12692 {
12693
12694 status = sme_ReleaseGlobalLock( &pMac->sme );
12695 if ( HAL_STATUS_SUCCESS( status ) )
12696 {
12697 pCommand->u.delStaSessionCmd.callback(
12698 pCommand->u.delStaSessionCmd.pContext);
12699 status = sme_AcquireGlobalLock( &pMac->sme );
12700 if (! HAL_STATUS_SUCCESS( status ) )
12701 {
12702 smsLog(pMac, LOGP, "%s: Failed to Acquire Lock\n", __FUNCTION__);
12703 return status;
12704 }
12705 }
12706 else {
12707 smsLog(pMac, LOGE, "%s: Failed to Release Lock\n", __FUNCTION__);
12708 }
12709 }
12710
12711 //Remove this command out of the active list
12712 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12713 {
12714 //Now put this command back on the avilable command list
12715 csrReleaseCommand(pMac, pCommand);
12716 }
12717 smeProcessPendingQueue( pMac );
12718 }
12719 else
12720 {
12721 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO Del sta session command are ACTIVE ...\n",
12722 __FUNCTION__);
12723 status = eHAL_STATUS_FAILURE;
12724 break;
12725 }
12726 }
12727 else
12728 {
12729 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
12730 __FUNCTION__);
12731 status = eHAL_STATUS_FAILURE;
12732 break;
12733 }
12734 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012735 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012736}
Jeff Johnson295189b2012-06-20 16:38:30 -070012737eHalStatus csrSendMBDelSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12738{
12739 tSirSmeDelStaSelfReq *pMsg;
12740 tANI_U16 msgLen;
12741 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012742 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012743 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12744 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012745 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12746 if ( !HAL_STATUS_SUCCESS(status) ) break;
12747
12748 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012749 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEL_STA_SELF_REQ);
12750 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012751 // self station address
12752 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012753 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012754 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012755 return( status );
12756}
Jeff Johnson295189b2012-06-20 16:38:30 -070012757eHalStatus csrIssueDelStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId,
12758 tSirMacAddr sessionMacAddr,
12759 csrRoamSessionCloseCallback callback,
12760 void *pContext)
12761{
12762 eHalStatus status = eHAL_STATUS_SUCCESS;
12763 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012764 pCommand = csrGetCommandBuffer(pMac);
12765 if(NULL == pCommand)
12766 {
12767 status = eHAL_STATUS_RESOURCES;
12768 }
12769 else
12770 {
12771 pCommand->command = eSmeCommandDelStaSession;
12772 pCommand->sessionId = (tANI_U8)sessionId;
12773 pCommand->u.delStaSessionCmd.callback = callback;
12774 pCommand->u.delStaSessionCmd.pContext = pContext;
12775 palCopyMemory( pMac->hHdd, pCommand->u.delStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012776 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12777 if( !HAL_STATUS_SUCCESS( status ) )
12778 {
12779 //Should be panic??
12780 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12781 }
12782 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012783 return (status);
12784}
Jeff Johnson295189b2012-06-20 16:38:30 -070012785eHalStatus csrProcessDelStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12786{
12787 return csrSendMBDelSelfStaReqMsg( pMac,
12788 pCommand->u.delStaSessionCmd.selfMacAddr );
12789}
Jeff Johnson295189b2012-06-20 16:38:30 -070012790static void purgeCsrSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId)
12791{
12792 tDblLinkList *pList = &pMac->roam.roamCmdPendingList;
12793 tListElem *pEntry, *pNext;
12794 tSmeCmd *pCommand;
12795 tDblLinkList localList;
12796
12797 vos_mem_zero(&localList, sizeof(tDblLinkList));
12798 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
12799 {
12800 smsLog(pMac, LOGE, FL(" failed to open list"));
12801 return;
12802 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012803 csrLLLock(pList);
12804 pEntry = csrLLPeekHead(pList, LL_ACCESS_NOLOCK);
12805 while(pEntry != NULL)
12806 {
12807 pNext = csrLLNext(pList, pEntry, LL_ACCESS_NOLOCK);
12808 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12809 if(pCommand->sessionId == sessionId)
12810 {
12811 if(csrLLRemoveEntry(pList, pEntry, LL_ACCESS_NOLOCK))
12812 {
12813 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
12814 }
12815 }
12816 pEntry = pNext;
12817 }
12818 csrLLUnlock(pList);
12819
12820 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
12821 {
12822 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12823 csrAbortCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
12824 }
12825 csrLLClose(&localList);
12826}
12827
Jeff Johnson295189b2012-06-20 16:38:30 -070012828void csrCleanupSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
12829{
12830 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12831 {
12832 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012833 csrRoamStop(pMac, sessionId);
12834 csrFreeConnectBssDesc(pMac, sessionId);
12835 csrRoamFreeConnectProfile( pMac, &pSession->connectedProfile );
12836 csrRoamFreeConnectedInfo ( pMac, &pSession->connectedInfo);
12837 palTimerFree(pMac->hHdd, pSession->hTimerRoaming);
12838#ifdef FEATURE_WLAN_BTAMP_UT_RF
12839 palTimerFree(pMac->hHdd, pSession->hTimerJoinRetry);
12840#endif
12841 palTimerFree(pMac->hHdd, pSession->hTimerIbssJoining);
12842 purgeSmeSessionCmdList(pMac, sessionId);
12843 purgeCsrSessionCmdList(pMac, sessionId);
12844 csrInitSession(pMac, sessionId);
12845 }
12846}
12847
Jeff Johnson295189b2012-06-20 16:38:30 -070012848eHalStatus csrRoamCloseSession( tpAniSirGlobal pMac, tANI_U32 sessionId,
12849 tANI_BOOLEAN fSync,
12850 csrRoamSessionCloseCallback callback,
12851 void *pContext )
12852{
12853 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -070012854 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12855 {
12856 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12857 if(fSync)
12858 {
12859 csrCleanupSession(pMac, sessionId);
12860 }
12861 else
12862 {
12863 purgeSmeSessionCmdList(pMac, sessionId);
12864 purgeCsrSessionCmdList(pMac, sessionId);
12865 status = csrIssueDelStaForSessionReq( pMac, sessionId,
12866 pSession->selfMacAddr, callback, pContext);
12867 }
12868 }
12869 else
12870 {
12871 status = eHAL_STATUS_INVALID_PARAMETER;
12872 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012873 return ( status );
12874}
12875
Jeff Johnson295189b2012-06-20 16:38:30 -070012876static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId )
12877{
12878 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012879
12880 if(!pSession)
12881 {
12882 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12883 return;
12884 }
12885
Jeff Johnson295189b2012-06-20 16:38:30 -070012886 pSession->sessionActive = eANI_BOOLEAN_FALSE;
12887 pSession->sessionId = CSR_SESSION_ID_INVALID;
12888 pSession->callback = NULL;
12889 pSession->pContext = NULL;
12890 pSession->ibss_join_pending = FALSE;
12891 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
12892 // TODO : Confirm pMac->roam.fReadyForPowerSave = eANI_BOOLEAN_FALSE;
12893 csrFreeRoamProfile( pMac, sessionId );
12894 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
12895 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
12896 csrFreeConnectBssDesc(pMac, sessionId);
12897 csrScanEnable(pMac);
12898 palZeroMemory( pMac->hHdd, &pSession->selfMacAddr, sizeof(tCsrBssid) );
12899 if(pSession->pWpaRsnReqIE)
12900 {
12901 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
12902 pSession->pWpaRsnReqIE = NULL;
12903 }
12904 pSession->nWpaRsnReqIeLength = 0;
12905 if(pSession->pWpaRsnRspIE)
12906 {
12907 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
12908 pSession->pWpaRsnRspIE = NULL;
12909 }
12910 pSession->nWpaRsnRspIeLength = 0;
12911#ifdef FEATURE_WLAN_WAPI
12912 if(pSession->pWapiReqIE)
12913 {
12914 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
12915 pSession->pWapiReqIE = NULL;
12916 }
12917 pSession->nWapiReqIeLength = 0;
12918 if(pSession->pWapiRspIE)
12919 {
12920 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
12921 pSession->pWapiRspIE = NULL;
12922 }
12923 pSession->nWapiRspIeLength = 0;
12924#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070012925 if(pSession->pAddIEScan)
12926 {
12927 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
12928 pSession->pAddIEScan = NULL;
12929 }
12930 pSession->nAddIEScanLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012931 if(pSession->pAddIEAssoc)
12932 {
12933 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
12934 pSession->pAddIEAssoc = NULL;
12935}
12936 pSession->nAddIEAssocLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012937}
12938
Jeff Johnson295189b2012-06-20 16:38:30 -070012939eHalStatus csrRoamGetSessionIdFromBSSID( tpAniSirGlobal pMac, tCsrBssid *bssid, tANI_U32 *pSessionId )
12940{
12941 eHalStatus status = eHAL_STATUS_FAILURE;
12942 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070012943 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12944 {
12945 if( CSR_IS_SESSION_VALID( pMac, i ) )
12946 {
12947 if( csrIsMacAddressEqual( pMac, bssid, &pMac->roam.roamSession[i].connectedProfile.bssid ) )
12948 {
12949 //Found it
12950 status = eHAL_STATUS_SUCCESS;
12951 *pSessionId = i;
12952 break;
12953 }
12954 }
12955 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012956 return( status );
12957}
12958
Jeff Johnson295189b2012-06-20 16:38:30 -070012959//This function assumes that we only support one IBSS session. We cannot use BSSID to identify
12960//session because for IBSS, the bssid changes.
12961static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac )
12962{
12963 tANI_U32 i, nRet = CSR_SESSION_ID_INVALID;
12964 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070012965 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12966 {
12967 if( CSR_IS_SESSION_VALID( pMac, i ) )
12968 {
12969 pSession = CSR_GET_SESSION( pMac, i );
12970 if( pSession->pCurRoamProfile && ( csrIsBssTypeIBSS( pSession->connectedProfile.BSSType ) ) )
12971 {
12972 //Found it
12973 nRet = i;
12974 break;
12975 }
12976 }
12977 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012978 return (nRet);
12979}
Jeff Johnson295189b2012-06-20 16:38:30 -070012980static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid)
12981{
12982 /* Update the current BSS info in ho control block based on connected
12983 profile info from pmac global structure */
12984
Jeff Johnson295189b2012-06-20 16:38:30 -070012985 smsLog(pMac, LOGW, " csrRoamLinkUp: WLAN link UP with AP= %02x-%02x-%02x-%02x-%02x-%02x\n",
12986 bssid[ 0 ], bssid[ 1 ], bssid[ 2 ],
12987 bssid[ 3 ], bssid[ 4 ], bssid[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -070012988 /* Check for user misconfig of RSSI trigger threshold */
12989 pMac->roam.configParam.vccRssiThreshold =
12990 ( 0 == pMac->roam.configParam.vccRssiThreshold ) ?
12991 CSR_VCC_RSSI_THRESHOLD : pMac->roam.configParam.vccRssiThreshold;
12992 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
Jeff Johnson295189b2012-06-20 16:38:30 -070012993 /* Check for user misconfig of UL MAC Loss trigger threshold */
12994 pMac->roam.configParam.vccUlMacLossThreshold =
12995 ( 0 == pMac->roam.configParam.vccUlMacLossThreshold ) ?
12996 CSR_VCC_UL_MAC_LOSS_THRESHOLD : pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070012997#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
12998 {
12999 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013000 /* Indicate the neighbor roal algorithm about the connect indication */
13001 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssid, &sessionId);
13002 csrNeighborRoamIndicateConnect(pMac, sessionId, VOS_STATUS_SUCCESS);
13003 }
13004#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070013005}
13006
Jeff Johnson295189b2012-06-20 16:38:30 -070013007static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId)
13008{
13009 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070013010
13011 if(!pSession)
13012 {
13013 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
13014 return;
13015 }
13016
Jeff Johnson295189b2012-06-20 16:38:30 -070013017 //Only to handle the case for Handover on infra link
13018 if( eCSR_BSS_TYPE_INFRASTRUCTURE != pSession->connectedProfile.BSSType )
13019 {
13020 return;
13021 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013022 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
13023 csrRoamDeregStatisticsReq(pMac);
13024 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13025#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13026 /* Indicate the neighbor roal algorithm about the disconnect indication */
13027 csrNeighborRoamIndicateDisconnect(pMac, sessionId);
13028#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070013029
13030 //Remove this code once SLM_Sessionization is supported
13031 //BMPS_WORKAROUND_NOT_NEEDED
13032 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -070013033 csrIsInfraApStarted( pMac ) &&
13034 pMac->roam.configParam.doBMPSWorkaround)
Jeff Johnsone7245742012-09-05 17:12:55 -070013035 {
13036 pMac->roam.configParam.doBMPSWorkaround = 0;
13037 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013038}
13039
Jeff Johnson295189b2012-06-20 16:38:30 -070013040void csrRoamTlStatsTimerHandler(void *pv)
13041{
13042 tpAniSirGlobal pMac = PMAC_STRUCT( pv );
13043 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013044 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13045
Jeff Johnsone7245742012-09-05 17:12:55 -070013046 smsLog(pMac, LOG1, FL(" TL stat timer is no-op. It needs to support multiple stations"));
13047
Jeff Johnson295189b2012-06-20 16:38:30 -070013048#if 0
13049 // TODO Persession .???
13050 //req TL for stats
13051 if(WLANTL_GetStatistics(pMac->roam.gVosContext, &tlStats, pMac->roam.connectedInfo.staId))
13052 {
13053 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:couldn't get the stats from TL\n"));
13054 }
13055 else
13056 {
13057 //save in SME
13058 csrRoamSaveStatsFromTl(pMac, tlStats);
13059 }
13060#endif
13061 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13062 {
13063 if(pMac->roam.tlStatsReqInfo.periodicity)
13064 {
13065 //start timer
13066 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13067 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13068 if(!HAL_STATUS_SUCCESS(status))
13069 {
13070 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:cannot start TlStatsTimer timer\n"));
13071 return;
13072 }
13073 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13074 }
13075 }
13076}
Jeff Johnson295189b2012-06-20 16:38:30 -070013077void csrRoamPeStatsTimerHandler(void *pv)
13078{
13079 tCsrPeStatsReqInfo *pPeStatsReqListEntry = (tCsrPeStatsReqInfo *)pv;
13080 eHalStatus status;
13081 tpAniSirGlobal pMac = pPeStatsReqListEntry->pMac;
13082 VOS_STATUS vosStatus;
13083 tPmcPowerState powerState;
Jeff Johnson295189b2012-06-20 16:38:30 -070013084 pPeStatsReqListEntry->timerRunning = FALSE;
13085 if( pPeStatsReqListEntry->timerStopFailed == TRUE )
13086 {
13087 // If we entered here, meaning the timer could not be successfully
13088 // stopped in csrRoamRemoveEntryFromPeStatsReqList(). So do it here.
13089
13090 /* Destroy the timer */
13091 vosStatus = vos_timer_destroy( &pPeStatsReqListEntry->hPeStatsTimer );
13092 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13093 {
13094 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to destroy hPeStatsTimer timer\n"));
13095 }
13096
13097 // Free the entry
13098 palFreeMemory(pMac->hHdd, pPeStatsReqListEntry);
13099 pPeStatsReqListEntry = NULL;
13100 }
13101 else
13102 {
13103 if(!pPeStatsReqListEntry->rspPending)
13104 {
13105 status = csrSendMBStatsReqMsg(pMac, pPeStatsReqListEntry->statsMask & ~(1 << eCsrGlobalClassDStats),
13106 pPeStatsReqListEntry->staId);
13107 if(!HAL_STATUS_SUCCESS(status))
13108 {
13109 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to send down stats req to PE\n"));
13110 }
13111 else
13112 {
13113 pPeStatsReqListEntry->rspPending = TRUE;
13114 }
13115 }
13116
13117 //send down a req
13118 if(pPeStatsReqListEntry->periodicity &&
13119 (VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pPeStatsReqListEntry->hPeStatsTimer)))
13120 {
13121 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
13122 if(ePMC_FULL_POWER == powerState)
13123 {
13124 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
13125 {
13126 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
13127 }
13128 }
13129 else
13130 {
13131 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
13132 {
13133 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
13134 }
13135 }
13136 //start timer
13137 vosStatus = vos_timer_start( &pPeStatsReqListEntry->hPeStatsTimer, pPeStatsReqListEntry->periodicity );
13138 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13139 {
13140 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:cannot start hPeStatsTimer timer\n"));
13141 return;
13142 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013143 pPeStatsReqListEntry->timerRunning = TRUE;
13144
13145 }
13146
13147 }
13148}
Jeff Johnson295189b2012-06-20 16:38:30 -070013149void csrRoamStatsClientTimerHandler(void *pv)
13150{
13151 tCsrStatsClientReqInfo *pStaEntry = (tCsrStatsClientReqInfo *)pv;
Jeff Johnson295189b2012-06-20 16:38:30 -070013152 if(VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pStaEntry->timer))
13153 {
13154#if 0
13155 // TODO Stats fix for multisession
13156 //start the timer
13157 vosStatus = vos_timer_start( &pStaEntry->timer, pStaEntry->periodicity );
13158
13159 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13160 {
13161 smsLog(pStaEntry->pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013162 }
13163#endif
13164 }
13165#if 0
13166 //send up the stats report
13167 csrRoamReportStatistics(pStaEntry->pMac, pStaEntry->statsMask, pStaEntry->callback,
13168 pStaEntry->staId, pStaEntry->pContext);
13169#endif
13170}
13171
13172
13173
Jeff Johnson295189b2012-06-20 16:38:30 -070013174eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId)
13175{
13176 tAniGetPEStatsReq *pMsg;
13177 eHalStatus status = eHAL_STATUS_SUCCESS;
13178 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetPEStatsReq));
13179 if ( !HAL_STATUS_SUCCESS(status) )
13180 {
13181 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to allocate mem for stats req \n");
13182 return status;
13183 }
13184 // need to initiate a stats request to PE
13185 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_STATISTICS_REQ);
13186 pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
13187 pMsg->staId = staId;
13188 pMsg->statsMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070013189 status = palSendMBMessage(pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070013190 if(!HAL_STATUS_SUCCESS(status))
13191 {
13192 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to send down the stats req \n");
13193 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013194 return status;
13195}
Jeff Johnson295189b2012-06-20 16:38:30 -070013196void csrRoamStatsRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg)
13197{
13198 tAniGetPEStatsRsp *pSmeStatsRsp;
13199 eHalStatus status = eHAL_STATUS_FAILURE;
13200 tListElem *pEntry = NULL;
13201 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
13202 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13203 tANI_U32 tempMask = 0;
13204 tANI_U8 counter = 0;
13205 tANI_U8 *pStats = NULL;
13206 tANI_U32 length = 0;
13207 v_PVOID_t pvosGCtx;
13208 v_S7_t rssi = 0;
13209 tANI_U32 *pRssi = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013210 pSmeStatsRsp = (tAniGetPEStatsRsp *)pSirMsg;
13211 if(pSmeStatsRsp->rc)
13212 {
13213 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:stats rsp from PE shows failure\n"));
13214 goto post_update;
13215 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013216 tempMask = pSmeStatsRsp->statsMask;
13217 pStats = ((tANI_U8 *)&pSmeStatsRsp->statsMask) + sizeof(pSmeStatsRsp->statsMask);
Jeff Johnson295189b2012-06-20 16:38:30 -070013218 /* subtract all statistics from this length, and after processing the entire
13219 * 'stat' part of the message, if the length is not zero, then rssi is piggy packed
13220 * in this 'stats' message.
13221 */
13222 length = pSmeStatsRsp->msgLen - sizeof(tAniGetPEStatsRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070013223 //new stats info from PE, fill up the stats strucutres in PMAC
13224 while(tempMask)
13225 {
13226 if(tempMask & 1)
13227 {
13228 switch(counter)
13229 {
13230 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013231 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013232 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
13233 pStats, sizeof(tCsrSummaryStatsInfo));
13234 if(!HAL_STATUS_SUCCESS(status))
13235 {
13236 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy summary stats\n"));
13237 }
13238 pStats += sizeof(tCsrSummaryStatsInfo);
13239 length -= sizeof(tCsrSummaryStatsInfo);
13240 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013241 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013242 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013243 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classAStatsInfo,
13244 pStats, sizeof(tCsrGlobalClassAStatsInfo));
13245 if(!HAL_STATUS_SUCCESS(status))
13246 {
13247 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassA stats\n"));
13248 }
13249 pStats += sizeof(tCsrGlobalClassAStatsInfo);
13250 length -= sizeof(tCsrGlobalClassAStatsInfo);
13251 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013252 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013253 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013254 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classBStatsInfo,
13255 pStats, sizeof(tCsrGlobalClassBStatsInfo));
13256 if(!HAL_STATUS_SUCCESS(status))
13257 {
13258 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassB stats\n"));
13259 }
13260 pStats += sizeof(tCsrGlobalClassBStatsInfo);
13261 length -= sizeof(tCsrGlobalClassBStatsInfo);
13262 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013263 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013264 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013265 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classCStatsInfo,
13266 pStats, sizeof(tCsrGlobalClassCStatsInfo));
13267 if(!HAL_STATUS_SUCCESS(status))
13268 {
13269 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassC stats\n"));
13270 }
13271 pStats += sizeof(tCsrGlobalClassCStatsInfo);
13272 length -= sizeof(tCsrGlobalClassCStatsInfo);
13273 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013274 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013275 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013276 if( CSR_MAX_STA > pSmeStatsRsp->staId )
13277 {
13278 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.perStaStatsInfo[pSmeStatsRsp->staId],
13279 pStats, sizeof(tCsrPerStaStatsInfo));
13280 }
13281 else
13282 {
13283 status = eHAL_STATUS_FAILURE;
13284 smsLog( pMac, LOGE, FL("csrRoamStatsRspProcessor:out bound staId:%d\n"), pSmeStatsRsp->staId);
13285 VOS_ASSERT( 0 );
13286 }
13287 if(!HAL_STATUS_SUCCESS(status))
13288 {
13289 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy PerSta stats\n"));
13290 }
13291 pStats += sizeof(tCsrPerStaStatsInfo);
13292 length -= sizeof(tCsrPerStaStatsInfo);
13293 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013294 default:
13295 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:unknown stats type\n"));
13296 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013297 }
13298 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013299 tempMask >>=1;
13300 counter++;
13301 }
13302 pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
13303 if (length != 0)
13304 {
13305 pRssi = (tANI_U32*)pStats;
13306 rssi = (v_S7_t)*pRssi;
13307 }
13308 else
13309 {
13310 /* If riva is not sending rssi, continue to use the hack */
13311 rssi = RSSI_HACK_BMPS;
13312 }
13313 WDA_UpdateRssiBmps(pvosGCtx, pSmeStatsRsp->staId, rssi);
Jeff Johnson295189b2012-06-20 16:38:30 -070013314post_update:
13315 //make sure to update the pe stats req list
13316 pEntry = csrRoamFindInPeStatsReqList(pMac, pSmeStatsRsp->statsMask);
13317 if(pEntry)
13318 {
13319 pPeStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
13320 pPeStaEntry->rspPending = FALSE;
13321
13322 }
13323 //check the one timer cases
13324 pEntry = csrRoamCheckClientReqList(pMac, pSmeStatsRsp->statsMask);
13325 if(pEntry)
13326 {
Jeff Johnson295189b2012-06-20 16:38:30 -070013327 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013328 if(pTempStaEntry->timerExpired)
13329 {
13330 //send up the stats report
13331 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
13332 pTempStaEntry->staId, pTempStaEntry->pContext);
13333 //also remove from the client list
13334 csrRoamRemoveStatListEntry(pMac, pEntry);
13335 pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013336 }
13337 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013338}
Jeff Johnson295189b2012-06-20 16:38:30 -070013339tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13340{
13341 tListElem *pEntry = NULL;
13342 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013343 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013344 if(!pEntry)
13345 {
13346 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013347 smsLog(pMac, LOG2, "csrRoamFindInPeStatsReqList: List empty, no request to PE\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013348 return NULL;
13349 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013350 while( pEntry )
13351 {
13352 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013353 if(pTempStaEntry->statsMask == statsMask)
13354 {
Mohit Khanna23863762012-09-11 17:40:09 -070013355 smsLog(pMac, LOG3, "csrRoamFindInPeStatsReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013356 break;
13357 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013358 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
13359 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013360 return pEntry;
13361}
13362
Jeff Johnson295189b2012-06-20 16:38:30 -070013363tListElem * csrRoamChecknUpdateClientReqList(tpAniSirGlobal pMac, tCsrStatsClientReqInfo *pStaEntry,
13364 tANI_BOOLEAN update)
13365{
13366 tListElem *pEntry;
13367 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013368 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013369 if(!pEntry)
13370 {
13371 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013372 smsLog(pMac, LOG2, "csrRoamChecknUpdateClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013373 "upper layer client(s)\n");
13374 return NULL;
13375 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013376 while( pEntry )
13377 {
13378 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013379 if((pTempStaEntry->requesterId == pStaEntry->requesterId) &&
13380 (pTempStaEntry->statsMask == pStaEntry->statsMask))
13381 {
Mohit Khanna23863762012-09-11 17:40:09 -070013382 smsLog(pMac, LOG3, "csrRoamChecknUpdateClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013383 if(update)
13384 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013385 pTempStaEntry->periodicity = pStaEntry->periodicity;
13386 pTempStaEntry->callback = pStaEntry->callback;
13387 pTempStaEntry->pContext = pStaEntry->pContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013388 }
13389 break;
13390 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013391 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13392 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013393 return pEntry;
13394}
Jeff Johnson295189b2012-06-20 16:38:30 -070013395tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13396{
13397 tListElem *pEntry;
13398 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013399 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013400 if(!pEntry)
13401 {
13402 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013403 smsLog(pMac, LOG2, "csrRoamCheckClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013404 "upper layer client(s)\n");
13405 return NULL;
13406 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013407 while( pEntry )
13408 {
13409 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013410 if((pTempStaEntry->statsMask & ~(1 << eCsrGlobalClassDStats)) == statsMask)
13411 {
Mohit Khanna23863762012-09-11 17:40:09 -070013412 smsLog(pMac, LOG3, "csrRoamCheckClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013413 break;
13414 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013415 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13416 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013417 return pEntry;
13418}
Jeff Johnson295189b2012-06-20 16:38:30 -070013419eHalStatus csrRoamRegisterLinkQualityIndCallback(tpAniSirGlobal pMac,
13420 csrRoamLinkQualityIndCallback callback,
13421 void *pContext)
13422{
13423 pMac->roam.linkQualityIndInfo.callback = callback;
13424 pMac->roam.linkQualityIndInfo.context = pContext;
13425 if( NULL == callback )
13426 {
13427 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being deregistered");
13428 }
13429 else
13430 {
13431 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being registered");
Jeff Johnson295189b2012-06-20 16:38:30 -070013432 /* do we need to invoke the callback to notify client of initial value ?? */
13433 }
13434 return eHAL_STATUS_SUCCESS;
13435}
Jeff Johnson295189b2012-06-20 16:38:30 -070013436void csrRoamVccTrigger(tpAniSirGlobal pMac)
13437{
13438 eCsrRoamLinkQualityInd newVccLinkQuality;
13439 tANI_U32 ul_mac_loss = 0;
13440 tANI_U32 ul_mac_loss_trigger_threshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013441 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
13442 /*-------------------------------------------------------------------------
13443 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013444 Check for a change in link quality and notify client if necessary
13445 -------------------------------------------------------------------------*/
13446 ul_mac_loss_trigger_threshold =
13447 pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013448 VOS_ASSERT( ul_mac_loss_trigger_threshold != 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070013449 smsLog(pMac, LOGW, "csrRoamVccTrigger: UL_MAC_LOSS_THRESHOLD is %d\n",
13450 ul_mac_loss_trigger_threshold );
Jeff Johnson295189b2012-06-20 16:38:30 -070013451 if(ul_mac_loss_trigger_threshold < ul_mac_loss)
13452 {
13453 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is POOR \n");
13454 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13455 }
13456 else
13457 {
13458 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is GOOD\n");
13459 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13460 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013461 smsLog(pMac, LOGW, "csrRoamVccTrigger: link qual : *** UL_MAC_LOSS %d *** ",
13462 ul_mac_loss);
Jeff Johnson295189b2012-06-20 16:38:30 -070013463 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13464 {
13465 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality changed: trigger necessary\n");
13466 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13467 {
13468 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality indication %d\n",
13469 newVccLinkQuality );
13470
13471 /* we now invoke the callback once to notify client of initial value */
13472 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13473 pMac->roam.linkQualityIndInfo.context );
13474 //event: EVENT_WLAN_VCC
13475 }
13476 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013477 pMac->roam.vccLinkQuality = newVccLinkQuality;
13478
Jeff Johnson295189b2012-06-20 16:38:30 -070013479}
Jeff Johnson295189b2012-06-20 16:38:30 -070013480VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal,
13481 v_U8_t rssiNotification,
13482 void * context)
13483{
13484 tpAniSirGlobal pMac = PMAC_STRUCT( context );
13485 eCsrRoamLinkQualityInd newVccLinkQuality;
13486 // TODO : Session info unavailable
13487 tANI_U32 sessionId = 0;
13488 VOS_STATUS status = VOS_STATUS_SUCCESS;
13489 /*-------------------------------------------------------------------------
13490 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013491 Check for a change in link quality and notify client if necessary
13492 -------------------------------------------------------------------------*/
13493 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: RSSI trigger threshold is %d\n",
13494 pMac->roam.configParam.vccRssiThreshold);
13495 if(!csrIsConnStateConnectedInfra(pMac, sessionId))
13496 {
13497 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: ignoring the indication as we are not connected\n");
13498 return VOS_STATUS_SUCCESS;
13499 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013500 if(WLANTL_HO_THRESHOLD_DOWN == rssiNotification)
13501 {
13502 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is POOR\n");
13503 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13504 }
13505 else if(WLANTL_HO_THRESHOLD_UP == rssiNotification)
13506 {
13507 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is GOOD \n");
13508 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13509 }
13510 else
13511 {
13512 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: unknown rssi notification %d\n", rssiNotification);
13513 //Set to this so the code below won't do anything
13514 newVccLinkQuality = pMac->roam.vccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013515 VOS_ASSERT(0);
13516 }
13517
Jeff Johnson295189b2012-06-20 16:38:30 -070013518 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13519 {
13520 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality changed: trigger necessary\n");
13521 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13522 {
13523 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality indication %d\n",
13524 newVccLinkQuality);
Jeff Johnson295189b2012-06-20 16:38:30 -070013525 /* we now invoke the callback once to notify client of initial value */
13526 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13527 pMac->roam.linkQualityIndInfo.context );
13528 //event: EVENT_WLAN_VCC
13529 }
13530 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013531 pMac->roam.vccLinkQuality = newVccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013532 return status;
13533}
Jeff Johnson295189b2012-06-20 16:38:30 -070013534tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
13535 tDblLinkList *pStaList,
13536 tCsrStatsClientReqInfo *pStaEntry)
13537{
13538 tCsrStatsClientReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013539 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013540 //if same entity requested for same set of stats with different periodicity &
13541 // callback update it
13542 if(NULL == csrRoamChecknUpdateClientReqList(pMac, pStaEntry, TRUE))
13543 {
13544
13545 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrStatsClientReqInfo));
13546 if (!HAL_STATUS_SUCCESS(status))
13547 {
13548 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoList: couldn't allocate memory for the "
13549 "entry\n");
13550 return NULL;
13551 }
13552
Jeff Johnson295189b2012-06-20 16:38:30 -070013553 pNewStaEntry->callback = pStaEntry->callback;
13554 pNewStaEntry->pContext = pStaEntry->pContext;
13555 pNewStaEntry->periodicity = pStaEntry->periodicity;
13556 pNewStaEntry->requesterId = pStaEntry->requesterId;
13557 pNewStaEntry->statsMask = pStaEntry->statsMask;
13558 pNewStaEntry->pPeStaEntry = pStaEntry->pPeStaEntry;
13559 pNewStaEntry->pMac = pStaEntry->pMac;
13560 pNewStaEntry->staId = pStaEntry->staId;
13561 pNewStaEntry->timerExpired = pStaEntry->timerExpired;
13562
13563 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
13564 }
13565 return pNewStaEntry;
13566}
13567
Jeff Johnson295189b2012-06-20 16:38:30 -070013568tCsrPeStatsReqInfo * csrRoamInsertEntryIntoPeStatsReqList( tpAniSirGlobal pMac,
13569 tDblLinkList *pStaList,
13570 tCsrPeStatsReqInfo *pStaEntry)
13571{
13572 tCsrPeStatsReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013573 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013574 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrPeStatsReqInfo));
13575 if (!HAL_STATUS_SUCCESS(status))
13576 {
13577 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoPeStatsReqList: couldn't allocate memory for the "
13578 "entry\n");
13579 return NULL;
13580 }
13581
Jeff Johnson295189b2012-06-20 16:38:30 -070013582 pNewStaEntry->hPeStatsTimer = pStaEntry->hPeStatsTimer;
13583 pNewStaEntry->numClient = pStaEntry->numClient;
13584 pNewStaEntry->periodicity = pStaEntry->periodicity;
13585 pNewStaEntry->statsMask = pStaEntry->statsMask;
13586 pNewStaEntry->pMac = pStaEntry->pMac;
13587 pNewStaEntry->staId = pStaEntry->staId;
13588 pNewStaEntry->timerRunning = pStaEntry->timerRunning;
13589 pNewStaEntry->rspPending = pStaEntry->rspPending;
13590
13591 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013592 return pNewStaEntry;
13593}
Jeff Johnson295189b2012-06-20 16:38:30 -070013594eHalStatus csrGetRssi(tpAniSirGlobal pMac,
13595 tCsrRssiCallback callback,
13596 tANI_U8 staId, tCsrBssid bssId, void *pContext, void* pVosContext)
13597{
13598 eHalStatus status = eHAL_STATUS_SUCCESS;
13599 vos_msg_t msg;
13600 tANI_U32 sessionId;
13601
13602 tAniGetRssiReq *pMsg;
13603 smsLog(pMac, LOG2, FL("called"));
13604 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetRssiReq));
13605 if ( !HAL_STATUS_SUCCESS(status) )
13606 {
13607 smsLog(pMac, LOGE, " csrGetRssi: failed to allocate mem for req \n");
13608 return status;
13609 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013610 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssId, &sessionId);
13611
13612 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_RSSI_REQ);
13613 pMsg->msgLen = (tANI_U16)sizeof(tAniGetRssiReq);
13614 pMsg->sessionId = sessionId;
13615 pMsg->staId = staId;
13616 pMsg->rssiCallback = callback;
13617 pMsg->pDevContext = pContext;
13618 pMsg->pVosContext = pVosContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013619 msg.type = eWNI_SME_GET_RSSI_REQ;
13620 msg.bodyptr = pMsg;
13621 msg.reserved = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013622 if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
13623 {
13624 smsLog(pMac, LOGE, " csrGetRssi failed to post msg to self \n");
13625 palFreeMemory(pMac->hHdd, (void *)pMsg);
13626 status = eHAL_STATUS_FAILURE;
13627 }
13628 smsLog(pMac, LOG2, FL("returned"));
13629 return status;
13630}
Jeff Johnson295189b2012-06-20 16:38:30 -070013631eHalStatus csrGetStatistics(tpAniSirGlobal pMac, eCsrStatsRequesterType requesterId,
13632 tANI_U32 statsMask,
13633 tCsrStatsCallback callback,
13634 tANI_U32 periodicity, tANI_BOOLEAN cache,
13635 tANI_U8 staId, void *pContext)
13636{
13637 tCsrStatsClientReqInfo staEntry;
13638 tCsrStatsClientReqInfo *pStaEntry = NULL;
13639 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13640 tListElem *pEntry = NULL;
13641 tANI_BOOLEAN found = FALSE;
13642 eHalStatus status = eHAL_STATUS_SUCCESS;
13643 tANI_BOOLEAN insertInClientList = FALSE;
13644 VOS_STATUS vosStatus;
Jeff Johnsone7245742012-09-05 17:12:55 -070013645 WLANTL_TRANSFER_STA_TYPE *pTlStats;
Jeff Johnson295189b2012-06-20 16:38:30 -070013646
13647 if( csrIsAllSessionDisconnected(pMac) )
13648 {
13649 //smsLog(pMac, LOGW, "csrGetStatistics: wrong state curState(%d) not connected\n", pMac->roam.curState);
13650 return eHAL_STATUS_FAILURE;
13651 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013652 if((!statsMask) && (!callback))
13653 {
13654 //msg
13655 smsLog(pMac, LOGW, "csrGetStatistics: statsMask & callback empty in the request\n");
13656 return eHAL_STATUS_FAILURE;
13657 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013658 //for the search list method for deregister
13659 staEntry.requesterId = requesterId;
13660 staEntry.statsMask = statsMask;
13661 //requester wants to deregister or just an error
13662 if((statsMask) && (!callback))
13663 {
13664 pEntry = csrRoamChecknUpdateClientReqList(pMac, &staEntry, FALSE);
13665 if(!pEntry)
13666 {
13667 //msg
13668 smsLog(pMac, LOGW, "csrGetStatistics: callback is empty in the request & couldn't "
13669 "find any existing request in statsClientReqList\n");
13670 return eHAL_STATUS_FAILURE;
13671 }
13672 else
13673 {
13674 //clean up & return
13675 pStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnsond13512a2012-07-17 11:42:19 -070013676 if(NULL != pStaEntry->pPeStaEntry)
Jeff Johnson295189b2012-06-20 16:38:30 -070013677 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013678 pStaEntry->pPeStaEntry->numClient--;
13679 //check if we need to delete the entry from peStatsReqList too
13680 if(!pStaEntry->pPeStaEntry->numClient)
13681 {
13682 csrRoamRemoveEntryFromPeStatsReqList(pMac, pStaEntry->pPeStaEntry);
13683 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013684 }
Jeff Johnsond13512a2012-07-17 11:42:19 -070013685
Jeff Johnson295189b2012-06-20 16:38:30 -070013686 //check if we need to stop the tl stats timer too
13687 pMac->roam.tlStatsReqInfo.numClient--;
13688 if(!pMac->roam.tlStatsReqInfo.numClient)
13689 {
13690 if(pMac->roam.tlStatsReqInfo.timerRunning)
13691 {
13692 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
13693 if(!HAL_STATUS_SUCCESS(status))
13694 {
13695 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot stop TlStatsTimer timer\n"));
13696 return eHAL_STATUS_FAILURE;
13697 }
13698 }
13699 pMac->roam.tlStatsReqInfo.periodicity = 0;
13700 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13701 }
13702 vos_timer_stop( &pStaEntry->timer );
Jeff Johnson295189b2012-06-20 16:38:30 -070013703 // Destroy the vos timer...
13704 vosStatus = vos_timer_destroy( &pStaEntry->timer );
13705 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13706 {
13707 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to destroy Client req timer\n"));
13708 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013709 csrRoamRemoveStatListEntry(pMac, pEntry);
13710 pStaEntry = NULL;
13711 return eHAL_STATUS_SUCCESS;
13712 }
13713 }
13714
13715 if(cache && !periodicity)
13716 {
13717 //return the cached stats
13718 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13719 }
13720 else
13721 {
13722 //add the request in the client req list
13723 staEntry.callback = callback;
13724 staEntry.pContext = pContext;
13725 staEntry.periodicity = periodicity;
13726 staEntry.pPeStaEntry = NULL;
13727 staEntry.staId = staId;
13728 staEntry.pMac = pMac;
13729 staEntry.timerExpired = FALSE;
13730
13731
Jeff Johnson295189b2012-06-20 16:38:30 -070013732 //if periodic report requested with non cached result from PE/TL
13733 if(periodicity)
13734 {
13735
13736 //if looking for stats from PE
13737 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13738 {
13739
13740 //check if same request made already & waiting for rsp
13741 pPeStaEntry = csrRoamCheckPeStatsReqList(pMac, statsMask & ~(1 << eCsrGlobalClassDStats),
13742 periodicity, &found, staId);
13743 if(!pPeStaEntry)
13744 {
13745 //bail out, maxed out on number of req for PE
13746 return eHAL_STATUS_FAILURE;
13747 }
13748 else
13749 {
13750 staEntry.pPeStaEntry = pPeStaEntry;
13751 }
13752
13753 }
13754 //request stats from TL rightaway if requested by client, update tlStatsReqInfo if needed
13755 if(statsMask & (1 << eCsrGlobalClassDStats))
13756 {
13757 if(cache && pMac->roam.tlStatsReqInfo.numClient)
13758 {
13759 smsLog(pMac, LOGE, FL("csrGetStatistics:Looking for cached stats from TL\n"));
13760 }
13761 else
13762 {
13763
13764 //update periodicity
13765 if(pMac->roam.tlStatsReqInfo.periodicity)
13766 {
13767 pMac->roam.tlStatsReqInfo.periodicity =
13768 CSR_ROAM_MIN(periodicity, pMac->roam.tlStatsReqInfo.periodicity);
13769 }
13770 else
13771 {
13772 pMac->roam.tlStatsReqInfo.periodicity = periodicity;
13773 }
13774 if(pMac->roam.tlStatsReqInfo.periodicity < CSR_MIN_TL_STAT_QUERY_PERIOD)
13775 {
13776 pMac->roam.tlStatsReqInfo.periodicity = CSR_MIN_TL_STAT_QUERY_PERIOD;
13777 }
13778
13779 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13780 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013781 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13782 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013783 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013784 //req TL for class D stats
13785 if(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId))
13786 {
13787 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13788 }
13789 else
13790 {
13791 //save in SME
13792 csrRoamSaveStatsFromTl(pMac, pTlStats);
13793 }
13794 vos_mem_free(pTlStats);
13795 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013796 }
13797 else
13798 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013799 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013800 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013801
Jeff Johnson295189b2012-06-20 16:38:30 -070013802 if(pMac->roam.tlStatsReqInfo.periodicity)
13803 {
13804 //start timer
13805 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13806 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13807 if(!HAL_STATUS_SUCCESS(status))
13808 {
13809 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start TlStatsTimer timer\n"));
13810 return eHAL_STATUS_FAILURE;
13811 }
13812 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13813 }
13814 }
13815 }
13816 pMac->roam.tlStatsReqInfo.numClient++;
13817 }
13818
13819 insertInClientList = TRUE;
13820 }
13821 //if one time report requested with non cached result from PE/TL
13822 else if(!cache && !periodicity)
13823 {
13824 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13825 {
13826 //send down a req
13827 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
13828 if(!HAL_STATUS_SUCCESS(status))
13829 {
13830 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to send down stats req to PE\n"));
13831 }
13832 //so that when the stats rsp comes back from PE we respond to upper layer
13833 //right away
13834 staEntry.timerExpired = TRUE;
13835 insertInClientList = TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -070013836 }
13837 if(statsMask & (1 << eCsrGlobalClassDStats))
13838 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013839 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13840 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013841 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013842 //req TL for class D stats
13843 if(!VOS_IS_STATUS_SUCCESS(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId)))
13844 {
13845 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13846 }
13847 else
13848 {
13849 //save in SME
13850 csrRoamSaveStatsFromTl(pMac, pTlStats);
13851 }
13852 vos_mem_free(pTlStats);
13853 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013854 }
13855 else
13856 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013857 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013858 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013859
13860 }
13861 //if looking for stats from TL only
13862 if(!insertInClientList)
13863 {
13864 //return the stats
13865 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13866 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013867 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013868 if(insertInClientList)
13869 {
13870 pStaEntry = csrRoamInsertEntryIntoList(pMac, &pMac->roam.statsClientReqList, &staEntry);
13871 if(!pStaEntry)
13872 {
13873 //msg
13874 smsLog(pMac, LOGW, "csrGetStatistics: Failed to insert req in statsClientReqList\n");
13875 return eHAL_STATUS_FAILURE;
13876 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013877 pStaEntry->periodicity = periodicity;
Jeff Johnson295189b2012-06-20 16:38:30 -070013878 //Init & start timer if needed
13879 if(periodicity)
13880 {
13881 vosStatus = vos_timer_init( &pStaEntry->timer, VOS_TIMER_TYPE_SW,
13882 csrRoamStatsClientTimerHandler, pStaEntry );
13883 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13884 {
13885 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot init StatsClient timer\n"));
13886 return eHAL_STATUS_FAILURE;
13887 }
13888 vosStatus = vos_timer_start( &pStaEntry->timer, periodicity );
13889 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13890 {
13891 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
13892 return eHAL_STATUS_FAILURE;
13893 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013894 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013895 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013896 }
13897 return eHAL_STATUS_SUCCESS;
13898}
13899
Jeff Johnson295189b2012-06-20 16:38:30 -070013900tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask,
13901 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId)
13902{
13903 tANI_BOOLEAN found = FALSE;
13904 eHalStatus status = eHAL_STATUS_SUCCESS;
13905 tCsrPeStatsReqInfo staEntry;
13906 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
13907 tListElem *pStaEntry = NULL;
13908 VOS_STATUS vosStatus;
13909 tPmcPowerState powerState;
13910 *pFound = FALSE;
13911
13912 pStaEntry = csrRoamFindInPeStatsReqList(pMac, statsMask);
13913 if(pStaEntry)
13914 {
13915 pTempStaEntry = GET_BASE_ADDR( pStaEntry, tCsrPeStatsReqInfo, link );
13916 if(pTempStaEntry->periodicity)
13917 {
13918 pTempStaEntry->periodicity =
13919 CSR_ROAM_MIN(periodicity, pTempStaEntry->periodicity);
13920 }
13921 else
13922 {
13923 pTempStaEntry->periodicity = periodicity;
13924 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013925 pTempStaEntry->numClient++;
13926 found = TRUE;
13927 }
13928 else
13929 {
13930 palZeroMemory(pMac->hHdd, &staEntry, sizeof(tCsrPeStatsReqInfo));
13931 staEntry.numClient = 1;
13932 staEntry.periodicity = periodicity;
13933 staEntry.pMac = pMac;
13934 staEntry.rspPending = FALSE;
13935 staEntry.staId = staId;
13936 staEntry.statsMask = statsMask;
13937 staEntry.timerRunning = FALSE;
13938 pTempStaEntry = csrRoamInsertEntryIntoPeStatsReqList(pMac, &pMac->roam.peStatsReqList, &staEntry);
13939 if(!pTempStaEntry)
13940 {
13941 //msg
13942 smsLog(pMac, LOGW, "csrRoamCheckPeStatsReqList: Failed to insert req in peStatsReqList\n");
13943 return NULL;
13944 }
13945 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013946 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
13947 if(ePMC_FULL_POWER == powerState)
13948 {
13949 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
13950 {
13951 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
13952 }
13953 }
13954 else
13955 {
13956 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
13957 {
13958 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
13959 }
13960 }
13961 if(!pTempStaEntry->timerRunning)
13962 {
13963 //send down a req in case of one time req, for periodic ones wait for timer to expire
13964 if(!pTempStaEntry->rspPending &&
13965 !pTempStaEntry->periodicity)
13966 {
13967 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
13968 if(!HAL_STATUS_SUCCESS(status))
13969 {
13970 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:failed to send down stats req to PE\n"));
13971 }
13972 else
13973 {
13974 pTempStaEntry->rspPending = TRUE;
13975 }
13976 }
13977 if(pTempStaEntry->periodicity)
13978 {
13979 if(!found)
13980 {
13981
13982 vosStatus = vos_timer_init( &pTempStaEntry->hPeStatsTimer, VOS_TIMER_TYPE_SW,
13983 csrRoamPeStatsTimerHandler, pTempStaEntry );
13984 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13985 {
13986 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot init hPeStatsTimer timer\n"));
13987 return NULL;
13988 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013989 }
13990 //start timer
13991 smsLog(pMac, LOG1, "csrRoamCheckPeStatsReqList:peStatsTimer period %d\n", pTempStaEntry->periodicity);
Jeff Johnson295189b2012-06-20 16:38:30 -070013992 vosStatus = vos_timer_start( &pTempStaEntry->hPeStatsTimer, pTempStaEntry->periodicity );
13993 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13994 {
13995 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot start hPeStatsTimer timer\n"));
13996 return NULL;
13997 }
13998 pTempStaEntry->timerRunning = TRUE;
13999 }
14000 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014001 *pFound = found;
14002 return pTempStaEntry;
14003}
14004
Jeff Johnson295189b2012-06-20 16:38:30 -070014005/*
14006 pStaEntry is no longer invalid upon the return of this function.
14007*/
14008static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry)
14009{
14010 if(pEntry)
14011 {
14012 if(csrLLRemoveEntry(&pMac->roam.statsClientReqList, pEntry, LL_ACCESS_LOCK))
14013 {
14014 palFreeMemory(pMac->hHdd, GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link ));
Jeff Johnsone7245742012-09-05 17:12:55 -070014015 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014016 }
14017 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014018
14019void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry)
14020{
14021 tListElem *pEntry;
14022 tCsrPeStatsReqInfo *pTempStaEntry;
14023 VOS_STATUS vosStatus;
14024 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014025 if(!pEntry)
14026 {
14027 //list empty
14028 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: List empty, no stats req for PE\n");
14029 return;
14030 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014031 while( pEntry )
14032 {
14033 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014034 if( pTempStaEntry && pTempStaEntry->statsMask == pPeStaEntry->statsMask)
14035 {
14036 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: match found\n");
14037 if(pTempStaEntry->timerRunning)
14038 {
14039 vosStatus = vos_timer_stop( &pTempStaEntry->hPeStatsTimer );
14040 /* If we are not able to stop the timer here, just remove
14041 * the entry from the linked list. Destroy the timer object
14042 * and free the memory in the timer CB
14043 */
14044 if( vosStatus == VOS_STATUS_SUCCESS )
14045 {
14046 /* the timer is successfully stopped */
14047 pTempStaEntry->timerRunning = FALSE;
14048
14049 /* Destroy the timer */
14050 vosStatus = vos_timer_destroy( &pTempStaEntry->hPeStatsTimer );
14051 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14052 {
14053 smsLog(pMac, LOGE, FL("csrRoamRemoveEntryFromPeStatsReqList:failed to destroy hPeStatsTimer timer\n"));
14054 }
14055 }
14056 else
14057 {
14058 // the timer could not be stopped. Hence destroy and free the
14059 // memory for the PE stat entry in the timer CB.
14060 pTempStaEntry->timerStopFailed = TRUE;
14061 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014062 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014063
14064 if(csrLLRemoveEntry(&pMac->roam.peStatsReqList, pEntry, LL_ACCESS_LOCK))
14065 {
14066 // Only free the memory if we could stop the timer successfully
14067 if(!pTempStaEntry->timerStopFailed)
14068 {
14069 palFreeMemory(pMac->hHdd, pTempStaEntry);
14070 pTempStaEntry = NULL;
14071 }
14072 break;
14073 }
14074
14075 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
14076 }
14077 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014078 return;
14079}
14080
14081
Jeff Johnsone7245742012-09-05 17:12:55 -070014082void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070014083{
14084
Jeff Johnsone7245742012-09-05 17:12:55 -070014085 pMac->roam.classDStatsInfo.num_rx_bytes_crc_ok = pTlStats->rxBcntCRCok;
14086 pMac->roam.classDStatsInfo.rx_bc_byte_cnt = pTlStats->rxBCBcnt;
14087 pMac->roam.classDStatsInfo.rx_bc_frm_cnt = pTlStats->rxBCFcnt;
14088 pMac->roam.classDStatsInfo.rx_byte_cnt = pTlStats->rxBcnt;
14089 pMac->roam.classDStatsInfo.rx_mc_byte_cnt = pTlStats->rxMCBcnt;
14090 pMac->roam.classDStatsInfo.rx_mc_frm_cnt = pTlStats->rxMCFcnt;
14091 pMac->roam.classDStatsInfo.rx_rate = pTlStats->rxRate;
Jeff Johnson295189b2012-06-20 16:38:30 -070014092 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014093 pMac->roam.classDStatsInfo.rx_uc_byte_cnt[0] = pTlStats->rxUCBcnt;
14094 pMac->roam.classDStatsInfo.rx_uc_frm_cnt = pTlStats->rxUCFcnt;
14095 pMac->roam.classDStatsInfo.tx_bc_byte_cnt = pTlStats->txBCBcnt;
14096 pMac->roam.classDStatsInfo.tx_bc_frm_cnt = pTlStats->txBCFcnt;
14097 pMac->roam.classDStatsInfo.tx_mc_byte_cnt = pTlStats->txMCBcnt;
14098 pMac->roam.classDStatsInfo.tx_mc_frm_cnt = pTlStats->txMCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014099 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014100 pMac->roam.classDStatsInfo.tx_uc_byte_cnt[0] = pTlStats->txUCBcnt;
14101 pMac->roam.classDStatsInfo.tx_uc_frm_cnt = pTlStats->txUCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014102
14103}
14104
Jeff Johnson295189b2012-06-20 16:38:30 -070014105void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
14106 tCsrStatsCallback callback, tANI_U8 staId, void *pContext)
14107{
14108 tANI_U8 stats[500];
14109 tANI_U8 *pStats = NULL;
14110 tANI_U32 tempMask = 0;
14111 tANI_U8 counter = 0;
14112 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014113 if(!callback)
14114 {
14115 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report callback NULL\n"));
14116 return;
14117 }
14118 if(!statsMask)
14119 {
14120 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report statsMask is 0\n"));
14121 return;
14122 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014123 pStats = stats;
Jeff Johnson295189b2012-06-20 16:38:30 -070014124 tempMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070014125 while(tempMask)
14126 {
14127 if(tempMask & 1)
14128 {
14129 //new stats info from PE, fill up the stats strucutres in PMAC
14130 switch(counter)
14131 {
14132 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014133 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014134 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
14135 sizeof(tCsrSummaryStatsInfo));
14136 if(!HAL_STATUS_SUCCESS(status))
14137 {
14138 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy summary stats\n"));
14139 }
14140 pStats += sizeof(tCsrSummaryStatsInfo);
14141 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014142 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014143 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014144 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classAStatsInfo,
14145 sizeof(tCsrGlobalClassAStatsInfo));
14146 if(!HAL_STATUS_SUCCESS(status))
14147 {
14148 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassA stats\n"));
14149 }
14150 pStats += sizeof(tCsrGlobalClassAStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014151 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014152 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014153 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014154 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classBStatsInfo,
14155 sizeof(tCsrGlobalClassBStatsInfo));
14156 if(!HAL_STATUS_SUCCESS(status))
14157 {
14158 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassB stats\n"));
14159 }
14160 pStats += sizeof(tCsrGlobalClassBStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014161 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014162 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014163 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014164 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classCStatsInfo,
14165 sizeof(tCsrGlobalClassCStatsInfo));
14166 if(!HAL_STATUS_SUCCESS(status))
14167 {
14168 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassC stats\n"));
14169 }
14170 pStats += sizeof(tCsrGlobalClassCStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014171 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014172 case eCsrGlobalClassDStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014173 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassD stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014174 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classDStatsInfo,
14175 sizeof(tCsrGlobalClassDStatsInfo));
14176 if(!HAL_STATUS_SUCCESS(status))
14177 {
14178 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassD stats\n"));
14179 }
14180 pStats += sizeof(tCsrGlobalClassDStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014181 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014182 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014183 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014184 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.perStaStatsInfo[staId],
14185 sizeof(tCsrPerStaStatsInfo));
14186 if(!HAL_STATUS_SUCCESS(status))
14187 {
14188 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy PerSta stats\n"));
14189 }
14190 pStats += sizeof(tCsrPerStaStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014191 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014192 default:
14193 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:unknown stats type\n"));
14194 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014195 }
14196 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014197 tempMask >>=1;
14198 counter++;
14199 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014200 callback(stats, pContext );
Jeff Johnson295189b2012-06-20 16:38:30 -070014201}
14202
Jeff Johnson295189b2012-06-20 16:38:30 -070014203eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac)
14204{
14205 tListElem *pEntry = NULL;
14206 tListElem *pPrevEntry = NULL;
14207 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
14208 eHalStatus status = eHAL_STATUS_SUCCESS;
14209 VOS_STATUS vosStatus;
14210 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014211 if(!pEntry)
14212 {
14213 //list empty
14214 smsLog(pMac, LOGW, "csrRoamDeregStatisticsReq: List empty, no request from "
14215 "upper layer client(s)\n");
14216 return status;
14217 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014218 while( pEntry )
14219 {
14220 if(pPrevEntry)
14221 {
14222 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14223 //send up the stats report
14224 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14225 pTempStaEntry->staId, pTempStaEntry->pContext);
14226 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14227 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014228 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014229 if (pTempStaEntry->pPeStaEntry) //pPeStaEntry can be NULL
14230 {
Jeff Johnsone7245742012-09-05 17:12:55 -070014231 pTempStaEntry->pPeStaEntry->numClient--;
14232 //check if we need to delete the entry from peStatsReqList too
14233 if(!pTempStaEntry->pPeStaEntry->numClient)
14234 {
14235 csrRoamRemoveEntryFromPeStatsReqList(pMac, pTempStaEntry->pPeStaEntry);
14236 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014237 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014238 //check if we need to stop the tl stats timer too
14239 pMac->roam.tlStatsReqInfo.numClient--;
14240 if(!pMac->roam.tlStatsReqInfo.numClient)
14241 {
14242 if(pMac->roam.tlStatsReqInfo.timerRunning)
14243 {
14244 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
14245 if(!HAL_STATUS_SUCCESS(status))
14246 {
14247 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:cannot stop TlStatsTimer timer\n"));
14248 //we will continue
14249 }
14250 }
14251 pMac->roam.tlStatsReqInfo.periodicity = 0;
14252 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
14253 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014254 if (pTempStaEntry->periodicity)
14255 {
14256 //While creating StaEntry in csrGetStatistics,
14257 //Initializing and starting timer only when periodicity is set.
14258 //So Stop and Destroy timer only when periodicity is set.
14259
Jeff Johnsone7245742012-09-05 17:12:55 -070014260 vos_timer_stop( &pTempStaEntry->timer );
14261 // Destroy the vos timer...
14262 vosStatus = vos_timer_destroy( &pTempStaEntry->timer );
14263 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14264 {
14265 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:failed to destroy Client req timer\n"));
14266 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014267 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014268
Jeff Johnson295189b2012-06-20 16:38:30 -070014269
14270 pPrevEntry = pEntry;
14271 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
14272 }
14273 //the last one
14274 if(pPrevEntry)
14275 {
14276 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14277 //send up the stats report
14278 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14279 pTempStaEntry->staId, pTempStaEntry->pContext);
14280 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14281 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014282 return status;
14283
14284}
14285
Jeff Johnson295189b2012-06-20 16:38:30 -070014286eHalStatus csrIsFullPowerNeeded( tpAniSirGlobal pMac, tSmeCmd *pCommand,
14287 tRequestFullPowerReason *pReason,
14288 tANI_BOOLEAN *pfNeedPower )
14289{
14290 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14291 tRequestFullPowerReason reason = eSME_REASON_OTHER;
14292 tPmcState pmcState;
14293 eHalStatus status = eHAL_STATUS_SUCCESS;
14294 // TODO : Session info unavailable
14295 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070014296 if( pfNeedPower )
14297 {
14298 *pfNeedPower = eANI_BOOLEAN_FALSE;
14299 }
14300 //We only handle CSR commands
14301 if( !(eSmeCsrCommandMask & pCommand->command) )
14302 {
14303 return eHAL_STATUS_SUCCESS;
14304 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014305 //Check PMC state first
14306 pmcState = pmcGetPmcState( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014307 switch( pmcState )
14308 {
14309 case REQUEST_IMPS:
14310 case IMPS:
14311 if( eSmeCommandScan == pCommand->command )
14312 {
14313 switch( pCommand->u.scanCmd.reason )
14314 {
14315 case eCsrScanGetResult:
14316 case eCsrScanBGScanAbort:
14317 case eCsrScanBGScanEnable:
14318 case eCsrScanGetScanChnInfo:
14319 //Internal process, no need for full power
14320 fNeedFullPower = eANI_BOOLEAN_FALSE;
14321 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014322 default:
14323 //Other scans are real scan, ask for power
14324 fNeedFullPower = eANI_BOOLEAN_TRUE;
14325 break;
14326 } //switch
14327 }
14328 else
14329 {
14330 //ask for power for roam and status change
14331 fNeedFullPower = eANI_BOOLEAN_TRUE;
14332 }
14333 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014334 case REQUEST_BMPS:
14335 case BMPS:
14336 case REQUEST_START_UAPSD:
14337 case UAPSD:
14338 //We treat WOWL same as BMPS
14339 case REQUEST_ENTER_WOWL:
14340 case WOWL:
14341 if( eSmeCommandRoam == pCommand->command )
14342 {
14343 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
14344 tCsrScanResult *pScanResult;
14345 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070014346 switch ( pCommand->u.roamCmd.roamReason )
14347 {
14348 case eCsrForcedDisassoc:
14349 case eCsrForcedDisassocMICFailure:
14350 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14351 fNeedFullPower = eANI_BOOLEAN_TRUE;
14352 break;
14353 case eCsrSmeIssuedDisassocForHandoff:
14354 case eCsrForcedDeauth:
14355 case eCsrHddIssuedReassocToSameAP:
14356 case eCsrSmeIssuedReassocToSameAP:
14357 fNeedFullPower = eANI_BOOLEAN_TRUE;
14358 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014359 case eCsrCapsChange:
14360 fNeedFullPower = eANI_BOOLEAN_TRUE;
14361 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014362 default:
14363 //Check whether the profile is already connected. If so, no need for full power
14364 //Note: IBSS is ignored for now because we don't support powersave in IBSS
14365 if ( csrIsConnStateConnectedInfra(pMac, sessionId) && pBSSList )
14366 {
14367 //Only need to check the first one
14368 pEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
14369 if( pEntry )
14370 {
14371 pScanResult = GET_BASE_ADDR(pEntry, tCsrScanResult, Link);
14372#if 0
14373 // TODO : Session Specific info pConnectBssDesc
14374 if( csrIsBssIdEqual( pMac, &pScanResult->Result.BssDescriptor, pMac->roam.pConnectBssDesc ) &&
14375 csrIsSsidEqual( pMac, pMac->roam.pConnectBssDesc,
14376 &pScanResult->Result.BssDescriptor, (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ) ) )
14377 {
14378 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
14379 // with Authenticating first. To force this, stop the current association (Disassociate) and
14380 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
14381 // a new Association.
14382 if(csrIsSameProfile(pMac, &pMac->roam.connectedProfile, pProfile))
14383 {
14384 if(csrRoamIsSameProfileKeys(pMac, &pMac->roam.connectedProfile, pProfile))
14385 {
14386 //Done, eventually, the command reaches eCsrReassocToSelfNoCapChange;
14387 //No need for full power
14388 //Set the flag so the code later can avoid to do the above
14389 //check again.
14390 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_TRUE;
14391 break;
14392 }
14393 }
14394 }
14395#endif
14396 }
14397 }
14398 //If we are here, full power is needed
14399 fNeedFullPower = eANI_BOOLEAN_TRUE;
14400 break;
14401 }
14402 }
14403 else if( eSmeCommandWmStatusChange == pCommand->command )
14404 {
14405 //need full power for all
14406 fNeedFullPower = eANI_BOOLEAN_TRUE;
14407 reason = eSME_LINK_DISCONNECTED_BY_OTHER;
14408 }
14409 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014410 case REQUEST_STOP_UAPSD:
14411 case REQUEST_EXIT_WOWL:
14412 if( eSmeCommandRoam == pCommand->command )
14413 {
14414 fNeedFullPower = eANI_BOOLEAN_TRUE;
14415 switch ( pCommand->u.roamCmd.roamReason )
14416 {
14417 case eCsrForcedDisassoc:
14418 case eCsrForcedDisassocMICFailure:
14419 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14420 break;
14421 default:
14422 break;
14423 }
14424 }
14425 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014426 case STOPPED:
14427 case REQUEST_STANDBY:
14428 case STANDBY:
14429 case LOW_POWER:
14430 //We are not supposed to do anything
14431 smsLog( pMac, LOGE, FL( " cannot process because PMC is in stopped/standby state %d\n" ), pmcState );
14432 status = eHAL_STATUS_FAILURE;
14433 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014434 case FULL_POWER:
14435 case REQUEST_FULL_POWER:
14436 default:
14437 //No need to ask for full power. This has to be FULL_POWER state
14438 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014439 } //switch
Jeff Johnson295189b2012-06-20 16:38:30 -070014440 if( pReason )
14441 {
14442 *pReason = reason;
14443 }
14444 if( pfNeedPower )
14445 {
14446 *pfNeedPower = fNeedFullPower;
14447 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014448 return ( status );
14449}
14450
Jeff Johnson295189b2012-06-20 16:38:30 -070014451static eHalStatus csrRequestFullPower( tpAniSirGlobal pMac, tSmeCmd *pCommand )
14452{
14453 eHalStatus status = eHAL_STATUS_SUCCESS;
14454 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14455 tRequestFullPowerReason reason = eSME_REASON_OTHER;
Jeff Johnson295189b2012-06-20 16:38:30 -070014456 status = csrIsFullPowerNeeded( pMac, pCommand, &reason, &fNeedFullPower );
Jeff Johnson295189b2012-06-20 16:38:30 -070014457 if( fNeedFullPower && HAL_STATUS_SUCCESS( status ) )
14458 {
14459 status = pmcRequestFullPower(pMac, csrFullPowerCallback, pMac, reason);
14460 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014461 return ( status );
14462}
14463
Jeff Johnson295189b2012-06-20 16:38:30 -070014464tSmeCmd *csrGetCommandBuffer( tpAniSirGlobal pMac )
14465{
14466 tSmeCmd *pCmd = smeGetCommandBuffer( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014467 if( pCmd )
14468 {
14469 pMac->roam.sPendingCommands++;
14470 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014471 return ( pCmd );
14472}
14473
Jeff Johnson295189b2012-06-20 16:38:30 -070014474void csrReleaseCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand)
14475{
14476 if (pMac->roam.sPendingCommands > 0)
14477 {
14478 //All command allocated through csrGetCommandBuffer need to
14479 //decrement the pending count when releasing.
14480 pMac->roam.sPendingCommands--;
14481 smeReleaseCommand( pMac, pCommand );
14482 }
14483 else
14484 {
14485 smsLog(pMac, LOGE, FL( "no pending commands"));
14486 VOS_ASSERT(0);
14487 }
14488}
14489
Jeff Johnson295189b2012-06-20 16:38:30 -070014490//Return SUCCESS is the command is queued, failed
14491eHalStatus csrQueueSmeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fHighPriority )
14492{
14493 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070014494 if( (eSmeCommandScan == pCommand->command) && pMac->scan.fDropScanCmd )
14495 {
14496 smsLog(pMac, LOGW, FL(" drop scan (scan reason %d) command"),
14497 pCommand->u.scanCmd.reason);
14498 return eHAL_STATUS_CSR_WRONG_STATE;
14499 }
14500
14501 //We can call request full power first before putting the command into pending Q
14502 //because we are holding SME lock at this point.
14503 status = csrRequestFullPower( pMac, pCommand );
14504 if( HAL_STATUS_SUCCESS( status ) )
14505 {
14506 tANI_BOOLEAN fNoCmdPending;
Jeff Johnson295189b2012-06-20 16:38:30 -070014507 //make sure roamCmdPendingList is not empty first
14508 fNoCmdPending = csrLLIsListEmpty( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_FALSE );
14509 if( fNoCmdPending )
14510 {
14511 smePushCommand( pMac, pCommand, fHighPriority );
14512 }
14513 else
14514 {
14515 //Other commands are waiting for PMC callback, queue the new command to the pending Q
14516 //no list lock is needed since SME lock is held
14517 if( !fHighPriority )
14518 {
14519 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14520 }
14521 else {
14522 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14523 }
14524 }
14525 }
14526 else if( eHAL_STATUS_PMC_PENDING == status )
14527 {
14528 //no list lock is needed since SME lock is held
14529 if( !fHighPriority )
14530 {
14531 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14532 }
14533 else {
14534 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14535 }
14536 //Let caller know the command is queue
14537 status = eHAL_STATUS_SUCCESS;
14538 }
14539 else
14540 {
14541 //Not to decrease pMac->roam.sPendingCommands here. Caller will decrease it when it
14542 //release the command.
14543 smsLog( pMac, LOGE, FL( " cannot queue command %d\n" ), pCommand->command );
14544 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014545 return ( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070014546}
Jeff Johnson295189b2012-06-20 16:38:30 -070014547#ifdef WLAN_SOFTAP_FEATURE
14548eHalStatus csrRoamUpdateAPWPSIE( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirAPWPSIEs* pAPWPSIES )
14549{
14550 eHalStatus status = eHAL_STATUS_SUCCESS;
14551 tSirUpdateAPWPSIEsReq *pMsg;
14552 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
14553
14554 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14555 if (NULL == pSession)
14556 {
14557 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14558 return eHAL_STATUS_FAILURE;
14559 }
14560
Jeff Johnson295189b2012-06-20 16:38:30 -070014561 do
14562 {
14563 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14564 if (!HAL_STATUS_SUCCESS(status)) break;
14565 palZeroMemory( pMac->hHdd, pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14566 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPDATE_APWPSIE_REQ);
14567
14568 pBuf = (tANI_U8 *)&pMsg->transactionId;
14569 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014570 // transactionId
14571 *pBuf = 0;
14572 *( pBuf + 1 ) = 0;
14573 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070014574 // bssId
14575 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14576 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014577 //sessionId
14578 *pBuf++ = (tANI_U8)sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014579 // APWPSIEs
14580 palCopyMemory( pMac->hHdd, (tSirAPWPSIEs *)pBuf, pAPWPSIES, sizeof(tSirAPWPSIEs));
14581 pBuf += sizeof(tSirAPWPSIEs);
Jeff Johnson295189b2012-06-20 16:38:30 -070014582 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014583 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014584 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014585 return ( status );
14586}
Jeff Johnson295189b2012-06-20 16:38:30 -070014587eHalStatus csrRoamUpdateWPARSNIEs( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirRSNie * pAPSirRSNie)
14588{
14589 eHalStatus status = eHAL_STATUS_SUCCESS;
14590 tSirUpdateAPWPARSNIEsReq *pMsg;
14591 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070014592 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14593 if (NULL == pSession)
14594 {
14595 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14596 return eHAL_STATUS_FAILURE;
14597 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014598 do
14599 {
14600 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPARSNIEsReq) );
14601 if (!HAL_STATUS_SUCCESS(status)) break;
14602 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirUpdateAPWPARSNIEsReq ) );
14603 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SET_APWPARSNIEs_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070014604 pBuf = (tANI_U8 *)&pMsg->transactionId;
14605 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014606 // transactionId
14607 *pBuf = 0;
14608 *( pBuf + 1 ) = 0;
14609 pBuf += sizeof(tANI_U16);
14610
14611 // bssId
14612 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14613 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014614 // sessionId
14615 *pBuf++ = (tANI_U8)sessionId;
14616
14617 // APWPARSNIEs
14618 palCopyMemory( pMac->hHdd, (tSirRSNie *)pBuf, pAPSirRSNie, sizeof(tSirRSNie));
14619 pBuf += sizeof(tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070014620 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014621 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014622 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014623 return ( status );
14624}
Jeff Johnson295189b2012-06-20 16:38:30 -070014625#endif //#ifdef WLAN_SOFTAP_FEATURE
14626
14627#ifdef WLAN_FEATURE_VOWIFI_11R
14628//eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tCsrBssid preAuthBssid, tANI_U8 channelId)
14629eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tpSirBssDescription pBssDescription)
14630{
14631 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14632 tpSirFTPreAuthReq pftPreAuthReq;
14633 tANI_U16 auth_req_len = 0;
14634 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070014635 auth_req_len = sizeof(tSirFTPreAuthReq);
14636 pftPreAuthReq = (tpSirFTPreAuthReq)vos_mem_malloc(auth_req_len);
14637 if (pftPreAuthReq == NULL)
14638 {
14639 smsLog(pMac, LOGE, FL("Memory allocation for FT Preauth request failed"));
14640 return eHAL_STATUS_RESOURCES;
14641 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014642 // Save the SME Session ID here. We need it while processing the preauth response
14643 pMac->ft.ftSmeContext.smeSessionId = sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014644 vos_mem_zero(pftPreAuthReq, auth_req_len);
14645
14646 pftPreAuthReq->pbssDescription = (tpSirBssDescription)vos_mem_malloc(
14647 sizeof(pBssDescription->length) + pBssDescription->length);
14648
14649 pftPreAuthReq->messageType = pal_cpu_to_be16(eWNI_SME_FT_PRE_AUTH_REQ);
14650
14651 pftPreAuthReq->preAuthchannelNum = pBssDescription->channelId;
14652
Jeff Johnson295189b2012-06-20 16:38:30 -070014653 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->currbssId, (void *)pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070014654 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->preAuthbssId, (void *)pBssDescription->bssId, sizeof(tSirMacAddr));
14655
Jeff Johnson295189b2012-06-20 16:38:30 -070014656#ifdef WLAN_FEATURE_VOWIFI_11R
14657 if (csrRoamIs11rAssoc(pMac))
14658 {
14659 pftPreAuthReq->ft_ies_length = (tANI_U16)pMac->ft.ftSmeContext.auth_ft_ies_length;
14660 palCopyMemory(pMac->hHdd, pftPreAuthReq->ft_ies, pMac->ft.ftSmeContext.auth_ft_ies,
14661 pMac->ft.ftSmeContext.auth_ft_ies_length);
14662 }
14663 else
14664#endif
14665 {
14666 pftPreAuthReq->ft_ies_length = 0;
14667 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014668 vos_mem_copy(pftPreAuthReq->pbssDescription, pBssDescription, pBssDescription->length);
Jeff Johnson295189b2012-06-20 16:38:30 -070014669 pftPreAuthReq->length = pal_cpu_to_be16(sizeof(tSirFTPreAuthReq) + sizeof(pBssDescription->length) +
14670 pBssDescription->length);
Jeff Johnson295189b2012-06-20 16:38:30 -070014671 return palSendMBMessage(pMac->hHdd, pftPreAuthReq);
14672}
Jeff Johnson295189b2012-06-20 16:38:30 -070014673/*--------------------------------------------------------------------------
14674 * This will receive and process the FT Pre Auth Rsp from the current
14675 * associated ap.
14676 *
14677 * This will invoke the hdd call back. This is so that hdd can now
14678 * send the FTIEs from the Auth Rsp (Auth Seq 2) to the supplicant.
14679 ------------------------------------------------------------------------*/
14680void csrRoamFTPreAuthRspProcessor( tHalHandle hHal, tpSirFTPreAuthRsp pFTPreAuthRsp )
14681{
14682 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14683 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014684#ifdef FEATURE_WLAN_LFR
14685 tCsrRoamInfo roamInfo;
14686#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014687
14688#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
14689 smsLog( pMac, LOGE, FL("Preauth response status code %d"), pFTPreAuthRsp->status);
14690#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014691#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
14692 csrNeighborRoamPreauthRspHandler(pMac, (VOS_STATUS)pFTPreAuthRsp->status);
14693#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014694 /* The below function calls/timers should be invoked only if the pre-auth is successful */
14695 if (VOS_STATUS_SUCCESS != (VOS_STATUS)pFTPreAuthRsp->status)
14696 return;
Jeff Johnson295189b2012-06-20 16:38:30 -070014697 // Implies a success
14698 pMac->ft.ftSmeContext.FTState = eFT_AUTH_COMPLETE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014699 // Indicate SME QoS module the completion of Preauth success. This will trigger the creation of RIC IEs
14700 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = pFTPreAuthRsp;
14701 sme_QosCsrEventInd(pMac, pMac->ft.ftSmeContext.smeSessionId, SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070014702 /* Start the pre-auth reassoc interval timer with a period of 400ms. When this expires,
14703 * actual transition from the current to handoff AP is triggered */
14704 status = palTimerStart(pMac->hHdd, pMac->ft.ftSmeContext.preAuthReassocIntvlTimer,
14705 60 * PAL_TIMER_TO_MS_UNIT,
14706 eANI_BOOLEAN_FALSE);
14707 if (eHAL_STATUS_SUCCESS != status)
14708 {
14709 smsLog(pMac, LOGE, FL("Preauth reassoc interval timer start failed to start with status %d\n"), status);
14710 return;
14711 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014712 // Save the received response
14713 palCopyMemory(pMac->hHdd, (void *)&pMac->ft.ftSmeContext.preAuthbssId, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14714 if (csrRoamIs11rAssoc(pMac))
14715 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, NULL, 0,
14716 eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
14717
14718 // Currently we dont do anything special for CCX connection.
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014719#ifdef FEATURE_WLAN_LFR
14720 // If Legacy Fast Roaming is enabled, signal the supplicant
14721 // So he can send us a PMK-ID for this candidate AP.
14722 if (csrRoamIsFastRoamEnabled(pMac))
14723 {
14724 // Save the bssid from the received response
14725 palCopyMemory(pMac->hHdd, (void *)&roamInfo.bssid, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14726 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, &roamInfo, 0, eCSR_ROAM_PMK_NOTIFY, 0);
14727 }
14728
14729#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014730
14731 // Done with it, init it.
14732 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = NULL;
14733}
14734#endif
14735#ifdef FEATURE_WLAN_BTAMP_UT_RF
14736void csrRoamJoinRetryTimerHandler(void *pv)
14737{
14738 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
14739 tpAniSirGlobal pMac = pInfo->pMac;
14740 tANI_U32 sessionId = pInfo->sessionId;
14741 tCsrRoamSession *pSession;
14742
14743 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14744 {
14745 smsLog( pMac, LOGE, FL( " retrying the last roam profile on session %d\n" ), sessionId );
14746 pSession = CSR_GET_SESSION( pMac, sessionId );
14747 if(pSession->pCurRoamProfile && csrIsConnStateDisconnected(pMac, sessionId))
14748 {
14749 if( !HAL_STATUS_SUCCESS(csrRoamJoinLastProfile(pMac, sessionId)) )
14750 {
14751 smsLog( pMac, LOGE, FL( " fail to retry the last roam profile\n" ) );
14752 }
14753 }
14754 }
14755}
Jeff Johnson295189b2012-06-20 16:38:30 -070014756eHalStatus csrRoamStartJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
14757{
14758 eHalStatus status = eHAL_STATUS_FAILURE;
14759 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14760
14761 if(pSession->pCurRoamProfile && pSession->maxRetryCount)
14762 {
14763 smsLog(pMac, LOGE, FL(" call sessionId %d retry count %d left\n "), sessionId, pSession->maxRetryCount);
14764 pSession->maxRetryCount--;
14765 pSession->joinRetryTimerInfo.pMac = pMac;
14766 pSession->joinRetryTimerInfo.sessionId = (tANI_U8)sessionId;
14767 status = palTimerStart(pMac->hHdd, pSession->hTimerJoinRetry, interval, eANI_BOOLEAN_FALSE);
14768 if(!HAL_STATUS_SUCCESS(status))
14769 {
14770 smsLog(pMac, LOGE, FL(" fail to start timer status %s \n "), status);
14771 }
14772 }
14773 else
14774 {
14775 smsLog(pMac, LOGE, FL(" not to start timer due to no profile or reach mac ret (%d)\n "),
14776 pSession->maxRetryCount);
14777 }
14778
14779 return (status);
14780}
Jeff Johnson295189b2012-06-20 16:38:30 -070014781eHalStatus csrRoamStopJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
14782{
14783 smsLog(pMac, LOGE, " csrRoamStopJoinRetryTimer \n ");
14784 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14785 {
14786 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerJoinRetry));
14787 }
14788
14789 return eHAL_STATUS_SUCCESS;
14790}
14791#endif
14792
14793
14794/*
14795 pBuf points to the beginning of the message
14796 LIM packs disassoc rsp as below,
14797 messageType - 2 bytes
14798 messageLength - 2 bytes
14799 sessionId - 1 byte
14800 transactionId - 2 bytes (tANI_U16)
14801 reasonCode - 4 bytes (sizeof(tSirResultCodes))
14802 peerMacAddr - 6 bytes
14803 The rest is conditionally defined of (WNI_POLARIS_FW_PRODUCT == AP) and not used
14804*/
14805static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp)
14806{
14807 if(pBuf && pRsp)
14808 {
14809 pBuf += 4; //skip type and length
14810 pRsp->sessionId = *pBuf++;
14811 pal_get_U16( pBuf, (tANI_U16 *)&pRsp->transactionId );
14812 pBuf += 2;
14813 pal_get_U32( pBuf, (tANI_U32 *)&pRsp->statusCode );
14814 pBuf += 4;
14815 vos_mem_copy(pRsp->peerMacAddr, pBuf, 6);
14816 }
14817}
14818
Jeff Johnsond13512a2012-07-17 11:42:19 -070014819eHalStatus csrGetDefaultCountryCodeFrmNv(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14820{
14821 static uNvTables nvTables;
14822 eHalStatus status = eHAL_STATUS_SUCCESS;
14823 VOS_STATUS vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
14824
14825 /* read the country code from NV and use it */
14826 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
14827 {
14828 palCopyMemory( pMac->hHdd, pCountry,
14829 nvTables.defaultCountryTable.countryCode,
14830 WNI_CFG_COUNTRY_CODE_LEN );
14831 return status;
14832 }
14833 else
14834 {
14835 palCopyMemory( pMac->hHdd, pCountry,
14836 "XXX",
14837 WNI_CFG_COUNTRY_CODE_LEN );
14838 status = eHAL_STATUS_FAILURE;
14839 return status;
14840 }
14841}
14842
14843eHalStatus csrGetCurrentCountryCode(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14844{
14845 palCopyMemory( pMac->hHdd, pCountry,
14846 pMac->scan.countryCode11d,
14847 WNI_CFG_COUNTRY_CODE_LEN );
14848 return eHAL_STATUS_SUCCESS;
14849}