blob: d8d75378b3a2859274c3e2abe5f7fa8d7d3c4c7c [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Jeff Johnson32d95a32012-09-10 13:15:23 -07002 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -07003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/** ------------------------------------------------------------------------- *
23 ------------------------------------------------------------------------- *
Jeff Johnsone7245742012-09-05 17:12:55 -070024
Jeff Johnson295189b2012-06-20 16:38:30 -070025
26 \file csrApiRoam.c
27
28 Implementation for the Common Roaming interfaces.
29
30 Copyright (C) 2008 Qualcomm, Incorporated
31
32
33 ========================================================================== */
Jeff Johnson295189b2012-06-20 16:38:30 -070034/*===========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -070035 EDIT HISTORY FOR FILE
36
Jeff Johnson295189b2012-06-20 16:38:30 -070037 This section contains comments describing changes made to the module.
38 Notice that changes are listed in reverse chronological order.
39
Jeff Johnson295189b2012-06-20 16:38:30 -070040 when who what, where, why
41---------- --- --------------------------------------------------------
4206/03/10 js Added support to hostapd driven
43 * deauth/disassoc/mic failure
Jeff Johnson295189b2012-06-20 16:38:30 -070044===========================================================================*/
Jeff Johnson295189b2012-06-20 16:38:30 -070045#include "aniGlobal.h" //for tpAniSirGlobal
46#include "wlan_qct_wda.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070047#ifdef FEATURE_WLAN_INTEGRATED_SOC
48#include "halMsgApi.h" //for HAL_STA_INVALID_IDX.
49#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070050#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
51#include "halPhyApi.h"
52#include "halInternal.h"
53#endif
Jeff Johnsone7245742012-09-05 17:12:55 -070054#include "limUtils.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070055#include "palApi.h"
56#include "csrInsideApi.h"
57#include "smsDebug.h"
58#include "logDump.h"
59#include "smeQosInternal.h"
60#include "wlan_qct_tl.h"
61#include "smeInside.h"
62#include "vos_diag_core_event.h"
63#include "vos_diag_core_log.h"
64#include "csrApi.h"
65#include "pmc.h"
66#include "vos_nvitem.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070067#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
68#include "csrNeighborRoam.h"
69#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
Jeff Johnson295189b2012-06-20 16:38:30 -070070#ifdef FEATURE_WLAN_CCX
71#include "csrCcx.h"
72#endif /* FEATURE_WLAN_CCX */
Jeff Johnson295189b2012-06-20 16:38:30 -070073#define CSR_NUM_IBSS_START_CHANNELS_50 4
74#define CSR_NUM_IBSS_START_CHANNELS_24 3
75#define CSR_DEF_IBSS_START_CHANNEL_50 36
76#define CSR_DEF_IBSS_START_CHANNEL_24 1
77#define CSR_IBSS_JOIN_TIMEOUT_PERIOD ( 1 * PAL_TIMER_TO_SEC_UNIT ) // 1 second
78#define CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD ( 50 * PAL_TIMER_TO_SEC_UNIT ) // 50 seconds, for WPA, WPA2, CCKM
79#define CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD ( 120 * PAL_TIMER_TO_SEC_UNIT ) // 120 seconds, for WPS
80/*---------------------------------------------------------------------------
81 OBIWAN recommends [8 10]% : pick 9%
82---------------------------------------------------------------------------*/
83#define CSR_VCC_UL_MAC_LOSS_THRESHOLD 9
Jeff Johnson295189b2012-06-20 16:38:30 -070084/*---------------------------------------------------------------------------
85 OBIWAN recommends -85dBm
86---------------------------------------------------------------------------*/
87#define CSR_VCC_RSSI_THRESHOLD 80
88#define CSR_MIN_GLOBAL_STAT_QUERY_PERIOD 500 //ms
89#define CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS 2000 //ms
90#define CSR_MIN_TL_STAT_QUERY_PERIOD 500 //ms
91#define CSR_DIAG_LOG_STAT_PERIOD 3000 //ms
Jeff Johnson295189b2012-06-20 16:38:30 -070092//We use constatnt 4 here
93//This macro returns true when higher AC parameter is bigger than lower AC for a difference
94//The bigger the number, the less chance of TX
95//It must put lower AC as the first parameter.
96#define SME_DETECT_AC_WEIGHT_DIFF(loAC, hiAC) (v_BOOL_t)(((hiAC) > (loAC)) ? (((hiAC)-(loAC)) > 4) : 0)
Jeff Johnson295189b2012-06-20 16:38:30 -070097//Flag to send/do not send disassoc frame over the air
98#define CSR_DONT_SEND_DISASSOC_OVER_THE_AIR 1
Jeff Johnson295189b2012-06-20 16:38:30 -070099#define RSSI_HACK_BMPS (-40)
Jeff Johnsone7245742012-09-05 17:12:55 -0700100#define MAX_CB_VALUE_IN_INI (2)
101
Jeff Johnson295189b2012-06-20 16:38:30 -0700102/*--------------------------------------------------------------------------
103 Static Type declarations
104 ------------------------------------------------------------------------*/
105static tChannelListWithPower csrRoamPowerTableFromEeprom[WNI_CFG_VALID_CHANNEL_LIST_LEN];
106static tChannelListWithPower csrRoamPowerTableFromEeprom40MHz[WNI_CFG_VALID_CHANNEL_LIST_LEN];
107static tCsrRoamSession csrRoamRoamSession[CSR_ROAM_SESSION_MAX];
Jeff Johnson295189b2012-06-20 16:38:30 -0700108/*--------------------------------------------------------------------------
109 Type declarations
110 ------------------------------------------------------------------------*/
111#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -0700112int diagAuthTypeFromCSRType(eCsrAuthType authType)
113{
114 int n = AUTH_OPEN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700115 switch(authType)
116 {
117 case eCSR_AUTH_TYPE_SHARED_KEY:
118 n = AUTH_SHARED;
119 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700120 case eCSR_AUTH_TYPE_WPA:
121 n = AUTH_WPA_EAP;
122 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700123 case eCSR_AUTH_TYPE_WPA_PSK:
124 n = AUTH_WPA_PSK;
125 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700126 case eCSR_AUTH_TYPE_RSN:
127 n = AUTH_WPA2_EAP;
128 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700129 case eCSR_AUTH_TYPE_RSN_PSK:
130 n = AUTH_WPA2_PSK;
131 break;
132#ifdef FEATURE_WLAN_WAPI
133 case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
134 n = AUTH_WAPI_CERT;
135 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700136 case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
137 n = AUTH_WAPI_PSK;
138 break;
139#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -0700140 default:
141 break;
142 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700143 return (n);
144}
Jeff Johnson295189b2012-06-20 16:38:30 -0700145int diagEncTypeFromCSRType(eCsrEncryptionType encType)
146{
147 int n = ENC_MODE_OPEN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700148 switch(encType)
149 {
150 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
151 case eCSR_ENCRYPT_TYPE_WEP40:
152 n = ENC_MODE_WEP40;
153 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700154 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
155 case eCSR_ENCRYPT_TYPE_WEP104:
156 n = ENC_MODE_WEP104;
157 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700158 case eCSR_ENCRYPT_TYPE_TKIP:
159 n = ENC_MODE_TKIP;
160 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700161 case eCSR_ENCRYPT_TYPE_AES:
162 n = ENC_MODE_AES;
163 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700164#ifdef FEATURE_WLAN_WAPI
165 case eCSR_ENCRYPT_TYPE_WPI:
166 n = ENC_MODE_SMS4;
167 break;
168#endif /* FEATURE_WLAN_WAPI */
169 default:
170 break;
171 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700172 return (n);
173}
Jeff Johnson295189b2012-06-20 16:38:30 -0700174#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -0700175static const tANI_U8 csrStartIbssChannels50[ CSR_NUM_IBSS_START_CHANNELS_50 ] = { 36, 40, 44, 48};
176static const tANI_U8 csrStartIbssChannels24[ CSR_NUM_IBSS_START_CHANNELS_24 ] = { 1, 6, 11 };
Jeff Johnson295189b2012-06-20 16:38:30 -0700177static void initConfigParam(tpAniSirGlobal pMac);
178static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
179 eCsrRoamCompleteResult Result, void *Context );
180static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId,
181 tCsrRoamProfile *pProfile,
182 tANI_BOOLEAN *pfSameIbss );
183static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirSmeNewBssInfo *pNewBss );
184static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
Jeff Johnsone7245742012-09-05 17:12:55 -0700185 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes);
186static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -0700187eHalStatus csrInitGetChannels(tpAniSirGlobal pMac);
188static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result );
189eHalStatus csrRoamOpen(tpAniSirGlobal pMac);
190eHalStatus csrRoamClose(tpAniSirGlobal pMac);
191void csrRoamMICErrorTimerHandler(void *pv);
192void csrRoamTKIPCounterMeasureTimerHandler(void *pv);
193tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2);
194
195static eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval);
196static eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId);
197static void csrRoamRoamingTimerHandler(void *pv);
198eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval);
199eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId);
200static void csrRoamIbssJoinTimerHandler(void *pv);
201eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval);
202eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac);
203static void csrRoamWaitForKeyTimeOutHandler(void *pv);
204
205static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo);
Jeff Johnsone7245742012-09-05 17:12:55 -0700206static eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo);
Jeff Johnson295189b2012-06-20 16:38:30 -0700207static eHalStatus csrRoamFreeConnectedInfo( tpAniSirGlobal pMac, tCsrRoamConnectedInfo *pConnectedInfo );
208eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
209 tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType,
210 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
211 tANI_U8 keyId, tANI_U8 keyLength, tANI_U8 *pKey, tANI_U8 paeRole,
212 tANI_U8 *pKeyRsc );
213static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId,
214 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes,
215 tCsrRoamProfile *pProfile );
216void csrRoamStatisticsTimerHandler(void *pv);
217void csrRoamStatsGlobalClassDTimerHandler(void *pv);
Jeff Johnson295189b2012-06-20 16:38:30 -0700218static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid);
219VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal,
220 v_U8_t rssiNotification,
221 void * context);
222static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId);
223void csrRoamVccTrigger(tpAniSirGlobal pMac);
224eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId);
225/*
226 pStaEntry is no longer invalid upon the return of this function.
227*/
228static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700229#ifdef WLAN_SOFTAP_FEATURE
230static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,tANI_U8 operationChn, eCsrBand *pBand );
231#else
232static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn, tANI_U8 operationChn, eCsrBand *pBand );
233#endif
234static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -0700235tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
236 tDblLinkList *pStaList,
237 tCsrStatsClientReqInfo *pStaEntry);
238void csrRoamStatsClientTimerHandler(void *pv);
239tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask,
240 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId);
241void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
242 tCsrStatsCallback callback, tANI_U8 staId, void *pContext);
Jeff Johnsone7245742012-09-05 17:12:55 -0700243void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats);
Jeff Johnson295189b2012-06-20 16:38:30 -0700244void csrRoamTlStatsTimerHandler(void *pv);
245void csrRoamPeStatsTimerHandler(void *pv);
246tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask);
247void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry);
248tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask);
249eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac);
250static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac );
251static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc );
252static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId );
253static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
254 tCsrRoamSetKey *pSetKey, tANI_U32 roamId );
255//static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand );
256static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc);
257void csrRoamReissueRoamCommand(tpAniSirGlobal pMac);
258#ifdef FEATURE_WLAN_BTAMP_UT_RF
259void csrRoamJoinRetryTimerHandler(void *pv);
260#endif
261extern void SysProcessMmhMsg(tpAniSirGlobal pMac, tSirMsgQ* pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700262extern void btampEstablishLogLinkHdlr(void* pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700263static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp);
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -0700264void csrReinitPreauthCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand);
Jeff Johnson295189b2012-06-20 16:38:30 -0700265
266//Initialize global variables
267static void csrRoamInitGlobals(tpAniSirGlobal pMac)
268{
269 if(pMac)
270 {
271 pMac->roam.powerTableFromEeprom = csrRoamPowerTableFromEeprom;
272 pMac->roam.powerTableFromEeprom40MHz = csrRoamPowerTableFromEeprom40MHz;
273 pMac->roam.roamSession = csrRoamRoamSession;
274 }
275 return;
276}
277
Jeff Johnson295189b2012-06-20 16:38:30 -0700278static void csrRoamDeInitGlobals(tpAniSirGlobal pMac)
279{
280 if(pMac)
281 {
282 pMac->roam.powerTableFromEeprom = NULL;
283 pMac->roam.powerTableFromEeprom40MHz = NULL;
284 pMac->roam.roamSession = NULL;
285 }
286 return;
287}
Jeff Johnson295189b2012-06-20 16:38:30 -0700288eHalStatus csrOpen(tpAniSirGlobal pMac)
289{
290 eHalStatus status = eHAL_STATUS_SUCCESS;
291 static uNvTables nvTables;
292 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700293 v_REGDOMAIN_t regId;
294 tANI_U32 i;
295
296 do
297 {
298 /* Initialize CSR Roam Globals */
299 csrRoamInitGlobals(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700300 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
301 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_STOP, i);
302
303 initConfigParam(pMac);
304 if(!HAL_STATUS_SUCCESS((status = csrScanOpen(pMac))))
305 break;
306 if(!HAL_STATUS_SUCCESS((status = csrRoamOpen(pMac))))
307 break;
308 pMac->roam.nextRoamId = 1; //Must not be 0
309 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.statsClientReqList)))
310 break;
311 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.peStatsReqList)))
312 break;
313 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.roamCmdPendingList)))
314 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700315 vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
316 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
317 {
318 palCopyMemory( pMac->hHdd, pMac->scan.countryCodeDefault,
319 nvTables.defaultCountryTable.countryCode, WNI_CFG_COUNTRY_CODE_LEN );
320 status = eHAL_STATUS_SUCCESS;
321 }
322 else
323 {
324 smsLog( pMac, LOGE, FL(" fail to get NV_FIELD_IMAGE\n") );
325 //hardcoded for now
326 pMac->scan.countryCodeDefault[0] = 'U';
327 pMac->scan.countryCodeDefault[1] = 'S';
328 pMac->scan.countryCodeDefault[2] = 'I';
329 //status = eHAL_STATUS_SUCCESS;
330 }
Madan Mohan Koyyalamudi8b7f1e62012-10-05 14:56:51 -0700331 smsLog( pMac, LOG1, FL(" country Code from nvRam %s"), pMac->scan.countryCodeDefault );
Jeff Johnson295189b2012-06-20 16:38:30 -0700332 csrGetRegulatoryDomainForCountry(pMac, pMac->scan.countryCodeDefault, &regId);
Jeff Johnson295189b2012-06-20 16:38:30 -0700333 WDA_SetRegDomain(pMac, regId);
334 pMac->scan.domainIdDefault = regId;
335 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
Jeff Johnson295189b2012-06-20 16:38:30 -0700336 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
337 pMac->scan.countryCodeDefault, WNI_CFG_COUNTRY_CODE_LEN);
338 status = csrInitGetChannels( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -0700339 }while(0);
340
341 return (status);
342}
343
Jeff Johnson295189b2012-06-20 16:38:30 -0700344#ifdef WLAN_SOFTAP_FEATURE
345eHalStatus csrSetRegInfo(tHalHandle hHal, tANI_U8 *apCntryCode)
346{
347 eHalStatus status = eHAL_STATUS_SUCCESS;
348 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
349 v_REGDOMAIN_t regId;
350 v_U8_t cntryCodeLength;
Jeff Johnson295189b2012-06-20 16:38:30 -0700351 if(NULL == apCntryCode)
352 {
353 smsLog( pMac, LOGW, FL(" Invalid country Code Pointer\n") );
354 return eHAL_STATUS_FAILURE;
355 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700356 smsLog( pMac, LOGW, FL(" country Code %s\n"), apCntryCode );
Jeff Johnson295189b2012-06-20 16:38:30 -0700357 /* To get correct Regulatory domain from NV table
358 * 2 character Country code should be used
359 * 3rd charater is optional for indoor/outdoor setting */
360 cntryCodeLength = strlen(apCntryCode);
Madan Mohan Koyyalamudib666eb12012-09-18 17:29:47 -0700361
362 if (cntryCodeLength > WNI_CFG_COUNTRY_CODE_LEN)
363 {
364 smsLog( pMac, LOGW, FL(" Invalid Country Code Length\n") );
365 return eHAL_STATUS_FAILURE;
366 }
367
Jeff Johnson295189b2012-06-20 16:38:30 -0700368 status = csrGetRegulatoryDomainForCountry(pMac, apCntryCode, &regId);
369 if (status != eHAL_STATUS_SUCCESS)
370 {
371 smsLog( pMac, LOGE, FL(" fail to get regId for country Code %s\n"), apCntryCode );
372 return status;
373 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700374 status = WDA_SetRegDomain(hHal, regId);
375 if (status != eHAL_STATUS_SUCCESS)
376 {
377 smsLog( pMac, LOGE, FL(" fail to get regId for country Code %s\n"), apCntryCode );
378 return status;
379 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700380 pMac->scan.domainIdDefault = regId;
381 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
Jeff Johnson295189b2012-06-20 16:38:30 -0700382 /* Clear CC field */
383 palFillMemory( pMac->hHdd,
384 pMac->scan.countryCodeDefault,
385 WNI_CFG_COUNTRY_CODE_LEN,
386 0 );
387 /* Copy 2 or 3 bytes country code */
388 palCopyMemory( pMac->hHdd, pMac->scan.countryCodeDefault,
389 apCntryCode, cntryCodeLength );
Jeff Johnson295189b2012-06-20 16:38:30 -0700390 /* If 2 bytes country code, 3rd byte must be filled with space */
391 if((WNI_CFG_COUNTRY_CODE_LEN - 1) == cntryCodeLength)
392 {
393 palFillMemory( pMac->hHdd,
394 pMac->scan.countryCodeDefault + 2,
395 1,
396 0x20 );
397 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700398 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
399 pMac->scan.countryCodeDefault, WNI_CFG_COUNTRY_CODE_LEN);
400 status = csrInitGetChannels( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -0700401 return status;
402}
Jeff Johnson295189b2012-06-20 16:38:30 -0700403eHalStatus csrSetChannels(tHalHandle hHal, tCsrConfigParam *pParam )
404{
405 eHalStatus status = eHAL_STATUS_SUCCESS;
406 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
407 tANI_U8 index = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700408 palCopyMemory( pMac->hHdd, pParam->Csr11dinfo.countryCode,
409 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN );
Jeff Johnson295189b2012-06-20 16:38:30 -0700410 for ( index = 0; index < pMac->scan.base20MHzChannels.numChannels ; index++)
411 {
412 pParam->Csr11dinfo.Channels.channelList[index] = pMac->scan.base20MHzChannels.channelList[ index ];
413 pParam->Csr11dinfo.ChnPower[index].firstChannel = pMac->scan.base20MHzChannels.channelList[ index ];
414 pParam->Csr11dinfo.ChnPower[index].numChannels = 1;
415 pParam->Csr11dinfo.ChnPower[index].maxtxPower = pMac->scan.defaultPowerTable[index].pwr;
416 }
417 pParam->Csr11dinfo.Channels.numChannels = pMac->scan.base20MHzChannels.numChannels;
418
419 return status;
420}
421#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700422eHalStatus csrClose(tpAniSirGlobal pMac)
423{
424 eHalStatus status = eHAL_STATUS_SUCCESS;
425
426 csrStop(pMac);
427 csrRoamClose(pMac);
428 csrScanClose(pMac);
429 csrLLClose(&pMac->roam.statsClientReqList);
430 csrLLClose(&pMac->roam.peStatsReqList);
431 csrLLClose(&pMac->roam.roamCmdPendingList);
Jeff Johnson295189b2012-06-20 16:38:30 -0700432 /* DeInit Globals */
433 csrRoamDeInitGlobals(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700434 return (status);
435}
Jeff Johnson295189b2012-06-20 16:38:30 -0700436eHalStatus csrStart(tpAniSirGlobal pMac)
437{
438 eHalStatus status = eHAL_STATUS_SUCCESS;
439 tANI_U32 i;
440
441 do
442 {
443 //save the global vos context
444 pMac->roam.gVosContext = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
445 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
446 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, i );
447
448 status = csrRoamStart(pMac);
449 if(!HAL_STATUS_SUCCESS(status)) break;
450 pMac->scan.f11dInfoApplied = eANI_BOOLEAN_FALSE;
451 status = pmcRegisterPowerSaveCheck(pMac, csrCheckPSReady, pMac);
452 if(!HAL_STATUS_SUCCESS(status)) break;
453 pMac->roam.sPendingCommands = 0;
454 csrScanEnable(pMac);
455#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
456 status = csrNeighborRoamInit(pMac);
457#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
458 pMac->roam.tlStatsReqInfo.numClient = 0;
459 pMac->roam.tlStatsReqInfo.periodicity = 0;
460 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
461 //init the link quality indication also
462 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_MIN_IND;
463 if(!HAL_STATUS_SUCCESS(status))
464 {
465 smsLog(pMac, LOGW, " csrStart: Couldn't Init HO control blk \n");
466 break;
467 }
468 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700469#if defined(ANI_LOGDUMP)
470 csrDumpInit(pMac);
471#endif //#if defined(ANI_LOGDUMP)
Jeff Johnson295189b2012-06-20 16:38:30 -0700472 return (status);
473}
474
Jeff Johnson295189b2012-06-20 16:38:30 -0700475eHalStatus csrStop(tpAniSirGlobal pMac)
476{
477 tANI_U32 sessionId;
478 tANI_U32 i;
479
480 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
481 {
482 csrRoamCloseSession(pMac, sessionId, TRUE, NULL, NULL);
483 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700484 csrScanDisable(pMac);
485 pMac->scan.fCancelIdleScan = eANI_BOOLEAN_FALSE;
486 pMac->scan.fRestartIdleScan = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700487 csrLLPurge( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_TRUE );
488
489#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
490 csrNeighborRoamClose(pMac);
491#endif
492 csrScanFlushResult(pMac); //Do we want to do this?
Jeff Johnson295189b2012-06-20 16:38:30 -0700493 // deregister from PMC since we register during csrStart()
494 // (ignore status since there is nothing we can do if it fails)
495 (void) pmcDeregisterPowerSaveCheck(pMac, csrCheckPSReady);
Jeff Johnson295189b2012-06-20 16:38:30 -0700496 //Reset the domain back to the deault
497 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
498 csrResetCountryInformation(pMac, eANI_BOOLEAN_TRUE);
499
500 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
501 {
502 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_STOP ,i );
503 pMac->roam.curSubState[i] = eCSR_ROAM_SUBSTATE_NONE;
504 }
505
506 return (eHAL_STATUS_SUCCESS);
507}
508
Jeff Johnson295189b2012-06-20 16:38:30 -0700509eHalStatus csrReady(tpAniSirGlobal pMac)
510{
511 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700512 csrScanGetSupportedChannels( pMac );
513 //WNI_CFG_VALID_CHANNEL_LIST should be set by this time
514 //use it to init the background scan list
515 csrInitBGScanChannelList(pMac);
516 /* HDD issues the init scan */
517 csrScanStartResultAgingTimer(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700518 //Store the AC weights in TL for later use
519 WLANTL_GetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
Jeff Johnson295189b2012-06-20 16:38:30 -0700520 status = csrInitChannelList( pMac );
521 if ( ! HAL_STATUS_SUCCESS( status ) )
522 {
523 smsLog( pMac, LOGE, "csrInitChannelList failed during csrReady with status=%d\n",
524 status );
525 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700526 return (status);
527}
Jeff Johnson295189b2012-06-20 16:38:30 -0700528void csrSetDefaultDot11Mode( tpAniSirGlobal pMac )
529{
530 v_U32_t wniDot11mode = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700531 wniDot11mode = csrTranslateToWNICfgDot11Mode(pMac,pMac->roam.configParam.uCfgDot11Mode);
532 ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, wniDot11mode, NULL, eANI_BOOLEAN_FALSE);
533}
Jeff Johnson295189b2012-06-20 16:38:30 -0700534void csrSetGlobalCfgs( tpAniSirGlobal pMac )
535{
Jeff Johnsone7245742012-09-05 17:12:55 -0700536
Jeff Johnson295189b2012-06-20 16:38:30 -0700537 ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
538 ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
539 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
540 ((pMac->roam.configParam.Is11hSupportEnabled) ? pMac->roam.configParam.Is11dSupportEnabled : pMac->roam.configParam.Is11dSupportEnabled),
541 NULL, eANI_BOOLEAN_FALSE);
542 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnsone7245742012-09-05 17:12:55 -0700543 /* For now we will just use the 5GHz CB mode ini parameter to decide whether CB supported or not in Probes when there is no session
544 * Once session is established we will use the session related params stored in PE session for CB mode
545 */
546 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, !!(pMac->roam.configParam.channelBondingMode5GHz), NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 ccmCfgSetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, pMac->roam.configParam.HeartbeatThresh24, NULL, eANI_BOOLEAN_FALSE);
548
549 //Update the operating mode to configured value during initialization,
550 //So that client can advertise full capabilities in Probe request frame.
551 csrSetDefaultDot11Mode( pMac );
552}
553
Jeff Johnson295189b2012-06-20 16:38:30 -0700554eHalStatus csrRoamOpen(tpAniSirGlobal pMac)
555{
556 eHalStatus status = eHAL_STATUS_SUCCESS;
557 tANI_U32 i;
558 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -0700559 do
560 {
561 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
562 {
563 pSession = CSR_GET_SESSION( pMac, i );
564 pSession->roamingTimerInfo.pMac = pMac;
565 pSession->roamingTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
566 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700567 pMac->roam.WaitForKeyTimerInfo.pMac = pMac;
568 pMac->roam.WaitForKeyTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
569 status = palTimerAlloc(pMac->hHdd, &pMac->roam.hTimerWaitForKey, csrRoamWaitForKeyTimeOutHandler,
570 &pMac->roam.WaitForKeyTimerInfo);
571 if(!HAL_STATUS_SUCCESS(status))
572 {
573 smsLog(pMac, LOGE, FL("cannot allocate memory for WaitForKey time out timer\n"));
574 break;
575 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700576 status = palTimerAlloc(pMac->hHdd, &pMac->roam.tlStatsReqInfo.hTlStatsTimer, csrRoamTlStatsTimerHandler, pMac);
577 if(!HAL_STATUS_SUCCESS(status))
578 {
579 smsLog(pMac, LOGE, FL("cannot allocate memory for summary Statistics timer\n"));
580 return eHAL_STATUS_FAILURE;
581 }
582 }while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700583 return (status);
584}
585
Jeff Johnson295189b2012-06-20 16:38:30 -0700586eHalStatus csrRoamClose(tpAniSirGlobal pMac)
587{
588 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
590 {
591 csrRoamCloseSession(pMac, sessionId, TRUE, NULL, NULL);
592 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700593 palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey);
594 palTimerFree(pMac->hHdd, pMac->roam.hTimerWaitForKey);
Jeff Johnson295189b2012-06-20 16:38:30 -0700595 palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
596 palTimerFree(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
Jeff Johnson295189b2012-06-20 16:38:30 -0700597 return (eHAL_STATUS_SUCCESS);
598}
599
Jeff Johnson295189b2012-06-20 16:38:30 -0700600eHalStatus csrRoamStart(tpAniSirGlobal pMac)
601{
602 (void)pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -0700603 return (eHAL_STATUS_SUCCESS);
604}
605
Jeff Johnson295189b2012-06-20 16:38:30 -0700606void csrRoamStop(tpAniSirGlobal pMac, tANI_U32 sessionId)
607{
608 csrRoamStopRoamingTimer(pMac, sessionId);
609 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
610 csrRoamDeregStatisticsReq(pMac);
611}
Jeff Johnson295189b2012-06-20 16:38:30 -0700612eHalStatus csrRoamGetConnectState(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrConnectState *pState)
613{
614 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -0700615 if( pState )
616 {
617 status = eHAL_STATUS_SUCCESS;
618 *pState = pMac->roam.roamSession[sessionId].connectState;
619 }
620 return (status);
621}
622
Jeff Johnson295189b2012-06-20 16:38:30 -0700623eHalStatus csrRoamCopyConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamConnectedProfile *pProfile)
624{
625 eHalStatus status = eHAL_STATUS_FAILURE;
626 tANI_U32 size = 0;
627 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700628
629 if(!pSession)
630 {
631 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
632 return eHAL_STATUS_FAILURE;
633 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700634
635 if(pProfile)
636 {
637 if(pSession->pConnectBssDesc)
638 {
639 do
640 {
641 size = pSession->pConnectBssDesc->length + sizeof(pSession->pConnectBssDesc->length);
642 if(size)
643 {
644 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile->pBssDesc, size);
645 if(HAL_STATUS_SUCCESS(status))
646 {
647 palCopyMemory(pMac->hHdd, pProfile->pBssDesc, pSession->pConnectBssDesc, size);
648 }
649 else
650 break;
651 }
652 else
653 {
654 pProfile->pBssDesc = NULL;
655 }
656 pProfile->AuthType = pSession->connectedProfile.AuthType;
657 pProfile->EncryptionType = pSession->connectedProfile.EncryptionType;
658 pProfile->mcEncryptionType = pSession->connectedProfile.mcEncryptionType;
659 pProfile->BSSType = pSession->connectedProfile.BSSType;
660 pProfile->operationChannel = pSession->connectedProfile.operationChannel;
661 pProfile->CBMode = pSession->connectedProfile.CBMode;
662 palCopyMemory(pMac->hHdd, &pProfile->bssid, &pSession->connectedProfile.bssid, sizeof(tCsrBssid));
663 palCopyMemory(pMac->hHdd, &pProfile->SSID, &pSession->connectedProfile.SSID, sizeof(tSirMacSSid));
664#ifdef WLAN_FEATURE_VOWIFI_11R
665 if (pSession->connectedProfile.MDID.mdiePresent)
666 {
667 pProfile->MDID.mdiePresent = 1;
668 pProfile->MDID.mobilityDomain = pSession->connectedProfile.MDID.mobilityDomain;
669 }
670 else
671 {
672 pProfile->MDID.mdiePresent = 0;
673 pProfile->MDID.mobilityDomain = 0;
674 }
675#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700676#ifdef FEATURE_WLAN_CCX
677 pProfile->isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
Jeff Johnson295189b2012-06-20 16:38:30 -0700678 if (csrIsAuthTypeCCX(pSession->connectedProfile.AuthType))
679 {
680 palCopyMemory( pMac->hHdd, pProfile->ccxCckmInfo.krk,
681 pSession->connectedProfile.ccxCckmInfo.krk, CSR_KRK_KEY_LEN );
682 pProfile->ccxCckmInfo.reassoc_req_num=
683 pSession->connectedProfile.ccxCckmInfo.reassoc_req_num;
684 pProfile->ccxCckmInfo.krk_plumbed =
685 pSession->connectedProfile.ccxCckmInfo.krk_plumbed;
686 }
687#endif
688 }while(0);
689 }
690 }
691
692 return (status);
693}
694
Jeff Johnson295189b2012-06-20 16:38:30 -0700695eHalStatus csrRoamGetConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamConnectedProfile *pProfile)
696{
697 eHalStatus status = eHAL_STATUS_FAILURE;
698
699 if(csrIsConnStateConnected(pMac, sessionId))
700 {
701 if(pProfile)
702 {
703 status = csrRoamCopyConnectProfile(pMac, sessionId, pProfile);
704 }
705 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700706 return (status);
707}
Jeff Johnson295189b2012-06-20 16:38:30 -0700708eHalStatus csrRoamFreeConnectProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile)
709{
710 eHalStatus status = eHAL_STATUS_SUCCESS;
711
712 if(pProfile->pBssDesc)
713 {
714 palFreeMemory(pMac->hHdd, pProfile->pBssDesc);
715 }
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -0700716 if(pProfile->pAddIEAssoc)
717 {
718 palFreeMemory(pMac->hHdd, pProfile->pAddIEAssoc);
719 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700720 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamConnectedProfile));
721 pProfile->AuthType = eCSR_AUTH_TYPE_UNKNOWN;
722 return (status);
723}
724
Jeff Johnson295189b2012-06-20 16:38:30 -0700725static eHalStatus csrRoamFreeConnectedInfo( tpAniSirGlobal pMac, tCsrRoamConnectedInfo *pConnectedInfo )
726{
727 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700728 if( pConnectedInfo->pbFrames )
729 {
730 palFreeMemory( pMac->hHdd, pConnectedInfo->pbFrames );
731 pConnectedInfo->pbFrames = NULL;
732 }
733 pConnectedInfo->nBeaconLength = 0;
734 pConnectedInfo->nAssocReqLength = 0;
735 pConnectedInfo->nAssocRspLength = 0;
736 pConnectedInfo->staId = 0;
737#ifdef WLAN_FEATURE_VOWIFI_11R
738 pConnectedInfo->nRICRspLength = 0;
739#endif
740#ifdef FEATURE_WLAN_CCX
741 pConnectedInfo->nTspecIeLength = 0;
742#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700743 return ( status );
744}
745
Jeff Johnson295189b2012-06-20 16:38:30 -0700746
747
Jeff Johnsone7245742012-09-05 17:12:55 -0700748
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -0700749void csrReleaseCommandPreauth(tpAniSirGlobal pMac, tSmeCmd *pCommand)
750{
751 csrReinitPreauthCmd(pMac, pCommand);
752 csrReleaseCommand( pMac, pCommand );
753}
754
Jeff Johnson295189b2012-06-20 16:38:30 -0700755void csrReleaseCommandRoam(tpAniSirGlobal pMac, tSmeCmd *pCommand)
756{
757 csrReinitRoamCmd(pMac, pCommand);
758 csrReleaseCommand( pMac, pCommand );
759}
760
Jeff Johnson295189b2012-06-20 16:38:30 -0700761void csrReleaseCommandScan(tpAniSirGlobal pMac, tSmeCmd *pCommand)
762{
763 csrReinitScanCmd(pMac, pCommand);
764 csrReleaseCommand( pMac, pCommand );
765}
766
Jeff Johnson295189b2012-06-20 16:38:30 -0700767void csrReleaseCommandWmStatusChange(tpAniSirGlobal pMac, tSmeCmd *pCommand)
768{
769 csrReinitWmStatusChangeCmd(pMac, pCommand);
770 csrReleaseCommand( pMac, pCommand );
771}
772
Jeff Johnson295189b2012-06-20 16:38:30 -0700773void csrReinitSetKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
774{
775 palZeroMemory(pMac->hHdd, &pCommand->u.setKeyCmd, sizeof(tSetKeyCmd));
776}
777
Jeff Johnson295189b2012-06-20 16:38:30 -0700778void csrReinitRemoveKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
779{
780 palZeroMemory(pMac->hHdd, &pCommand->u.removeKeyCmd, sizeof(tRemoveKeyCmd));
781}
782
Jeff Johnson295189b2012-06-20 16:38:30 -0700783void csrReleaseCommandSetKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
784{
785 csrReinitSetKeyCmd(pMac, pCommand);
786 csrReleaseCommand( pMac, pCommand );
787}
Jeff Johnson295189b2012-06-20 16:38:30 -0700788void csrReleaseCommandRemoveKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
789{
790 csrReinitRemoveKeyCmd(pMac, pCommand);
791 csrReleaseCommand( pMac, pCommand );
792}
Jeff Johnson295189b2012-06-20 16:38:30 -0700793void csrAbortCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fStopping )
794{
795
796 if( eSmeCsrCommandMask & pCommand->command )
797 {
798 switch (pCommand->command)
799 {
800 case eSmeCommandScan:
801 // We need to inform the requester before droping the scan command
802 smsLog( pMac, LOGW, "%s: Drop scan reason %d callback 0x%X\n",
803 __FUNCTION__, pCommand->u.scanCmd.reason, (unsigned int)pCommand->u.scanCmd.callback);
804 if (NULL != pCommand->u.scanCmd.callback)
805 {
806 smsLog( pMac, LOGW, "%s callback scan requester\n", __FUNCTION__);
807 csrScanCallCallback(pMac, pCommand, eCSR_SCAN_ABORT);
808 }
809 csrReleaseCommandScan( pMac, pCommand );
810 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700811 case eSmeCommandRoam:
812 csrReleaseCommandRoam( pMac, pCommand );
813 break;
814
815 case eSmeCommandWmStatusChange:
816 csrReleaseCommandWmStatusChange( pMac, pCommand );
817 break;
818
819 case eSmeCommandSetKey:
820 csrReleaseCommandSetKey( pMac, pCommand );
821 break;
822
823 case eSmeCommandRemoveKey:
824 csrReleaseCommandRemoveKey( pMac, pCommand );
825 break;
826
827 default:
828 smsLog( pMac, LOGW, " CSR abort standard command %d\n", pCommand->command );
829 csrReleaseCommand( pMac, pCommand );
830 break;
831 }
832 }
833}
834
Jeff Johnson295189b2012-06-20 16:38:30 -0700835void csrRoamSubstateChange( tpAniSirGlobal pMac, eCsrRoamSubState NewSubstate, tANI_U32 sessionId)
836{
837 smsLog( pMac, LOG1, " CSR RoamSubstate: [ %d <== %d ]\n", NewSubstate, pMac->roam.curSubState[sessionId]);
838
Jeff Johnson295189b2012-06-20 16:38:30 -0700839 if(pMac->roam.curSubState[sessionId] == NewSubstate)
840 {
841 return;
Jeff Johnsone7245742012-09-05 17:12:55 -0700842 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700843 pMac->roam.curSubState[sessionId] = NewSubstate;
844}
845
Jeff Johnson295189b2012-06-20 16:38:30 -0700846eCsrRoamState csrRoamStateChange( tpAniSirGlobal pMac, eCsrRoamState NewRoamState, tANI_U8 sessionId)
847{
848 eCsrRoamState PreviousState;
849
850 smsLog( pMac, LOG1, "CSR RoamState: [ %d <== %d ]\n", NewRoamState, pMac->roam.curState[sessionId]);
851
852 PreviousState = pMac->roam.curState[sessionId];
853
854 if ( NewRoamState != pMac->roam.curState[sessionId] )
855 {
856 // Whenever we transition OUT of the Roaming state, clear the Roaming substate...
857 if ( CSR_IS_ROAM_JOINING(pMac, sessionId) )
858 {
859 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
860 }
861
862 pMac->roam.curState[sessionId] = NewRoamState;
863 }
864 return( PreviousState );
865}
866
Jeff Johnson295189b2012-06-20 16:38:30 -0700867void csrAssignRssiForCategory(tpAniSirGlobal pMac, tANI_U8 catOffset)
868{
869 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -0700870 if(catOffset)
871 {
872 pMac->roam.configParam.bCatRssiOffset = catOffset;
873 for(i = 0; i < CSR_NUM_RSSI_CAT; i++)
874 {
875 pMac->roam.configParam.RSSICat[CSR_NUM_RSSI_CAT - i - 1] = (int)CSR_BEST_RSSI_VALUE - (int)(i * catOffset);
876 }
877 }
878}
879
Jeff Johnson295189b2012-06-20 16:38:30 -0700880static void initConfigParam(tpAniSirGlobal pMac)
881{
882 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -0700883 pMac->roam.configParam.agingCount = CSR_AGING_COUNT;
884 pMac->roam.configParam.channelBondingMode24GHz = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
885 pMac->roam.configParam.channelBondingMode5GHz = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700886
Jeff Johnson295189b2012-06-20 16:38:30 -0700887 pMac->roam.configParam.phyMode = eCSR_DOT11_MODE_TAURUS;
888 pMac->roam.configParam.eBand = eCSR_BAND_ALL;
889 pMac->roam.configParam.uCfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
890 pMac->roam.configParam.FragmentationThreshold = eCSR_DOT11_FRAG_THRESH_DEFAULT;
891 pMac->roam.configParam.HeartbeatThresh24 = 40;
892 pMac->roam.configParam.HeartbeatThresh50 = 40;
893 pMac->roam.configParam.Is11dSupportEnabled = eANI_BOOLEAN_FALSE;
894 pMac->roam.configParam.Is11dSupportEnabledOriginal = eANI_BOOLEAN_FALSE;
895 pMac->roam.configParam.Is11eSupportEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700896 pMac->roam.configParam.Is11hSupportEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700897 pMac->roam.configParam.RTSThreshold = 2346;
898 pMac->roam.configParam.shortSlotTime = eANI_BOOLEAN_TRUE;
899 pMac->roam.configParam.WMMSupportMode = eCsrRoamWmmAuto;
900 pMac->roam.configParam.ProprietaryRatesEnabled = eANI_BOOLEAN_TRUE;
901 pMac->roam.configParam.TxRate = eCSR_TX_RATE_AUTO;
902 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
903 pMac->roam.configParam.scanAgeTimeNCNPS = CSR_SCAN_AGING_TIME_NOT_CONNECT_NO_PS;
904 pMac->roam.configParam.scanAgeTimeNCPS = CSR_SCAN_AGING_TIME_NOT_CONNECT_W_PS;
905 pMac->roam.configParam.scanAgeTimeCNPS = CSR_SCAN_AGING_TIME_CONNECT_NO_PS;
906 pMac->roam.configParam.scanAgeTimeCPS = CSR_SCAN_AGING_TIME_CONNECT_W_PS;
907 for(i = 0; i < CSR_NUM_RSSI_CAT; i++)
908 {
909 pMac->roam.configParam.BssPreferValue[i] = i;
910 }
911 csrAssignRssiForCategory(pMac, CSR_DEFAULT_RSSI_DB_GAP);
912 pMac->roam.configParam.nRoamingTime = CSR_DEFAULT_ROAMING_TIME;
913 pMac->roam.configParam.fEnforce11dChannels = eANI_BOOLEAN_FALSE;
914 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700915 pMac->roam.configParam.fEnforceCountryCodeMatch = eANI_BOOLEAN_FALSE;
916 pMac->roam.configParam.fEnforceDefaultDomain = eANI_BOOLEAN_FALSE;
917 pMac->roam.configParam.nActiveMaxChnTime = CSR_ACTIVE_MAX_CHANNEL_TIME;
918 pMac->roam.configParam.nActiveMinChnTime = CSR_ACTIVE_MIN_CHANNEL_TIME;
919 pMac->roam.configParam.nPassiveMaxChnTime = CSR_PASSIVE_MAX_CHANNEL_TIME;
920 pMac->roam.configParam.nPassiveMinChnTime = CSR_PASSIVE_MIN_CHANNEL_TIME;
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -0700921#ifdef WLAN_AP_STA_CONCURRENCY
922 pMac->roam.configParam.nActiveMaxChnTimeConc = CSR_ACTIVE_MAX_CHANNEL_TIME_CONC;
923 pMac->roam.configParam.nActiveMinChnTimeConc = CSR_ACTIVE_MIN_CHANNEL_TIME_CONC;
924 pMac->roam.configParam.nPassiveMaxChnTimeConc = CSR_PASSIVE_MAX_CHANNEL_TIME_CONC;
925 pMac->roam.configParam.nPassiveMinChnTimeConc = CSR_PASSIVE_MIN_CHANNEL_TIME_CONC;
926 pMac->roam.configParam.nRestTimeConc = CSR_REST_TIME_CONC;
927#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700928 pMac->roam.configParam.IsIdleScanEnabled = TRUE; //enable the idle scan by default
929 pMac->roam.configParam.nTxPowerCap = CSR_MAX_TX_POWER;
930 pMac->roam.configParam.statsReqPeriodicity = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD;
931 pMac->roam.configParam.statsReqPeriodicityInPS = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700932#ifdef WLAN_FEATURE_VOWIFI_11R
933 pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported = 0;
934#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700935#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
936 pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries = 3;
937 pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold = 120;
938 pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold = 125;
939 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime = 20;
940 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = 40;
941 pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod = 200;
942 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels = 3;
943 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[0] = 1;
944 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[1] = 6;
945 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[2] = 11;
946 pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod = 20000; //20 seconds
947#endif
Jeff Johnsone7245742012-09-05 17:12:55 -0700948#ifdef WLAN_FEATURE_11AC
949 pMac->roam.configParam.nVhtChannelWidth = WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1;
950#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700951
952 pMac->roam.configParam.addTSWhenACMIsOff = 0;
953 pMac->roam.configParam.fScanTwice = eANI_BOOLEAN_FALSE;
Mohit Khanna349bc392012-09-11 17:24:52 -0700954
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -0700955 //Remove this code once SLM_Sessionization is supported
956 //BMPS_WORKAROUND_NOT_NEEDED
Jeff Johnsone7245742012-09-05 17:12:55 -0700957 pMac->roam.configParam.doBMPSWorkaround = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700958
Jeff Johnsone7245742012-09-05 17:12:55 -0700959}
Jeff Johnson295189b2012-06-20 16:38:30 -0700960eCsrBand csrGetCurrentBand(tHalHandle hHal)
961{
962 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
963 return pMac->roam.configParam.bandCapability;
964}
Jeff Johnson295189b2012-06-20 16:38:30 -0700965eHalStatus csrSetBand(tHalHandle hHal, eCsrBand eBand)
966{
967 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
968 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700969 if (CSR_IS_PHY_MODE_A_ONLY(pMac) &&
970 (eBand == eCSR_BAND_24))
971 {
972 /* DOT11 mode configured to 11a only and received
973 request to change the band to 2.4 GHz */
974 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
975 "failed to set band cfg80211 = %u, band = %u\n",
976 pMac->roam.configParam.uCfgDot11Mode, eBand);
977 return eHAL_STATUS_INVALID_PARAMETER;
978 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700979 if ((CSR_IS_PHY_MODE_B_ONLY(pMac) ||
980 CSR_IS_PHY_MODE_G_ONLY(pMac)) &&
981 (eBand == eCSR_BAND_5G))
982 {
983 /* DOT11 mode configured to 11b/11g only and received
984 request to change the band to 5 GHz */
985 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
986 "failed to set band dot11mode = %u, band = %u\n",
987 pMac->roam.configParam.uCfgDot11Mode, eBand);
988 return eHAL_STATUS_INVALID_PARAMETER;
989 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700990 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
991 "Band changed to %u (0 - ALL, 1 - 2.4 GHZ, 2 - 5GHZ)\n", eBand);
992 pMac->roam.configParam.eBand = eBand;
993 pMac->roam.configParam.bandCapability = eBand;
994 csrScanGetSupportedChannels( pMac );
995 status = csrInitGetChannels( pMac );
996 if (eHAL_STATUS_SUCCESS == status)
997 csrInitChannelList( hHal );
998 return status;
999}
Jeff Johnsone7245742012-09-05 17:12:55 -07001000/* The funcns csrConvertCBIniValueToPhyCBState and csrConvertPhyCBStateToIniValue have been
1001 * introduced to convert the ini value to the ENUM used in csr and MAC for CB state
1002 * Ideally we should have kept the ini value and enum value same and representing the same
1003 * cb values as in 11n standard i.e.
1004 * Set to 1 (SCA) if the secondary channel is above the primary channel
1005 * Set to 3 (SCB) if the secondary channel is below the primary channel
1006 * Set to 0 (SCN) if no secondary channel is present
1007 * However, since our driver is already distributed we will keep the ini definition as it is which is:
1008 * 0 - secondary none
1009 * 1 - secondary LOW
1010 * 2 - secondary HIGH
1011 * and convert to enum value used within the driver in csrChangeDefaultConfigParam using this funcn
1012 * The enum values are as follows:
1013 * PHY_SINGLE_CHANNEL_CENTERED = 0
1014 * PHY_DOUBLE_CHANNEL_LOW_PRIMARY = 1
1015 * PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3
1016 */
1017ePhyChanBondState csrConvertCBIniValueToPhyCBState(v_U32_t cbIniValue)
1018{
1019
1020 ePhyChanBondState phyCbState;
1021 switch (cbIniValue) {
1022 // secondary none
1023 case 0:
1024 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1025 break;
1026 // secondary LOW
1027 case 1:
1028 phyCbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
1029 break;
1030 // secondary HIGH
1031 case 2:
1032 phyCbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
1033 break;
1034#ifdef WLAN_FEATURE_11AC
1035 case 3:
1036 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
1037 break;
1038 case 4:
1039 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1040 break;
1041 case 5:
1042 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1043 break;
1044 case 6:
1045 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
1046 break;
1047 case 7:
1048 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
1049 break;
1050 case 8:
1051 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
1052 break;
1053 case 9:
1054 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
1055 break;
1056#endif
1057 default:
1058 // If an invalid value is passed, disable CHANNEL BONDING
1059 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1060 break;
1061 }
1062 return phyCbState;
1063}
1064
1065v_U32_t csrConvertPhyCBStateToIniValue(ePhyChanBondState phyCbState)
1066{
1067
1068 v_U32_t cbIniValue;
1069 switch (phyCbState) {
1070 // secondary none
1071 case PHY_SINGLE_CHANNEL_CENTERED:
1072 cbIniValue = 0;
1073 break;
1074 // secondary LOW
1075 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1076 cbIniValue = 1;
1077 break;
1078 // secondary HIGH
1079 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1080 cbIniValue = 2;
1081 break;
1082#ifdef WLAN_FEATURE_11AC
1083 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
1084 cbIniValue = 3;
1085 break;
1086 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
1087 cbIniValue = 4;
1088 break;
1089 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
1090 cbIniValue = 5;
1091 break;
1092 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1093 cbIniValue = 6;
1094 break;
1095 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1096 cbIniValue = 7;
1097 break;
1098 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1099 cbIniValue = 8;
1100 break;
1101 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1102 cbIniValue = 9;
1103 break;
1104#endif
1105 default:
1106 // return some invalid value
1107 cbIniValue = 10;
1108 break;
1109 }
1110 return cbIniValue;
1111}
Jeff Johnson295189b2012-06-20 16:38:30 -07001112
1113eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1114{
1115 eHalStatus status = eHAL_STATUS_SUCCESS;
1116
1117 if(pParam)
1118 {
1119 pMac->roam.configParam.WMMSupportMode = pParam->WMMSupportMode;
1120 pMac->roam.configParam.Is11eSupportEnabled = pParam->Is11eSupportEnabled;
1121 pMac->roam.configParam.FragmentationThreshold = pParam->FragmentationThreshold;
1122 pMac->roam.configParam.Is11dSupportEnabled = pParam->Is11dSupportEnabled;
1123 pMac->roam.configParam.Is11dSupportEnabledOriginal = pParam->Is11dSupportEnabled;
1124 pMac->roam.configParam.Is11hSupportEnabled = pParam->Is11hSupportEnabled;
1125
1126 pMac->roam.configParam.fenableMCCMode = pParam->fEnableMCCMode;
Mohit Khanna7ed53f02012-09-11 17:52:10 -07001127 pMac->roam.configParam.fAllowMCCGODiffBI = pParam->fAllowMCCGODiffBI;
1128
Jeff Johnsone7245742012-09-05 17:12:55 -07001129 /* channelBondingMode5GHz plays a dual role right now
1130 * INFRA STA will use this non zero value as CB enabled and SOFTAP will use this non-zero value to determine the secondary channel offset
1131 * This is how channelBondingMode5GHz works now and this is kept intact to avoid any cfg.ini change
1132 */
1133 if (pParam->channelBondingMode24GHz > MAX_CB_VALUE_IN_INI)
1134 {
1135 smsLog( pMac, LOGW, "Invalid CB value from ini in 2.4GHz band %d, CB DISABLED\n", pParam->channelBondingMode24GHz);
1136 }
1137 pMac->roam.configParam.channelBondingMode24GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode24GHz);
1138 if (pParam->channelBondingMode5GHz > MAX_CB_VALUE_IN_INI)
1139 {
1140 smsLog( pMac, LOGW, "Invalid CB value from ini in 5GHz band %d, CB DISABLED\n", pParam->channelBondingMode5GHz);
1141 }
1142 pMac->roam.configParam.channelBondingMode5GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001143 pMac->roam.configParam.RTSThreshold = pParam->RTSThreshold;
1144 pMac->roam.configParam.phyMode = pParam->phyMode;
1145 pMac->roam.configParam.shortSlotTime = pParam->shortSlotTime;
1146 pMac->roam.configParam.HeartbeatThresh24 = pParam->HeartbeatThresh24;
1147 pMac->roam.configParam.HeartbeatThresh50 = pParam->HeartbeatThresh50;
1148 pMac->roam.configParam.ProprietaryRatesEnabled = pParam->ProprietaryRatesEnabled;
1149 pMac->roam.configParam.TxRate = pParam->TxRate;
1150 pMac->roam.configParam.AdHocChannel24 = pParam->AdHocChannel24;
1151 pMac->roam.configParam.AdHocChannel5G = pParam->AdHocChannel5G;
1152 pMac->roam.configParam.bandCapability = pParam->bandCapability;
1153 pMac->roam.configParam.cbChoice = pParam->cbChoice;
1154 pMac->roam.configParam.bgScanInterval = pParam->bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001155 //if HDD passed down non zero values then only update,
1156 //otherwise keep using the defaults
1157 if(pParam->nActiveMaxChnTime)
1158 {
1159 pMac->roam.configParam.nActiveMaxChnTime = pParam->nActiveMaxChnTime;
1160 }
1161 if(pParam->nActiveMinChnTime)
1162 {
1163 pMac->roam.configParam.nActiveMinChnTime = pParam->nActiveMinChnTime;
1164 }
1165 if(pParam->nPassiveMaxChnTime)
1166 {
1167 pMac->roam.configParam.nPassiveMaxChnTime = pParam->nPassiveMaxChnTime;
1168 }
1169 if(pParam->nPassiveMinChnTime)
1170 {
1171 pMac->roam.configParam.nPassiveMinChnTime = pParam->nPassiveMinChnTime;
1172 }
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -07001173#ifdef WLAN_AP_STA_CONCURRENCY
1174 if(pParam->nActiveMaxChnTimeConc)
1175 {
1176 pMac->roam.configParam.nActiveMaxChnTimeConc = pParam->nActiveMaxChnTimeConc;
1177 }
1178 if(pParam->nActiveMinChnTimeConc)
1179 {
1180 pMac->roam.configParam.nActiveMinChnTimeConc = pParam->nActiveMinChnTimeConc;
1181 }
1182 if(pParam->nPassiveMaxChnTimeConc)
1183 {
1184 pMac->roam.configParam.nPassiveMaxChnTimeConc = pParam->nPassiveMaxChnTimeConc;
1185 }
1186 if(pParam->nPassiveMinChnTimeConc)
1187 {
1188 pMac->roam.configParam.nPassiveMinChnTimeConc = pParam->nPassiveMinChnTimeConc;
1189 }
1190 if(pParam->nRestTimeConc)
1191 {
1192 pMac->roam.configParam.nRestTimeConc = pParam->nRestTimeConc;
1193 }
1194#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001195 //if upper layer wants to disable idle scan altogether set it to 0
1196 if(pParam->impsSleepTime)
1197 {
1198 //Change the unit from second to microsecond
1199 tANI_U32 impsSleepTime = pParam->impsSleepTime * PAL_TIMER_TO_SEC_UNIT;
Jeff Johnson295189b2012-06-20 16:38:30 -07001200 if(CSR_IDLE_SCAN_NO_PS_INTERVAL_MIN <= impsSleepTime)
1201 {
1202 pMac->roam.configParam.impsSleepTime = impsSleepTime;
1203 }
1204 else
1205 {
1206 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
1207 }
1208 }
1209 else
1210 {
1211 pMac->roam.configParam.impsSleepTime = 0;
1212 }
1213 pMac->roam.configParam.eBand = pParam->eBand;
1214#ifdef WLAN_SOFTAP_FEATURE
1215 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(NULL, pMac->roam.configParam.phyMode,
1216 pMac->roam.configParam.ProprietaryRatesEnabled);
1217#else
1218 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pMac->roam.configParam.phyMode,
1219 pMac->roam.configParam.ProprietaryRatesEnabled);
1220#endif
1221 //if HDD passed down non zero values for age params, then only update,
1222 //otherwise keep using the defaults
1223 if(pParam->nScanResultAgeCount)
1224 {
1225 pMac->roam.configParam.agingCount = pParam->nScanResultAgeCount;
1226 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001227 if(pParam->scanAgeTimeNCNPS)
1228 {
1229 pMac->roam.configParam.scanAgeTimeNCNPS = pParam->scanAgeTimeNCNPS;
1230 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001231 if(pParam->scanAgeTimeNCPS)
1232 {
1233 pMac->roam.configParam.scanAgeTimeNCPS = pParam->scanAgeTimeNCPS;
1234 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001235 if(pParam->scanAgeTimeCNPS)
1236 {
1237 pMac->roam.configParam.scanAgeTimeCNPS = pParam->scanAgeTimeCNPS;
1238 }
1239 if(pParam->scanAgeTimeCPS)
1240 {
1241 pMac->roam.configParam.scanAgeTimeCPS = pParam->scanAgeTimeCPS;
1242 }
1243
1244 csrAssignRssiForCategory(pMac, pParam->bCatRssiOffset);
1245 pMac->roam.configParam.nRoamingTime = pParam->nRoamingTime;
1246 pMac->roam.configParam.fEnforce11dChannels = pParam->fEnforce11dChannels;
1247 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = pParam->fSupplicantCountryCodeHasPriority;
1248 pMac->roam.configParam.fEnforceCountryCodeMatch = pParam->fEnforceCountryCodeMatch;
1249 pMac->roam.configParam.fEnforceDefaultDomain = pParam->fEnforceDefaultDomain;
Jeff Johnson295189b2012-06-20 16:38:30 -07001250 pMac->roam.configParam.vccRssiThreshold = pParam->vccRssiThreshold;
1251 pMac->roam.configParam.vccUlMacLossThreshold = pParam->vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001252 pMac->roam.configParam.IsIdleScanEnabled = pParam->IsIdleScanEnabled;
1253 pMac->roam.configParam.statsReqPeriodicity = pParam->statsReqPeriodicity;
1254 pMac->roam.configParam.statsReqPeriodicityInPS = pParam->statsReqPeriodicityInPS;
1255 //Assign this before calling CsrInit11dInfo
1256 pMac->roam.configParam.nTxPowerCap = pParam->nTxPowerCap;
Jeff Johnson295189b2012-06-20 16:38:30 -07001257 if( csrIs11dSupported( pMac ) )
1258 {
1259 status = CsrInit11dInfo(pMac, &pParam->Csr11dinfo);
1260 }
1261 else
1262 {
1263 pMac->scan.curScanType = eSIR_ACTIVE_SCAN;
1264 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001265
1266 /* Initialize the power + channel information if 11h is enabled.
1267 If 11d is enabled this information has already been initialized */
1268 if( csrIs11hSupported( pMac ) && !csrIs11dSupported( pMac ) )
1269 {
1270 csrInitChannelPowerList(pMac, &pParam->Csr11dinfo);
1271 }
1272
1273
Jeff Johnson295189b2012-06-20 16:38:30 -07001274#ifdef WLAN_FEATURE_VOWIFI_11R
1275 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.csr11rConfig, &pParam->csr11rConfig, sizeof(tCsr11rConfigParams) );
1276 smsLog( pMac, LOG1, "IsFTResourceReqSupp = %d\n", pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported);
1277#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001278#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -07001279 pMac->roam.configParam.isFastTransitionEnabled = pParam->isFastTransitionEnabled;
Jeff Johnson43971f52012-07-17 12:26:56 -07001280 pMac->roam.configParam.RoamRssiDiff = pParam->RoamRssiDiff;
Jeff Johnson295189b2012-06-20 16:38:30 -07001281#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001282#ifdef FEATURE_WLAN_LFR
1283 pMac->roam.configParam.isFastRoamIniFeatureEnabled = pParam->isFastRoamIniFeatureEnabled;
1284#endif
1285
Jeff Johnson295189b2012-06-20 16:38:30 -07001286#ifdef FEATURE_WLAN_CCX
1287 pMac->roam.configParam.isCcxIniFeatureEnabled = pParam->isCcxIniFeatureEnabled;
1288#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001289#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1290 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.neighborRoamConfig, &pParam->neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
Jeff Johnson295189b2012-06-20 16:38:30 -07001291 smsLog( pMac, LOG1, "nNeighborScanTimerPerioid = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod);
1292 smsLog( pMac, LOG1, "nNeighborReassocRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold);
1293 smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);
1294 smsLog( pMac, LOG1, "nNeighborScanMinChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime);
1295 smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
1296 smsLog( pMac, LOG1, "nMaxNeighborRetries = %d\n", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
1297 smsLog( pMac, LOG1, "nNeighborResultsRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod);
Jeff Johnson295189b2012-06-20 16:38:30 -07001298 {
1299 int i;
1300 smsLog( pMac, LOG1, FL("Num of Channels in CFG Channel List: %d\n"), pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels);
Jeff Johnson295189b2012-06-20 16:38:30 -07001301 for( i=0; i< pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels; i++)
1302 {
1303 smsLog( pMac, LOG1, "%d ", pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[i] );
1304 }
1305 smsLog( pMac, LOG1, "\n");
1306 }
1307#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001308 pMac->roam.configParam.addTSWhenACMIsOff = pParam->addTSWhenACMIsOff;
1309 pMac->scan.fValidateList = pParam->fValidateList;
1310 pMac->scan.fEnableBypass11d = pParam->fEnableBypass11d;
1311 pMac->scan.fEnableDFSChnlScan = pParam->fEnableDFSChnlScan;
1312 pMac->roam.configParam.fScanTwice = pParam->fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001313 pMac->scan.fFirstScanOnly2GChnl = pParam->fFirstScanOnly2GChnl;
1314 /* This parameter is not available in cfg and not passed from upper layers. Instead it is initialized here
1315 * This paramtere is used in concurrency to determine if there are concurrent active sessions.
1316 * Is used as a temporary fix to disconnect all active sessions when BMPS enabled so the active session if Infra STA
1317 * will automatically connect back and resume BMPS since resume BMPS is not working when moving from concurrent to
1318 * single session
1319 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07001320 //Remove this code once SLM_Sessionization is supported
1321 //BMPS_WORKAROUND_NOT_NEEDED
Mohit Khanna349bc392012-09-11 17:24:52 -07001322 pMac->roam.configParam.doBMPSWorkaround = 0;
1323
Jeff Johnsone7245742012-09-05 17:12:55 -07001324#ifdef WLAN_FEATURE_11AC
1325 pMac->roam.configParam.nVhtChannelWidth = pParam->nVhtChannelWidth;
1326#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001327 }
1328
1329 return status;
1330}
1331
Jeff Johnson295189b2012-06-20 16:38:30 -07001332eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1333{
1334 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07001335 if(pParam)
1336 {
1337 pParam->WMMSupportMode = pMac->roam.configParam.WMMSupportMode;
1338 pParam->Is11eSupportEnabled = pMac->roam.configParam.Is11eSupportEnabled;
1339 pParam->FragmentationThreshold = pMac->roam.configParam.FragmentationThreshold;
1340 pParam->Is11dSupportEnabled = pMac->roam.configParam.Is11dSupportEnabled;
1341 pParam->Is11dSupportEnabledOriginal = pMac->roam.configParam.Is11dSupportEnabledOriginal;
1342 pParam->Is11hSupportEnabled = pMac->roam.configParam.Is11hSupportEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001343 pParam->channelBondingMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode24GHz);
1344 pParam->channelBondingMode5GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001345 pParam->RTSThreshold = pMac->roam.configParam.RTSThreshold;
1346 pParam->phyMode = pMac->roam.configParam.phyMode;
1347 pParam->shortSlotTime = pMac->roam.configParam.shortSlotTime;
1348 pParam->HeartbeatThresh24 = pMac->roam.configParam.HeartbeatThresh24;
1349 pParam->HeartbeatThresh50 = pMac->roam.configParam.HeartbeatThresh50;
1350 pParam->ProprietaryRatesEnabled = pMac->roam.configParam.ProprietaryRatesEnabled;
1351 pParam->TxRate = pMac->roam.configParam.TxRate;
1352 pParam->AdHocChannel24 = pMac->roam.configParam.AdHocChannel24;
1353 pParam->AdHocChannel5G = pMac->roam.configParam.AdHocChannel5G;
1354 pParam->bandCapability = pMac->roam.configParam.bandCapability;
1355 pParam->cbChoice = pMac->roam.configParam.cbChoice;
1356 pParam->bgScanInterval = pMac->roam.configParam.bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001357 pParam->nActiveMaxChnTime = pMac->roam.configParam.nActiveMaxChnTime;
1358 pParam->nActiveMinChnTime = pMac->roam.configParam.nActiveMinChnTime;
1359 pParam->nPassiveMaxChnTime = pMac->roam.configParam.nPassiveMaxChnTime;
1360 pParam->nPassiveMinChnTime = pMac->roam.configParam.nPassiveMinChnTime;
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -07001361#ifdef WLAN_AP_STA_CONCURRENCY
1362 pParam->nActiveMaxChnTimeConc = pMac->roam.configParam.nActiveMaxChnTimeConc;
1363 pParam->nActiveMinChnTimeConc = pMac->roam.configParam.nActiveMinChnTimeConc;
1364 pParam->nPassiveMaxChnTimeConc = pMac->roam.configParam.nPassiveMaxChnTimeConc;
1365 pParam->nPassiveMinChnTimeConc = pMac->roam.configParam.nPassiveMinChnTimeConc;
1366 pParam->nRestTimeConc = pMac->roam.configParam.nRestTimeConc;
1367#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001368 //Change the unit from microsecond to second
1369 pParam->impsSleepTime = pMac->roam.configParam.impsSleepTime / PAL_TIMER_TO_SEC_UNIT;
1370 pParam->eBand = pMac->roam.configParam.eBand;
1371 pParam->nScanResultAgeCount = pMac->roam.configParam.agingCount;
1372 pParam->scanAgeTimeNCNPS = pMac->roam.configParam.scanAgeTimeNCNPS;
1373 pParam->scanAgeTimeNCPS = pMac->roam.configParam.scanAgeTimeNCPS;
1374 pParam->scanAgeTimeCNPS = pMac->roam.configParam.scanAgeTimeCNPS;
1375 pParam->scanAgeTimeCPS = pMac->roam.configParam.scanAgeTimeCPS;
1376 pParam->bCatRssiOffset = pMac->roam.configParam.bCatRssiOffset;
1377 pParam->nRoamingTime = pMac->roam.configParam.nRoamingTime;
1378 pParam->fEnforce11dChannels = pMac->roam.configParam.fEnforce11dChannels;
1379 pParam->fSupplicantCountryCodeHasPriority = pMac->roam.configParam.fSupplicantCountryCodeHasPriority;
1380 pParam->fEnforceCountryCodeMatch = pMac->roam.configParam.fEnforceCountryCodeMatch;
1381 pParam->fEnforceDefaultDomain = pMac->roam.configParam.fEnforceDefaultDomain;
1382 pParam->vccRssiThreshold = pMac->roam.configParam.vccRssiThreshold;
1383 pParam->vccUlMacLossThreshold = pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001384 pParam->IsIdleScanEnabled = pMac->roam.configParam.IsIdleScanEnabled;
1385 pParam->nTxPowerCap = pMac->roam.configParam.nTxPowerCap;
1386 pParam->statsReqPeriodicity = pMac->roam.configParam.statsReqPeriodicity;
1387 pParam->statsReqPeriodicityInPS = pMac->roam.configParam.statsReqPeriodicityInPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001388 pParam->addTSWhenACMIsOff = pMac->roam.configParam.addTSWhenACMIsOff;
1389 pParam->fValidateList = pMac->roam.configParam.fValidateList;
1390 pParam->fEnableBypass11d = pMac->scan.fEnableBypass11d;
1391 pParam->fEnableDFSChnlScan = pMac->scan.fEnableDFSChnlScan;
1392 pParam->fScanTwice = pMac->roam.configParam.fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001393 pParam->fFirstScanOnly2GChnl = pMac->scan.fFirstScanOnly2GChnl;
Jeff Johnson295189b2012-06-20 16:38:30 -07001394
1395#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1396 palCopyMemory( pMac->hHdd, &pParam->neighborRoamConfig, &pMac->roam.configParam.neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
1397#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001398#ifdef WLAN_FEATURE_11AC
1399 pParam->nVhtChannelWidth = pMac->roam.configParam.nVhtChannelWidth;
1400#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001401
1402 csrSetChannels(pMac, pParam);
1403
1404 status = eHAL_STATUS_SUCCESS;
1405 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001406 return (status);
1407}
1408
Jeff Johnson295189b2012-06-20 16:38:30 -07001409eHalStatus csrSetPhyMode(tHalHandle hHal, tANI_U32 phyMode, eCsrBand eBand, tANI_BOOLEAN *pfRestartNeeded)
1410{
1411 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
1412 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1413 tANI_BOOLEAN fRestartNeeded = eANI_BOOLEAN_FALSE;
1414 eCsrPhyMode newPhyMode = eCSR_DOT11_MODE_AUTO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001415 do
1416 {
1417 if(eCSR_BAND_24 == eBand)
1418 {
1419 if(CSR_IS_RADIO_A_ONLY(pMac)) break;
1420 if((eCSR_DOT11_MODE_11a & phyMode) || (eCSR_DOT11_MODE_11a_ONLY & phyMode)) break;
1421 }
1422 if(eCSR_BAND_5G == eBand)
1423 {
1424 if(CSR_IS_RADIO_BG_ONLY(pMac)) break;
1425 if((eCSR_DOT11_MODE_11b & phyMode) || (eCSR_DOT11_MODE_11b_ONLY & phyMode) ||
1426 (eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11g_ONLY & phyMode)
1427 )
1428 {
1429 break;
1430 }
1431 }
1432 if((0 == phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode))
1433 {
1434 newPhyMode = eCSR_DOT11_MODE_TAURUS;
1435 }
1436 else if(eCSR_DOT11_MODE_AUTO & phyMode)
1437 {
1438 newPhyMode = eCSR_DOT11_MODE_AUTO;
1439 }
1440 else
1441 {
1442 //Check for dual band and higher capability first
1443 if(eCSR_DOT11_MODE_11n_ONLY & phyMode)
1444 {
1445 if(eCSR_DOT11_MODE_11n_ONLY != phyMode) break;
1446 newPhyMode = eCSR_DOT11_MODE_11n_ONLY;
1447 }
1448 else if(eCSR_DOT11_MODE_11a_ONLY & phyMode)
1449 {
1450 if(eCSR_DOT11_MODE_11a_ONLY != phyMode) break;
1451 if(eCSR_BAND_24 == eBand) break;
1452 newPhyMode = eCSR_DOT11_MODE_11a_ONLY;
1453 eBand = eCSR_BAND_5G;
1454 }
1455 else if(eCSR_DOT11_MODE_11g_ONLY & phyMode)
1456 {
1457 if(eCSR_DOT11_MODE_11g_ONLY != phyMode) break;
1458 if(eCSR_BAND_5G == eBand) break;
1459 newPhyMode = eCSR_DOT11_MODE_11g_ONLY;
1460 eBand = eCSR_BAND_24;
1461 }
1462 else if(eCSR_DOT11_MODE_11b_ONLY & phyMode)
1463 {
1464 if(eCSR_DOT11_MODE_11b_ONLY != phyMode) break;
1465 if(eCSR_BAND_5G == eBand) break;
1466 newPhyMode = eCSR_DOT11_MODE_11b_ONLY;
1467 eBand = eCSR_BAND_24;
1468 }
1469 else if(eCSR_DOT11_MODE_11n & phyMode)
1470 {
1471 newPhyMode = eCSR_DOT11_MODE_11n;
1472 }
1473 else if(eCSR_DOT11_MODE_abg & phyMode)
1474 {
1475 newPhyMode = eCSR_DOT11_MODE_abg;
1476 }
1477 else if(eCSR_DOT11_MODE_11a & phyMode)
1478 {
1479 if((eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11b & phyMode))
1480 {
1481 if(eCSR_BAND_ALL == eBand)
1482 {
1483 newPhyMode = eCSR_DOT11_MODE_abg;
1484 }
1485 else
1486 {
1487 //bad setting
1488 break;
1489 }
1490 }
1491 else
1492 {
1493 newPhyMode = eCSR_DOT11_MODE_11a;
1494 eBand = eCSR_BAND_5G;
1495 }
1496 }
1497 else if(eCSR_DOT11_MODE_11g & phyMode)
1498 {
1499 newPhyMode = eCSR_DOT11_MODE_11g;
1500 eBand = eCSR_BAND_24;
1501 }
1502 else if(eCSR_DOT11_MODE_11b & phyMode)
1503 {
1504 newPhyMode = eCSR_DOT11_MODE_11b;
1505 eBand = eCSR_BAND_24;
1506 }
1507 else
1508 {
1509 //We will never be here
1510 smsLog( pMac, LOGE, FL(" cannot recognize the phy mode 0x%08X\n"), phyMode );
1511 newPhyMode = eCSR_DOT11_MODE_AUTO;
1512 }
1513 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001514 //Done validating
1515 status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001516 //Now we need to check whether a restart is needed.
1517 if(eBand != pMac->roam.configParam.eBand)
1518 {
1519 fRestartNeeded = eANI_BOOLEAN_TRUE;
1520 break;
1521 }
1522 if(newPhyMode != pMac->roam.configParam.phyMode)
1523 {
1524 fRestartNeeded = eANI_BOOLEAN_TRUE;
1525 break;
1526 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001527 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001528 if(HAL_STATUS_SUCCESS(status))
1529 {
1530 pMac->roam.configParam.eBand = eBand;
1531 pMac->roam.configParam.phyMode = newPhyMode;
1532 if(pfRestartNeeded)
1533 {
1534 *pfRestartNeeded = fRestartNeeded;
1535 }
1536 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001537 return (status);
1538}
1539
Jeff Johnson295189b2012-06-20 16:38:30 -07001540void csrPruneChannelListForMode( tpAniSirGlobal pMac, tCsrChannel *pChannelList )
1541{
1542 tANI_U8 Index;
1543 tANI_U8 cChannels;
Jeff Johnson295189b2012-06-20 16:38:30 -07001544 // for dual band NICs, don't need to trim the channel list....
1545 if ( !CSR_IS_OPEARTING_DUAL_BAND( pMac ) )
1546 {
1547 // 2.4 GHz band operation requires the channel list to be trimmed to
1548 // the 2.4 GHz channels only...
1549 if ( CSR_IS_24_BAND_ONLY( pMac ) )
1550 {
1551 for( Index = 0, cChannels = 0; Index < pChannelList->numChannels;
1552 Index++ )
1553 {
1554 if ( CSR_IS_CHANNEL_24GHZ(pChannelList->channelList[ Index ]) )
1555 {
1556 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1557 cChannels++;
1558 }
1559 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001560 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1561 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1562 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1563 // only if we need to.
1564 //
1565 // The amount of memory to clear is the number of channesl that we trimmed
1566 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1567
1568 if ( pChannelList->numChannels > cChannels )
1569 {
1570 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1571 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1572
1573 }
1574
1575 pChannelList->numChannels = cChannels;
1576 }
1577 else if ( CSR_IS_5G_BAND_ONLY( pMac ) )
1578 {
1579 for ( Index = 0, cChannels = 0; Index < pChannelList->numChannels; Index++ )
1580 {
1581 if ( CSR_IS_CHANNEL_5GHZ(pChannelList->channelList[ Index ]) )
1582 {
1583 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1584 cChannels++;
1585 }
1586 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001587 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1588 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1589 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1590 // only if we need to.
1591 //
1592 // The amount of memory to clear is the number of channesl that we trimmed
1593 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1594 if ( pChannelList->numChannels > cChannels )
1595 {
1596 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1597 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1598 }
1599
1600 pChannelList->numChannels = cChannels;
1601 }
1602 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001603}
Jeff Johnson295189b2012-06-20 16:38:30 -07001604#ifdef WLAN_SOFTAP_FEATURE
1605#define INFRA_AP_DEFAULT_CHANNEL 6
1606eHalStatus csrIsValidChannel(tpAniSirGlobal pMac, tANI_U8 chnNum)
1607{
1608 tANI_U8 index= 0;
1609 eHalStatus status = eHAL_STATUS_FAILURE;
1610 for (index=0; index < pMac->scan.base20MHzChannels.numChannels ;index++)
1611 {
1612 if(pMac->scan.base20MHzChannels.channelList[ index ] == chnNum){
1613 status = eHAL_STATUS_SUCCESS;
1614 break;
1615 }
1616 }
1617 return status;
1618}
1619#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001620eHalStatus csrInitGetChannels(tpAniSirGlobal pMac)
1621{
1622 eHalStatus status = eHAL_STATUS_SUCCESS;
1623 tANI_U8 num20MHzChannelsFound = 0;
1624 VOS_STATUS vosStatus;
1625 tANI_U8 Index = 0;
1626 tANI_U8 num40MHzChannelsFound = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001627
Jeff Johnson295189b2012-06-20 16:38:30 -07001628
1629 //TODO: this interface changed to include the 40MHz channel list
1630 // this needs to be tied into the adapter structure somehow and referenced appropriately for CB operation
1631 // Read the scan channel list (including the power limit) from EEPROM
1632 vosStatus = vos_nv_getChannelListWithPower( pMac->scan.defaultPowerTable, &num20MHzChannelsFound,
1633 pMac->scan.defaultPowerTable40MHz, &num40MHzChannelsFound);
1634 if ( (VOS_STATUS_SUCCESS != vosStatus) || (num20MHzChannelsFound == 0) )
1635 {
1636 smsLog( pMac, LOGE, FL("failed to get channels \n"));
1637 status = eHAL_STATUS_FAILURE;
1638 }
1639 else
1640 {
1641 if ( num20MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN )
1642 {
1643 num20MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1644 }
1645 pMac->scan.numChannelsDefault = num20MHzChannelsFound;
1646 // Move the channel list to the global data
1647 // structure -- this will be used as the scan list
1648 for ( Index = 0; Index < num20MHzChannelsFound; Index++)
1649 {
1650#ifdef FEATURE_WLAN_INTEGRATED_SOC /* Need to fix this while dealing with NV item */
1651 pMac->scan.base20MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable[ Index ].chanId;
1652#else
1653 pMac->scan.base20MHzChannels.channelList[ Index ] = Index + 1;
1654 pMac->scan.defaultPowerTable[Index].chanId = Index + 1;
1655 pMac->scan.defaultPowerTable[Index].pwr = 25;
1656#endif
1657 }
1658 pMac->scan.base20MHzChannels.numChannels = num20MHzChannelsFound;
1659 if(num40MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN)
1660 {
1661 num40MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1662 }
1663 for ( Index = 0; Index < num40MHzChannelsFound; Index++)
1664 {
1665 pMac->scan.base40MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable40MHz[ Index ].chanId;
1666 }
1667 pMac->scan.base40MHzChannels.numChannels = num40MHzChannelsFound;
1668 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001669 return (status);
1670}
1671
Jeff Johnson295189b2012-06-20 16:38:30 -07001672eHalStatus csrInitChannelList( tHalHandle hHal )
1673{
1674 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1675 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001676 csrPruneChannelListForMode(pMac, &pMac->scan.baseChannels);
1677 csrPruneChannelListForMode(pMac, &pMac->scan.base20MHzChannels);
1678 // Apply the base channel list, power info, and set the Country code...
1679 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1680
1681 return (status);
1682}
Jeff Johnson295189b2012-06-20 16:38:30 -07001683eHalStatus csrChangeConfigParams(tpAniSirGlobal pMac,
1684 tCsrUpdateConfigParam *pUpdateConfigParam)
1685{
1686 eHalStatus status = eHAL_STATUS_FAILURE;
1687 tCsr11dinfo *ps11dinfo = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001688 ps11dinfo = &pUpdateConfigParam->Csr11dinfo;
1689 status = CsrInit11dInfo(pMac, ps11dinfo);
1690 return status;
1691}
1692
Jeff Johnson295189b2012-06-20 16:38:30 -07001693static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1694{
1695 eHalStatus status = eHAL_STATUS_FAILURE;
1696 tANI_U8 index;
1697 tANI_U32 count=0;
1698 tSirMacChanInfo *pChanInfo;
1699 tSirMacChanInfo *pChanInfoStart;
1700 tANI_BOOLEAN applyConfig = TRUE;
1701
1702 if(!ps11dinfo)
1703 {
1704 return (status);
1705 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001706 if ( ps11dinfo->Channels.numChannels && ( WNI_CFG_VALID_CHANNEL_LIST_LEN >= ps11dinfo->Channels.numChannels ) )
1707 {
1708 pMac->scan.base20MHzChannels.numChannels = ps11dinfo->Channels.numChannels;
1709 status = palCopyMemory(pMac->hHdd, pMac->scan.base20MHzChannels.channelList,
1710 ps11dinfo->Channels.channelList, ps11dinfo->Channels.numChannels);
1711 if(!HAL_STATUS_SUCCESS(status)) return (status);
1712 }
1713 else
1714 {
1715 //No change
1716 return (eHAL_STATUS_SUCCESS);
1717 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001718 //legacy maintenance
1719 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeDefault,
1720 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1721 if(!HAL_STATUS_SUCCESS(status)) return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -07001722 //Tush: at csropen get this initialized with default, during csr reset if this
1723 // already set with some value no need initilaize with default again
1724 if(0 == pMac->scan.countryCodeCurrent[0])
1725 {
1726 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
1727 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1728 if(!HAL_STATUS_SUCCESS(status)) return (status);
1729 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001730 // need to add the max power channel list
1731 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1732 {
1733 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1734 pChanInfoStart = pChanInfo;
Jeff Johnsone7245742012-09-05 17:12:55 -07001735 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1736 {
1737 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1738 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1739 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1740 pChanInfo++;
1741 count++;
1742 }
1743 if(count)
1744 {
1745 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1746 }
1747 palFreeMemory(pMac->hHdd, pChanInfoStart);
1748 }
1749 //Only apply them to CFG when not in STOP state. Otherwise they will be applied later
1750 if( HAL_STATUS_SUCCESS(status) )
1751 {
1752 for( index = 0; index < CSR_ROAM_SESSION_MAX; index++ )
1753 {
1754 if((CSR_IS_SESSION_VALID(pMac, index)) && CSR_IS_ROAM_STOP(pMac, index))
1755 {
1756 applyConfig = FALSE;
1757 }
1758 }
1759
1760 if(TRUE == applyConfig)
1761 {
1762 // Apply the base channel list, power info, and set the Country code...
1763 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1764 }
1765
1766 }
1767 return (status);
1768}
1769/* Initialize the Channel + Power List in the local cache and in the CFG */
1770eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1771{
1772 tANI_U8 index;
1773 tANI_U32 count=0;
1774 tSirMacChanInfo *pChanInfo;
1775 tSirMacChanInfo *pChanInfoStart;
1776
1777 if(!ps11dinfo || !pMac)
1778 {
1779 return eHAL_STATUS_FAILURE;
1780 }
1781
1782 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1783 {
1784 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1785 pChanInfoStart = pChanInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07001786
1787 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1788 {
1789 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1790 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1791 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1792 pChanInfo++;
1793 count++;
1794 }
1795 if(count)
1796 {
1797 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1798 }
1799 palFreeMemory(pMac->hHdd, pChanInfoStart);
1800 }
1801
Jeff Johnsone7245742012-09-05 17:12:55 -07001802 return eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001803}
1804
1805//pCommand may be NULL
1806//Pass in sessionId in case pCommand is NULL. sessionId is not used in case pCommand is not NULL.
1807void csrRoamRemoveDuplicateCommand(tpAniSirGlobal pMac, tANI_U32 sessionId, tSmeCmd *pCommand, eCsrRoamReason eRoamReason)
1808{
1809 tListElem *pEntry, *pNextEntry;
1810 tSmeCmd *pDupCommand;
1811 tDblLinkList localList;
1812
1813 vos_mem_zero(&localList, sizeof(tDblLinkList));
1814 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
1815 {
1816 smsLog(pMac, LOGE, FL(" failed to open list"));
1817 return;
1818 }
1819 csrLLLock( &pMac->sme.smeCmdPendingList );
1820 pEntry = csrLLPeekHead( &pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK );
1821 while( pEntry )
1822 {
1823 pNextEntry = csrLLNext( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK );
1824 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07001825 // Remove the previous command if..
1826 // - the new roam command is for the same RoamReason...
1827 // - the new roam command is a NewProfileList.
1828 // - the new roam command is a Forced Dissoc
1829 // - the new roam command is from an 802.11 OID (OID_SSID or OID_BSSID).
1830 if (
1831 (pCommand && ( pCommand->sessionId == pDupCommand->sessionId ) &&
1832 ((pCommand->command == pDupCommand->command) &&
1833 (pCommand->u.roamCmd.roamReason == pDupCommand->u.roamCmd.roamReason ||
1834 eCsrForcedDisassoc == pCommand->u.roamCmd.roamReason ||
1835 eCsrHddIssued == pCommand->u.roamCmd.roamReason)))
1836 ||
1837 //below the pCommand is NULL
Jeff Johnson43971f52012-07-17 12:26:56 -07001838 ( (sessionId == pDupCommand->sessionId) &&
1839 (eSmeCommandRoam == pDupCommand->command) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07001840 ((eCsrForcedDisassoc == eRoamReason) ||
1841 (eCsrHddIssued == eRoamReason))
1842 )
1843 )
1844 {
1845 smsLog(pMac, LOGW, FL(" roamReason = %d\n"), pDupCommand->u.roamCmd.roamReason);
1846 // Remove the 'stale' roam command from the pending list...
1847 if(csrLLRemoveEntry( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK ))
1848 {
1849 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
1850 }
1851 }
1852 pEntry = pNextEntry;
1853 }
1854 csrLLUnlock( &pMac->sme.smeCmdPendingList );
1855
1856 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
1857 {
1858 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
1859 //Tell caller that the command is cancelled
1860 csrRoamCallCallback(pMac, pDupCommand->sessionId, NULL, pDupCommand->u.roamCmd.roamId,
1861 eCSR_ROAM_CANCELLED, eCSR_ROAM_RESULT_NONE);
1862 csrReleaseCommandRoam(pMac, pDupCommand);
1863 }
1864 csrLLClose(&localList);
1865}
Jeff Johnson295189b2012-06-20 16:38:30 -07001866eHalStatus csrRoamCallCallback(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo,
1867 tANI_U32 roamId, eRoamCmdStatus u1, eCsrRoamResult u2)
1868{
1869 eHalStatus status = eHAL_STATUS_SUCCESS;
1870#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1871 WLAN_VOS_DIAG_EVENT_DEF(connectionStatus, vos_event_wlan_status_payload_type);
1872#endif
1873 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07001874 if( CSR_IS_SESSION_VALID( pMac, sessionId) )
1875 {
1876 pSession = CSR_GET_SESSION( pMac, sessionId );
1877 }
1878 else
1879 {
1880 smsLog(pMac, LOGE, "Session ID:%d is not valid\n", sessionId);
1881 VOS_ASSERT(0);
1882 return eHAL_STATUS_FAILURE;
1883 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001884 if(eCSR_ROAM_ASSOCIATION_COMPLETION == u1 && pRoamInfo)
1885 {
1886 smsLog(pMac, LOGW, " Assoc complete result = %d statusCode = %d reasonCode = %d\n", u2, pRoamInfo->statusCode, pRoamInfo->reasonCode);
1887 }
Madan Mohan Koyyalamudi85d140a2012-10-18 20:23:01 -07001888 if ((u1 == eCSR_ROAM_FT_REASSOC_FAILED) && (pSession->bRefAssocStartCnt)) {
1889 /*
1890 * Decrement bRefAssocStartCnt for FT reassoc failure.
1891 * Reason: For FT reassoc failures, we first call
1892 * csrRoamCallCallback before notifying a failed roam
1893 * completion through csrRoamComplete. The latter in
1894 * turn calls csrRoamProcessResults which tries to
1895 * once again call csrRoamCallCallback if bRefAssocStartCnt
1896 * is non-zero. Since this is redundant for FT reassoc
1897 * failure, decrement bRefAssocStartCnt.
1898 */
1899 pSession->bRefAssocStartCnt--;
1900 }
1901
Jeff Johnson295189b2012-06-20 16:38:30 -07001902 if ( (pSession == NULL) ||
1903 (eANI_BOOLEAN_FALSE == pSession->sessionActive) )
1904 {
1905 smsLog(pMac, LOG1, "Session ID is not valid\n");
1906 return eHAL_STATUS_FAILURE;
1907 }
1908
1909 if(NULL != pSession->callback)
1910 {
1911 if( pRoamInfo )
1912 {
1913 pRoamInfo->sessionId = (tANI_U8)sessionId;
1914 }
1915
1916 /* avoid holding the global lock when making the roaming callback , original change came
1917 from a raised CR (CR304874). Since this callback is in HDD a potential deadlock
1918 is possible on other OS ports where the callback may need to take locks to protect
1919 HDD state
1920 UPDATE : revert this change but keep the comments here. Need to revisit as there are callbacks
1921 that may actually depend on the lock being held */
1922 // TODO: revisit: sme_ReleaseGlobalLock( &pMac->sme );
1923 status = pSession->callback(pSession->pContext, pRoamInfo, roamId, u1, u2);
1924 // TODO: revisit: sme_AcquireGlobalLock( &pMac->sme );
1925 }
1926 //EVENT_WLAN_STATUS: eCSR_ROAM_ASSOCIATION_COMPLETION,
1927 // eCSR_ROAM_LOSTLINK, eCSR_ROAM_DISASSOCIATED,
1928#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1929 palZeroMemory(pMac->hHdd, &connectionStatus, sizeof(vos_event_wlan_status_payload_type));
1930 if((eCSR_ROAM_ASSOCIATION_COMPLETION == u1) && (eCSR_ROAM_RESULT_ASSOCIATED == u2))
1931 {
1932 connectionStatus.eventId = eCSR_WLAN_STATUS_CONNECT;
1933 connectionStatus.bssType = pRoamInfo->u.pConnectedProfile->BSSType;
1934 if(NULL != pRoamInfo->pBssDesc)
1935 {
1936 connectionStatus.rssi = pRoamInfo->pBssDesc->rssi * (-1);
1937 connectionStatus.channel = pRoamInfo->pBssDesc->channelId;
1938 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001939 connectionStatus.qosCapability = pRoamInfo->u.pConnectedProfile->qosConnection;
1940 connectionStatus.authType = (v_U8_t)diagAuthTypeFromCSRType(pRoamInfo->u.pConnectedProfile->AuthType);
1941 connectionStatus.encryptionType = (v_U8_t)diagEncTypeFromCSRType(pRoamInfo->u.pConnectedProfile->EncryptionType);
1942 palCopyMemory(pMac->hHdd, connectionStatus.ssid, pRoamInfo->u.pConnectedProfile->SSID.ssId, 6);
1943 connectionStatus.reason = eCSR_REASON_UNSPECIFIED;
1944 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1945 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001946 if((eCSR_ROAM_MIC_ERROR_IND == u1) || (eCSR_ROAM_RESULT_MIC_FAILURE == u2))
1947 {
1948 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1949 connectionStatus.reason = eCSR_REASON_MIC_ERROR;
1950 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1951 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001952 if(eCSR_ROAM_RESULT_FORCED == u2)
1953 {
1954 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1955 connectionStatus.reason = eCSR_REASON_USER_REQUESTED;
1956 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1957 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001958 if(eCSR_ROAM_RESULT_DISASSOC_IND == u2)
1959 {
1960 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1961 connectionStatus.reason = eCSR_REASON_DISASSOC;
1962 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1963 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001964 if(eCSR_ROAM_RESULT_DEAUTH_IND == u2)
1965 {
1966 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1967 connectionStatus.reason = eCSR_REASON_DEAUTH;
1968 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1969 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001970#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
1971
1972 return (status);
1973}
Jeff Johnson295189b2012-06-20 16:38:30 -07001974// Returns whether handoff is currently in progress or not
1975tANI_BOOLEAN csrRoamIsHandoffInProgress(tpAniSirGlobal pMac)
1976{
1977#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1978 return csrNeighborRoamIsHandoffInProgress(pMac);
1979#else
1980 return eANI_BOOLEAN_FALSE;
1981#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001982}
Jeff Johnson295189b2012-06-20 16:38:30 -07001983eHalStatus csrRoamIssueDisassociate( tpAniSirGlobal pMac, tANI_U32 sessionId,
1984 eCsrRoamSubState NewSubstate, tANI_BOOLEAN fMICFailure )
1985{
1986 eHalStatus status = eHAL_STATUS_SUCCESS;
1987 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1988 tANI_U16 reasonCode;
1989 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07001990
1991 if(!pSession)
1992 {
1993 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
1994 return eHAL_STATUS_FAILURE;
1995 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001996
1997 //Restore AC weight in case we change it
1998 if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
1999 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07002000 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 -07002001 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
2002 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
2003 }
2004
2005 if ( fMICFailure )
2006 {
2007 reasonCode = eSIR_MAC_MIC_FAILURE_REASON;
2008 }
2009 else if (NewSubstate == eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF)
2010 {
2011 reasonCode = eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON;
2012 } else
2013 {
2014 reasonCode = eSIR_MAC_UNSPEC_FAILURE_REASON;
2015 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002016#ifdef WLAN_FEATURE_VOWIFI_11R
2017 if ( (csrRoamIsHandoffInProgress(pMac)) &&
2018 (NewSubstate != eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF))
2019 {
2020 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
2021 palCopyMemory(pMac->hHdd, &bssId, pNeighborRoamInfo->csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002022 } else
2023#endif
2024 if(pSession->pConnectBssDesc)
2025 {
2026 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2027 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002028
Jeff Johnson295189b2012-06-20 16:38:30 -07002029
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07002030 smsLog( pMac, LOG1, "CSR Attempting to Disassociate Bssid= %02x-%02x-%02x-%02x-%02x-%02x subState = %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07002031 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2032 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ], NewSubstate );
Jeff Johnson295189b2012-06-20 16:38:30 -07002033 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
2034
2035 status = csrSendMBDisassocReqMsg( pMac, sessionId, bssId, reasonCode );
2036
2037 if(HAL_STATUS_SUCCESS(status))
2038 {
2039 csrRoamLinkDown(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002040#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2041 //no need to tell QoS that we are disassociating, it will be taken care off in assoc req for HO
2042 if(eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF != NewSubstate)
2043 {
2044 //Tush-QoS: notify QoS module that disassoc happening
2045 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
2046 }
2047#endif
2048 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002049 return (status);
2050}
Jeff Johnson295189b2012-06-20 16:38:30 -07002051#ifdef WLAN_SOFTAP_FEATURE
2052
Jeff Johnson295189b2012-06-20 16:38:30 -07002053/* ---------------------------------------------------------------------------
2054 \fn csrRoamIssueDisassociateStaCmd
2055 \brief csr function that HDD calls to disassociate a associated station
2056 \param sessionId - session Id for Soft AP
2057 \param pPeerMacAddr - MAC of associated station to delete
2058 \param reason - reason code, be one of the tSirMacReasonCodes
2059 \return eHalStatus
2060 ---------------------------------------------------------------------------*/
2061eHalStatus csrRoamIssueDisassociateStaCmd( tpAniSirGlobal pMac,
2062 tANI_U32 sessionId,
2063 tANI_U8 *pPeerMacAddr,
2064 tANI_U32 reason)
2065{
2066 eHalStatus status = eHAL_STATUS_SUCCESS;
2067 tSmeCmd *pCommand;
2068
2069 do
2070 {
2071 pCommand = csrGetCommandBuffer( pMac );
2072 if ( !pCommand )
2073 {
2074 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2075 status = eHAL_STATUS_RESOURCES;
2076 break;
2077 }
2078 pCommand->command = eSmeCommandRoam;
2079 pCommand->sessionId = (tANI_U8)sessionId;
2080 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocSta;
2081 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2082 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2083 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2084 if( !HAL_STATUS_SUCCESS( status ) )
2085 {
2086 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2087 csrReleaseCommandRoam( pMac, pCommand );
2088 }
2089 }while(0);
2090
2091 return status;
2092}
2093
2094
Jeff Johnson295189b2012-06-20 16:38:30 -07002095/* ---------------------------------------------------------------------------
2096 \fn csrRoamIssueDeauthSta
2097 \brief csr function that HDD calls to delete a associated station
2098 \param sessionId - session Id for Soft AP
2099 \param pPeerMacAddr - MAC of associated station to delete
2100 \param reason - reason code, be one of the tSirMacReasonCodes
2101 \return eHalStatus
2102 ---------------------------------------------------------------------------*/
2103eHalStatus csrRoamIssueDeauthStaCmd( tpAniSirGlobal pMac,
2104 tANI_U32 sessionId,
2105 tANI_U8 *pPeerMacAddr,
2106 tANI_U32 reason)
2107{
2108 eHalStatus status = eHAL_STATUS_SUCCESS;
2109 tSmeCmd *pCommand;
2110
2111 do
2112 {
2113 pCommand = csrGetCommandBuffer( pMac );
2114 if ( !pCommand )
2115 {
2116 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2117 status = eHAL_STATUS_RESOURCES;
2118 break;
2119 }
2120 pCommand->command = eSmeCommandRoam;
2121 pCommand->sessionId = (tANI_U8)sessionId;
2122 pCommand->u.roamCmd.roamReason = eCsrForcedDeauthSta;
2123 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2124 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2125 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2126 if( !HAL_STATUS_SUCCESS( status ) )
2127 {
2128 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2129 csrReleaseCommandRoam( pMac, pCommand );
2130 }
2131 }while(0);
2132
2133 return status;
2134}
Jeff Johnson295189b2012-06-20 16:38:30 -07002135eHalStatus
2136csrRoamIssueTkipCounterMeasures( tpAniSirGlobal pMac, tANI_U32 sessionId,
2137 tANI_BOOLEAN bEnable )
2138{
2139 eHalStatus status = eHAL_STATUS_FAILURE;
2140 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2141 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002142 if (!pSession)
2143 {
2144 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:CSR Session not found\n");
2145 return (status);
2146 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002147 if (pSession->pConnectBssDesc)
2148 {
2149 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2150 }
2151 else
2152 {
2153 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:Connected BSS Description in CSR Session not found\n");
2154 return (status);
2155 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002156 smsLog( pMac, LOG2, "CSR issuing tkip counter measures for Bssid = %02x-%02x-%02x-%02x-%02x-%02x, Enable = %d\n",
2157 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2158 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] , bEnable);
Jeff Johnson295189b2012-06-20 16:38:30 -07002159 status = csrSendMBTkipCounterMeasuresReqMsg( pMac, sessionId, bEnable, bssId );
2160 return (status);
2161}
Jeff Johnson295189b2012-06-20 16:38:30 -07002162eHalStatus
2163csrRoamGetAssociatedStas( tpAniSirGlobal pMac, tANI_U32 sessionId,
2164 VOS_MODULE_ID modId, void *pUsrContext,
2165 void *pfnSapEventCallback, v_U8_t *pAssocStasBuf )
2166{
2167 eHalStatus status = eHAL_STATUS_SUCCESS;
2168 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2169 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002170 if (!pSession)
2171 {
2172 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:CSR Session not found\n");
2173 return (status);
2174 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002175 if(pSession->pConnectBssDesc)
2176 {
2177 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2178 }
2179 else
2180 {
2181 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:Connected BSS Description in CSR Session not found\n");
2182 return (status);
2183 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002184 smsLog( pMac, LOG2, "CSR getting associated stations for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2185 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2186 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002187 status = csrSendMBGetAssociatedStasReqMsg( pMac, sessionId, modId, bssId, pUsrContext, pfnSapEventCallback, pAssocStasBuf );
2188 return (status);
2189}
Jeff Johnson295189b2012-06-20 16:38:30 -07002190eHalStatus
2191csrRoamGetWpsSessionOverlap( tpAniSirGlobal pMac, tANI_U32 sessionId,
2192 void *pUsrContext, void *pfnSapEventCallback, v_MACADDR_t pRemoveMac )
2193{
2194 eHalStatus status = eHAL_STATUS_SUCCESS;
2195 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2196 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2197
2198 if (!pSession)
2199 {
2200 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:CSR Session not found\n");
2201 return (status);
2202 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002203 if(pSession->pConnectBssDesc)
2204 {
2205 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2206 }
2207 else
2208 {
2209 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:Connected BSS Description in CSR Session not found\n");
2210 return (status);
2211 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002212 smsLog( pMac, LOG2, "CSR getting WPS Session Overlap for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2213 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2214 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
2215
2216 status = csrSendMBGetWPSPBCSessions( pMac, sessionId, bssId, pUsrContext, pfnSapEventCallback, pRemoveMac);
2217
2218 return (status);
2219}
Jeff Johnson295189b2012-06-20 16:38:30 -07002220#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002221eHalStatus csrRoamIssueDeauth( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
2222{
2223 eHalStatus status = eHAL_STATUS_SUCCESS;
2224 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2225 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07002226
2227 if (!pSession)
2228 {
2229 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2230 return eHAL_STATUS_FAILURE;
2231 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002232
2233 if(pSession->pConnectBssDesc)
2234 {
2235 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2236 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002237 smsLog( pMac, LOG2, "CSR Attempting to Deauth Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
2238 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2239 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002240 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
2241
2242 status = csrSendMBDeauthReqMsg( pMac, sessionId, bssId, eSIR_MAC_DISASSOC_LEAVING_BSS_REASON );
2243
2244 return (status);
2245}
2246
Jeff Johnson295189b2012-06-20 16:38:30 -07002247eHalStatus csrRoamSaveConnectedBssDesc( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDesc )
2248{
2249 eHalStatus status = eHAL_STATUS_SUCCESS;
2250 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2251 tANI_U32 size;
Jeff Johnson32d95a32012-09-10 13:15:23 -07002252
2253 if(!pSession)
2254 {
2255 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2256 return eHAL_STATUS_FAILURE;
2257 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002258
2259 // If no BSS description was found in this connection (happens with start IBSS), then
2260 // nix the BSS description that we keep around for the connected BSS) and get out...
2261 if(NULL == pBssDesc)
2262 {
2263 csrFreeConnectBssDesc(pMac, sessionId);
2264 }
2265 else
2266 {
2267 size = pBssDesc->length + sizeof( pBssDesc->length );
2268 if(NULL != pSession->pConnectBssDesc)
2269 {
2270 if(((pSession->pConnectBssDesc->length) + sizeof(pSession->pConnectBssDesc->length)) < size)
2271 {
2272 //not enough room for the new BSS, pMac->roam.pConnectBssDesc is freed inside
2273 csrFreeConnectBssDesc(pMac, sessionId);
2274 }
2275 }
2276 if(NULL == pSession->pConnectBssDesc)
2277 {
2278 status = palAllocateMemory( pMac->hHdd, (void **)&pSession->pConnectBssDesc, size);
2279 }
2280 if ( HAL_STATUS_SUCCESS(status) && pSession->pConnectBssDesc )
2281 {
2282 palCopyMemory( pMac->hHdd, pSession->pConnectBssDesc, pBssDesc, size );
2283 }
2284 }
2285
2286 return (status);
2287}
2288
Jeff Johnson295189b2012-06-20 16:38:30 -07002289eHalStatus csrRoamPrepareBssConfig(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2290 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
2291 tDot11fBeaconIEs *pIes)
2292{
2293 eHalStatus status = eHAL_STATUS_SUCCESS;
2294 eCsrCfgDot11Mode cfgDot11Mode;
Jeff Johnson295189b2012-06-20 16:38:30 -07002295#if defined(VOSS_ENABLED)
2296 VOS_ASSERT( pIes != NULL );
2297#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07002298
Jeff Johnson295189b2012-06-20 16:38:30 -07002299 do
2300 {
2301 palCopyMemory(pMac->hHdd, &pBssConfig->BssCap, &pBssDesc->capabilityInfo, sizeof(tSirMacCapabilityInfo));
2302 //get qos
2303 pBssConfig->qosType = csrGetQoSFromBssDesc(pMac, pBssDesc, pIes);
2304 //get SSID
2305 if(pIes->SSID.present)
2306 {
2307 palCopyMemory(pMac->hHdd, &pBssConfig->SSID.ssId, pIes->SSID.ssid, pIes->SSID.num_ssid);
2308 pBssConfig->SSID.length = pIes->SSID.num_ssid;
2309 }
2310 else
2311 pBssConfig->SSID.length = 0;
2312 if(csrIsNULLSSID(pBssConfig->SSID.ssId, pBssConfig->SSID.length))
2313 {
2314 smsLog(pMac, LOGW, " BSS desc SSID is a wildcard\n");
2315 //Return failed if profile doesn't have an SSID either.
2316 if(pProfile->SSIDs.numOfSSIDs == 0)
2317 {
2318 smsLog(pMac, LOGW, " Both BSS desc and profile doesn't have SSID\n");
2319 status = eHAL_STATUS_FAILURE;
2320 break;
2321 }
2322 }
2323 if(CSR_IS_CHANNEL_5GHZ(pBssDesc->channelId))
2324 {
2325 pBssConfig->eBand = eCSR_BAND_5G;
2326 }
2327 else
2328 {
2329 pBssConfig->eBand = eCSR_BAND_24;
2330 }
2331 //phymode
2332 if(csrIsPhyModeMatch( pMac, pProfile->phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes ))
2333 {
2334 pBssConfig->uCfgDot11Mode = cfgDot11Mode;
2335 }
2336 else
2337 {
2338 smsLog(pMac, LOGW, " Can not find match phy mode\n");
2339 //force it
2340 if(eCSR_BAND_24 == pBssConfig->eBand)
2341 {
2342 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2343 }
2344 else
2345 {
2346 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2347 }
2348 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002349 //Qos
2350 if ((pBssConfig->uCfgDot11Mode != eCSR_CFG_DOT11_MODE_11N) &&
2351 (pMac->roam.configParam.WMMSupportMode == eCsrRoamWmmNoQos))
2352 {
2353 //Joining BSS is not 11n capable and WMM is disabled on client.
2354 //Disable QoS and WMM
2355 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2356 }
2357
2358 //auth type
2359 switch( pProfile->negotiatedAuthType )
2360 {
2361 default:
2362 case eCSR_AUTH_TYPE_WPA:
2363 case eCSR_AUTH_TYPE_WPA_PSK:
2364 case eCSR_AUTH_TYPE_WPA_NONE:
2365 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2366 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2367 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002368 case eCSR_AUTH_TYPE_SHARED_KEY:
2369 pBssConfig->authType = eSIR_SHARED_KEY;
2370 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002371 case eCSR_AUTH_TYPE_AUTOSWITCH:
2372 pBssConfig->authType = eSIR_AUTO_SWITCH;
2373 break;
2374 }
2375 //short slot time
2376 if( eCSR_CFG_DOT11_MODE_11B != cfgDot11Mode )
2377 {
2378 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2379 }
2380 else
2381 {
2382 pBssConfig->uShortSlotTime = 0;
2383 }
2384 if(pBssConfig->BssCap.ibss)
2385 {
2386 //We don't support 11h on IBSS
2387 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2388 }
2389 else
2390 {
2391 pBssConfig->f11hSupport = pMac->roam.configParam.Is11hSupportEnabled;
2392 }
2393 //power constraint
2394 pBssConfig->uPowerLimit = csrGet11hPowerConstraint(pMac, &pIes->PowerConstraints);
2395 //heartbeat
2396 if ( CSR_IS_11A_BSS( pBssDesc ) )
2397 {
2398 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2399 }
2400 else
2401 {
2402 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2403 }
2404 //Join timeout
2405 // if we find a BeaconInterval in the BssDescription, then set the Join Timeout to
Jeff Johnsone7245742012-09-05 17:12:55 -07002406 // be 10 x the BeaconInterval.
Jeff Johnson295189b2012-06-20 16:38:30 -07002407 if ( pBssDesc->beaconInterval )
2408 {
2409 //Make sure it is bigger than the minimal
Jeff Johnsone7245742012-09-05 17:12:55 -07002410 pBssConfig->uJoinTimeOut = CSR_ROAM_MAX(10 * pBssDesc->beaconInterval, CSR_JOIN_FAILURE_TIMEOUT_MIN);
Jeff Johnson295189b2012-06-20 16:38:30 -07002411 }
2412 else
2413 {
2414 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
2415 }
2416 //validate CB
2417 pBssConfig->cbMode = csrGetCBModeFromIes(pMac, pBssDesc->channelId, pIes);
2418 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002419 return (status);
2420}
2421
Jeff Johnson295189b2012-06-20 16:38:30 -07002422static eHalStatus csrRoamPrepareBssConfigFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2423 tBssConfigParam *pBssConfig, tSirBssDescription *pBssDesc)
2424{
2425 eHalStatus status = eHAL_STATUS_SUCCESS;
2426 tANI_U8 operationChannel = 0;
2427 tANI_U8 qAPisEnabled = FALSE;
2428 //SSID
2429 pBssConfig->SSID.length = 0;
2430 if(pProfile->SSIDs.numOfSSIDs)
2431 {
2432 //only use the first one
2433 palCopyMemory(pMac->hHdd, &pBssConfig->SSID, &pProfile->SSIDs.SSIDList[0].SSID, sizeof(tSirMacSSid));
2434 }
2435 else
2436 {
2437 //SSID must present
2438 return eHAL_STATUS_FAILURE;
2439 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002440 //Settomg up the capabilities
2441 if( csrIsBssTypeIBSS(pProfile->BSSType) )
2442 {
2443 pBssConfig->BssCap.ibss = 1;
2444 }
2445 else
2446 {
2447 pBssConfig->BssCap.ess = 1;
2448 }
2449 if( eCSR_ENCRYPT_TYPE_NONE != pProfile->EncryptionType.encryptionType[0] )
2450 {
2451 pBssConfig->BssCap.privacy = 1;
2452 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002453 pBssConfig->eBand = pMac->roam.configParam.eBand;
2454 //phymode
2455 if(pProfile->ChannelInfo.ChannelList)
2456 {
2457 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2458 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002459#ifdef WLAN_SOFTAP_FEATURE
2460 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, operationChannel,
2461 &pBssConfig->eBand);
2462#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002463 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel,
2464 &pBssConfig->eBand);
2465#endif
2466 //QOS
2467 //Is this correct to always set to this //***
Jeff Johnson295189b2012-06-20 16:38:30 -07002468 if ( pBssConfig->BssCap.ess == 1 )
2469 {
2470#ifdef WLAN_SOFTAP_FEATURE
2471 /*For Softap case enable WMM*/
2472 if(CSR_IS_INFRA_AP(pProfile) && (eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode )){
2473 qAPisEnabled = TRUE;
2474 }
2475 else
2476#endif
2477 if (csrRoamGetQosInfoFromBss(pMac, pBssDesc) == eHAL_STATUS_SUCCESS) {
2478 qAPisEnabled = TRUE;
2479 } else {
2480 qAPisEnabled = FALSE;
2481 }
2482 } else {
2483 qAPisEnabled = TRUE;
2484 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002485 if (( eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode && qAPisEnabled) ||
2486 (( eCSR_CFG_DOT11_MODE_11N == pBssConfig->uCfgDot11Mode && qAPisEnabled) ||
2487 ( eCSR_CFG_DOT11_MODE_TAURUS == pBssConfig->uCfgDot11Mode ) ) //For 11n, need QoS
2488 )
2489 {
2490 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP;
2491 } else {
2492 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2493 }
2494
2495 //auth type
2496 switch( pProfile->AuthType.authType[0] ) //Take the prefered Auth type.
2497 {
2498 default:
2499 case eCSR_AUTH_TYPE_WPA:
2500 case eCSR_AUTH_TYPE_WPA_PSK:
2501 case eCSR_AUTH_TYPE_WPA_NONE:
2502 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2503 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2504 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002505 case eCSR_AUTH_TYPE_SHARED_KEY:
2506 pBssConfig->authType = eSIR_SHARED_KEY;
2507 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002508 case eCSR_AUTH_TYPE_AUTOSWITCH:
2509 pBssConfig->authType = eSIR_AUTO_SWITCH;
2510 break;
2511 }
2512 //short slot time
2513 if( WNI_CFG_PHY_MODE_11B != pBssConfig->uCfgDot11Mode )
2514 {
2515 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2516 }
2517 else
2518 {
2519 pBssConfig->uShortSlotTime = 0;
2520 }
2521 //power constraint. We don't support 11h on IBSS
2522 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2523 pBssConfig->uPowerLimit = 0;
2524 //heartbeat
2525 if ( eCSR_BAND_5G == pBssConfig->eBand )
2526 {
2527 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2528 }
2529 else
2530 {
2531 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2532 }
2533 //Join timeout
2534 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
Jeff Johnsone7245742012-09-05 17:12:55 -07002535
Jeff Johnson295189b2012-06-20 16:38:30 -07002536 return (status);
2537}
Jeff Johnson295189b2012-06-20 16:38:30 -07002538static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc)
2539{
2540 eHalStatus status = eHAL_STATUS_FAILURE;
2541 tDot11fBeaconIEs *pIes = NULL;
2542
2543 do
2544 {
2545 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIes)))
2546 {
2547 //err msg
2548 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
2549 "csrRoamGetQosInfoFromBss() failed\n");
Jeff Johnson295189b2012-06-20 16:38:30 -07002550 break;
2551 }
2552 //check if the AP is QAP & it supports APSD
2553 if( CSR_IS_QOS_BSS(pIes) )
2554 {
2555 return eHAL_STATUS_SUCCESS;
2556 }
2557 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002558 return status;
2559}
2560
Jeff Johnson295189b2012-06-20 16:38:30 -07002561void csrSetCfgPrivacy( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, tANI_BOOLEAN fPrivacy )
2562{
Jeff Johnson295189b2012-06-20 16:38:30 -07002563 // !! Note: the only difference between this function and the csrSetCfgPrivacyFromProfile() is the
2564 // setting of the privacy CFG based on the advertised privacy setting from the AP for WPA associations.
2565 // See !!Note: below in this function...
2566 tANI_U32 PrivacyEnabled = 0;
2567 tANI_U32 RsnEnabled = 0;
2568 tANI_U32 WepDefaultKeyId = 0;
2569 tANI_U32 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5; /* default 40 bits */
2570 tANI_U32 Key0Length = 0;
2571 tANI_U32 Key1Length = 0;
2572 tANI_U32 Key2Length = 0;
2573 tANI_U32 Key3Length = 0;
2574
2575 // Reserve for the biggest key
2576 tANI_U8 Key0[ WNI_CFG_WEP_DEFAULT_KEY_1_LEN ];
2577 tANI_U8 Key1[ WNI_CFG_WEP_DEFAULT_KEY_2_LEN ];
2578 tANI_U8 Key2[ WNI_CFG_WEP_DEFAULT_KEY_3_LEN ];
2579 tANI_U8 Key3[ WNI_CFG_WEP_DEFAULT_KEY_4_LEN ];
2580
2581 switch ( pProfile->negotiatedUCEncryptionType )
2582 {
2583 case eCSR_ENCRYPT_TYPE_NONE:
2584
2585 // for NO encryption, turn off Privacy and Rsn.
2586 PrivacyEnabled = 0;
2587 RsnEnabled = 0;
2588
2589 // WEP key length and Wep Default Key ID don't matter in this case....
2590
2591 // clear out the WEP keys that may be hanging around.
2592 Key0Length = 0;
2593 Key1Length = 0;
2594 Key2Length = 0;
2595 Key3Length = 0;
2596
2597 break;
2598
2599 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
2600
2601 // Privacy is ON. NO RSN for Wep40 static key.
2602 PrivacyEnabled = 1;
2603 RsnEnabled = 0;
2604
2605 // Set the Wep default key ID.
2606 WepDefaultKeyId = pProfile->Keys.defaultIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07002607 // Wep key size if 5 bytes (40 bits).
2608 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5;
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_5 );
2614 Key0Length = WNI_CFG_WEP_KEY_LENGTH_5;
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_5 );
2624 Key1Length = WNI_CFG_WEP_KEY_LENGTH_5;
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_5 );
2634 Key2Length = WNI_CFG_WEP_KEY_LENGTH_5;
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_5 );
2644 Key3Length = WNI_CFG_WEP_KEY_LENGTH_5;
2645 }
2646 else
2647 {
2648 Key3Length = 0;
2649 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002650 break;
2651
2652 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
2653
2654 // Privacy is ON. NO RSN for Wep40 static key.
2655 PrivacyEnabled = 1;
2656 RsnEnabled = 0;
2657
2658 // Set the Wep default key ID.
2659 WepDefaultKeyId = pProfile->Keys.defaultIndex;
2660
2661 // Wep key size if 13 bytes (104 bits).
2662 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_13;
2663
2664 // set encryption keys in the CFG database or clear those that are not present in this profile.
2665 if ( pProfile->Keys.KeyLength[0] )
2666 {
2667 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[ 0 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2668 Key0Length = WNI_CFG_WEP_KEY_LENGTH_13;
2669 }
2670 else
2671 {
2672 Key0Length = 0;
2673 }
2674
2675 if ( pProfile->Keys.KeyLength[1] )
2676 {
2677 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[ 1 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2678 Key1Length = WNI_CFG_WEP_KEY_LENGTH_13;
2679 }
2680 else
2681 {
2682 Key1Length = 0;
2683 }
2684
2685 if ( pProfile->Keys.KeyLength[2] )
2686 {
2687 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[ 2 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2688 Key2Length = WNI_CFG_WEP_KEY_LENGTH_13;
2689 }
2690 else
2691 {
2692 Key2Length = 0;
2693 }
2694
2695 if ( pProfile->Keys.KeyLength[3] )
2696 {
2697 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[ 3 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2698 Key3Length = WNI_CFG_WEP_KEY_LENGTH_13;
2699 }
2700 else
2701 {
2702 Key3Length = 0;
2703 }
2704
2705 break;
2706
2707 case eCSR_ENCRYPT_TYPE_WEP40:
2708 case eCSR_ENCRYPT_TYPE_WEP104:
2709 case eCSR_ENCRYPT_TYPE_TKIP:
2710 case eCSR_ENCRYPT_TYPE_AES:
2711#ifdef FEATURE_WLAN_WAPI
2712 case eCSR_ENCRYPT_TYPE_WPI:
2713#endif /* FEATURE_WLAN_WAPI */
2714 // !! Note: this is the only difference between this function and the csrSetCfgPrivacyFromProfile()
2715 // (setting of the privacy CFG based on the advertised privacy setting from the AP for WPA/WAPI associations ).
2716 PrivacyEnabled = (0 != fPrivacy);
2717
2718 // turn on RSN enabled for WPA associations
2719 RsnEnabled = 1;
2720
2721 // WEP key length and Wep Default Key ID don't matter in this case....
2722
2723 // clear out the static WEP keys that may be hanging around.
2724 Key0Length = 0;
2725 Key1Length = 0;
2726 Key2Length = 0;
2727 Key3Length = 0;
2728
2729 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002730 default:
2731 PrivacyEnabled = 0;
2732 RsnEnabled = 0;
2733 break;
2734 }
2735
2736 ccmCfgSetInt(pMac, WNI_CFG_PRIVACY_ENABLED, PrivacyEnabled, NULL, eANI_BOOLEAN_FALSE);
2737 ccmCfgSetInt(pMac, WNI_CFG_RSN_ENABLED, RsnEnabled, NULL, eANI_BOOLEAN_FALSE);
2738 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_1, Key0, Key0Length, NULL, eANI_BOOLEAN_FALSE);
2739 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_2, Key1, Key1Length, NULL, eANI_BOOLEAN_FALSE);
2740 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_3, Key2, Key2Length, NULL, eANI_BOOLEAN_FALSE);
2741 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_4, Key3, Key3Length, NULL, eANI_BOOLEAN_FALSE);
2742 ccmCfgSetInt(pMac, WNI_CFG_WEP_KEY_LENGTH, WepKeyLength, NULL, eANI_BOOLEAN_FALSE);
2743 ccmCfgSetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, WepDefaultKeyId, NULL, eANI_BOOLEAN_FALSE);
2744}
2745
Jeff Johnson295189b2012-06-20 16:38:30 -07002746static void csrSetCfgSsid( tpAniSirGlobal pMac, tSirMacSSid *pSSID )
2747{
2748 tANI_U32 len = 0;
2749 if(pSSID->length <= WNI_CFG_SSID_LEN)
2750 {
2751 len = pSSID->length;
2752 }
2753 ccmCfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *)pSSID->ssId, len, NULL, eANI_BOOLEAN_FALSE);
2754}
2755
Jeff Johnson295189b2012-06-20 16:38:30 -07002756eHalStatus csrSetQosToCfg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrMediaAccessType qosType )
2757{
2758 eHalStatus status = eHAL_STATUS_SUCCESS;
2759 tANI_U32 QoSEnabled;
2760 tANI_U32 WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002761 // set the CFG enable/disable variables based on the qosType being configured...
2762 switch( qosType )
2763 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002764 case eCSR_MEDIUM_ACCESS_WMM_eDCF_802dot1p:
2765 QoSEnabled = FALSE;
2766 WmeEnabled = TRUE;
2767 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002768 case eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP:
2769 QoSEnabled = FALSE;
2770 WmeEnabled = TRUE;
2771 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002772 case eCSR_MEDIUM_ACCESS_WMM_eDCF_NoClassify:
2773 QoSEnabled = FALSE;
2774 WmeEnabled = TRUE;
2775 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002776 case eCSR_MEDIUM_ACCESS_11e_eDCF:
2777 QoSEnabled = TRUE;
2778 WmeEnabled = FALSE;
2779 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002780 case eCSR_MEDIUM_ACCESS_11e_HCF:
2781 QoSEnabled = TRUE;
2782 WmeEnabled = FALSE;
2783 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002784 default:
2785 case eCSR_MEDIUM_ACCESS_DCF:
2786 QoSEnabled = FALSE;
2787 WmeEnabled = FALSE;
2788 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002789 }
2790 //save the WMM setting for later use
2791 pMac->roam.roamSession[sessionId].fWMMConnection = (tANI_BOOLEAN)WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002792 status = ccmCfgSetInt(pMac, WNI_CFG_QOS_ENABLED, QoSEnabled, NULL, eANI_BOOLEAN_FALSE);
2793 status = ccmCfgSetInt(pMac, WNI_CFG_WME_ENABLED, WmeEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002794 return (status);
2795}
Jeff Johnson295189b2012-06-20 16:38:30 -07002796static eHalStatus csrGetRateSet( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tSirBssDescription *pBssDesc,
2797 tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet)
2798{
2799 eHalStatus status = eHAL_STATUS_FAILURE;
2800 int i;
2801 eCsrCfgDot11Mode cfgDot11Mode;
2802 tANI_U8 *pDstRate;
Jeff Johnson295189b2012-06-20 16:38:30 -07002803 palZeroMemory(pMac->hHdd, pOpRateSet, sizeof(tSirMacRateSet));
2804 palZeroMemory(pMac->hHdd, pExRateSet, sizeof(tSirMacRateSet));
Jeff Johnson295189b2012-06-20 16:38:30 -07002805#if defined(VOSS_ENABLED)
2806 VOS_ASSERT( pIes != NULL );
2807#endif
2808
2809 if( NULL != pIes )
2810 {
2811 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002812 // Originally, we thought that for 11a networks, the 11a rates are always
2813 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2814 // appear in the Operational Rate set. Consequently, in either case, we
2815 // would blindly put the rates we support into our Operational Rate set
2816 // (including the basic rates, which we have already verified are
2817 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002818 // However, it turns out that this is not always the case. Some AP's
2819 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2820 // too. Now, we're a little more careful:
2821 pDstRate = pOpRateSet->rate;
2822 if(pIes->SuppRates.present)
2823 {
2824 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2825 {
2826 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) )
2827 {
2828 *pDstRate++ = pIes->SuppRates.rates[ i ];
2829 pOpRateSet->numRates++;;
2830 }
2831 }
2832 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002833 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2834 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2835 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2836 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2837 {
2838 // If there are Extended Rates in the beacon, we will reflect those
2839 // extended rates that we support in out Extended Operational Rate
2840 // set:
2841 pDstRate = pExRateSet->rate;
2842 if(pIes->ExtSuppRates.present)
2843 {
2844 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2845 {
2846 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) )
2847 {
2848 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2849 pExRateSet->numRates++;
2850 }
2851 }
2852 }
2853 }
2854 }//Parsing BSSDesc
2855 else
2856 {
2857 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2858 }
2859 if (pOpRateSet->numRates > 0 || pExRateSet->numRates > 0) status = eHAL_STATUS_SUCCESS;
2860 return status;
2861}
2862
2863static void csrSetCfgRateSet( tpAniSirGlobal pMac, eCsrPhyMode phyMode, tCsrRoamProfile *pProfile,
2864 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
2865{
2866 int i;
2867 tANI_U8 *pDstRate;
2868 eCsrCfgDot11Mode cfgDot11Mode;
2869 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2870 tANI_U32 OperationalRatesLength = 0;
2871 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2872 tANI_U32 ExtendedOperationalRatesLength = 0;
2873 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2874 tANI_U32 ProprietaryOperationalRatesLength = 0;
2875 tANI_U32 PropRatesEnable = 0;
2876 tANI_U8 MCSRateIdxSet[ SIZE_OF_SUPPORTED_MCS_SET ];
2877 tANI_U32 MCSRateLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002878#if defined(VOSS_ENABLED)
2879 VOS_ASSERT( pIes != NULL );
2880#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002881 if( NULL != pIes )
2882 {
2883 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002884 // Originally, we thought that for 11a networks, the 11a rates are always
2885 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2886 // appear in the Operational Rate set. Consequently, in either case, we
2887 // would blindly put the rates we support into our Operational Rate set
2888 // (including the basic rates, which we have already verified are
2889 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002890 // However, it turns out that this is not always the case. Some AP's
2891 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2892 // too. Now, we're a little more careful:
2893 pDstRate = OperationalRates;
2894 if(pIes->SuppRates.present)
2895 {
2896 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2897 {
2898 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) &&
2899 ( OperationalRatesLength < CSR_DOT11_SUPPORTED_RATES_MAX ))
2900 {
2901 *pDstRate++ = pIes->SuppRates.rates[ i ];
2902 OperationalRatesLength++;
2903 }
2904 }
2905 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002906 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2907 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2908 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2909 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2910 {
2911 // If there are Extended Rates in the beacon, we will reflect those
2912 // extended rates that we support in out Extended Operational Rate
2913 // set:
2914 pDstRate = ExtendedOperationalRates;
2915 if(pIes->ExtSuppRates.present)
2916 {
2917 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2918 {
2919 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) &&
2920 ( ExtendedOperationalRatesLength < CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ))
2921 {
2922 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2923 ExtendedOperationalRatesLength++;
2924 }
2925 }
2926 }
2927 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002928 // Enable proprietary MAC features if peer node is Airgo node and STA
2929 // user wants to use them
2930 if( pIes->Airgo.present && pMac->roam.configParam.ProprietaryRatesEnabled )
2931 {
2932 PropRatesEnable = 1;
2933 }
2934 else
2935 {
2936 PropRatesEnable = 0;
2937 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002938 // For ANI network companions, we need to populate the proprietary rate
2939 // set with any proprietary rates we found in the beacon, only if user
2940 // allows them...
2941 if ( PropRatesEnable && pIes->Airgo.PropSuppRates.present &&
2942 ( pIes->Airgo.PropSuppRates.num_rates > 0 ))
2943 {
2944 ProprietaryOperationalRatesLength = pIes->Airgo.PropSuppRates.num_rates;
2945 if ( ProprietaryOperationalRatesLength > sizeof(ProprietaryOperationalRates) )
2946 {
2947 ProprietaryOperationalRatesLength = sizeof (ProprietaryOperationalRates);
2948 }
2949 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates, pIes->Airgo.PropSuppRates.rates, ProprietaryOperationalRatesLength );
2950 }
2951 else {
2952 // No proprietary modes...
2953 ProprietaryOperationalRatesLength = 0;
2954 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002955 /* Get MCS Rate */
2956 pDstRate = MCSRateIdxSet;
2957 if ( pIes->HTCaps.present )
2958 {
2959 for ( i = 0; i < VALID_MAX_MCS_INDEX; i++ )
2960 {
2961 if ( (unsigned int)pIes->HTCaps.supportedMCSSet[0] & (1 << i) )
2962 {
2963 MCSRateLength++;
2964 *pDstRate++ = i;
2965 }
2966 }
2967 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002968 // Set the operational rate set CFG variables...
2969 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
2970 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2971 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
2972 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2973 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
2974 ProprietaryOperationalRates,
2975 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2976 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
2977 ccmCfgSetStr(pMac, WNI_CFG_CURRENT_MCS_SET, MCSRateIdxSet,
2978 MCSRateLength, NULL, eANI_BOOLEAN_FALSE);
2979 }//Parsing BSSDesc
2980 else
2981 {
2982 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2983 }
2984}
2985
Jeff Johnson295189b2012-06-20 16:38:30 -07002986static void csrSetCfgRateSetFromProfile( tpAniSirGlobal pMac,
2987 tCsrRoamProfile *pProfile )
2988{
2989 tSirMacRateSetIE DefaultSupportedRates11a = { SIR_MAC_RATESET_EID,
2990 { 8,
2991 { SIR_MAC_RATE_6,
2992 SIR_MAC_RATE_9,
2993 SIR_MAC_RATE_12,
2994 SIR_MAC_RATE_18,
2995 SIR_MAC_RATE_24,
2996 SIR_MAC_RATE_36,
2997 SIR_MAC_RATE_48,
2998 SIR_MAC_RATE_54 } } };
Jeff Johnson295189b2012-06-20 16:38:30 -07002999 tSirMacRateSetIE DefaultSupportedRates11b = { SIR_MAC_RATESET_EID,
3000 { 4,
3001 { SIR_MAC_RATE_1,
3002 SIR_MAC_RATE_2,
3003 SIR_MAC_RATE_5_5,
3004 SIR_MAC_RATE_11 } } };
3005
3006
3007 tSirMacPropRateSet DefaultSupportedPropRates = { 3,
3008 { SIR_MAC_RATE_72,
3009 SIR_MAC_RATE_96,
3010 SIR_MAC_RATE_108 } };
3011 eCsrCfgDot11Mode cfgDot11Mode;
3012 eCsrBand eBand;
3013 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
3014 tANI_U32 OperationalRatesLength = 0;
3015 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
3016 tANI_U32 ExtendedOperationalRatesLength = 0;
3017 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
3018 tANI_U32 ProprietaryOperationalRatesLength = 0;
3019 tANI_U32 PropRatesEnable = 0;
3020 tANI_U8 operationChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003021 if(pProfile->ChannelInfo.ChannelList)
3022 {
3023 operationChannel = pProfile->ChannelInfo.ChannelList[0];
3024 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003025#ifdef WLAN_SOFTAP_FEATURE
3026 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
3027#else
3028 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
3029#endif
3030 // For 11a networks, the 11a rates go into the Operational Rate set. For 11b and 11g
3031 // networks, the 11b rates appear in the Operational Rate set. In either case,
3032 // we can blindly put the rates we support into our Operational Rate set
3033 // (including the basic rates, which we have already verified are supported
3034 // earlier in the roaming decision).
3035 if ( eCSR_BAND_5G == eBand )
3036 {
3037 // 11a rates into the Operational Rate Set.
3038 OperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3039 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3040 palCopyMemory( pMac->hHdd, OperationalRates,
3041 DefaultSupportedRates11a.supportedRateSet.rate,
3042 OperationalRatesLength );
3043
3044 // Nothing in the Extended rate set.
3045 ExtendedOperationalRatesLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003046 // populate proprietary rates if user allows them
3047 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3048 {
3049 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3050 sizeof(*DefaultSupportedPropRates.propRate);
3051 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3052 DefaultSupportedPropRates.propRate,
3053 ProprietaryOperationalRatesLength );
3054 }
3055 else
3056 {
3057 // No proprietary modes
3058 ProprietaryOperationalRatesLength = 0;
3059 }
3060 }
3061 else if ( eCSR_CFG_DOT11_MODE_11B == cfgDot11Mode )
3062 {
3063 // 11b rates into the Operational Rate Set.
3064 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3065 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3066 palCopyMemory( pMac->hHdd, OperationalRates,
3067 DefaultSupportedRates11b.supportedRateSet.rate,
3068 OperationalRatesLength );
3069 // Nothing in the Extended rate set.
3070 ExtendedOperationalRatesLength = 0;
3071 // No proprietary modes
3072 ProprietaryOperationalRatesLength = 0;
3073 }
3074 else
3075 {
3076 // 11G
3077
3078 // 11b rates into the Operational Rate Set.
3079 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3080 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3081 palCopyMemory( pMac->hHdd, OperationalRates,
3082 DefaultSupportedRates11b.supportedRateSet.rate,
3083 OperationalRatesLength );
3084
3085 // 11a rates go in the Extended rate set.
3086 ExtendedOperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3087 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3088 palCopyMemory( pMac->hHdd, ExtendedOperationalRates,
3089 DefaultSupportedRates11a.supportedRateSet.rate,
3090 ExtendedOperationalRatesLength );
3091
3092 // populate proprietary rates if user allows them
3093 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3094 {
3095 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3096 sizeof(*DefaultSupportedPropRates.propRate);
3097 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3098 DefaultSupportedPropRates.propRate,
3099 ProprietaryOperationalRatesLength );
3100 }
3101 else
3102 {
3103 // No proprietary modes
3104 ProprietaryOperationalRatesLength = 0;
3105 }
3106 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003107 // set this to 1 if prop. rates need to be advertised in to the IBSS beacon and user wants to use them
3108 if ( ProprietaryOperationalRatesLength && pMac->roam.configParam.ProprietaryRatesEnabled )
3109 {
3110 PropRatesEnable = 1;
3111 }
3112 else
3113 {
3114 PropRatesEnable = 0;
3115 }
3116
3117 // Set the operational rate set CFG variables...
3118 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
3119 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3120 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
3121 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3122 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
3123 ProprietaryOperationalRates,
3124 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3125 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003126}
Jeff Johnson295189b2012-06-20 16:38:30 -07003127void csrRoamCcmCfgSetCallback(tHalHandle hHal, tANI_S32 result)
3128{
3129 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
Jeff Johnsone7245742012-09-05 17:12:55 -07003130
Jeff Johnson295189b2012-06-20 16:38:30 -07003131 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
3132 tANI_U32 sessionId;
3133 tSmeCmd *pCommand = NULL;
3134
3135 if(NULL == pEntry)
3136 {
3137 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
3138 return;
3139 }
3140 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
3141 sessionId = pCommand->sessionId;
3142
3143 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
3144 {
3145 csrRoamingStateConfigCnfProcessor(pMac, (tANI_U32)result);
3146 }
3147}
3148
Jeff Johnson295189b2012-06-20 16:38:30 -07003149//This function is very dump. It is here because PE still need WNI_CFG_PHY_MODE
3150tANI_U32 csrRoamGetPhyModeFromDot11Mode(eCsrCfgDot11Mode dot11Mode, eCsrBand band)
3151{
3152 if(eCSR_CFG_DOT11_MODE_11B == dot11Mode)
3153 {
3154 return (WNI_CFG_PHY_MODE_11B);
3155 }
3156 else
3157 {
3158 if(eCSR_BAND_24 == band)
3159 return (WNI_CFG_PHY_MODE_11G);
3160 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003161 return (WNI_CFG_PHY_MODE_11A);
3162}
Jeff Johnson295189b2012-06-20 16:38:30 -07003163
Jeff Johnsone7245742012-09-05 17:12:55 -07003164
3165#ifdef WLAN_FEATURE_11AC
3166ePhyChanBondState csrGetHTCBStateFromVHTCBState(ePhyChanBondState aniCBMode)
3167{
3168 switch ( aniCBMode )
3169 {
3170 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3171 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3172 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3173 return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
3174 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3175 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3176 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3177 return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
3178 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003179 default :
Jeff Johnsone7245742012-09-05 17:12:55 -07003180 return PHY_SINGLE_CHANNEL_CENTERED;
3181 }
3182}
3183#endif
3184
Jeff Johnson295189b2012-06-20 16:38:30 -07003185//pIes may be NULL
3186eHalStatus csrRoamSetBssConfigCfg(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3187 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
3188 tDot11fBeaconIEs *pIes)
3189{
3190 eHalStatus status = eHAL_STATUS_SUCCESS;
3191 tANI_U32 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3192 tANI_U8 channel = 0;
3193 //Make sure we have the domain info for the BSS we try to connect to.
3194 //Do we need to worry about sequence for OSs that are not Windows??
3195 if(pBssDesc)
3196 {
3197 if(csrLearnCountryInformation(pMac, pBssDesc, pIes, eANI_BOOLEAN_TRUE))
3198 {
3199 //Make sure the 11d info from this BSSDesc can be applied
3200 pMac->scan.fAmbiguous11dInfoFound = eANI_BOOLEAN_FALSE;
3201 csrApplyCountryInformation( pMac, TRUE );
3202 }
3203 }
3204
3205 //Qos
3206 csrSetQosToCfg( pMac, sessionId, pBssConfig->qosType );
3207 //SSID
3208 csrSetCfgSsid(pMac, &pBssConfig->SSID );
3209 //fragment threshold
3210 //ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3211 //RTS threshold
3212 //ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3213
3214 //ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, csrTranslateToWNICfgDot11Mode(pMac, pBssConfig->uCfgDot11Mode), NULL, eANI_BOOLEAN_FALSE);
3215
3216 //Auth type
3217 ccmCfgSetInt(pMac, WNI_CFG_AUTHENTICATION_TYPE, pBssConfig->authType, NULL, eANI_BOOLEAN_FALSE);
3218 //encryption type
3219 csrSetCfgPrivacy(pMac, pProfile, (tANI_BOOLEAN)pBssConfig->BssCap.privacy );
3220 //short slot time
3221 ccmCfgSetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, pBssConfig->uShortSlotTime, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003222#ifdef WLAN_SOFTAP_FEATURE
3223 //11d
3224 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
3225 ((pBssConfig->f11hSupport) ? pBssConfig->f11hSupport : pProfile->ieee80211d),
3226 NULL, eANI_BOOLEAN_FALSE);
3227#endif
3228 /*//11h
3229 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
3230 */
3231 ccmCfgSetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, pBssConfig->uPowerLimit, NULL, eANI_BOOLEAN_FALSE);
3232 //CB
Jeff Johnsone7245742012-09-05 17:12:55 -07003233
Jeff Johnson295189b2012-06-20 16:38:30 -07003234 if(CSR_IS_INFRA_AP(pProfile) || CSR_IS_WDS_AP(pProfile))
3235 {
3236 channel = pProfile->operationChannel;
3237 }
3238 else
3239 {
3240 if(pBssDesc)
3241 {
3242 channel = pBssDesc->channelId;
3243 }
3244 }
3245 if(0 != channel)
3246 {
3247 if(CSR_IS_CHANNEL_24GHZ(channel))
3248 {//for now if we are on 2.4 Ghz, CB will be always disabled
3249 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3250 }
3251 else
3252 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003253 cfgCb = pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003254 }
3255 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003256#ifdef WLAN_FEATURE_11AC
3257 if(cfgCb > 2 )
3258 {
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003259 if(!WDA_getFwWlanFeatCaps(DOT11AC)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003260 cfgCb = csrGetHTCBStateFromVHTCBState(cfgCb);
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003261 }
3262 else
3263 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003264 ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, pMac->roam.configParam.nVhtChannelWidth, NULL, eANI_BOOLEAN_FALSE);
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003265 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003266 }
3267 else
3268#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003269 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, cfgCb, NULL, eANI_BOOLEAN_FALSE);
3270 //Rate
3271 //Fixed Rate
3272 if(pBssDesc)
3273 {
3274 csrSetCfgRateSet(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile, pBssDesc, pIes);
3275 }
3276 else
3277 {
3278 csrSetCfgRateSetFromProfile(pMac, pProfile);
3279 }
3280 //Make this the last CFG to set. The callback will trigger a join_req
3281 //Join time out
3282 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_CONFIG, sessionId );
3283
3284 ccmCfgSetInt(pMac, WNI_CFG_JOIN_FAILURE_TIMEOUT, pBssConfig->uJoinTimeOut, (tCcmCfgSetCallback)csrRoamCcmCfgSetCallback, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003285 return (status);
3286}
3287
Jeff Johnson295189b2012-06-20 16:38:30 -07003288eHalStatus csrRoamStopNetwork( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3289 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
3290{
3291 eHalStatus status;
3292 tBssConfigParam *pBssConfig;
3293 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003294
3295 if(!pSession)
3296 {
3297 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3298 return eHAL_STATUS_FAILURE;
3299 }
3300
Jeff Johnson295189b2012-06-20 16:38:30 -07003301 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
3302 if(HAL_STATUS_SUCCESS(status))
3303 {
3304 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
3305 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, pBssConfig, pIes);
3306 if(HAL_STATUS_SUCCESS(status))
3307 {
3308 pSession->bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003309 /* This will allow to pass cbMode during join req */
3310 pSession->bssParams.cbMode= pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003311 //For IBSS, we need to prepare some more information
3312 if( csrIsBssTypeIBSS(pProfile->BSSType) || CSR_IS_WDS( pProfile )
3313#ifdef WLAN_SOFTAP_FEATURE
3314 || CSR_IS_INFRA_AP(pProfile)
3315#endif
3316 )
3317 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003318 csrRoamPrepareBssParams(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07003319 }
3320 // If we are in an IBSS, then stop the IBSS...
3321 ////Not worry about WDS connection for now
3322 if ( csrIsConnStateIbss( pMac, sessionId ) )
3323 {
3324 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
3325 }
3326 else
3327 {
3328 // if we are in an Infrastructure association....
3329 if ( csrIsConnStateInfra( pMac, sessionId ) )
3330 {
3331 // and the new Bss is an Ibss OR we are roaming from Infra to Infra
3332 // across SSIDs (roaming to a new SSID)... //
3333 //Not worry about WDS connection for now
3334 if ( pBssDesc && ( ( csrIsIbssBssDesc( pBssDesc ) ) ||
3335 !csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIes ) ) )
3336 {
3337 // then we need to disassociate from the Infrastructure network...
3338 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
3339 }
3340 else
3341 {
3342 // In an Infrastucture and going to an Infrastructure network with the same SSID. This
3343 // calls for a Reassociation sequence. So issue the CFG sets for this new AP.
3344 if ( pBssDesc )
3345 {
3346 // Set parameters for this Bss.
3347 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3348 }
3349 }
3350 }
3351 else
3352 {
3353 // Neiher in IBSS nor in Infra. We can go ahead and set the CFG for tne new network...
3354 // Nothing to stop.
3355 if ( pBssDesc || CSR_IS_WDS_AP( pProfile )
3356#ifdef WLAN_SOFTAP_FEATURE
3357 || CSR_IS_INFRA_AP(pProfile)
3358#endif
3359 )
3360 {
3361 // Set parameters for this Bss.
3362 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3363 }
3364 }
3365 }
3366 }//Success getting BSS config info
3367 palFreeMemory(pMac->hHdd, pBssConfig);
3368 }//Allocate memory
3369
3370 return (status);
3371}
3372
Jeff Johnson295189b2012-06-20 16:38:30 -07003373eCsrJoinState csrRoamJoin( tpAniSirGlobal pMac, tANI_U32 sessionId,
3374 tCsrScanResultInfo *pScanResult, tCsrRoamProfile *pProfile )
3375{
3376 eCsrJoinState eRoamState = eCsrContinueRoaming;
3377 eHalStatus status;
3378 tSirBssDescription *pBssDesc = &pScanResult->BssDescriptor;
3379 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)( pScanResult->pvIes ); //This may be NULL
3380 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003381
3382 if(!pSession)
3383 {
3384 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3385 return (eCsrStopRoaming);
3386 }
3387
Jeff Johnson295189b2012-06-20 16:38:30 -07003388 if( CSR_IS_WDS_STA( pProfile ) )
3389 {
3390 status = csrRoamStartWds( pMac, sessionId, pProfile, pBssDesc );
3391 if( !HAL_STATUS_SUCCESS( status ) )
3392 {
3393 eRoamState = eCsrStopRoaming;
3394 }
3395 }
3396 else
3397 {
3398 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
3399 {
3400 smsLog(pMac, LOGE, FL(" fail to parse IEs"));
3401 return (eCsrStopRoaming);
3402 }
3403 if ( csrIsInfraBssDesc( pBssDesc ) )
3404 {
3405 // If we are connected in infrastructure mode and the Join Bss description is for the same BssID, then we are
3406 // attempting to join the AP we are already connected with. In that case, see if the Bss or Sta capabilities
3407 // have changed and handle the changes (without disturbing the current association).
3408
3409 if ( csrIsConnStateConnectedInfra(pMac, sessionId) &&
3410 csrIsBssIdEqual( pMac, pBssDesc, pSession->pConnectBssDesc ) &&
3411 csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIesLocal )
3412 )
3413 {
3414 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
3415 // with Authenticating first. To force this, stop the current association (Disassociate) and
3416 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
3417 // a new Association.
3418 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3419 {
3420 smsLog(pMac, LOGW, FL(" detect same profile authType = %d encryType = %d\n"), pProfile->AuthType, pProfile->EncryptionType);
3421 if(csrRoamIsSameProfileKeys(pMac, &pSession->connectedProfile, pProfile))
3422 {
3423 eRoamState = eCsrReassocToSelfNoCapChange;
3424 }
3425 else
3426 {
3427 tBssConfigParam bssConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07003428 //The key changes
3429 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(bssConfig));
3430 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, &bssConfig, pIesLocal);
3431 if(HAL_STATUS_SUCCESS(status))
3432 {
3433 pSession->bssParams.uCfgDot11Mode = bssConfig.uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003434 pSession->bssParams.cbMode = bssConfig.cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003435 //Reapply the config including Keys so reassoc is happening.
3436 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, &bssConfig, pIesLocal);
3437 if(!HAL_STATUS_SUCCESS(status))
3438 {
3439 eRoamState = eCsrStopRoaming;
3440 }
3441 }
3442 else
3443 {
3444 eRoamState = eCsrStopRoaming;
3445 }
3446 }//same profile
3447 }
3448 else
3449 {
3450 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, sessionId,
3451 eCSR_ROAM_SUBSTATE_DISASSOC_REQ, FALSE )))
3452 {
3453 smsLog(pMac, LOGW, FL(" fail to issue disassociate\n"));
3454 eRoamState = eCsrStopRoaming;
3455 }
3456 }
3457 }
3458 else
3459 {
3460 // note: we used to pre-auth here with open authentication networks but that was not working so well.
3461 // we had a lot of join timeouts when testing at Samsung. removing this step helped associations
3462 // work much better.
3463 //
3464 //
3465 // stop the existing network before attempting to join the new network...
3466 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3467 {
3468 eRoamState = eCsrStopRoaming;
3469 }
3470 }
3471 }//Infra
3472 else
3473 {
3474 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3475 {
3476 eRoamState = eCsrStopRoaming;
3477 }
3478 }
3479 if( pIesLocal && !pScanResult->pvIes )
3480 {
3481 palFreeMemory(pMac->hHdd, pIesLocal);
3482 }
3483 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003484 return( eRoamState );
3485}
3486
Jeff Johnson295189b2012-06-20 16:38:30 -07003487eHalStatus csrRoamShouldRoam(tpAniSirGlobal pMac, tANI_U32 sessionId,
3488 tSirBssDescription *pBssDesc, tANI_U32 roamId)
3489{
3490 eHalStatus status = eHAL_STATUS_SUCCESS;
3491 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07003492 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3493 roamInfo.pBssDesc = pBssDesc;
3494 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, roamId, eCSR_ROAM_SHOULD_ROAM, eCSR_ROAM_RESULT_NONE);
3495 return (status);
3496}
Jeff Johnson295189b2012-06-20 16:38:30 -07003497//In case no matching BSS is found, use whatever default we can find
3498static void csrRoamAssignDefaultParam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3499{
3500 //Need to get all negotiated types in place first
3501 //auth type
3502 switch( pCommand->u.roamCmd.roamProfile.AuthType.authType[0] ) //Take the prefered Auth type.
3503 {
3504 default:
3505 case eCSR_AUTH_TYPE_WPA:
3506 case eCSR_AUTH_TYPE_WPA_PSK:
3507 case eCSR_AUTH_TYPE_WPA_NONE:
3508 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3509 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3510 break;
3511
3512 case eCSR_AUTH_TYPE_SHARED_KEY:
3513 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
3514 break;
3515
3516 case eCSR_AUTH_TYPE_AUTOSWITCH:
3517 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
3518 break;
3519 }
3520 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType =
3521 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3522 //In this case, the multicast encryption needs to follow the uncast ones.
3523 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType =
3524 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3525}
3526
3527static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fUseSameBss )
3528{
3529 eHalStatus status;
3530 tCsrScanResult *pScanResult = NULL;
3531 eCsrJoinState eRoamState = eCsrStopRoaming;
3532 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
3533 tANI_BOOLEAN fDone = eANI_BOOLEAN_FALSE;
3534 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
3535#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3536 v_U8_t acm_mask = 0;
3537#endif
3538 tANI_U32 sessionId = pCommand->sessionId;
3539 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
3540 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
3541 tANI_U8 concurrentChannel = 0;
Jeff Johnson32d95a32012-09-10 13:15:23 -07003542
3543 if(!pSession)
3544 {
3545 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3546 return (eCsrStopRoaming);
3547 }
3548
Jeff Johnson295189b2012-06-20 16:38:30 -07003549 do
3550 {
3551 // Check for Cardbus eject condition, before trying to Roam to any BSS
3552 //***if( !balIsCardPresent(pAdapter) ) break;
3553
3554 if(NULL != pBSSList)
3555 {
3556 // When handling AP's capability change, continue to associate to
3557 // same BSS and make sure pRoamBssEntry is not Null.
3558 if((eANI_BOOLEAN_FALSE == fUseSameBss) || (pCommand->u.roamCmd.pRoamBssEntry == NULL))
3559 {
3560 if(pCommand->u.roamCmd.pRoamBssEntry == NULL)
3561 {
3562 //Try the first BSS
3563 pCommand->u.roamCmd.pLastRoamBss = NULL;
3564 pCommand->u.roamCmd.pRoamBssEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
3565 }
3566 else
3567 {
3568 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3569 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3570 {
3571 //Done with all the BSSs
3572 //In this case, will tell HDD the completion
3573 break;
3574 }
3575 else
3576 {
3577 //We need to indicate to HDD that we are done with this one.
3578 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3579 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss; //this shall not be NULL
3580 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
3581 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
3582 pRoamInfo = &roamInfo;
3583 }
3584 }
3585 while(pCommand->u.roamCmd.pRoamBssEntry)
3586 {
3587 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
Jeff Johnson295189b2012-06-20 16:38:30 -07003588 /*If concurrency enabled take the concurrent connected channel first. */
3589 /* Valid multichannel concurrent sessions exempted */
Jeff Johnsone7245742012-09-05 17:12:55 -07003590 if (vos_concurrent_sessions_running() &&
3591 !csrIsValidMcConcurrentSession(pMac, sessionId, &pScanResult->Result.BssDescriptor))
Jeff Johnson295189b2012-06-20 16:38:30 -07003592 {
3593 concurrentChannel =
3594 csrGetConcurrentOperationChannel(pMac);
3595 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH, "%s: "
3596 " csr Concurrent Channel = %d", __FUNCTION__, concurrentChannel);
Jeff Johnson295189b2012-06-20 16:38:30 -07003597 if ((concurrentChannel) &&
3598 (concurrentChannel ==
3599 pScanResult->Result.BssDescriptor.channelId))
3600 {
3601 //make this 0 because we do not want the
3602 //below check to pass as we don't want to
3603 //connect on other channel
3604 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3605 FL("Concurrent channel match =%d"),
3606 concurrentChannel);
3607 concurrentChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003608 }
3609 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003610
3611 if (!concurrentChannel)
3612 {
3613
3614 if(HAL_STATUS_SUCCESS(csrRoamShouldRoam(pMac,
3615 sessionId, &pScanResult->Result.BssDescriptor,
3616 pCommand->u.roamCmd.roamId)))
3617 {
3618 //Ok to roam this
3619 break;
3620 }
3621 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003622 else
3623 {
3624 eRoamState = eCsrStopRoamingDueToConcurrency;
3625 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003626 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3627 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3628 {
3629 //Done with all the BSSs
3630 fDone = eANI_BOOLEAN_TRUE;
3631 break;
3632 }
3633 }
3634 if(fDone)
3635 {
3636 break;
3637 }
3638 }
3639 }
3640 //We have something to roam, tell HDD when it is infra.
3641 //For IBSS, the indication goes back to HDD via eCSR_ROAM_IBSS_IND
3642 //For WDS, the indication is eCSR_ROAM_WDS_IND
3643 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
3644 {
3645 if(pRoamInfo)
3646 {
3647 pSession->bRefAssocStartCnt--;
3648 //Complete the last association attemp because a new one is about to be tried
3649 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3650 eCSR_ROAM_ASSOCIATION_COMPLETION,
3651 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3652 }
3653 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
3654 if(pScanResult)
3655 {
3656 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07003657 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, &pScanResult->Result.BssDescriptor, &pIesLocal))) )
3658 {
3659 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
3660 fDone = eANI_BOOLEAN_TRUE;
3661 eRoamState = eCsrStopRoaming;
3662 break;
3663 }
3664 roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor;
3665 pCommand->u.roamCmd.pLastRoamBss = roamInfo.pBssDesc;
3666 //No need to put uapsd_mask in if the BSS doesn't support uAPSD
3667 if( pCommand->u.roamCmd.roamProfile.uapsd_mask &&
3668 CSR_IS_QOS_BSS(pIesLocal) &&
3669 CSR_IS_UAPSD_BSS(pIesLocal) )
3670 {
3671#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson295189b2012-06-20 16:38:30 -07003672 acm_mask = sme_QosGetACMMask(pMac, &pScanResult->Result.BssDescriptor,
3673 pIesLocal);
3674 pCommand->u.roamCmd.roamProfile.uapsd_mask &= ~(acm_mask);
3675#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
Jeff Johnson295189b2012-06-20 16:38:30 -07003676 }
3677 else
3678 {
3679 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3680 }
3681 if( pIesLocal && !pScanResult->Result.pvIes)
3682 {
3683 palFreeMemory(pMac->hHdd, pIesLocal);
3684 }
3685 }
3686 else
3687 {
3688 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3689 }
3690 roamInfo.pProfile = pProfile;
3691 pSession->bRefAssocStartCnt++;
3692 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3693 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3694 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003695 if ( NULL == pCommand->u.roamCmd.pRoamBssEntry )
3696 {
3697 // If this is a start IBSS profile, then we need to start the IBSS.
3698 if ( CSR_IS_START_IBSS(pProfile) )
3699 {
3700 tANI_BOOLEAN fSameIbss = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003701 // Attempt to start this IBSS...
3702 csrRoamAssignDefaultParam( pMac, pCommand );
3703 status = csrRoamStartIbss( pMac, sessionId, pProfile, &fSameIbss );
3704 if(HAL_STATUS_SUCCESS(status))
3705 {
3706 if ( fSameIbss )
3707 {
3708 eRoamState = eCsrStartIbssSameIbss;
3709 }
3710 else
3711 {
3712 eRoamState = eCsrContinueRoaming;
3713 }
3714 }
3715 else
3716 {
3717 //it somehow fail need to stop
3718 eRoamState = eCsrStopRoaming;
3719 }
3720 break;
3721 }
3722 else if ( (CSR_IS_WDS_AP(pProfile))
3723#ifdef WLAN_SOFTAP_FEATURE
3724 || (CSR_IS_INFRA_AP(pProfile))
3725#endif
3726 )
3727 {
3728 // Attempt to start this WDS...
3729 csrRoamAssignDefaultParam( pMac, pCommand );
3730 /* For AP WDS, we dont have any BSSDescription */
3731 status = csrRoamStartWds( pMac, sessionId, pProfile, NULL );
3732 if(HAL_STATUS_SUCCESS(status))
3733 {
3734 eRoamState = eCsrContinueRoaming;
3735 }
3736 else
3737 {
3738 //it somehow fail need to stop
3739 eRoamState = eCsrStopRoaming;
3740 }
3741 }
3742 else
3743 {
3744 //Nothing we can do
3745 smsLog(pMac, LOGW, FL("cannot continue without BSS list\n"));
3746 eRoamState = eCsrStopRoaming;
3747 break;
3748 }
3749 }
3750 else //We have BSS
3751 {
3752 //Need to assign these value because they are used in csrIsSameProfile
3753 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3754 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType = pScanResult->ucEncryptionType; //Negotiated while building scan result.
3755 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType = pScanResult->mcEncryptionType;
3756 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = pScanResult->authType;
3757 if ( CSR_IS_START_IBSS(&pCommand->u.roamCmd.roamProfile) )
3758 {
3759 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3760 {
3761 eRoamState = eCsrStartIbssSameIbss;
3762 break;
3763 }
3764 }
3765 if( pCommand->u.roamCmd.fReassocToSelfNoCapChange )
3766 {
3767 //trying to connect to the one already connected
3768 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_FALSE;
3769 eRoamState = eCsrReassocToSelfNoCapChange;
3770 break;
3771 }
3772 // Attempt to Join this Bss...
3773 eRoamState = csrRoamJoin( pMac, sessionId, &pScanResult->Result, pProfile );
3774 break;
3775 }
3776
3777 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07003778 if( (eCsrStopRoaming == eRoamState) && (CSR_IS_INFRASTRUCTURE( pProfile )) )
3779 {
3780 //Need to indicate association_completion if association_start has been done
3781 if(pSession->bRefAssocStartCnt > 0)
3782 {
3783 pSession->bRefAssocStartCnt--;
3784 //Complete the last association attemp because a new one is about to be tried
3785 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3786 eCSR_ROAM_ASSOCIATION_COMPLETION,
3787 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3788 }
3789 }
3790
3791 return( eRoamState );
3792}
3793
Jeff Johnson295189b2012-06-20 16:38:30 -07003794static eHalStatus csrRoam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3795{
3796 eHalStatus status = eHAL_STATUS_SUCCESS;
3797 eCsrJoinState RoamState;
3798 tANI_U32 sessionId = pCommand->sessionId;
3799
Jeff Johnson295189b2012-06-20 16:38:30 -07003800 //***if( hddIsRadioStateOn( pAdapter ) )
3801 {
3802 // Attept to join a Bss...
3803 RoamState = csrRoamJoinNextBss( pMac, pCommand, eANI_BOOLEAN_FALSE );
Jeff Johnsone7245742012-09-05 17:12:55 -07003804
Jeff Johnson295189b2012-06-20 16:38:30 -07003805 // if nothing to join..
Jeff Johnsone7245742012-09-05 17:12:55 -07003806 if (( eCsrStopRoaming == RoamState ) || ( eCsrStopRoamingDueToConcurrency == RoamState))
Jeff Johnson295189b2012-06-20 16:38:30 -07003807 {
3808 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003809 // and if connected in Infrastructure mode...
3810 if ( csrIsConnStateInfra(pMac, sessionId) )
3811 {
3812 //... then we need to issue a disassociation
3813 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISASSOC_NOTHING_TO_JOIN, FALSE );
3814 if(!HAL_STATUS_SUCCESS(status))
3815 {
3816 smsLog(pMac, LOGW, FL(" failed to issue disassociate, status = %d\n"), status);
3817 //roam command is completed by caller in the failed case
3818 fComplete = eANI_BOOLEAN_TRUE;
3819 }
3820 }
3821 else if( csrIsConnStateIbss(pMac, sessionId) )
3822 {
3823 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3824 if(!HAL_STATUS_SUCCESS(status))
3825 {
3826 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3827 //roam command is completed by caller in the failed case
3828 fComplete = eANI_BOOLEAN_TRUE;
3829 }
3830 }
3831#ifdef WLAN_SOFTAP_FEATURE
3832 else if (csrIsConnStateConnectedInfraAp(pMac, sessionId))
3833 {
3834 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3835 if(!HAL_STATUS_SUCCESS(status))
3836 {
3837 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3838 //roam command is completed by caller in the failed case
3839 fComplete = eANI_BOOLEAN_TRUE;
3840 }
3841 }
3842#endif
3843 else
3844 {
3845 fComplete = eANI_BOOLEAN_TRUE;
3846 }
3847 if(fComplete)
3848 {
3849 // ... otherwise, we can complete the Roam command here.
Jeff Johnsone7245742012-09-05 17:12:55 -07003850 if(eCsrStopRoamingDueToConcurrency == RoamState)
3851 {
3852 csrRoamComplete( pMac, eCsrJoinFailureDueToConcurrency, NULL );
3853 }
3854 else
3855 {
3856 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
3857 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003858 }
3859 }
3860 else if ( eCsrReassocToSelfNoCapChange == RoamState )
3861 {
3862 csrRoamComplete( pMac, eCsrSilentlyStopRoamingSaveState, NULL );
3863 }
3864 else if ( eCsrStartIbssSameIbss == RoamState )
3865 {
3866 csrRoamComplete( pMac, eCsrSilentlyStopRoaming, NULL );
3867 }
3868 }//hddIsRadioStateOn
3869
3870 return status;
3871}
Jeff Johnson295189b2012-06-20 16:38:30 -07003872eHalStatus csrProcessFTReassocRoamCommand ( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3873{
3874 tANI_U32 sessionId;
3875 tCsrRoamSession *pSession;
3876 tCsrScanResult *pScanResult = NULL;
3877 tSirBssDescription *pBssDesc = NULL;
3878 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003879 sessionId = pCommand->sessionId;
3880 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003881
3882 if(!pSession)
3883 {
3884 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3885 return eHAL_STATUS_FAILURE;
3886 }
3887
Jeff Johnson295189b2012-06-20 16:38:30 -07003888 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
3889 {
3890 //the roaming is cancelled. Simply complete the command
3891 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3892 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3893 return eHAL_STATUS_FAILURE;
3894 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003895 if (pCommand->u.roamCmd.pRoamBssEntry)
3896 {
3897 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3898 pBssDesc = &pScanResult->Result.BssDescriptor;
3899 }
3900 else
3901 {
3902 //the roaming is cancelled. Simply complete the command
3903 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3904 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3905 return eHAL_STATUS_FAILURE;
3906 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003907 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
3908 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
3909 return status;
3910}
3911
Jeff Johnson295189b2012-06-20 16:38:30 -07003912eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3913{
3914 eHalStatus status = eHAL_STATUS_SUCCESS;
3915 tCsrRoamInfo roamInfo;
3916 tANI_U32 sessionId = pCommand->sessionId;
3917 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003918
3919 if(!pSession)
3920 {
3921 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3922 return eHAL_STATUS_FAILURE;
3923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003924
3925 switch ( pCommand->u.roamCmd.roamReason )
3926 {
3927 case eCsrForcedDisassoc:
3928 csrFreeRoamProfile(pMac, sessionId);
3929 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3930 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003931 case eCsrSmeIssuedDisassocForHandoff:
3932 //Not to free pMac->roam.pCurRoamProfile (via csrFreeRoamProfile) because it is needed after disconnect
3933#if 0 // TODO : Confirm this change
3934 status = csrRoamProcessDisassociate( pMac, pCommand, FALSE );
3935#else
3936 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3937#endif
3938
3939 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003940 case eCsrForcedDisassocMICFailure:
3941 csrFreeRoamProfile(pMac, sessionId);
3942 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, TRUE );
3943 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003944 case eCsrForcedDeauth:
3945 csrFreeRoamProfile(pMac, sessionId);
3946 status = csrRoamProcessDisassocDeauth( pMac, pCommand, FALSE, FALSE );
3947 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003948 case eCsrHddIssuedReassocToSameAP:
3949 case eCsrSmeIssuedReassocToSameAP:
3950 {
3951 tDot11fBeaconIEs *pIes = NULL;
3952
Jeff Johnson295189b2012-06-20 16:38:30 -07003953 if( pSession->pConnectBssDesc )
3954 {
3955 status = csrGetParsedBssDescriptionIEs(pMac, pSession->pConnectBssDesc, &pIes);
3956 if(!HAL_STATUS_SUCCESS(status) )
3957 {
3958 smsLog(pMac, LOGE, FL(" fail to parse IEs\n"));
3959 }
3960 else
3961 {
3962 roamInfo.reasonCode = eCsrRoamReasonStaCapabilityChanged;
3963 csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
3964 pSession->roamingReason = eCsrReassocRoaming;
Jeff Johnson295189b2012-06-20 16:38:30 -07003965 roamInfo.pBssDesc = pSession->pConnectBssDesc;
3966 roamInfo.pProfile = &pCommand->u.roamCmd.roamProfile;
3967 pSession->bRefAssocStartCnt++;
3968 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3969 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3970
3971 smsLog(pMac, LOG1, FL(" calling csrRoamIssueReassociate\n"));
3972 csrRoamIssueReassociate( pMac, sessionId, pSession->pConnectBssDesc, pIes,
3973 &pCommand->u.roamCmd.roamProfile );
3974 palFreeMemory(pMac->hHdd, pIes);
3975 pIes = NULL;
3976 }
3977 }
3978 break;
3979 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003980 case eCsrCapsChange:
3981 smsLog(pMac, LOGE, FL("received eCsrCapsChange \n"));
3982 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
3983 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE);
3984 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003985 case eCsrSmeIssuedFTReassoc:
3986 smsLog(pMac, LOGE, FL("received FT Reassoc Req \n"));
3987 status = csrProcessFTReassocRoamCommand(pMac, pCommand);
3988 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07003989
Jeff Johnson295189b2012-06-20 16:38:30 -07003990 case eCsrStopBss:
3991 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3992 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3993 break;
3994
3995 case eCsrForcedDisassocSta:
3996 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3997 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DISASSOC_REQ, sessionId);
3998 status = csrSendMBDisassocReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
3999 pCommand->u.roamCmd.reason);
4000 break;
4001
4002 case eCsrForcedDeauthSta:
4003 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
4004 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DEAUTH_REQ, sessionId);
4005 status = csrSendMBDeauthReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
4006 pCommand->u.roamCmd.reason);
4007 break;
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07004008#if 1
4009 /*Varun*/
4010 case eCsrPerformPreauth:
4011 smsLog(pMac, LOGE, FL("Attempting FT PreAuth Req \n"));
4012 status = csrRoamIssueFTPreauthReq(pMac, sessionId,
4013 pCommand->u.roamCmd.pLastRoamBss);
4014 break;
4015#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004016
4017 default:
4018 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
4019
4020 if( pCommand->u.roamCmd.fUpdateCurRoamProfile )
4021 {
4022 //Remember the roaming profile
4023 csrFreeRoamProfile(pMac, sessionId);
4024 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pSession->pCurRoamProfile, sizeof(tCsrRoamProfile))))
4025 {
4026 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
4027 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, &pCommand->u.roamCmd.roamProfile);
4028 }
4029 }
4030
4031 //At this point, original uapsd_mask is saved in pCurRoamProfile
4032 //uapsd_mask in the pCommand may change from this point on.
4033
4034 // Attempt to roam with the new scan results (if we need to..)
4035 status = csrRoam( pMac, pCommand );
4036 break;
4037 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004038 return (status);
4039}
4040
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07004041void csrReinitPreauthCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4042{
4043 pCommand->u.roamCmd.pLastRoamBss = NULL;
4044 pCommand->u.roamCmd.pRoamBssEntry = NULL;
4045 //Because u.roamCmd is union and share with scanCmd and StatusChange
4046 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
4047}
4048
Jeff Johnson295189b2012-06-20 16:38:30 -07004049void csrReinitRoamCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4050{
4051 if(pCommand->u.roamCmd.fReleaseBssList)
4052 {
4053 csrScanResultPurge(pMac, pCommand->u.roamCmd.hBSSList);
4054 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
4055 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
4056 }
4057 if(pCommand->u.roamCmd.fReleaseProfile)
4058 {
4059 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
4060 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
4061 }
4062 pCommand->u.roamCmd.pRoamBssEntry = NULL;
4063 //Because u.roamCmd is union and share with scanCmd and StatusChange
4064 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
4065}
4066
Jeff Johnson295189b2012-06-20 16:38:30 -07004067void csrReinitWmStatusChangeCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4068{
4069 palZeroMemory(pMac->hHdd, &pCommand->u.wmStatusChangeCmd, sizeof(tWmStatusChangeCmd));
4070}
Jeff Johnson295189b2012-06-20 16:38:30 -07004071void csrRoamComplete( tpAniSirGlobal pMac, eCsrRoamCompleteResult Result, void *Context )
4072{
4073 tListElem *pEntry;
4074 tSmeCmd *pCommand;
4075 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004076 smsLog( pMac, LOG2, "roamQ: Roam Completion ...\n" );
Jeff Johnson295189b2012-06-20 16:38:30 -07004077 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
4078 if ( pEntry )
4079 {
4080 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07004081 // If the head of the queue is Active and it is a ROAM command, remove
4082 // and put this on the Free queue.
4083 if ( eSmeCommandRoam == pCommand->command )
4084 {
4085 //we need to process the result first before removing it from active list because state changes
4086 //still happening insides roamQProcessRoamResults so no other roam command should be issued
4087 fReleaseCommand = csrRoamProcessResults( pMac, pCommand, Result, Context );
4088 if( fReleaseCommand )
4089 {
4090 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
4091 {
4092 csrReleaseCommandRoam( pMac, pCommand );
4093 }
4094 else
4095 {
4096 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4097 pCommand->u.roamCmd.roamReason );
4098 }
4099 }
4100 else
4101 {
4102 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4103 pCommand->u.roamCmd.roamReason );
4104 }
4105 }
4106 else
4107 {
4108 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
4109 }
4110 }
4111 else
4112 {
4113 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
4114 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004115 if( fReleaseCommand )
4116 {
4117 smeProcessPendingQueue( pMac );
4118 }
4119}
4120
Jeff Johnson295189b2012-06-20 16:38:30 -07004121void csrResetPMKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4122{
4123 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004124 if(!pSession)
4125 {
4126 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4127 return;
4128 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004129 palZeroMemory( pMac->hHdd, &(pSession->PmkidCandidateInfo[0]), sizeof(tPmkidCandidateInfo) * CSR_MAX_PMKID_ALLOWED );
4130 pSession->NumPmkidCandidate = 0;
4131}
Jeff Johnson295189b2012-06-20 16:38:30 -07004132#ifdef FEATURE_WLAN_WAPI
4133void csrResetBKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4134{
4135 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004136 if(!pSession)
4137 {
4138 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4139 return;
4140 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004141 palZeroMemory( pMac->hHdd, &(pSession->BkidCandidateInfo[0]), sizeof(tBkidCandidateInfo) * CSR_MAX_BKID_ALLOWED );
4142 pSession->NumBkidCandidate = 0;
4143}
4144#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07004145extern tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ];
4146
Jeff Johnson295189b2012-06-20 16:38:30 -07004147static eHalStatus csrRoamSaveSecurityRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrAuthType authType,
4148 tSirBssDescription *pSirBssDesc,
4149 tDot11fBeaconIEs *pIes)
4150{
4151 eHalStatus status = eHAL_STATUS_SUCCESS;
4152 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4153 tDot11fBeaconIEs *pIesLocal = pIes;
Jeff Johnson32d95a32012-09-10 13:15:23 -07004154
4155 if(!pSession)
4156 {
4157 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4158 return eHAL_STATUS_FAILURE;
4159 }
4160
Jeff Johnson295189b2012-06-20 16:38:30 -07004161 if((eCSR_AUTH_TYPE_WPA == authType) ||
4162 (eCSR_AUTH_TYPE_WPA_PSK == authType) ||
4163 (eCSR_AUTH_TYPE_RSN == authType) ||
4164 (eCSR_AUTH_TYPE_RSN_PSK == authType)
4165#if defined WLAN_FEATURE_VOWIFI_11R
4166 ||
4167 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4168 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType)
4169#endif /* FEATURE_WLAN_WAPI */
4170#ifdef FEATURE_WLAN_WAPI
4171 ||
4172 (eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4173 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType)
4174#endif /* FEATURE_WLAN_WAPI */
4175 )
4176 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004177 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4178 {
4179 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
4180 }
4181 if( pIesLocal )
4182 {
4183 tANI_U32 nIeLen;
4184 tANI_U8 *pIeBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07004185 if((eCSR_AUTH_TYPE_RSN == authType) ||
4186#if defined WLAN_FEATURE_VOWIFI_11R
4187 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4188 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType) ||
4189#endif /* WLAN_FEATURE_VOWIFI_11R */
4190 (eCSR_AUTH_TYPE_RSN_PSK == authType))
4191 {
4192 if(pIesLocal->RSN.present)
4193 {
4194 //Calculate the actual length
4195 nIeLen = 8 //version + gp_cipher_suite + pwise_cipher_suite_count
4196 + pIesLocal->RSN.pwise_cipher_suite_count * 4 //pwise_cipher_suites
4197 + 2 //akm_suite_count
4198 + pIesLocal->RSN.akm_suite_count * 4 //akm_suites
4199 + 2; //reserved
4200 if( pIesLocal->RSN.pmkid_count )
4201 {
4202 nIeLen += 2 + pIesLocal->RSN.pmkid_count * 4; //pmkid
4203 }
4204 //nIeLen doesn't count EID and length fields
4205 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4206 {
4207 pSession->pWpaRsnRspIE[0] = DOT11F_EID_RSN;
4208 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4209 //copy upto akm_suites
4210 pIeBuf = pSession->pWpaRsnRspIE + 2;
4211 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.version, 8);
4212 pIeBuf += 8;
4213 if( pIesLocal->RSN.pwise_cipher_suite_count )
4214 {
4215 //copy pwise_cipher_suites
4216 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.pwise_cipher_suites,
4217 pIesLocal->RSN.pwise_cipher_suite_count * 4);
4218 pIeBuf += pIesLocal->RSN.pwise_cipher_suite_count * 4;
4219 }
4220 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.akm_suite_count, 2);
4221 pIeBuf += 2;
4222 if( pIesLocal->RSN.akm_suite_count )
4223 {
4224 //copy akm_suites
4225 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites,
4226 pIesLocal->RSN.akm_suite_count * 4);
4227 pIeBuf += pIesLocal->RSN.akm_suite_count * 4;
4228 }
4229 //copy the rest
4230 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites +
4231 pIesLocal->RSN.akm_suite_count * 4,
4232 2 + pIesLocal->RSN.pmkid_count * 4);
4233 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4234 }
4235 }
4236 }
4237 else if((eCSR_AUTH_TYPE_WPA == authType) ||
4238 (eCSR_AUTH_TYPE_WPA_PSK == authType))
4239 {
4240 if(pIesLocal->WPA.present)
4241 {
4242 //Calculate the actual length
4243 nIeLen = 12 //OUI + version + multicast_cipher + unicast_cipher_count
4244 + pIesLocal->WPA.unicast_cipher_count * 4 //unicast_ciphers
4245 + 2 //auth_suite_count
4246 + pIesLocal->WPA.auth_suite_count * 4; //auth_suites
4247 // The WPA capabilities follows the Auth Suite (two octects)--
4248 // this field is optional, and we always "send" zero, so just
4249 // remove it. This is consistent with our assumptions in the
4250 // frames compiler; c.f. bug 15234:
4251 //nIeLen doesn't count EID and length fields
4252 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4253 {
4254 pSession->pWpaRsnRspIE[0] = DOT11F_EID_WPA;
4255 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4256 pIeBuf = pSession->pWpaRsnRspIE + 2;
4257 //Copy WPA OUI
4258 palCopyMemory(pMac->hHdd, pIeBuf, &csrWpaOui[1], 4);
4259 pIeBuf += 4;
4260 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.version, 8 +
4261 pIesLocal->WPA.unicast_cipher_count * 4);
4262 pIeBuf += 8 + pIesLocal->WPA.unicast_cipher_count * 4;
4263 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.auth_suite_count, 2 +
4264 pIesLocal->WPA.auth_suite_count * 4);
4265 pIeBuf += pIesLocal->WPA.auth_suite_count * 4;
4266 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4267 }
4268 }
4269 }
4270#ifdef FEATURE_WLAN_WAPI
4271 else if((eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4272 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType))
4273 {
4274 if(pIesLocal->WAPI.present)
4275 {
4276 //Calculate the actual length
4277 nIeLen = 4 //version + akm_suite_count
4278 + pIesLocal->WAPI.akm_suite_count * 4 // akm_suites
4279 + 2 //pwise_cipher_suite_count
4280 + pIesLocal->WAPI.unicast_cipher_suite_count * 4 //pwise_cipher_suites
4281 + 6; //gp_cipher_suite + preauth + reserved
4282 if( pIesLocal->WAPI.bkid_count )
4283 {
4284 nIeLen += 2 + pIesLocal->WAPI.bkid_count * 4; //bkid
4285 }
4286
4287 //nIeLen doesn't count EID and length fields
4288 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiRspIE, nIeLen + 2))))
4289 {
4290 pSession->pWapiRspIE[0] = DOT11F_EID_WAPI;
4291 pSession->pWapiRspIE[1] = (tANI_U8)nIeLen;
4292 pIeBuf = pSession->pWapiRspIE + 2;
4293 //copy upto akm_suite_count
4294 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.version, 4);
4295 pIeBuf += 4;
4296 if( pIesLocal->WAPI.akm_suite_count )
4297 {
4298 //copy akm_suites
4299 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.akm_suites,
4300 pIesLocal->WAPI.akm_suite_count * 4);
4301 pIeBuf += pIesLocal->WAPI.akm_suite_count * 4;
4302 }
4303 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.unicast_cipher_suite_count, 2);
4304 pIeBuf += 2;
Jeff Johnson295189b2012-06-20 16:38:30 -07004305 if( pIesLocal->WAPI.unicast_cipher_suite_count )
4306 {
4307 //copy pwise_cipher_suites
4308 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.unicast_cipher_suites,
4309 pIesLocal->WAPI.unicast_cipher_suite_count * 4);
4310 pIeBuf += pIesLocal->WAPI.unicast_cipher_suite_count * 4;
4311 }
4312 //gp_cipher_suite + preauth + reserved + bkid_count
4313 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.multicast_cipher_suite, 8);
4314 pIeBuf += 8;
4315 if( pIesLocal->WAPI.bkid_count )
4316 {
4317 //copy akm_suites
4318 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.bkid, pIesLocal->WAPI.bkid_count * 4);
4319 pIeBuf += pIesLocal->WAPI.bkid_count * 4;
4320 }
4321 pSession->nWapiRspIeLength = nIeLen + 2;
4322 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004323 }
4324 }
4325#endif /* FEATURE_WLAN_WAPI */
4326 if( !pIes )
4327 {
4328 //locally allocated
4329 palFreeMemory(pMac->hHdd, pIesLocal);
4330 }
4331 }
4332 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004333 return (status);
4334}
4335
Jeff Johnson295189b2012-06-20 16:38:30 -07004336static void csrCheckAndUpdateACWeight( tpAniSirGlobal pMac, tDot11fBeaconIEs *pIEs )
4337{
4338 v_U8_t bACWeights[WLANTL_MAX_AC];
4339 v_U8_t paramBk, paramBe, paramVi, paramVo;
4340 v_BOOL_t fWeightChange = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004341 //Compare two ACs' EDCA parameters, from low to high (BK, BE, VI, VO)
4342 //The "formula" is, if lower AC's AIFSN+CWMin is bigger than a fixed amount
4343 //of the higher AC one, make the higher AC has the same weight as the lower AC.
4344 //This doesn't address the case where the lower AC needs a real higher weight
4345 if( pIEs->WMMParams.present )
4346 {
4347 //no change to the lowest ones
4348 bACWeights[WLANTL_AC_BK] = pMac->roam.ucACWeights[WLANTL_AC_BK];
4349 bACWeights[WLANTL_AC_BE] = pMac->roam.ucACWeights[WLANTL_AC_BE];
4350 bACWeights[WLANTL_AC_VI] = pMac->roam.ucACWeights[WLANTL_AC_VI];
4351 bACWeights[WLANTL_AC_VO] = pMac->roam.ucACWeights[WLANTL_AC_VO];
4352 paramBk = pIEs->WMMParams.acbk_aifsn + pIEs->WMMParams.acbk_acwmin;
4353 paramBe = pIEs->WMMParams.acbe_aifsn + pIEs->WMMParams.acbe_acwmin;
4354 paramVi = pIEs->WMMParams.acvi_aifsn + pIEs->WMMParams.acvi_acwmin;
4355 paramVo = pIEs->WMMParams.acvo_aifsn + pIEs->WMMParams.acvo_acwmin;
4356 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramBe) )
4357 {
4358 bACWeights[WLANTL_AC_BE] = bACWeights[WLANTL_AC_BK];
4359 fWeightChange = VOS_TRUE;
4360 }
4361 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVi) )
4362 {
4363 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BK];
4364 fWeightChange = VOS_TRUE;
4365 }
4366 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVi) )
4367 {
4368 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BE];
4369 fWeightChange = VOS_TRUE;
4370 }
4371 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVo) )
4372 {
4373 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BK];
4374 fWeightChange = VOS_TRUE;
4375 }
4376 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVo) )
4377 {
4378 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BE];
4379 fWeightChange = VOS_TRUE;
4380 }
4381 else if( SME_DETECT_AC_WEIGHT_DIFF(paramVi, paramVo) )
4382 {
4383 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_VI];
4384 fWeightChange = VOS_TRUE;
4385 }
4386 if(fWeightChange)
4387 {
4388 smsLog(pMac, LOGE, FL(" change AC weights (%d-%d-%d-%d)\n"), bACWeights[0], bACWeights[1],
4389 bACWeights[2], bACWeights[3]);
4390 WLANTL_SetACWeights(pMac->roam.gVosContext, bACWeights);
4391 }
4392 }
4393}
Jeff Johnson295189b2012-06-20 16:38:30 -07004394#ifdef WLAN_FEATURE_VOWIFI_11R
4395//Returns whether the current association is a 11r assoc or not
4396tANI_BOOLEAN csrRoamIs11rAssoc(tpAniSirGlobal pMac)
4397{
4398#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4399 return csrNeighborRoamIs11rAssoc(pMac);
4400#else
4401 return eANI_BOOLEAN_FALSE;
4402#endif
4403}
4404#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004405#ifdef FEATURE_WLAN_CCX
4406//Returns whether the current association is a CCX assoc or not
4407tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac)
4408{
4409#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4410 return csrNeighborRoamIsCCXAssoc(pMac);
4411#else
4412 return eANI_BOOLEAN_FALSE;
4413#endif
4414}
4415#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004416#ifdef FEATURE_WLAN_LFR
4417//Returns whether "Legacy Fast Roaming" is currently enabled...or not
4418tANI_BOOLEAN csrRoamIsFastRoamEnabled(tpAniSirGlobal pMac)
4419{
Madan Mohan Koyyalamudi9ce36ec2012-10-15 16:03:17 -07004420 return (pMac->roam.configParam.isFastRoamIniFeatureEnabled &&
Madan Mohan Koyyalamudi393a4342012-10-15 16:07:09 -07004421 (!csrIsConcurrentSessionRunning(pMac)));
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004422}
4423#endif
4424
Jeff Johnson295189b2012-06-20 16:38:30 -07004425//Return true means the command can be release, else not
4426static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
4427 eCsrRoamCompleteResult Result, void *Context )
4428{
4429 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
4430 tSirBssDescription *pSirBssDesc = NULL;
4431 tSirMacAddr BroadcastMac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4432 tCsrScanResult *pScanResult = NULL;
4433 tCsrRoamInfo roamInfo;
4434 sme_QosAssocInfo assocInfo;
4435 sme_QosCsrEventIndType ind_qos;//indication for QoS module in SME
4436 tANI_U8 acm_mask = 0; //HDD needs the ACM mask in the assoc rsp callback
4437 tDot11fBeaconIEs *pIes = NULL;
4438 tANI_U32 sessionId = pCommand->sessionId;
4439 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4440 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
4441 eRoamCmdStatus roamStatus;
4442 eCsrRoamResult roamResult;
4443 eHalStatus status;
4444 tANI_U32 key_timeout_interval = 0;
4445#ifdef WLAN_SOFTAP_FEATURE
4446 tSirSmeStartBssRsp *pSmeStartBssRsp = NULL;
4447#endif
4448
Jeff Johnson32d95a32012-09-10 13:15:23 -07004449 if(!pSession)
4450 {
4451 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4452 return eANI_BOOLEAN_FALSE;
4453 }
4454
Jeff Johnson295189b2012-06-20 16:38:30 -07004455 smsLog( pMac, LOG1, FL("Processing ROAM results...\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004456 switch( Result )
4457 {
4458 case eCsrJoinSuccess:
4459 // reset the IDLE timer
4460 // !!
4461 // !! fall through to the next CASE statement here is intentional !!
4462 // !!
4463 case eCsrReassocSuccess:
4464 if(eCsrReassocSuccess == Result)
4465 {
4466 ind_qos = SME_QOS_CSR_REASSOC_COMPLETE;
4467 }
4468 else
4469 {
4470 ind_qos = SME_QOS_CSR_ASSOC_COMPLETE;
4471 }
4472 // Success Join Response from LIM. Tell NDIS we are connected and save the
4473 // Connected state...
4474 smsLog(pMac, LOGW, FL("receives association indication\n"));
4475 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4476 //always free the memory here
4477 if(pSession->pWpaRsnRspIE)
4478 {
4479 pSession->nWpaRsnRspIeLength = 0;
4480 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
4481 pSession->pWpaRsnRspIE = NULL;
4482 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004483#ifdef FEATURE_WLAN_WAPI
4484 if(pSession->pWapiRspIE)
4485 {
4486 pSession->nWapiRspIeLength = 0;
4487 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
4488 pSession->pWapiRspIE = NULL;
4489 }
4490#endif /* FEATURE_WLAN_WAPI */
4491#ifdef FEATURE_WLAN_BTAMP_UT_RF
4492 //Reset counter so no join retry is needed.
4493 pSession->maxRetryCount = 0;
4494 csrRoamStopJoinRetryTimer(pMac, sessionId);
4495#endif
4496 /* This creates problem since we have not saved the connected profile.
4497 So moving this after saving the profile
4498 */
4499 //csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED );
4500 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
4501 {
4502 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED;
4503 }
4504 else
4505 {
4506 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;
4507 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004508 //Use the last connected bssdesc for reassoc-ing to the same AP.
4509 //NOTE: What to do when reassoc to a different AP???
4510 if( (eCsrHddIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) ||
4511 (eCsrSmeIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) )
4512 {
4513 pSirBssDesc = pSession->pConnectBssDesc;
4514 if(pSirBssDesc)
4515 {
4516 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4517 }
4518 }
4519 else
4520 {
4521
4522 if(pCommand->u.roamCmd.pRoamBssEntry)
4523 {
4524 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
4525 if(pScanResult != NULL)
4526 {
4527 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4528 //this can be NULL
4529 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4530 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4531 }
4532 }
4533 }
4534 if( pSirBssDesc )
4535 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004536 roamInfo.staId = HAL_STA_INVALID_IDX;
Jeff Johnson295189b2012-06-20 16:38:30 -07004537 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4538 //Save WPA/RSN IE
4539 csrRoamSaveSecurityRspIE(pMac, sessionId, pProfile->negotiatedAuthType, pSirBssDesc, pIes);
4540#ifdef FEATURE_WLAN_CCX
4541 roamInfo.isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
4542#endif
4543
4544 // csrRoamStateChange also affects sub-state. Hence, csrRoamStateChange happens first and then
4545 // substate change.
4546 // Moving even save profile above so that below mentioned conditon is also met.
4547 // JEZ100225: Moved to after saving the profile. Fix needed in main/latest
4548 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07004549 // Make sure the Set Context is issued before link indication to NDIS. After link indication is
4550 // made to NDIS, frames could start flowing. If we have not set context with LIM, the frames
4551 // will be dropped for the security context may not be set properly.
4552 //
4553 // this was causing issues in the 2c_wlan_wep WHQL test when the SetContext was issued after the link
4554 // indication. (Link Indication happens in the profFSMSetConnectedInfra call).
4555 //
4556 // this reordering was done on titan_prod_usb branch and is being replicated here.
4557 //
4558
4559 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) &&
4560 !pProfile->bWPSAssociation)
4561 {
4562 // Issue the set Context request to LIM to establish the Unicast STA context
4563 if( !HAL_STATUS_SUCCESS( csrRoamIssueSetContextReq( pMac, sessionId,
4564 pProfile->negotiatedUCEncryptionType,
4565 pSirBssDesc, &(pSirBssDesc->bssId),
4566 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ) ) ) // NO keys... these key parameters don't matter.
4567 {
4568 smsLog( pMac, LOGE, FL(" Set context for unicast fail\n") );
4569 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4570 }
4571 // Issue the set Context request to LIM to establish the Broadcast STA context
4572 csrRoamIssueSetContextReq( pMac, sessionId, pProfile->negotiatedMCEncryptionType,
4573 pSirBssDesc, &BroadcastMac,
4574 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4575 }
4576 else
4577 {
4578 //Need to wait for supplicant authtication
4579 roamInfo.fAuthRequired = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004580 //Set the subestate to WaitForKey in case authentiation is needed
4581 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY, sessionId );
4582
Jeff Johnson295189b2012-06-20 16:38:30 -07004583 if(pProfile->bWPSAssociation)
4584 {
4585 key_timeout_interval = CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD;
4586 }
4587 else
4588 {
4589 key_timeout_interval = CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD;
4590 }
4591
4592 //Save sessionId in case of timeout
4593 pMac->roam.WaitForKeyTimerInfo.sessionId = (tANI_U8)sessionId;
4594 //This time should be long enough for the rest of the process plus setting key
4595 if(!HAL_STATUS_SUCCESS( csrRoamStartWaitForKeyTimer( pMac, key_timeout_interval ) ) )
4596 {
4597 //Reset our state so nothting is blocked.
4598 smsLog( pMac, LOGE, FL(" Failed to start pre-auth timer\n") );
4599 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
4600 }
4601 }
4602
4603 assocInfo.pBssDesc = pSirBssDesc; //could be NULL
4604 assocInfo.pProfile = pProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07004605 if(Context)
4606 {
4607 tSirSmeJoinRsp *pJoinRsp = (tSirSmeJoinRsp *)Context;
4608 tANI_U32 len;
Jeff Johnson295189b2012-06-20 16:38:30 -07004609 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4610 len = pJoinRsp->assocReqLength + pJoinRsp->assocRspLength + pJoinRsp->beaconLength;
4611#ifdef WLAN_FEATURE_VOWIFI_11R
4612 len += pJoinRsp->parsedRicRspLen;
4613#endif /* WLAN_FEATURE_VOWIFI_11R */
4614#ifdef FEATURE_WLAN_CCX
4615 len += pJoinRsp->tspecIeLen;
4616#endif
4617 if(len)
4618 {
4619 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
4620 (void **)&pSession->connectedInfo.pbFrames, len)))
4621 {
4622 if(HAL_STATUS_SUCCESS( palCopyMemory(pMac->hHdd,
4623 pSession->connectedInfo.pbFrames, pJoinRsp->frames, len) ))
4624 {
4625 pSession->connectedInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4626 pSession->connectedInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4627 pSession->connectedInfo.nBeaconLength = pJoinRsp->beaconLength;
4628#ifdef WLAN_FEATURE_VOWIFI_11R
4629 pSession->connectedInfo.nRICRspLength = pJoinRsp->parsedRicRspLen;
4630#endif /* WLAN_FEATURE_VOWIFI_11R */
4631#ifdef FEATURE_WLAN_CCX
4632 pSession->connectedInfo.nTspecIeLength = pJoinRsp->tspecIeLen;
4633#endif
4634 roamInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4635 roamInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4636 roamInfo.nBeaconLength = pJoinRsp->beaconLength;
4637 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4638 }
4639 else
4640 {
4641 smsLog(pMac, LOGE, "%s: Copying of memory failed for %d bytes !!!\n",
4642 __FUNCTION__, len);
4643 palFreeMemory( pMac->hHdd, pSession->connectedInfo.pbFrames );
4644 pSession->connectedInfo.pbFrames = NULL;
4645 }
4646 }
4647 }
4648 if(pCommand->u.roamCmd.fReassoc)
4649 {
4650 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4651 }
4652 pSession->connectedInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4653 roamInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4654 roamInfo.ucastSig = ( tANI_U8 )pJoinRsp->ucastSig;
4655 roamInfo.bcastSig = ( tANI_U8 )pJoinRsp->bcastSig;
4656 }
4657 else
4658 {
4659 if(pCommand->u.roamCmd.fReassoc)
4660 {
4661 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4662 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4663 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4664 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4665 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4666 }
4667 }
4668#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4669 // Indicate SME-QOS with reassoc success event, only after
4670 // copying the frames
4671 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, ind_qos, &assocInfo);
4672#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004673 roamInfo.pBssDesc = pSirBssDesc;
4674 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4675 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4676#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4677 acm_mask = sme_QosGetACMMask(pMac, pSirBssDesc, NULL);
4678#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
4679 pSession->connectedProfile.acm_mask = acm_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004680#ifdef FEATURE_WLAN_UAPSD_FW_TRG_FRAMES
4681 //start UAPSD if uapsd_mask is not 0 because HDD will configure for trigger frame
4682 //It may be better to let QoS do this????
4683 if( pSession->connectedProfile.modifyProfileFields.uapsd_mask )
4684 {
4685 smsLog(pMac, LOGE, " uapsd_mask (0x%X) set, request UAPSD now\n",
4686 pSession->connectedProfile.modifyProfileFields.uapsd_mask);
4687 pmcStartUapsd( pMac, NULL, NULL );
4688 }
4689#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004690 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4691 if( pSession->bRefAssocStartCnt > 0 )
4692 {
4693 pSession->bRefAssocStartCnt--;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004694 //Remove this code once SLM_Sessionization is supported
4695 //BMPS_WORKAROUND_NOT_NEEDED
4696 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) && ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004697 {
4698 pMac->roam.configParam.doBMPSWorkaround = 1;
4699 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004700 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4701 }
4702
4703 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_NONE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004704 // reset the PMKID candidate list
4705 csrResetPMKIDCandidateList( pMac, sessionId );
4706 //Update TL's AC weight base on the current EDCA parameters
4707 //These parameters may change in the course of the connection, that sictuation
4708 //is not taken care here. This change is mainly to address a WIFI WMM test where
4709 //BE has a equal or higher TX priority than VI.
4710 //We only do this for infra link
4711 if( csrIsConnStateConnectedInfra(pMac, sessionId ) && pIes )
4712 {
4713 csrCheckAndUpdateACWeight(pMac, pIes);
4714 }
4715#ifdef FEATURE_WLAN_WAPI
4716 // reset the BKID candidate list
4717 csrResetBKIDCandidateList( pMac, sessionId );
4718#endif /* FEATURE_WLAN_WAPI */
4719 }
4720 else
4721 {
4722 smsLog(pMac, LOGW, " Roam command doesn't have a BSS desc\n");
4723 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004724 csrScanCancelIdleScan(pMac);
4725 //Not to signal link up because keys are yet to be set.
4726 //The linkup function will overwrite the sub-state that we need to keep at this point.
4727 if( !CSR_IS_WAIT_FOR_KEY(pMac, sessionId) )
4728 {
4729 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
4730 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004731 //Check if BMPS is required and start the BMPS retry timer. Timer period is large
4732 //enough to let security and DHCP handshake succeed before entry into BMPS
4733 if (pmcShouldBmpsTimerRun(pMac))
4734 {
4735 if (pmcStartTrafficTimer(pMac, BMPS_TRAFFIC_TIMER_ALLOW_SECURITY_DHCP)
4736 != eHAL_STATUS_SUCCESS)
4737 {
4738 smsLog(pMac, LOGP, FL("Cannot start BMPS Retry timer"));
4739 }
4740 smsLog(pMac, LOG2, FL("BMPS Retry Timer already running or started"));
4741 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004742 break;
4743
Jeff Johnson295189b2012-06-20 16:38:30 -07004744 case eCsrStartBssSuccess:
4745 // on the StartBss Response, LIM is returning the Bss Description that we
4746 // are beaconing. Add this Bss Description to our scan results and
4747 // chain the Profile to this Bss Description. On a Start BSS, there was no
4748 // detected Bss description (no partner) so we issued the Start Bss to
4749 // start the Ibss without any Bss description. Lim was kind enough to return
4750 // the Bss Description that we start beaconing for the newly started Ibss.
4751 smsLog(pMac, LOG2, FL("receives start BSS ok indication\n"));
4752 status = eHAL_STATUS_FAILURE;
4753#ifdef WLAN_SOFTAP_FEATURE
4754 pSmeStartBssRsp = (tSirSmeStartBssRsp *)Context;
4755#endif
4756 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4757 if( CSR_IS_IBSS( pProfile ) )
4758 {
4759 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
4760 }
4761#ifdef WLAN_SOFTAP_FEATURE
4762 else if (CSR_IS_INFRA_AP(pProfile))
4763 {
4764 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
4765 }
4766#endif
4767 else
4768 {
4769 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
4770 }
4771 if( !CSR_IS_WDS_STA( pProfile ) )
4772 {
4773 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4774#ifdef WLAN_SOFTAP_FEATURE
4775 pSirBssDesc = &pSmeStartBssRsp->bssDescription;
4776#else
4777 pSirBssDesc = (tSirBssDescription *)Context;
4778#endif
4779 if( !HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs( pMac, pSirBssDesc, &pIes )) )
4780 {
4781 smsLog(pMac, LOG2, FL("cannot parse IBSS IEs\n"));
4782 roamInfo.pBssDesc = pSirBssDesc;
4783 //We need to associate_complete it first, becasue Associate_start already indicated.
4784 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4785 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_START_FAILED );
4786 break;
4787 }
4788#ifdef WLAN_SOFTAP_FEATURE
4789 if (!CSR_IS_INFRA_AP(pProfile))
4790#endif
4791 {
4792 pScanResult = csrScanAppendBssDescription( pMac, pSirBssDesc, pIes );
4793 }
4794 csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
4795 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4796 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4797 if(pSirBssDesc)
4798 {
4799 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4800 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4801 }
4802 //We are doen with the IEs so free it
4803 palFreeMemory(pMac->hHdd, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07004804#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4805 {
4806 vos_log_ibss_pkt_type *pIbssLog;
4807 tANI_U32 bi;
4808
4809 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4810 if(pIbssLog)
4811 {
4812 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4813 {
4814 //We start the IBSS (didn't find any matched IBSS out there)
4815 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_RSP;
4816 }
4817 else
4818 {
4819 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_RSP;
4820 }
4821 if(pSirBssDesc)
4822 {
4823 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pSirBssDesc->bssId, 6);
4824 pIbssLog->operatingChannel = pSirBssDesc->channelId;
4825 }
4826 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
4827 {
4828 //***U8 is not enough for beacon interval
4829 pIbssLog->beaconInterval = (v_U8_t)bi;
4830 }
4831 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4832 }
4833 }
4834#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4835 //Only set context for non-WDS_STA. We don't even need it for WDS_AP. But since the encryption
4836 //is WPA2-PSK so it won't matter.
Jeff Johnson295189b2012-06-20 16:38:30 -07004837#ifdef WLAN_SOFTAP_FEATURE
4838 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) && !CSR_IS_INFRA_AP( pSession->pCurRoamProfile ))
4839 {
4840#else
4841 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ))
4842 {
4843#endif
4844 // Issue the set Context request to LIM to establish the Broadcast STA context for the Ibss.
4845 csrRoamIssueSetContextReq( pMac, sessionId,
4846 pProfile->negotiatedMCEncryptionType,
4847 pSirBssDesc, &BroadcastMac,
4848 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4849 }
4850 }
4851 else
4852 {
4853 //Keep the state to eCSR_ROAMING_STATE_JOINING
4854 //Need to send join_req.
4855 if(pCommand->u.roamCmd.pRoamBssEntry)
4856 {
4857 if((pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link)))
4858 {
4859 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4860 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4861 // Set the roaming substate to 'join attempt'...
4862 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
4863 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
4864 }
4865 }
4866 else
4867 {
4868 smsLog( pMac, LOGE, " StartBSS for WDS station with no BssDesc\n" );
4869 VOS_ASSERT( 0 );
4870 }
4871 }
4872 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4873 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4874 //trigger the connection start indication in Vista
4875 if( !CSR_IS_JOIN_TO_IBSS( pProfile ) )
4876 {
4877 roamStatus = eCSR_ROAM_IBSS_IND;
4878 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4879 if( CSR_IS_WDS( pProfile ) )
4880 {
4881 roamStatus = eCSR_ROAM_WDS_IND;
4882 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4883 }
4884#ifdef WLAN_SOFTAP_FEATURE
4885 if( CSR_IS_INFRA_AP( pProfile ) )
4886 {
4887 roamStatus = eCSR_ROAM_INFRA_IND;
4888 roamResult = eCSR_ROAM_RESULT_INFRA_STARTED;
4889 }
4890#endif
4891
4892 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4893 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4894 //trigger the connection start indication in Vista
4895 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4896 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4897 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4898 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4899 {
4900 //We start the IBSS (didn't find any matched IBSS out there)
4901 roamInfo.pBssDesc = pSirBssDesc;
4902 }
4903#ifdef WLAN_SOFTAP_FEATURE
4904 roamInfo.staId = (tANI_U8)pSmeStartBssRsp->staId;
4905#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004906 //Remove this code once SLM_Sessionization is supported
4907 //BMPS_WORKAROUND_NOT_NEEDED
4908 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -07004909 ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004910 {
4911 pMac->roam.configParam.doBMPSWorkaround = 1;
4912 }
Mohit Khanna349bc392012-09-11 17:24:52 -07004913
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4915 }
4916
4917 csrScanCancelIdleScan(pMac);
4918 //Only use this timer for ibss. BAP has its own timer for WDS
4919 if( CSR_IS_IBSS( pProfile) && CSR_INVALID_SCANRESULT_HANDLE != pCommand->u.roamCmd.hBSSList)
4920 {
4921 //start the join IBSS timer
4922 csrRoamStartIbssJoinTimer(pMac, sessionId, CSR_IBSS_JOIN_TIMEOUT_PERIOD); //interval
4923 pSession->ibss_join_pending = TRUE;
4924 }
4925 if( HAL_STATUS_SUCCESS( status ) )
4926 {
4927 //Already sent join_req for the WDS station
4928 fReleaseCommand = eANI_BOOLEAN_FALSE;
4929 }
4930 else if( CSR_IS_WDS_STA( pProfile ) )
4931 {
4932 //need to send stop BSS because we fail to send join_req
4933 csrRoamIssueDisassociateCmd( pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED );
4934 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4935 eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_STOPPED );
4936 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004937 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004938 case eCsrStartBssFailure:
4939#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4940 {
4941 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07004942 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4943 if(pIbssLog)
4944 {
4945 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
4946 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4947 }
4948 }
4949#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07004950 roamStatus = eCSR_ROAM_IBSS_IND;
4951 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4952 if( CSR_IS_WDS( pProfile ) )
4953 {
4954 roamStatus = eCSR_ROAM_WDS_IND;
4955 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4956 }
4957#ifdef WLAN_SOFTAP_FEATURE
4958 if( CSR_IS_INFRA_AP( pProfile ) )
4959 {
4960 roamStatus = eCSR_ROAM_INFRA_IND;
4961 roamResult = eCSR_ROAM_RESULT_INFRA_START_FAILED;
4962 }
4963#endif
4964 if(Context)
4965 {
4966 pSirBssDesc = (tSirBssDescription *)Context;
4967 }
4968 else
4969 {
4970 pSirBssDesc = NULL;
4971 }
4972 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4973 roamInfo.pBssDesc = pSirBssDesc;
4974 //We need to associate_complete it first, becasue Associate_start already indicated.
4975 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4976 csrSetDefaultDot11Mode( pMac );
4977 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004978 case eCsrSilentlyStopRoaming:
4979 // We are here because we try to start the same IBSS
4980 //No message to PE
4981 // return the roaming state to Joined.
4982 smsLog(pMac, LOGW, FL("receives silently roaming indication\n"));
4983 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4984 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4985 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4986 roamInfo.pBssDesc = pSession->pConnectBssDesc;
4987 if( roamInfo.pBssDesc )
4988 {
4989 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
4990 }
4991 //Since there is no change in the current state, simply pass back no result otherwise
4992 //HDD may be mistakenly mark to disconnected state.
4993 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4994 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_NONE );
Jeff Johnson295189b2012-06-20 16:38:30 -07004995 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004996 case eCsrSilentlyStopRoamingSaveState:
4997 //We are here because we try to connect to the same AP
4998 //No message to PE
4999 smsLog(pMac, LOGW, FL("receives silently stop roaming indication\n"));
5000 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
5001
5002 //to aviod resetting the substate to NONE
5003 pMac->roam.curState[sessionId] = eCSR_ROAMING_STATE_JOINED;
5004 //No need to change substate to wai_for_key because there is no state change
5005 roamInfo.pBssDesc = pSession->pConnectBssDesc;
5006 if( roamInfo.pBssDesc )
5007 {
5008 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
5009 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005010 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5011 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
5012 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
5013 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
5014 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
5015 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
5016 roamInfo.staId = pSession->connectedInfo.staId;
5017 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5018#if defined(VOSS_ENABLED)
5019 VOS_ASSERT( roamInfo.staId != 0 );
5020#endif
5021 pSession->bRefAssocStartCnt--;
5022 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5023 eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
5024 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_ASSOCIATED, eANI_BOOLEAN_TRUE);
5025 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005026 case eCsrReassocFailure:
5027#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5028 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_REASSOC_FAILURE, NULL);
5029#endif
5030 case eCsrJoinWdsFailure:
5031 smsLog(pMac, LOGW, FL("failed to join WDS\n"));
5032 csrFreeConnectBssDesc(pMac, sessionId);
5033 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
5034 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
5035 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5036 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5037 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5038 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
5039 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5040 eCSR_ROAM_WDS_IND,
5041 eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED);
5042 //Need to issue stop_bss
5043 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005044 case eCsrJoinFailure:
5045 case eCsrNothingToJoin:
Jeff Johnsone7245742012-09-05 17:12:55 -07005046 case eCsrJoinFailureDueToConcurrency:
Jeff Johnson295189b2012-06-20 16:38:30 -07005047 default:
5048 {
5049 smsLog(pMac, LOGW, FL("receives no association indication\n"));
Madan Mohan Koyyalamudi85d140a2012-10-18 20:23:01 -07005050 smsLog(pMac, LOG1, FL("Assoc ref count %d\n"),
5051 pSession->bRefAssocStartCnt);
Jeff Johnson295189b2012-06-20 16:38:30 -07005052 if( CSR_IS_INFRASTRUCTURE( &pSession->connectedProfile ) ||
5053 CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, sessionId ) )
5054 {
5055 //do not free for the other profiles as we need to send down stop BSS later
5056 csrFreeConnectBssDesc(pMac, sessionId);
5057 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
5058 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
5059 csrSetDefaultDot11Mode( pMac );
5060 }
5061
5062 switch( pCommand->u.roamCmd.roamReason )
5063 {
5064 // If this transition is because of an 802.11 OID, then we transition
5065 // back to INIT state so we sit waiting for more OIDs to be issued and
5066 // we don't start the IDLE timer.
Jeff Johnsone7245742012-09-05 17:12:55 -07005067 case eCsrSmeIssuedFTReassoc:
Jeff Johnson295189b2012-06-20 16:38:30 -07005068 case eCsrSmeIssuedAssocToSimilarAP:
5069 case eCsrHddIssued:
5070 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5071 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5072 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5073 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5074 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07005075 /* Defeaturize this later if needed */
5076#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
5077 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
5078 if (csrRoamIsHandoffInProgress(pMac))
5079 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005080 /* Should indicate neighbor roam algorithm about the connect failure here */
5081 csrNeighborRoamIndicateConnect(pMac, (tANI_U8)sessionId, VOS_STATUS_E_FAILURE);
5082 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005083#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005084 if(pSession->bRefAssocStartCnt > 0)
5085 {
5086 pSession->bRefAssocStartCnt--;
Jeff Johnsone7245742012-09-05 17:12:55 -07005087 if(eCsrJoinFailureDueToConcurrency == Result)
5088 {
5089 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5090 eCSR_ROAM_ASSOCIATION_COMPLETION,
5091 eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL);
5092 }
5093 else
5094 {
5095 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
Jeff Johnson295189b2012-06-20 16:38:30 -07005096 eCSR_ROAM_ASSOCIATION_COMPLETION,
5097 eCSR_ROAM_RESULT_FAILURE);
Jeff Johnsone7245742012-09-05 17:12:55 -07005098 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005099 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005100 smsLog(pMac, LOG1, FL(" roam(reason %d) failed\n"), pCommand->u.roamCmd.roamReason);
5101#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5102 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5103#endif
5104 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5105 csrScanStartIdleScan(pMac);
5106#ifdef FEATURE_WLAN_BTAMP_UT_RF
5107 //For WDS STA. To fix the issue where the WDS AP side may be too busy by
5108 //BT activity and not able to recevie WLAN traffic. Retry the join
5109 if( CSR_IS_WDS_STA(pProfile) )
5110 {
5111 csrRoamStartJoinRetryTimer(pMac, sessionId, CSR_JOIN_RETRY_TIMEOUT_PERIOD);
5112 }
5113#endif
5114 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005115 case eCsrHddIssuedReassocToSameAP:
5116 case eCsrSmeIssuedReassocToSameAP:
5117 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5118
5119 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5120#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5121 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5122#endif
5123 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5124 csrScanStartIdleScan(pMac);
5125 break;
5126 case eCsrForcedDisassoc:
5127 case eCsrForcedDeauth:
5128 case eCsrSmeIssuedIbssJoinFailure:
5129 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5130
5131 if(eCsrSmeIssuedIbssJoinFailure == pCommand->u.roamCmd.roamReason)
5132 {
5133 // Notify HDD that IBSS join failed
5134 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
5135 }
5136 else
5137 {
5138 csrRoamCallCallback(pMac, sessionId, NULL,
5139 pCommand->u.roamCmd.roamId,
5140 eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5141 }
5142#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5143 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5144#endif
5145 csrRoamLinkDown(pMac, sessionId);
5146 csrScanStartIdleScan(pMac);
5147 break;
5148 case eCsrForcedIbssLeave:
5149 csrRoamCallCallback(pMac, sessionId, NULL,
5150 pCommand->u.roamCmd.roamId,
5151 eCSR_ROAM_IBSS_LEAVE,
5152 eCSR_ROAM_RESULT_IBSS_STOP);
5153 break;
5154 case eCsrForcedDisassocMICFailure:
5155 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5156
5157 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_MIC_FAILURE);
5158#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5159 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
5160#endif
5161 csrScanStartIdleScan(pMac);
5162 break;
5163#ifdef WLAN_SOFTAP_FEATURE
5164 case eCsrStopBss:
5165 csrRoamCallCallback(pMac, sessionId, NULL,
5166 pCommand->u.roamCmd.roamId,
5167 eCSR_ROAM_INFRA_IND,
5168 eCSR_ROAM_RESULT_INFRA_STOPPED);
5169 break;
5170 case eCsrForcedDisassocSta:
5171 case eCsrForcedDeauthSta:
5172 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId);
5173 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
5174 {
5175 pSession = CSR_GET_SESSION(pMac, sessionId);
5176 if (!pSession)
5177 break;
5178
5179 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
5180 {
5181 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5182 palCopyMemory(pMac->hHdd, roamInfo.peerMac,
5183 pCommand->u.roamCmd.peerMac, sizeof(tSirMacAddr));
5184 roamInfo.reasonCode = eCSR_ROAM_RESULT_FORCED;
5185 roamInfo.statusCode = eSIR_SME_SUCCESS;
5186 status = csrRoamCallCallback(pMac, sessionId,
5187 &roamInfo, pCommand->u.roamCmd.roamId,
5188 eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
5189 }
5190 }
5191 break;
5192#endif
5193 case eCsrLostLink1:
5194 // if lost link roam1 failed, then issue lost link Scan2 ...
5195 csrScanRequestLostLink2(pMac, sessionId);
5196 break;
5197 case eCsrLostLink2:
5198 // if lost link roam2 failed, then issue lost link scan3 ...
5199 csrScanRequestLostLink3(pMac, sessionId);
5200 break;
5201 case eCsrLostLink3:
5202 default:
5203 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5204
5205 //We are done with one round of lostlink roaming here
5206 csrScanHandleFailedLostlink3(pMac, sessionId);
5207 break;
5208 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005209 break;
5210 }
5211 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005212 return ( fReleaseCommand );
5213}
5214
Jeff Johnson295189b2012-06-20 16:38:30 -07005215eHalStatus csrRoamRegisterCallback(tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext)
5216{
5217 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005218 return (status);
5219}
5220
Jeff Johnson295189b2012-06-20 16:38:30 -07005221eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile, tCsrRoamProfile *pSrcProfile)
5222{
5223 eHalStatus status = eHAL_STATUS_SUCCESS;
5224 tANI_U32 size = 0;
5225
5226 do
5227 {
5228 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5229 if(pSrcProfile->BSSIDs.numOfBSSIDs)
5230 {
5231 size = sizeof(tCsrBssid) * pSrcProfile->BSSIDs.numOfBSSIDs;
5232 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, size);
5233 if(!HAL_STATUS_SUCCESS(status))
5234 {
5235 break;
5236 }
5237 pDstProfile->BSSIDs.numOfBSSIDs = pSrcProfile->BSSIDs.numOfBSSIDs;
5238 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->BSSIDs.bssid, size);
5239 }
5240 if(pSrcProfile->SSIDs.numOfSSIDs)
5241 {
5242 size = sizeof(tCsrSSIDInfo) * pSrcProfile->SSIDs.numOfSSIDs;
5243 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, size);
5244 if(!HAL_STATUS_SUCCESS(status))
5245 {
5246 break;
5247 }
5248 pDstProfile->SSIDs.numOfSSIDs = pSrcProfile->SSIDs.numOfSSIDs;
5249 palCopyMemory(pMac->hHdd, pDstProfile->SSIDs.SSIDList, pSrcProfile->SSIDs.SSIDList, size);
5250 }
5251 if(pSrcProfile->nWPAReqIELength)
5252 {
5253 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5254 if(!HAL_STATUS_SUCCESS(status))
5255 {
5256 break;
5257 }
5258 pDstProfile->nWPAReqIELength = pSrcProfile->nWPAReqIELength;
5259 palCopyMemory(pMac->hHdd, pDstProfile->pWPAReqIE, pSrcProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5260 }
5261 if(pSrcProfile->nRSNReqIELength)
5262 {
5263 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5264 if(!HAL_STATUS_SUCCESS(status))
5265 {
5266 break;
5267 }
5268 pDstProfile->nRSNReqIELength = pSrcProfile->nRSNReqIELength;
5269 palCopyMemory(pMac->hHdd, pDstProfile->pRSNReqIE, pSrcProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5270 }
5271#ifdef FEATURE_WLAN_WAPI
5272 if(pSrcProfile->nWAPIReqIELength)
5273 {
5274 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5275 if(!HAL_STATUS_SUCCESS(status))
5276 {
5277 break;
5278 }
5279 pDstProfile->nWAPIReqIELength = pSrcProfile->nWAPIReqIELength;
5280 palCopyMemory(pMac->hHdd, pDstProfile->pWAPIReqIE, pSrcProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5281 }
5282#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07005283 if(pSrcProfile->nAddIEScanLength)
5284 {
5285 status = palAllocateMemory(pMac->hHdd,
5286 (void **)&pDstProfile->pAddIEScan, pSrcProfile->nAddIEScanLength);
5287 if(!HAL_STATUS_SUCCESS(status))
5288 {
5289 break;
5290 }
5291 pDstProfile->nAddIEScanLength = pSrcProfile->nAddIEScanLength;
5292 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEScan, pSrcProfile->pAddIEScan,
5293 pSrcProfile->nAddIEScanLength);
5294 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005295 if(pSrcProfile->nAddIEAssocLength)
5296 {
5297 status = palAllocateMemory(pMac->hHdd,
5298 (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5299 if(!HAL_STATUS_SUCCESS(status))
5300 {
5301 break;
5302 }
5303 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5304 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5305 pSrcProfile->nAddIEAssocLength);
5306 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005307 if(pSrcProfile->ChannelInfo.ChannelList)
5308 {
5309 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5310 if(!HAL_STATUS_SUCCESS(status))
5311 {
5312 break;
5313 }
5314 pDstProfile->ChannelInfo.numOfChannels = pSrcProfile->ChannelInfo.numOfChannels;
5315 palCopyMemory(pMac->hHdd, pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5316 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005317 pDstProfile->AuthType = pSrcProfile->AuthType;
5318 pDstProfile->EncryptionType = pSrcProfile->EncryptionType;
5319 pDstProfile->mcEncryptionType = pSrcProfile->mcEncryptionType;
5320 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->negotiatedUCEncryptionType;
5321 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->negotiatedMCEncryptionType;
5322 pDstProfile->negotiatedAuthType = pSrcProfile->negotiatedAuthType;
5323 pDstProfile->BSSType = pSrcProfile->BSSType;
5324 pDstProfile->phyMode = pSrcProfile->phyMode;
5325 pDstProfile->csrPersona = pSrcProfile->csrPersona;
5326
5327#ifdef FEATURE_WLAN_WAPI
5328 if(csrIsProfileWapi(pSrcProfile))
5329 {
5330 if(pDstProfile->phyMode & eCSR_DOT11_MODE_11n)
5331 {
5332 pDstProfile->phyMode &= ~eCSR_DOT11_MODE_11n;
5333 }
5334 }
5335#endif /* FEATURE_WLAN_WAPI */
5336 pDstProfile->CBMode = pSrcProfile->CBMode;
5337 /*Save the WPS info*/
5338 pDstProfile->bWPSAssociation = pSrcProfile->bWPSAssociation;
5339 pDstProfile->uapsd_mask = pSrcProfile->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005340 pDstProfile->beaconInterval = pSrcProfile->beaconInterval;
5341#ifdef WLAN_SOFTAP_FEATURE
5342 pDstProfile->privacy = pSrcProfile->privacy;
5343 pDstProfile->fwdWPSPBCProbeReq = pSrcProfile->fwdWPSPBCProbeReq;
5344 pDstProfile->csr80211AuthType = pSrcProfile->csr80211AuthType;
5345 pDstProfile->dtimPeriod = pSrcProfile->dtimPeriod;
5346 pDstProfile->ApUapsdEnable = pSrcProfile->ApUapsdEnable;
5347 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->SSIDs.SSIDList[0].ssidHidden;
5348 pDstProfile->protEnabled = pSrcProfile->protEnabled;
5349 pDstProfile->obssProtEnabled = pSrcProfile->obssProtEnabled;
5350 pDstProfile->cfg_protection = pSrcProfile->cfg_protection;
5351 pDstProfile->wps_state = pSrcProfile->wps_state;
5352 pDstProfile->ieee80211d = pSrcProfile->ieee80211d;
5353#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005354 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
Jeff Johnson295189b2012-06-20 16:38:30 -07005355#ifdef WLAN_FEATURE_VOWIFI_11R
5356 if (pSrcProfile->MDID.mdiePresent)
5357 {
5358 pDstProfile->MDID.mdiePresent = 1;
5359 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5360 }
5361#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005362 }while(0);
5363
5364 if(!HAL_STATUS_SUCCESS(status))
5365 {
5366 csrReleaseProfile(pMac, pDstProfile);
5367 pDstProfile = NULL;
5368 }
5369
5370 return (status);
5371}
Jeff Johnson295189b2012-06-20 16:38:30 -07005372eHalStatus csrRoamCopyConnectedProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pDstProfile )
5373{
5374 eHalStatus status = eHAL_STATUS_SUCCESS;
5375 tCsrRoamConnectedProfile *pSrcProfile = &pMac->roam.roamSession[sessionId].connectedProfile;
5376 do
5377 {
5378 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5379 if(pSrcProfile->bssid)
5380 {
5381 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, sizeof(tCsrBssid));
5382 if(!HAL_STATUS_SUCCESS(status))
5383 {
5384 break;
5385 }
5386 pDstProfile->BSSIDs.numOfBSSIDs = 1;
5387 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->bssid, sizeof(tCsrBssid));
5388 }
5389 if(pSrcProfile->SSID.ssId)
5390 {
5391 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
5392 if(!HAL_STATUS_SUCCESS(status))
5393 {
5394 break;
5395 }
5396 pDstProfile->SSIDs.numOfSSIDs = 1;
5397 pDstProfile->SSIDs.SSIDList[0].handoffPermitted = pSrcProfile->handoffPermitted;
5398 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->ssidHidden;
5399 palCopyMemory(pMac->hHdd, &pDstProfile->SSIDs.SSIDList[0].SSID, &pSrcProfile->SSID, sizeof(tSirMacSSid));
5400 }
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07005401 if(pSrcProfile->nAddIEAssocLength)
5402 {
5403 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5404 if(!HAL_STATUS_SUCCESS(status))
5405 {
5406 smsLog( pMac, LOGE, FL(" failed to allocate memory for additional IEs \n") );
5407 break;
5408 }
5409 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5410 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5411 pSrcProfile->nAddIEAssocLength);
5412 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005413 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, 1);
5414 if(!HAL_STATUS_SUCCESS(status))
5415 {
5416 break;
5417 }
5418 pDstProfile->ChannelInfo.numOfChannels = 1;
5419 pDstProfile->ChannelInfo.ChannelList[0] = pSrcProfile->operationChannel;
Jeff Johnson295189b2012-06-20 16:38:30 -07005420 pDstProfile->AuthType.numEntries = 1;
5421 pDstProfile->AuthType.authType[0] = pSrcProfile->AuthType;
5422 pDstProfile->negotiatedAuthType = pSrcProfile->AuthType;
5423 pDstProfile->EncryptionType.numEntries = 1;
5424 pDstProfile->EncryptionType.encryptionType[0] = pSrcProfile->EncryptionType;
5425 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->EncryptionType;
5426 pDstProfile->mcEncryptionType.numEntries = 1;
5427 pDstProfile->mcEncryptionType.encryptionType[0] = pSrcProfile->mcEncryptionType;
5428 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->mcEncryptionType;
5429 pDstProfile->BSSType = pSrcProfile->BSSType;
5430 pDstProfile->CBMode = pSrcProfile->CBMode;
5431 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
5432#ifdef WLAN_FEATURE_VOWIFI_11R
5433 if (pSrcProfile->MDID.mdiePresent)
5434 {
5435 pDstProfile->MDID.mdiePresent = 1;
5436 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5437 }
5438#endif
5439
5440 }while(0);
5441
5442 if(!HAL_STATUS_SUCCESS(status))
5443 {
5444 csrReleaseProfile(pMac, pDstProfile);
5445 pDstProfile = NULL;
5446 }
5447
5448 return (status);
5449}
5450
Jeff Johnson295189b2012-06-20 16:38:30 -07005451eHalStatus csrRoamIssueConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5452 tScanResultHandle hBSSList,
5453 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate,
5454 tANI_BOOLEAN fClearScan)
5455{
5456 eHalStatus status = eHAL_STATUS_SUCCESS;
5457 tSmeCmd *pCommand;
5458
5459 pCommand = csrGetCommandBuffer(pMac);
5460 if(NULL == pCommand)
5461 {
5462 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5463 status = eHAL_STATUS_RESOURCES;
5464 }
5465 else
5466 {
5467 if( fClearScan )
5468 {
5469 csrScanCancelIdleScan(pMac);
5470 csrScanAbortMacScanNotForConnect(pMac);
5471 }
5472 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5473 if(NULL == pProfile)
5474 {
5475 //We can roam now
5476 //Since pProfile is NULL, we need to build our own profile, set everything to default
5477 //We can only support open and no encryption
5478 pCommand->u.roamCmd.roamProfile.AuthType.numEntries = 1;
5479 pCommand->u.roamCmd.roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5480 pCommand->u.roamCmd.roamProfile.EncryptionType.numEntries = 1;
5481 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5482 pCommand->u.roamCmd.roamProfile.csrPersona = VOS_STA_MODE;
5483 }
5484 else
5485 {
5486 //make a copy of the profile
5487 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5488 if(HAL_STATUS_SUCCESS(status))
5489 {
5490 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5491 }
5492 }
5493 pCommand->command = eSmeCommandRoam;
5494 pCommand->sessionId = (tANI_U8)sessionId;
5495 pCommand->u.roamCmd.hBSSList = hBSSList;
5496 pCommand->u.roamCmd.roamId = roamId;
5497 pCommand->u.roamCmd.roamReason = reason;
5498 //We need to free the BssList when the command is done
5499 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_TRUE;
5500 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005501 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
5502 FL("CSR PERSONA=%d"),
5503 pCommand->u.roamCmd.roamProfile.csrPersona);
Jeff Johnson295189b2012-06-20 16:38:30 -07005504 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5505 if( !HAL_STATUS_SUCCESS( status ) )
5506 {
5507 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5508 csrReleaseCommandRoam( pMac, pCommand );
5509 }
5510 }
5511
5512 return (status);
5513}
Jeff Johnson295189b2012-06-20 16:38:30 -07005514eHalStatus csrRoamIssueReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5515 tCsrRoamModifyProfileFields *pMmodProfileFields,
5516 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5517{
5518 eHalStatus status = eHAL_STATUS_SUCCESS;
5519 tSmeCmd *pCommand;
5520
5521 pCommand = csrGetCommandBuffer(pMac);
5522 if(NULL == pCommand)
5523 {
5524 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5525 status = eHAL_STATUS_RESOURCES;
5526 }
5527 else
5528 {
5529 csrScanCancelIdleScan(pMac);
5530 csrScanAbortMacScanNotForConnect(pMac);
5531 if(pProfile)
5532 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005533 //This is likely trying to reassoc to different profile
5534 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5535 //make a copy of the profile
5536 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5537 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005538 }
5539 else
5540 {
5541 status = csrRoamCopyConnectedProfile(pMac, sessionId, &pCommand->u.roamCmd.roamProfile);
5542 //how to update WPA/WPA2 info in roamProfile??
5543 pCommand->u.roamCmd.roamProfile.uapsd_mask = pMmodProfileFields->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005544 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005545 if(HAL_STATUS_SUCCESS(status))
5546 {
5547 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5548 }
5549 pCommand->command = eSmeCommandRoam;
5550 pCommand->sessionId = (tANI_U8)sessionId;
5551 pCommand->u.roamCmd.roamId = roamId;
5552 pCommand->u.roamCmd.roamReason = reason;
5553 //We need to free the BssList when the command is done
5554 //For reassoc there is no BSS list, so the boolean set to false
5555 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
5556 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
5557 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005558 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5559 if( !HAL_STATUS_SUCCESS( status ) )
5560 {
5561 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5562 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5563 csrReleaseCommandRoam( pMac, pCommand );
5564 }
5565 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005566 return (status);
5567}
5568
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07005569eHalStatus csrRoamEnqueuePreauth(tpAniSirGlobal pMac, tANI_U32 sessionId, tpSirBssDescription pBssDescription,
5570 eCsrRoamReason reason, tANI_BOOLEAN fImmediate)
5571// , eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5572{
5573 eHalStatus status = eHAL_STATUS_SUCCESS;
5574 tSmeCmd *pCommand;
5575
5576 pCommand = csrGetCommandBuffer(pMac);
5577 if(NULL == pCommand)
5578 {
5579 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5580 status = eHAL_STATUS_RESOURCES;
5581 }
5582 else
5583 {
5584 if(pBssDescription)
5585 {
5586 //copy over the parameters we need later
5587 pCommand->command = eSmeCommandRoam;
5588 pCommand->sessionId = (tANI_U8)sessionId;
5589 pCommand->u.roamCmd.roamReason = reason;
5590 //this is the important parameter
5591 //in this case we are using this field for the "next" BSS
5592 pCommand->u.roamCmd.pLastRoamBss = pBssDescription;
5593 status = csrQueueSmeCommand(pMac, pCommand, fImmediate);
5594 if( !HAL_STATUS_SUCCESS( status ) )
5595 {
5596 smsLog( pMac, LOGE, FL(" fail to enqueue preauth command, status = %d\n"), status );
5597 csrReleaseCommandPreauth( pMac, pCommand );
5598 }
5599 }
5600 else
5601 {
5602 //Return failure
5603 status = eHAL_STATUS_RESOURCES;
5604 }
5605 }
5606 return (status);
5607}
5608
5609eHalStatus csrRoamDequeuePreauth(tpAniSirGlobal pMac)
5610{
5611 tListElem *pEntry;
5612 tSmeCmd *pCommand;
5613 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
5614 if ( pEntry )
5615 {
5616 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
5617 if ( (eSmeCommandRoam == pCommand->command) &&
5618 (eCsrPerformPreauth == pCommand->u.roamCmd.roamReason))
5619 {
5620 smsLog( pMac, LOGE, FL("DQ-Command = %d, Reason = %d \n"),
5621 pCommand->command, pCommand->u.roamCmd.roamReason);
5622 if (csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK )) {
5623 csrReleaseCommandPreauth( pMac, pCommand );
5624 }
5625 } else {
5626 smsLog( pMac, LOGE, FL("Command = %d, Reason = %d \n"),
5627 pCommand->command, pCommand->u.roamCmd.roamReason);
5628 }
5629 }
5630 else {
5631 smsLog( pMac, LOGE, FL("pEntry NULL for eWNI_SME_FT_PRE_AUTH_RSP\n"));
5632 }
5633 smeProcessPendingQueue( pMac );
5634 return eHAL_STATUS_SUCCESS;
5635}
5636
Jeff Johnson295189b2012-06-20 16:38:30 -07005637eHalStatus csrRoamConnectWithBSSList(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5638 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5639{
5640 eHalStatus status = eHAL_STATUS_FAILURE;
5641 tScanResultHandle hBSSList;
5642 tANI_U32 roamId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005643 status = csrScanCopyResultList(pMac, hBssListIn, &hBSSList);
5644 if(HAL_STATUS_SUCCESS(status))
5645 {
5646 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5647 if(pRoamId)
5648 {
5649 *pRoamId = roamId;
5650 }
5651 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5652 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5653 if(!HAL_STATUS_SUCCESS(status))
5654 {
5655 smsLog(pMac, LOGE, FL("failed to start a join process\n"));
5656 csrScanResultPurge(pMac, hBSSList);
5657 }
5658 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005659 return (status);
5660}
5661
Jeff Johnson295189b2012-06-20 16:38:30 -07005662eHalStatus csrRoamConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5663 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5664{
5665 eHalStatus status = eHAL_STATUS_SUCCESS;
5666 tScanResultHandle hBSSList;
5667 tCsrScanResultFilter *pScanFilter;
5668 tANI_U32 roamId = 0;
5669 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_FALSE;
5670 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005671 if (NULL == pProfile)
5672 {
5673 smsLog(pMac, LOGP, FL("No profile specified"));
5674 return eHAL_STATUS_FAILURE;
5675 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005676 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"),
5677 pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07005678 if( CSR_IS_WDS( pProfile ) &&
5679 !HAL_STATUS_SUCCESS( status = csrIsBTAMPAllowed( pMac, pProfile->operationChannel ) ) )
5680 {
5681 return status;
5682 }
5683 csrRoamCancelRoaming(pMac, sessionId);
5684 csrScanRemoveFreshScanCommand(pMac, sessionId);
5685 csrScanCancelIdleScan(pMac);
5686 //Only abort the scan if it is not used for other roam/connect purpose
5687 csrScanAbortMacScan(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07005688#ifdef WLAN_SOFTAP_FEATURE
5689 if (!vos_concurrent_sessions_running() && (VOS_STA_SAP_MODE == pProfile->csrPersona))//In case of AP mode we do not want idle mode scan
5690 {
5691 csrScanDisable(pMac);
5692 }
5693#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005694 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5695 //Check whether ssid changes
5696 if(csrIsConnStateConnected(pMac, sessionId))
5697 {
5698 if(pProfile->SSIDs.numOfSSIDs && !csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5699 {
5700 csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5701 }
5702 }
5703#ifdef FEATURE_WLAN_BTAMP_UT_RF
5704 pSession->maxRetryCount = CSR_JOIN_MAX_RETRY_COUNT;
5705#endif
5706 if(CSR_INVALID_SCANRESULT_HANDLE != hBssListIn)
5707 {
5708 smsLog(pMac, LOGW, FL("is called with BSSList\n"));
5709 status = csrRoamConnectWithBSSList(pMac, sessionId, pProfile, hBssListIn, pRoamId);
5710 if(pRoamId)
5711 {
5712 roamId = *pRoamId;
5713 }
5714 if(!HAL_STATUS_SUCCESS(status))
5715 {
5716 fCallCallback = eANI_BOOLEAN_TRUE;
5717 }
5718 }
5719 else
5720 {
5721 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5722 if(HAL_STATUS_SUCCESS(status))
5723 {
5724 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5725 //Try to connect to any BSS
5726 if(NULL == pProfile)
5727 {
5728 //No encryption
5729 pScanFilter->EncryptionType.numEntries = 1;
5730 pScanFilter->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5731 }//we don't have a profile
5732 else
5733 {
5734 //Here is the profile we need to connect to
5735 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5736 }//We have a profile
5737 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5738 if(pRoamId)
5739 {
5740 *pRoamId = roamId;
5741 }
5742
5743 if(HAL_STATUS_SUCCESS(status))
5744 {
5745 /*Save the WPS info*/
5746 if(NULL != pProfile)
5747 {
5748 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
5749 }
5750 else
5751 {
5752 pScanFilter->bWPSAssociation = 0;
5753 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005754 do
5755 {
5756 if( (pProfile && CSR_IS_WDS_AP( pProfile ) )
5757#ifdef WLAN_SOFTAP_FEATURE
5758 || (pProfile && CSR_IS_INFRA_AP ( pProfile ))
5759#endif
5760 )
5761 {
5762 //This can be start right away
5763 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5764 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5765 if(!HAL_STATUS_SUCCESS(status))
5766 {
5767 fCallCallback = eANI_BOOLEAN_TRUE;
5768 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005769 break;
5770 }
5771 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
Mohit Khanna23863762012-09-11 17:40:09 -07005772 smsLog(pMac, LOG1, "************ csrScanGetResult Status ********* %d\n", status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005773 if(HAL_STATUS_SUCCESS(status))
5774 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005775 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5776 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5777 if(!HAL_STATUS_SUCCESS(status))
5778 {
5779 csrScanResultPurge(pMac, hBSSList);
5780 fCallCallback = eANI_BOOLEAN_TRUE;
5781 }
5782 }//Have scan result
5783 else if(NULL != pProfile)
5784 {
5785 //Check whether it is for start ibss
5786 if(CSR_IS_START_IBSS(pProfile))
5787 {
5788 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5789 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5790 if(!HAL_STATUS_SUCCESS(status))
5791 {
5792 smsLog(pMac, LOGE, " CSR failed to issue startIBSS command with status = 0x%08X\n", status);
5793 fCallCallback = eANI_BOOLEAN_TRUE;
5794 }
5795 }
5796 else
5797 {
5798 //scan for this SSID
5799 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5800 if(!HAL_STATUS_SUCCESS(status))
5801 {
5802 fCallCallback = eANI_BOOLEAN_TRUE;
5803 }
5804 }
5805 }
5806 else
5807 {
5808 fCallCallback = eANI_BOOLEAN_TRUE;
5809 }
5810 } while (0);
5811 if(NULL != pProfile)
5812 {
5813 //we need to free memory for filter if profile exists
5814 csrFreeScanFilter(pMac, pScanFilter);
5815 }
5816 }//Got the scan filter from profile
5817
5818 palFreeMemory(pMac->hHdd, pScanFilter);
5819 }//allocated memory for pScanFilter
5820 }//No Bsslist coming in
5821 //tell the caller if we fail to trigger a join request
5822 if( fCallCallback )
5823 {
5824 csrRoamCallCallback(pMac, sessionId, NULL, roamId, eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5825 }
5826
5827 return (status);
5828}
Jeff Johnson295189b2012-06-20 16:38:30 -07005829eHalStatus csrRoamReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5830 tCsrRoamModifyProfileFields modProfileFields,
5831 tANI_U32 *pRoamId)
5832{
5833 eHalStatus status = eHAL_STATUS_SUCCESS;
5834 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_TRUE;
5835 tANI_U32 roamId = 0;
5836 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005837 if (NULL == pProfile)
5838 {
5839 smsLog(pMac, LOGP, FL("No profile specified"));
5840 return eHAL_STATUS_FAILURE;
5841 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005842 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"), pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
5843 csrRoamCancelRoaming(pMac, sessionId);
5844 csrScanRemoveFreshScanCommand(pMac, sessionId);
5845 csrScanCancelIdleScan(pMac);
5846 csrScanAbortMacScanNotForConnect(pMac);
5847 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssuedReassocToSameAP);
Jeff Johnson295189b2012-06-20 16:38:30 -07005848 if(csrIsConnStateConnected(pMac, sessionId))
5849 {
5850 if(pProfile)
5851 {
5852 if(pProfile->SSIDs.numOfSSIDs &&
5853 csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5854 {
5855 fCallCallback = eANI_BOOLEAN_FALSE;
5856 }
5857 else
5858 {
5859 smsLog(pMac, LOG1, FL("Not connected to the same SSID asked in the profile\n"));
5860 }
5861 }
5862 else if(!palEqualMemory(pMac->hHdd, &modProfileFields,
5863 &pSession->connectedProfile.modifyProfileFields,
5864 sizeof(tCsrRoamModifyProfileFields)))
5865 {
5866 fCallCallback = eANI_BOOLEAN_FALSE;
5867 }
5868 else
5869 {
5870 smsLog(pMac, LOG1, FL("Either the profile is NULL or none of the fields "
5871 "in tCsrRoamModifyProfileFields got modified\n"));
5872 }
5873 }
5874 else
5875 {
5876 smsLog(pMac, LOG1, FL("Not connected! No need to reassoc\n"));
5877 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005878 if(!fCallCallback)
5879 {
5880 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5881 if(pRoamId)
5882 {
5883 *pRoamId = roamId;
5884 }
5885
Jeff Johnson295189b2012-06-20 16:38:30 -07005886 status = csrRoamIssueReassoc(pMac, sessionId, pProfile, &modProfileFields,
5887 eCsrHddIssuedReassocToSameAP, roamId, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005888 }
5889 else
5890 {
5891 status = csrRoamCallCallback(pMac, sessionId, NULL, roamId,
5892 eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5893 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005894 return status;
5895}
Jeff Johnson295189b2012-06-20 16:38:30 -07005896eHalStatus csrRoamJoinLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5897{
5898 eHalStatus status = eHAL_STATUS_FAILURE;
5899 tScanResultHandle hBSSList = NULL;
5900 tCsrScanResultFilter *pScanFilter = NULL;
5901 tANI_U32 roamId;
5902 tCsrRoamProfile *pProfile = NULL;
5903 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07005904
5905 if(!pSession)
5906 {
5907 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
5908 return eHAL_STATUS_FAILURE;
5909 }
5910
Jeff Johnson295189b2012-06-20 16:38:30 -07005911 do
5912 {
5913 if(pSession->pCurRoamProfile)
5914 {
5915 csrScanCancelIdleScan(pMac);
5916 csrScanAbortMacScanNotForConnect(pMac);
5917 //We have to make a copy of pCurRoamProfile because it will be free inside csrRoamIssueConnect
5918 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile, sizeof(tCsrRoamProfile));
5919 if(!HAL_STATUS_SUCCESS(status))
5920 break;
5921 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamProfile));
5922 status = csrRoamCopyProfile(pMac, pProfile, pSession->pCurRoamProfile);
5923 if(!HAL_STATUS_SUCCESS(status))
5924 break;
5925 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5926 if(!HAL_STATUS_SUCCESS(status))
5927 {
5928 break;
5929 }
5930 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5931 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5932 if(!HAL_STATUS_SUCCESS(status))
5933 {
5934 break;
5935 }
5936 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5937 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
5938 if(HAL_STATUS_SUCCESS(status))
5939 {
5940 //we want to put the last connected BSS to the very beginning, if possible
5941 csrMoveBssToHeadFromBSSID(pMac, &pSession->connectedProfile.bssid, hBSSList);
5942 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5943 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5944 if(!HAL_STATUS_SUCCESS(status))
5945 {
5946 csrScanResultPurge(pMac, hBSSList);
5947 break;
5948 }
5949 }
5950 else
5951 {
5952 //Do a scan on this profile
5953 //scan for this SSID only in case the AP suppresses SSID
5954 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5955 if(!HAL_STATUS_SUCCESS(status))
5956 {
5957 break;
5958 }
5959 }
5960 }//We have a profile
5961 else
5962 {
5963 smsLog(pMac, LOGW, FL("cannot find a roaming profile\n"));
5964 break;
5965 }
5966 }while(0);
5967 if(pScanFilter)
5968 {
5969 csrFreeScanFilter(pMac, pScanFilter);
5970 palFreeMemory(pMac->hHdd, pScanFilter);
5971 }
5972 if(NULL != pProfile)
5973 {
5974 csrReleaseProfile(pMac, pProfile);
5975 palFreeMemory(pMac->hHdd, pProfile);
5976 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005977 return (status);
5978}
Jeff Johnson295189b2012-06-20 16:38:30 -07005979eHalStatus csrRoamReconnect(tpAniSirGlobal pMac, tANI_U32 sessionId)
5980{
5981 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005982 if(csrIsConnStateConnected(pMac, sessionId))
5983 {
5984 status = csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5985 if(HAL_STATUS_SUCCESS(status))
5986 {
5987 status = csrRoamJoinLastProfile(pMac, sessionId);
5988 }
5989 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005990 return (status);
5991}
5992
Jeff Johnson295189b2012-06-20 16:38:30 -07005993eHalStatus csrRoamConnectToLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5994{
5995 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005996 smsLog(pMac, LOGW, FL("is called\n"));
5997 csrRoamCancelRoaming(pMac, sessionId);
5998 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5999 if(csrIsConnStateDisconnected(pMac, sessionId))
6000 {
6001 status = csrRoamJoinLastProfile(pMac, sessionId);
6002 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006003 return (status);
6004}
6005
Jeff Johnson295189b2012-06-20 16:38:30 -07006006eHalStatus csrRoamProcessDisassocDeauth( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fDisassoc, tANI_BOOLEAN fMICFailure )
6007{
6008 eHalStatus status = eHAL_STATUS_SUCCESS;
6009 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
6010 eCsrRoamSubState NewSubstate;
6011 tANI_U32 sessionId = pCommand->sessionId;
6012
6013 // change state to 'Roaming'...
6014 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
6015
6016 if ( csrIsConnStateIbss( pMac, sessionId ) )
6017 {
6018 // If we are in an IBSS, then stop the IBSS...
6019 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
6020 fComplete = (!HAL_STATUS_SUCCESS(status));
6021 }
6022 else if ( csrIsConnStateInfra( pMac, sessionId ) )
6023 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07006024 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 -07006025 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
6026 //Restore AC weight in case we change it
6027 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
6028 // in Infrasturcture, we need to disassociate from the Infrastructure network...
6029 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_FORCED;
6030 if(eCsrSmeIssuedDisassocForHandoff == pCommand->u.roamCmd.roamReason)
6031 {
6032 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF;
6033 }
6034 if( fDisassoc )
6035 {
6036 status = csrRoamIssueDisassociate( pMac, sessionId, NewSubstate, fMICFailure );
6037 }
6038 else
6039 {
6040 status = csrRoamIssueDeauth( pMac, sessionId, eCSR_ROAM_SUBSTATE_DEAUTH_REQ );
6041 }
6042 fComplete = (!HAL_STATUS_SUCCESS(status));
6043 }
6044 else if ( csrIsConnStateWds( pMac, sessionId ) )
6045 {
6046 if( CSR_IS_WDS_AP( &pMac->roam.roamSession[sessionId].connectedProfile ) )
6047 {
6048 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
6049 fComplete = (!HAL_STATUS_SUCCESS(status));
6050 }
6051 //This has to be WDS station
6052 else if( csrIsConnStateConnectedWds( pMac, sessionId ) ) //This has to be WDS station
6053 {
6054
6055 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6056 if( fDisassoc )
6057 {
6058 status = csrRoamIssueDisassociate( pMac, sessionId,
6059 eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, fMICFailure );
6060 fComplete = (!HAL_STATUS_SUCCESS(status));
6061 }
6062 }
6063 } else {
6064 // we got a dis-assoc request while not connected to any peer
6065 // just complete the command
6066 fComplete = eANI_BOOLEAN_TRUE;
6067 status = eHAL_STATUS_FAILURE;
6068 }
6069 if(fComplete)
6070 {
6071 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6072 }
6073
6074 if(HAL_STATUS_SUCCESS(status))
6075 {
6076 if ( csrIsConnStateInfra( pMac, sessionId ) )
6077 {
6078 //Set the state to disconnect here
6079 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6080 }
6081 }
6082 return (status);
6083}
6084
Jeff Johnson295189b2012-06-20 16:38:30 -07006085/* This is been removed from latest code base */
6086/*
6087static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand )
6088{
6089 eHalStatus status;
6090 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07006091 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING );
6092 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
Jeff Johnson295189b2012-06-20 16:38:30 -07006093 return ( status );
6094}
6095*/
6096
Jeff Johnson295189b2012-06-20 16:38:30 -07006097eHalStatus csrRoamIssueDisassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason )
6098{
6099 eHalStatus status = eHAL_STATUS_SUCCESS;
6100 tSmeCmd *pCommand;
6101 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006102 do
6103 {
6104 smsLog( pMac, LOGE, FL(" reason = %d\n"), reason );
6105 pCommand = csrGetCommandBuffer( pMac );
6106 if ( !pCommand )
6107 {
6108 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6109 status = eHAL_STATUS_RESOURCES;
6110 break;
6111 }
6112 //Change the substate in case it is wait-for-key
6113 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6114 {
6115 csrRoamStopWaitForKeyTimer( pMac );
6116 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6117 }
6118 pCommand->command = eSmeCommandRoam;
6119 pCommand->sessionId = (tANI_U8)sessionId;
6120 switch ( reason )
6121 {
6122 case eCSR_DISCONNECT_REASON_MIC_ERROR:
6123 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocMICFailure;
6124 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006125 case eCSR_DISCONNECT_REASON_DEAUTH:
6126 pCommand->u.roamCmd.roamReason = eCsrForcedDeauth;
6127 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006128 case eCSR_DISCONNECT_REASON_HANDOFF:
6129 fHighPriority = eANI_BOOLEAN_TRUE;
6130 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedDisassocForHandoff;
6131 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006132 case eCSR_DISCONNECT_REASON_UNSPECIFIED:
6133 case eCSR_DISCONNECT_REASON_DISASSOC:
6134 pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc;
6135 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006136 case eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE:
6137 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedIbssJoinFailure;
6138 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006139 case eCSR_DISCONNECT_REASON_IBSS_LEAVE:
6140 pCommand->u.roamCmd.roamReason = eCsrForcedIbssLeave;
6141 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006142 default:
6143 break;
6144 }
6145 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6146 if( !HAL_STATUS_SUCCESS( status ) )
6147 {
6148 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6149 csrReleaseCommandRoam( pMac, pCommand );
6150 }
6151 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07006152 return( status );
6153}
6154
Jeff Johnson295189b2012-06-20 16:38:30 -07006155eHalStatus csrRoamIssueStopBssCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN fHighPriority )
6156{
6157 eHalStatus status = eHAL_STATUS_SUCCESS;
6158 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006159 pCommand = csrGetCommandBuffer( pMac );
6160 if ( NULL != pCommand )
6161 {
6162 //Change the substate in case it is wait-for-key
6163 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
6164 {
6165 csrRoamStopWaitForKeyTimer( pMac );
6166 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6167 }
6168 pCommand->command = eSmeCommandRoam;
6169 pCommand->sessionId = (tANI_U8)sessionId;
6170 pCommand->u.roamCmd.roamReason = eCsrStopBss;
6171 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6172 if( !HAL_STATUS_SUCCESS( status ) )
6173 {
6174 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6175 csrReleaseCommandRoam( pMac, pCommand );
6176 }
6177 }
6178 else
6179 {
6180 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6181 status = eHAL_STATUS_RESOURCES;
6182 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006183 return ( status );
6184}
6185
Jeff Johnson295189b2012-06-20 16:38:30 -07006186eHalStatus csrRoamDisconnectInternal(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6187{
6188 eHalStatus status = eHAL_STATUS_SUCCESS;
6189 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006190
6191 if(!pSession)
6192 {
6193 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6194 return eHAL_STATUS_FAILURE;
6195 }
6196
Jeff Johnson295189b2012-06-20 16:38:30 -07006197#ifdef FEATURE_WLAN_BTAMP_UT_RF
6198 //Stop te retry
6199 pSession->maxRetryCount = 0;
6200 csrRoamStopJoinRetryTimer(pMac, sessionId);
6201#endif
6202 //Not to call cancel roaming here
6203 //Only issue disconnect when necessary
6204 if(csrIsConnStateConnected(pMac, sessionId) || csrIsBssTypeIBSS(pSession->connectedProfile.BSSType)
6205 || csrIsBssTypeWDS(pSession->connectedProfile.BSSType)
6206 || csrIsRoamCommandWaitingForSession(pMac, sessionId) )
6207
6208 {
6209 smsLog(pMac, LOG2, FL("called\n"));
6210 status = csrRoamIssueDisassociateCmd(pMac, sessionId, reason);
6211 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006212 return (status);
6213}
6214
Jeff Johnson295189b2012-06-20 16:38:30 -07006215eHalStatus csrRoamDisconnect(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6216{
6217 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006218
6219 if(!pSession)
6220 {
6221 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6222 return eHAL_STATUS_FAILURE;
6223 }
6224
Jeff Johnson295189b2012-06-20 16:38:30 -07006225 csrRoamCancelRoaming(pMac, sessionId);
6226 pSession->ibss_join_pending = FALSE;
6227 csrRoamStopIbssJoinTimer(pMac, sessionId);
6228 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrForcedDisassoc);
6229
6230 return (csrRoamDisconnectInternal(pMac, sessionId, reason));
6231}
6232
Jeff Johnson295189b2012-06-20 16:38:30 -07006233eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
6234 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes)
6235{
6236 eHalStatus status = eHAL_STATUS_SUCCESS;
6237 tDot11fBeaconIEs *pIesTemp = pIes;
6238 tANI_U8 index;
6239 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
6240 tCsrRoamConnectedProfile *pConnectProfile = &pSession->connectedProfile;
Jeff Johnson32d95a32012-09-10 13:15:23 -07006241
6242 if(!pSession)
6243 {
6244 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6245 return eHAL_STATUS_FAILURE;
6246 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006247
6248 palZeroMemory(pMac->hHdd, &pSession->connectedProfile, sizeof(tCsrRoamConnectedProfile));
6249 pConnectProfile->AuthType = pProfile->negotiatedAuthType;
6250 pConnectProfile->AuthInfo = pProfile->AuthType;
6251 pConnectProfile->CBMode = pProfile->CBMode; //*** this may not be valid
6252 pConnectProfile->EncryptionType = pProfile->negotiatedUCEncryptionType;
6253 pConnectProfile->EncryptionInfo = pProfile->EncryptionType;
6254 pConnectProfile->mcEncryptionType = pProfile->negotiatedMCEncryptionType;
6255 pConnectProfile->mcEncryptionInfo = pProfile->mcEncryptionType;
6256 pConnectProfile->BSSType = pProfile->BSSType;
6257 pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask;
6258 pConnectProfile->operationChannel = pSirBssDesc->channelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07006259 pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval;
6260
Jeff Johnson295189b2012-06-20 16:38:30 -07006261 palCopyMemory(pMac->hHdd, &pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys));
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07006262 /* saving the addional IE`s like Hot spot indication element and extended capabilities */
6263 if(pProfile->nAddIEAssocLength)
6264 {
6265 status = palAllocateMemory(pMac->hHdd,
6266 (void **)&pConnectProfile->pAddIEAssoc, pProfile->nAddIEAssocLength);
6267 if(!HAL_STATUS_SUCCESS(status))
6268 {
6269 smsLog(pMac, LOGE, FL("Failed to allocate memory for additional IEs")) ;
6270 return eHAL_STATUS_FAILURE;
6271 }
6272 pConnectProfile->nAddIEAssocLength = pProfile->nAddIEAssocLength;
6273 palCopyMemory(pMac->hHdd, pConnectProfile->pAddIEAssoc, pProfile->pAddIEAssoc,
6274 pProfile->nAddIEAssocLength);
6275 }
6276
Jeff Johnson295189b2012-06-20 16:38:30 -07006277 //Save bssid
6278 csrGetBssIdBssDesc(pMac, pSirBssDesc, &pConnectProfile->bssid);
6279#ifdef WLAN_FEATURE_VOWIFI_11R
6280 if (pSirBssDesc->mdiePresent)
6281 {
6282 pConnectProfile->MDID.mdiePresent = 1;
6283 pConnectProfile->MDID.mobilityDomain = (pSirBssDesc->mdie[1] << 8) | (pSirBssDesc->mdie[0]);
6284 }
6285#endif
6286#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006287 if ((csrIsProfileCCX(pProfile) ||
6288 ((pIesTemp->CCXVersion.present)
6289 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
6290 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
6291 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
6292 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
6293 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
6294 && (!(csrIsProfile11r( pProfile )))
6295 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -07006296 {
6297 pConnectProfile->isCCXAssoc = 1;
6298 }
6299#endif
6300 //save ssid
6301 if( NULL == pIesTemp )
6302 {
6303 status = csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesTemp);
6304 }
6305 if(HAL_STATUS_SUCCESS(status))
6306 {
6307 if(pIesTemp->SSID.present)
6308 {
6309 pConnectProfile->SSID.length = pIesTemp->SSID.num_ssid;
6310 palCopyMemory(pMac->hHdd, pConnectProfile->SSID.ssId,
6311 pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid);
6312 }
6313
6314 //Save the bss desc
6315 status = csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006316 if( CSR_IS_QOS_BSS(pIesTemp) )
6317 {
6318 pConnectProfile->qap = TRUE;
6319 }
6320 else
6321 {
6322 pConnectProfile->qap = FALSE;
6323 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006324 if ( NULL == pIes )
6325 {
6326 //Free memory if it allocated locally
6327 palFreeMemory(pMac->hHdd, pIesTemp);
6328 }
6329 }
6330 //Save Qos connection
6331 pConnectProfile->qosConnection = pMac->roam.roamSession[sessionId].fWMMConnection;
6332
6333 if(!HAL_STATUS_SUCCESS(status))
6334 {
6335 csrFreeConnectBssDesc(pMac, sessionId);
6336 }
6337 for(index = 0; index < pProfile->SSIDs.numOfSSIDs; index++)
6338 {
6339 if((pProfile->SSIDs.SSIDList[index].SSID.length == pConnectProfile->SSID.length) &&
6340 palEqualMemory(pMac->hHdd, pProfile->SSIDs.SSIDList[index].SSID.ssId,
6341 pConnectProfile->SSID.ssId, pConnectProfile->SSID.length))
6342 {
6343 pConnectProfile->handoffPermitted = pProfile->SSIDs.SSIDList[index].handoffPermitted;
6344 break;
6345 }
6346 pConnectProfile->handoffPermitted = FALSE;
6347 }
6348
6349 return (status);
6350}
6351
Jeff Johnson295189b2012-06-20 16:38:30 -07006352static void csrRoamJoinRspProcessor( tpAniSirGlobal pMac, tSirSmeJoinRsp *pSmeJoinRsp )
6353{
6354 tListElem *pEntry = NULL;
6355 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006356 //The head of the active list is the request we sent
6357 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6358 if(pEntry)
6359 {
6360 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6361 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006362 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6363 {
6364 if(pCommand && eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason)
6365 {
6366#ifndef WLAN_MDM_CODE_REDUCTION_OPT
6367 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6368#endif
6369 }
6370 csrRoamComplete( pMac, eCsrJoinSuccess, (void *)pSmeJoinRsp );
6371 }
6372 else
6373 {
6374 tANI_U32 roamId = 0;
6375 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pSmeJoinRsp->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006376 if(!pSession)
6377 {
6378 smsLog(pMac, LOGE, FL(" session %d not found "), pSmeJoinRsp->sessionId);
6379 return;
6380 }
6381
Jeff Johnson295189b2012-06-20 16:38:30 -07006382
6383 //The head of the active list is the request we sent
6384 //Try to get back the same profile and roam again
6385 if(pCommand)
6386 {
6387 roamId = pCommand->u.roamCmd.roamId;
6388 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006389 pSession->joinFailStatusCode.statusCode = pSmeJoinRsp->statusCode;
6390 pSession->joinFailStatusCode.reasonCode = pSmeJoinRsp->protStatusCode;
6391 smsLog( pMac, LOGW, "SmeJoinReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6392#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6393 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
6394 if (csrRoamIsHandoffInProgress(pMac))
6395 {
6396 csrRoamCallCallback(pMac, pSmeJoinRsp->sessionId, NULL, roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
6397 /* Should indicate neighbor roam algorithm about the connect failure here */
6398 csrNeighborRoamIndicateConnect(pMac, pSmeJoinRsp->sessionId, VOS_STATUS_E_FAILURE);
6399 }
6400#endif
6401 if (pCommand)
6402 {
6403 if(CSR_IS_WDS_STA( &pCommand->u.roamCmd.roamProfile ))
6404 {
6405 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6406 pSession->connectedProfile.BSSType = eCSR_BSS_TYPE_WDS_STA;
6407 csrRoamReissueRoamCommand(pMac);
6408 }
6409 else if( CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile ) )
6410 {
6411 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6412 }
6413 else
6414 {
6415 csrRoam(pMac, pCommand);
6416 }
6417 }
6418 else
6419 {
6420 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6421 }
6422 } /*else: ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode ) */
6423}
6424
Jeff Johnson295189b2012-06-20 16:38:30 -07006425eHalStatus csrRoamIssueJoin( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6426 tDot11fBeaconIEs *pIes,
6427 tCsrRoamProfile *pProfile, tANI_U32 roamId )
6428{
6429 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006430 smsLog( pMac, LOG1, "Attempting to Join Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
6431 pSirBssDesc->bssId[ 0 ],pSirBssDesc->bssId[ 1 ],pSirBssDesc->bssId[ 2 ],
6432 pSirBssDesc->bssId[ 3 ],pSirBssDesc->bssId[ 4 ],pSirBssDesc->bssId[ 5 ] );
6433
6434 // Set the roaming substate to 'join attempt'...
6435 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006436 // attempt to Join this BSS...
6437 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07006438 return (status);
6439}
6440
Jeff Johnson295189b2012-06-20 16:38:30 -07006441static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6442 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile)
6443{
6444 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006445 // Set the roaming substate to 'join attempt'...
6446 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_REASSOC_REQ, sessionId );
6447
6448 smsLog(pMac, LOGE, FL(" calling csrSendSmeReassocReqMsg\n"));
6449
6450 // attempt to Join this BSS...
6451 return csrSendSmeReassocReqMsg( pMac, sessionId, pSirBssDesc, pIes, pProfile );
6452}
6453
Jeff Johnson295189b2012-06-20 16:38:30 -07006454void csrRoamReissueRoamCommand(tpAniSirGlobal pMac)
6455{
6456 tListElem *pEntry;
6457 tSmeCmd *pCommand;
6458 tCsrRoamInfo roamInfo;
6459 tANI_U32 sessionId;
6460 tCsrRoamSession *pSession;
6461
6462 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6463 if(pEntry)
6464 {
6465 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6466 if ( eSmeCommandRoam == pCommand->command )
6467 {
6468 sessionId = pCommand->sessionId;
6469 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006470
6471 if(!pSession)
6472 {
6473 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6474 return;
6475 }
6476
Jeff Johnson295189b2012-06-20 16:38:30 -07006477 if( pCommand->u.roamCmd.fStopWds )
6478 {
6479 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
6480 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
6481 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
6482 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
6483#ifdef WLAN_SOFTAP_FEATURE
6484 if (CSR_IS_WDS(&pSession->connectedProfile)){
6485#endif
6486 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
6487 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6488 eCSR_ROAM_WDS_IND,
6489 eCSR_ROAM_RESULT_WDS_DISASSOCIATED);
6490#ifdef WLAN_SOFTAP_FEATURE
6491 }else if (CSR_IS_INFRA_AP(&pSession->connectedProfile)){
6492 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
6493 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6494 eCSR_ROAM_INFRA_IND,
6495 eCSR_ROAM_RESULT_INFRA_DISASSOCIATED);
6496 }
6497
6498#endif
6499
Jeff Johnson295189b2012-06-20 16:38:30 -07006500 if( !HAL_STATUS_SUCCESS( csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ ) ) )
6501 {
6502 smsLog(pMac, LOGE, " Failed to reissue stop_bss command for WDS after disassociated\n");
6503 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6504 }
6505 }
6506 else if(eCsrStopRoaming == csrRoamJoinNextBss(pMac, pCommand, eANI_BOOLEAN_TRUE))
6507 {
6508 smsLog(pMac, LOGW, " Failed to reissue join command after disassociated\n");
6509 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6510 }
6511 }
6512 else
6513 {
6514 smsLog(pMac, LOGW, " Command is not roaming after disassociated\n");
6515 }
6516 }
6517 else
6518 {
6519 smsLog(pMac, LOGE, " Disassoc rsp cannot continue because no command is available\n");
6520 }
6521}
6522
Jeff Johnson295189b2012-06-20 16:38:30 -07006523tANI_BOOLEAN csrIsRoamCommandWaitingForSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
6524{
6525 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6526 tListElem *pEntry;
6527 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006528 //alwasy lock active list before locking pending list
6529 csrLLLock( &pMac->sme.smeCmdActiveList );
6530 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6531 if(pEntry)
6532 {
6533 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6534 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6535 {
6536 fRet = eANI_BOOLEAN_TRUE;
6537 }
6538 }
6539 if(eANI_BOOLEAN_FALSE == fRet)
6540 {
6541 csrLLLock(&pMac->sme.smeCmdPendingList);
6542 pEntry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK);
6543 while(pEntry)
6544 {
6545 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6546 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6547 {
6548 fRet = eANI_BOOLEAN_TRUE;
6549 break;
6550 }
6551 pEntry = csrLLNext(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK);
6552 }
6553 csrLLUnlock(&pMac->sme.smeCmdPendingList);
6554 }
6555 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006556 return (fRet);
6557}
6558
Jeff Johnson295189b2012-06-20 16:38:30 -07006559tANI_BOOLEAN csrIsRoamCommandWaiting(tpAniSirGlobal pMac)
6560{
6561 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6562 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07006563 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
6564 {
6565 if( CSR_IS_SESSION_VALID( pMac, i ) && ( fRet = csrIsRoamCommandWaitingForSession( pMac, i ) ) )
6566 {
6567 break;
6568 }
6569 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006570 return ( fRet );
6571}
6572
Jeff Johnson295189b2012-06-20 16:38:30 -07006573tANI_BOOLEAN csrIsCommandWaiting(tpAniSirGlobal pMac)
6574{
6575 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006576 //alwasy lock active list before locking pending list
6577 csrLLLock( &pMac->sme.smeCmdActiveList );
6578 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6579 if(eANI_BOOLEAN_FALSE == fRet)
6580 {
6581 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
6582 }
6583 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006584 return (fRet);
6585}
6586
Jeff Johnson295189b2012-06-20 16:38:30 -07006587tANI_BOOLEAN csrIsScanForRoamCommandActive( tpAniSirGlobal pMac )
6588{
6589 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6590 tListElem *pEntry;
6591 tCsrCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006592 //alwasy lock active list before locking pending list
6593 csrLLLock( &pMac->sme.smeCmdActiveList );
6594 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6595 if( pEntry )
6596 {
6597 pCommand = GET_BASE_ADDR(pEntry, tCsrCmd, Link);
6598 if( ( eCsrRoamCommandScan == pCommand->command ) &&
6599 ( ( eCsrScanForSsid == pCommand->u.scanCmd.reason ) ||
6600 ( eCsrScanForCapsChange == pCommand->u.scanCmd.reason ) ||
6601 ( eCsrScanP2PFindPeer == pCommand->u.scanCmd.reason ) ) )
6602 {
6603 fRet = eANI_BOOLEAN_TRUE;
6604 }
6605 }
6606 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006607 return (fRet);
6608}
Jeff Johnson295189b2012-06-20 16:38:30 -07006609eHalStatus csrRoamIssueReassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId )
6610{
6611 eHalStatus status = eHAL_STATUS_SUCCESS;
6612 tSmeCmd *pCommand = NULL;
6613 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_TRUE;
6614 tANI_BOOLEAN fRemoveCmd = FALSE;
6615 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -07006616 // Delete the old assoc command. All is setup for reassoc to be serialized
6617 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6618 if ( pEntry )
6619 {
6620 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
6621 if ( !pCommand )
6622 {
6623 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6624 return eHAL_STATUS_RESOURCES;
6625 }
6626 if ( eSmeCommandRoam == pCommand->command )
6627 {
6628 if (pCommand->u.roamCmd.roamReason == eCsrSmeIssuedAssocToSimilarAP)
6629 {
6630 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
6631 }
6632 else
6633 {
6634 smsLog( pMac, LOGE, FL(" Unexpected active roam command present \n") );
6635 }
6636 if (fRemoveCmd == FALSE)
6637 {
6638 // Implies we did not get the serialized assoc command we
6639 // were expecting
6640 pCommand = NULL;
6641 }
6642 }
6643 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006644 if(NULL == pCommand)
6645 {
6646 smsLog( pMac, LOGE, FL(" fail to get command buffer as expected based on previous connect roam command\n") );
6647 return eHAL_STATUS_RESOURCES;
6648 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006649 do
6650 {
6651 //Change the substate in case it is wait-for-key
6652 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6653 {
6654 csrRoamStopWaitForKeyTimer( pMac );
6655 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
6656 }
6657 pCommand->command = eSmeCommandRoam;
6658 pCommand->sessionId = (tANI_U8)sessionId;
6659 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedFTReassoc;
Jeff Johnson295189b2012-06-20 16:38:30 -07006660 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6661 if( !HAL_STATUS_SUCCESS( status ) )
6662 {
6663 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6664 csrReleaseCommandRoam( pMac, pCommand );
6665 }
6666 } while( 0 );
6667
Jeff Johnson295189b2012-06-20 16:38:30 -07006668 return( status );
6669}
6670static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result )
6671{
6672 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6673 tCsrScanResult *pScanResult = NULL;
6674 tSirBssDescription *pBssDesc = NULL;
6675 tSmeCmd *pCommand = NULL;
6676 tANI_U32 sessionId;
6677 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07006678 if(NULL == pEntry)
6679 {
6680 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
6681 return;
6682 }
6683 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6684 sessionId = pCommand->sessionId;
6685 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006686
6687 if(!pSession)
6688 {
6689 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6690 return;
6691 }
6692
Jeff Johnson295189b2012-06-20 16:38:30 -07006693 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
6694 {
6695 //the roaming is cancelled. Simply complete the command
6696 smsLog(pMac, LOGW, FL(" Roam command cancelled\n"));
6697 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
6698 }
6699 else
6700 {
6701 if ( CCM_IS_RESULT_SUCCESS(result) )
6702 {
6703 smsLog(pMac, LOG2, "Cfg sequence complete\n");
6704 // Successfully set the configuration parameters for the new Bss. Attempt to
6705 // join the roaming Bss.
6706 if(pCommand->u.roamCmd.pRoamBssEntry)
6707 {
6708 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
6709 pBssDesc = &pScanResult->Result.BssDescriptor;
6710 }
6711 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) ||
6712 CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile )
6713#ifdef WLAN_SOFTAP_FEATURE
6714 || CSR_IS_INFRA_AP(&pCommand->u.roamCmd.roamProfile)
6715#endif
6716 )
6717 {
6718 if(!HAL_STATUS_SUCCESS(csrRoamIssueStartBss( pMac, sessionId,
6719 &pSession->bssParams, &pCommand->u.roamCmd.roamProfile,
6720 pBssDesc, pCommand->u.roamCmd.roamId )))
6721 {
6722 smsLog(pMac, LOGW, " CSR start BSS failed\n");
6723 //We need to complete the command
6724 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6725 }
6726 }
6727 else
6728 {
6729 if (!pCommand->u.roamCmd.pRoamBssEntry)
6730 {
6731 smsLog(pMac, LOGW, " pRoamBssEntry is NULL\n");
6732 //We need to complete the command
6733 csrRoamComplete(pMac, eCsrJoinFailure, NULL);
6734 return;
6735 }
6736 // If we are roaming TO an Infrastructure BSS...
6737 VOS_ASSERT(pScanResult != NULL);
6738 if ( csrIsInfraBssDesc( pBssDesc ) )
6739 {
6740 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07006741 if(pIesLocal || (HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
6742 {
6743 // ..and currently in an Infrastructure connection....
6744 if( csrIsConnStateConnectedInfra( pMac, sessionId ) )
6745 {
6746 // ...and the SSIDs are equal, then we Reassoc.
6747 if ( csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc,
6748 pIesLocal ) )
6749 // ..and currently in an infrastructure connection
6750 {
6751 // then issue a Reassoc.
6752 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
6753 csrRoamIssueReassociate( pMac, sessionId, pBssDesc, pIesLocal,
6754 &pCommand->u.roamCmd.roamProfile );
6755 }
6756 else
6757 {
6758
6759 // otherwise, we have to issue a new Join request to LIM because we disassociated from the
6760 // previously associated AP.
6761 if(!HAL_STATUS_SUCCESS(csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6762 pIesLocal,
6763 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId )))
6764 {
6765 //try something else
6766 csrRoam( pMac, pCommand );
6767 }
6768 }
6769 }
6770 else
6771 {
6772 eHalStatus status = eHAL_STATUS_SUCCESS;
6773
6774 /* We need to come with other way to figure out that this is because of HO in BMP
6775 The below API will be only available for Android as it uses a different HO algorithm */
6776 /* Reassoc request will be used only for CCX and 11r handoff whereas other legacy roaming should
6777 * use join request */
6778#ifdef WLAN_FEATURE_VOWIFI_11R
6779 if (csrRoamIsHandoffInProgress(pMac) &&
6780 csrRoamIs11rAssoc(pMac))
6781 {
6782 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
6783 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
6784 }
6785 else
6786#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006787#ifdef FEATURE_WLAN_CCX
6788 if (csrRoamIsHandoffInProgress(pMac) &&
6789 csrRoamIsCCXAssoc(pMac))
6790 {
6791 // Now serialize the reassoc command.
6792 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6793 }
6794 else
6795#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006796#ifdef FEATURE_WLAN_LFR
6797 if (csrRoamIsHandoffInProgress(pMac) &&
6798 csrRoamIsFastRoamEnabled(pMac))
6799 {
6800 // Now serialize the reassoc command.
6801 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6802 }
6803 else
6804#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006805 // else we are not connected and attempting to Join. Issue the
6806 // Join request.
6807 {
6808 status = csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6809 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ),
6810 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId );
6811 }
6812 if(!HAL_STATUS_SUCCESS(status))
6813 {
6814 //try something else
6815 csrRoam( pMac, pCommand );
6816 }
6817 }
6818 if( !pScanResult->Result.pvIes )
6819 {
6820 //Locally allocated
6821 palFreeMemory(pMac->hHdd, pIesLocal);
6822 }
6823 }
6824 }//if ( csrIsInfraBssDesc( pBssDesc ) )
6825 else
6826 {
6827 smsLog(pMac, LOGW, FL(" found BSSType mismatching the one in BSS description\n"));
6828 }
6829 }//else
6830 }//if ( WNI_CFG_SUCCESS == result )
6831 else
6832 {
6833 // In the event the configuration failed, for infra let the roam processor
6834 //attempt to join something else...
6835 if( pCommand->u.roamCmd.pRoamBssEntry && CSR_IS_INFRASTRUCTURE( &pCommand->u.roamCmd.roamProfile ) )
6836 {
6837 csrRoam(pMac, pCommand);
6838 }
6839 else
6840 {
6841 //We need to complete the command
6842 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) )
6843 {
6844 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6845 }
6846 else
6847 {
6848 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6849 }
6850 }
6851 }
6852 }//we have active entry
6853}
6854
Jeff Johnson295189b2012-06-20 16:38:30 -07006855static void csrRoamRoamingStateAuthRspProcessor( tpAniSirGlobal pMac, tSirSmeAuthRsp *pSmeAuthRsp )
6856{
6857 //No one is sending eWNI_SME_AUTH_REQ to PE.
6858 smsLog(pMac, LOGW, FL("is no-op\n"));
6859 if ( eSIR_SME_SUCCESS == pSmeAuthRsp->statusCode )
6860 {
6861 smsLog( pMac, LOGW, "CSR SmeAuthReq Successful\n" );
6862 // Successfully authenticated with a new Bss. Attempt to stop the current Bss and
6863 // join the new one...
6864 /***pBssDesc = profGetRoamingBssDesc( pAdapter, &pHddProfile );
Jeff Johnson295189b2012-06-20 16:38:30 -07006865 roamStopNetwork( pAdapter, &pBssDesc->SirBssDescription );***/
6866 }
6867 else {
6868 smsLog( pMac, LOGW, "CSR SmeAuthReq failed with statusCode= 0x%08lX [%d]\n", pSmeAuthRsp->statusCode, pSmeAuthRsp->statusCode );
6869 /***profHandleLostLinkAfterReset(pAdapter);
6870 // In the event the authenticate fails, let the roam processor attempt to join something else...
6871 roamRoam( pAdapter );***/
6872 }
6873}
6874
Jeff Johnson295189b2012-06-20 16:38:30 -07006875static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSmeJoinRsp pSmeJoinRsp )
6876{
6877 eCsrRoamCompleteResult result;
6878 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
6879 tCsrRoamInfo roamInfo;
6880 tANI_U32 roamId = 0;
6881
6882 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6883 {
6884 smsLog( pMac, LOGW, "CSR SmeReassocReq Successful\n" );
6885 result = eCsrReassocSuccess;
Jeff Johnson295189b2012-06-20 16:38:30 -07006886 /* Defeaturize this part later if needed */
6887#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
6888 /* Since the neighbor roam algorithm uses reassoc req for handoff instead of join,
6889 * we need the response contents while processing the result in csrRoamProcessResults() */
6890 if (csrRoamIsHandoffInProgress(pMac))
6891 {
6892 /* Need to dig more on indicating events to SME QoS module */
6893 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6894 csrRoamComplete( pMac, result, pSmeJoinRsp);
6895 }
6896 else
6897#endif
6898 {
6899 csrRoamComplete( pMac, result, NULL );
6900 }
6901 }
6902 /* Should we handle this similar to handling the join failure? Is it ok
6903 * to call csrRoamComplete() with state as CsrJoinFailure */
6904 else
6905 {
6906 smsLog( pMac, LOGW, "CSR SmeReassocReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6907 result = eCsrReassocFailure;
6908#ifdef WLAN_FEATURE_VOWIFI_11R
6909 if ((eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE == pSmeJoinRsp->statusCode) ||
6910 (eSIR_SME_FT_REASSOC_FAILURE == pSmeJoinRsp->statusCode))
6911 {
6912 // Inform HDD to turn off FT flag in HDD
6913 if (pNeighborRoamInfo)
6914 {
6915 vos_mem_zero(&roamInfo, sizeof(tCsrRoamInfo));
6916 csrRoamCallCallback(pMac, pNeighborRoamInfo->csrSessionId,
6917 &roamInfo, roamId, eCSR_ROAM_FT_REASSOC_FAILED, eSIR_SME_SUCCESS);
Madan Mohan Koyyalamudi57772162012-10-18 19:46:14 -07006918 /*
6919 * Since the above callback sends a disconnect
6920 * to HDD, we should clean-up our state
6921 * machine as well to be in sync with the upper
6922 * layers. There is no need to send a disassoc
6923 * since: 1) we will never reassoc to the current
6924 * AP in LFR, and 2) there is no need to issue a
6925 * disassoc to the AP with which we were trying
6926 * to reassoc.
6927 */
6928 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6929 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07006930 }
6931 }
6932#endif
6933 // In the event that the Reassociation fails, then we need to Disassociate the current association and keep
6934 // roaming. Note that we will attempt to Join the AP instead of a Reassoc since we may have attempted a
6935 // 'Reassoc to self', which AP's that don't support Reassoc will force a Disassoc.
6936 //The disassoc rsp message will remove the command from active list
6937 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, pSmeJoinRsp->sessionId,
6938 eCSR_ROAM_SUBSTATE_DISASSOC_REASSOC_FAILURE, FALSE )))
6939 {
6940 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6941 }
6942 }
6943}
6944
Jeff Johnson295189b2012-06-20 16:38:30 -07006945static void csrRoamRoamingStateStopBssRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSmeRsp)
6946{
Jeff Johnson295189b2012-06-20 16:38:30 -07006947#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
6948 {
6949 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07006950 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
6951 if(pIbssLog)
6952 {
6953 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_RSP;
6954 if(eSIR_SME_SUCCESS != pSmeRsp->statusCode)
6955 {
6956 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
6957 }
6958 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
6959 }
6960 }
6961#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07006962 pMac->roam.roamSession[pSmeRsp->sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6963 if(CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, pSmeRsp->sessionId))
6964 {
6965 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6966 }
6967 else if(CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId))
6968 {
6969 csrRoamReissueRoamCommand(pMac);
6970 }
6971}
6972
Jeff Johnson295189b2012-06-20 16:38:30 -07006973void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisassocRsp *pSmeRsp )
6974{
6975 tSirResultCodes statusCode;
6976#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6977 tScanResultHandle hBSSList;
6978 tANI_BOOLEAN fCallCallback, fRemoveCmd;
6979 eHalStatus status;
6980 tCsrRoamInfo roamInfo;
6981 tCsrScanResultFilter *pScanFilter = NULL;
6982 tANI_U32 roamId = 0;
6983 tCsrRoamProfile *pCurRoamProfile = NULL;
6984 tListElem *pEntry = NULL;
6985 tSmeCmd *pCommand = NULL;
6986#endif
6987 tANI_U32 sessionId;
6988 tCsrRoamSession *pSession;
Jeff Johnsone7245742012-09-05 17:12:55 -07006989
Jeff Johnson295189b2012-06-20 16:38:30 -07006990 tSirSmeDisassocRsp SmeDisassocRsp;
6991
6992 csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, &SmeDisassocRsp);
6993 sessionId = SmeDisassocRsp.sessionId;
6994 statusCode = SmeDisassocRsp.statusCode;
6995
6996 smsLog( pMac, LOG2, "csrRoamRoamingStateDisassocRspProcessor sessionId %d\n", sessionId);
6997
6998 if ( csrIsConnStateInfra( pMac, sessionId ) )
6999 {
7000 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
7001 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007002 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07007003
7004 if(!pSession)
7005 {
7006 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7007 return;
7008 }
7009
Jeff Johnson295189b2012-06-20 16:38:30 -07007010 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, sessionId ) )
7011 {
7012 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7013 }
7014 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, sessionId ) ||
7015 CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, sessionId ) )
7016 {
7017 if ( eSIR_SME_SUCCESS == statusCode )
7018 {
7019 smsLog( pMac, LOG2, "CSR SmeDisassocReq force disassociated Successfully\n" );
7020 //A callback to HDD will be issued from csrRoamComplete so no need to do anything here
7021 }
7022 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7023 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007024 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, sessionId ) )
7025 {
7026 smsLog( pMac, LOGE, "CSR SmeDisassocReq due to HO\n" );
7027#if defined (WLAN_FEATURE_NEIGHBOR_ROAMING)
7028 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
7029 if ( pEntry )
7030 {
7031 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07007032 // If the head of the queue is Active and it is a ROAM command, remove
7033 // and put this on the Free queue.
7034 if ( eSmeCommandRoam == pCommand->command )
7035 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007036
Jeff Johnson295189b2012-06-20 16:38:30 -07007037 //we need to process the result first before removing it from active list because state changes
7038 //still happening insides roamQProcessRoamResults so no other roam command should be issued
7039 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
7040 if(pCommand->u.roamCmd.fReleaseProfile)
7041 {
7042 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
7043 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
7044 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007045 if( fRemoveCmd )
7046 {
7047 csrReleaseCommandRoam( pMac, pCommand );
7048 }
7049 else
7050 {
7051 smsLog( pMac, LOGE, " ********csrRoamRoamingStateDisassocRspProcessor fail to remove cmd reason %d\n",
7052 pCommand->u.roamCmd.roamReason );
7053 }
7054 }
7055 else
7056 {
7057 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
7058 }
7059 }
7060 else
7061 {
7062 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
7063 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007064 //notify HDD for handoff, providing the BSSID too
7065 roamInfo.reasonCode = eCsrRoamReasonBetterAP;
7066
7067 palCopyMemory(pMac->hHdd, roamInfo.bssid, pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
7068
Jeff Johnsone7245742012-09-05 17:12:55 -07007069 csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007070
7071 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
7072 if(HAL_STATUS_SUCCESS(status))
7073 {
7074 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
7075 status = csrRoamPrepareFilterFromProfile(pMac, &pMac->roam.neighborRoamInfo.csrNeighborRoamProfile, pScanFilter);
7076 if(!HAL_STATUS_SUCCESS(status))
7077 {
7078 smsLog(pMac, LOGE, FL(" csrRoamPrepareFilterFromProfile fail to create scan filter\n"));
7079 }
7080
7081 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
7082 if(HAL_STATUS_SUCCESS(status))
7083 {
7084 //copy over the connected profile to apply the same for this connection as well
7085 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pCurRoamProfile, sizeof(tCsrRoamProfile))))
7086 {
7087 palZeroMemory(pMac->hHdd, pCurRoamProfile, sizeof(tCsrRoamProfile));
7088 csrRoamCopyProfile(pMac, pCurRoamProfile, pSession->pCurRoamProfile);
7089 }
7090 //make sure to put it at the head of the cmd queue
7091 status = csrRoamIssueConnect(pMac, sessionId, pCurRoamProfile,
7092 hBSSList, eCsrSmeIssuedAssocToSimilarAP,
7093 roamId, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
7094 if(!HAL_STATUS_SUCCESS(status))
7095 {
7096 //msg
7097 fCallCallback = eANI_BOOLEAN_TRUE;
7098 }
7099 /* Notify sub-modules like QoS etc. that handoff happening */
7100 sme_QosCsrEventInd(pMac, sessionId, SME_QOS_CSR_HANDOFF_ASSOC_REQ, NULL);
7101 palFreeMemory(pMac->hHdd, pCurRoamProfile);
7102 }
7103 else
7104 {
7105 //msg
7106 smsLog( pMac, LOGE,"csrRoamRoamingStateDisassocRspProcessor: csrScanGetResult failed");
7107 // should have asserted, sending up roam complete instead. Let upper layer
7108 // decide what to do next
7109 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7110 }
7111 }
7112 else
7113 {
7114 smsLog(pMac, LOGE, FL(" fail to allocate memory for scan filter\n"));
7115 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7116 }
7117 if( pScanFilter )
7118 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007119
Jeff Johnson295189b2012-06-20 16:38:30 -07007120 csrFreeScanFilter(pMac, pScanFilter);
7121 palFreeMemory( pMac->hHdd, pScanFilter );
7122 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007123#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07007124
Jeff Johnson295189b2012-06-20 16:38:30 -07007125 } //else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac ) )
7126 else if ( CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, sessionId ) )
7127 {
7128 // Disassoc due to Reassoc failure falls into this codepath....
7129 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
7130 }
7131 else
7132 {
7133 if ( eSIR_SME_SUCCESS == statusCode )
7134 {
7135 // Successfully disassociated from the 'old' Bss...
7136 //
7137 // We get Disassociate response in three conditions.
7138 // - First is the case where we are disasociating from an Infra Bss to start an IBSS.
7139 // - Second is the when we are disassociating from an Infra Bss to join an IBSS or a new
7140 // Infrastructure network.
7141 // - Third is where we are doing an Infra to Infra roam between networks with different
7142 // SSIDs. In all cases, we set the new Bss configuration here and attempt to join
7143
7144 smsLog( pMac, LOG2, "CSR SmeDisassocReq disassociated Successfully\n" );
7145 }
7146 else
7147 {
7148 smsLog( pMac, LOGE, "SmeDisassocReq failed with statusCode= 0x%08lX\n", statusCode );
7149 }
7150 //We are not done yet. Get the data and continue roaming
7151 csrRoamReissueRoamCommand(pMac);
7152 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007153}
7154
Jeff Johnson295189b2012-06-20 16:38:30 -07007155static void csrRoamRoamingStateDeauthRspProcessor( tpAniSirGlobal pMac, tSirSmeDeauthRsp *pSmeRsp )
7156{
7157 tSirResultCodes statusCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07007158 //No one is sending eWNI_SME_DEAUTH_REQ to PE.
7159 smsLog(pMac, LOGW, FL("is no-op\n"));
7160 statusCode = csrGetDeAuthRspStatusCode( pSmeRsp );
7161 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId) )
7162 {
7163 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7164 }
7165 else
7166 {
7167 if ( eSIR_SME_SUCCESS == statusCode )
7168 {
7169 // Successfully deauth from the 'old' Bss...
7170 //
7171 smsLog( pMac, LOG2, "CSR SmeDeauthReq disassociated Successfully\n" );
7172 }
7173 else
7174 {
7175 smsLog( pMac, LOGW, "SmeDeauthReq failed with statusCode= 0x%08lX\n", statusCode );
7176 }
7177 //We are not done yet. Get the data and continue roaming
7178 csrRoamReissueRoamCommand(pMac);
7179 }
7180}
7181
Jeff Johnson295189b2012-06-20 16:38:30 -07007182static void csrRoamRoamingStateStartBssRspProcessor( tpAniSirGlobal pMac, tSirSmeStartBssRsp *pSmeStartBssRsp )
7183{
7184 eCsrRoamCompleteResult result;
7185
7186 if ( eSIR_SME_SUCCESS == pSmeStartBssRsp->statusCode )
7187 {
7188 smsLog( pMac, LOGW, "SmeStartBssReq Successful\n" );
7189 result = eCsrStartBssSuccess;
7190 }
7191 else
7192 {
7193 smsLog( pMac, LOGW, "SmeStartBssReq failed with statusCode= 0x%08lX\n", pSmeStartBssRsp->statusCode );
7194 //Let csrRoamComplete decide what to do
7195 result = eCsrStartBssFailure;
7196 }
7197#ifdef WLAN_SOFTAP_FEATURE
7198 csrRoamComplete( pMac, result, pSmeStartBssRsp);
7199#else
7200 csrRoamComplete( pMac, result, &pSmeStartBssRsp->bssDescription );
7201#endif
7202}
7203
Jeff Johnson295189b2012-06-20 16:38:30 -07007204/*
7205 We need to be careful on whether to cast pMsgBuf (pSmeRsp) to other type of strucutres.
7206 It depends on how the message is constructed. If the message is sent by limSendSmeRsp,
7207 the pMsgBuf is only a generic response and can only be used as pointer to tSirSmeRsp.
7208 For the messages where sender allocates memory for specific structures, then it can be
7209 cast accordingly.
7210*/
7211void csrRoamingStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7212{
7213 tSirSmeRsp *pSmeRsp;
7214 tSmeIbssPeerInd *pIbssPeerInd;
7215 tCsrRoamInfo roamInfo;
7216 // TODO Session Id need to be acquired in this function
7217 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07007218 pSmeRsp = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007219 smsLog( pMac, LOG2, "Message %d[0x%04X] received in substate %d\n",
7220 pSmeRsp->messageType, pSmeRsp->messageType,
7221 pMac->roam.curSubState[pSmeRsp->sessionId] );
7222#if defined ANI_PRODUCT_TYPE_AP
7223 pSmeRsp->messageType = pal_be16_to_cpu(pSmeRsp->messageType);
7224 pSmeRsp->length = pal_be16_to_cpu(pSmeRsp->length);
7225 pSmeRsp->statusCode = pal_be32_to_cpu(pSmeRsp->statusCode);
7226#else
7227 pSmeRsp->messageType = (pSmeRsp->messageType);
7228 pSmeRsp->length = (pSmeRsp->length);
7229 pSmeRsp->statusCode = (pSmeRsp->statusCode);
7230#endif
7231 switch (pSmeRsp->messageType)
7232 {
7233
7234 case eWNI_SME_JOIN_RSP: // in Roaming state, process the Join response message...
7235 if (CSR_IS_ROAM_SUBSTATE_JOIN_REQ(pMac, pSmeRsp->sessionId))
7236 {
7237 //We sent a JOIN_REQ
7238 csrRoamJoinRspProcessor( pMac, (tSirSmeJoinRsp *)pSmeRsp );
7239 }
7240 break;
7241
7242 case eWNI_SME_AUTH_RSP: // or the Authenticate response message...
7243 if (CSR_IS_ROAM_SUBSTATE_AUTH_REQ( pMac, pSmeRsp->sessionId) )
7244 {
7245 //We sent a AUTH_REQ
7246 csrRoamRoamingStateAuthRspProcessor( pMac, (tSirSmeAuthRsp *)pSmeRsp );
7247 }
7248 break;
7249
7250 case eWNI_SME_REASSOC_RSP: // or the Reassociation response message...
7251 if (CSR_IS_ROAM_SUBSTATE_REASSOC_REQ( pMac, pSmeRsp->sessionId) )
7252 {
7253 csrRoamRoamingStateReassocRspProcessor( pMac, (tpSirSmeJoinRsp )pSmeRsp );
7254 }
7255 break;
7256
7257 case eWNI_SME_STOP_BSS_RSP: // or the Stop Bss response message...
7258 {
7259 csrRoamRoamingStateStopBssRspProcessor(pMac, pSmeRsp);
7260 }
7261 break;
7262
7263 case eWNI_SME_DISASSOC_RSP: // or the Disassociate response message...
7264 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, pSmeRsp->sessionId ) ||
7265 CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, pSmeRsp->sessionId ) ||
7266 CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, pSmeRsp->sessionId ) ||
7267 CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, pSmeRsp->sessionId ) ||
7268 CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId ) ||
7269//HO
7270 CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, pSmeRsp->sessionId ) )
7271 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07007272 smsLog(pMac, LOG1, FL("eWNI_SME_DISASSOC_RSP subState = %d\n"), pMac->roam.curSubState[pSmeRsp->sessionId]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007273 csrRoamRoamingStateDisassocRspProcessor( pMac, (tSirSmeDisassocRsp *)pSmeRsp );
7274 }
7275 break;
7276
7277 case eWNI_SME_DEAUTH_RSP: // or the Deauthentication response message...
7278 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId ) )
7279 {
7280 csrRoamRoamingStateDeauthRspProcessor( pMac, (tSirSmeDeauthRsp *)pSmeRsp );
7281 }
7282 break;
7283
7284 case eWNI_SME_START_BSS_RSP: // or the Start BSS response message...
7285 if (CSR_IS_ROAM_SUBSTATE_START_BSS_REQ( pMac, pSmeRsp->sessionId ) )
7286 {
7287 csrRoamRoamingStateStartBssRspProcessor( pMac, (tSirSmeStartBssRsp *)pSmeRsp );
7288 }
7289 break;
7290
7291 case WNI_CFG_SET_CNF: // process the Config Confirm messages when we are in 'Config' substate...
7292 if ( CSR_IS_ROAM_SUBSTATE_CONFIG( pMac, pSmeRsp->sessionId ) )
7293 {
7294 csrRoamingStateConfigCnfProcessor( pMac, ((tCsrCfgSetRsp *)pSmeRsp)->respStatus );
7295 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007296 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007297 //In case CSR issues STOP_BSS, we need to tell HDD about peer departed becasue PE is removing them
7298 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
7299 pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
7300 smsLog(pMac, LOGE, "CSR: Peer departed notification from LIM in joining state\n");
7301 palZeroMemory( pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo) );
7302 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
7303 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
7304 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
7305 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
7306 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
7307 eCSR_ROAM_CONNECT_STATUS_UPDATE,
7308 eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
7309 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007310 default:
7311 smsLog( pMac, LOG1, "Unexpected message type = %d[0x%X] received in substate %d\n",
7312 pSmeRsp->messageType, pSmeRsp->messageType,
7313 pMac->roam.curSubState[pSmeRsp->sessionId] );
7314
7315 //If we are connected, check the link status change
7316 if(!csrIsConnStateDisconnected(pMac, sessionId))
7317 {
7318 csrRoamCheckForLinkStatusChange( pMac, pSmeRsp );
7319 }
7320 break;
7321 }
7322}
7323
Jeff Johnson295189b2012-06-20 16:38:30 -07007324void csrRoamJoinedStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7325{
7326 tSirSmeRsp *pSirMsg = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007327 switch (pSirMsg->messageType)
7328 {
7329 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07007330 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007331 csrRoamStatsRspProcessor( pMac, pSirMsg );
7332 break;
7333#ifdef WLAN_SOFTAP_FEATURE
7334 case eWNI_SME_UPPER_LAYER_ASSOC_CNF:
7335 {
7336 tCsrRoamSession *pSession;
7337 tSirSmeAssocIndToUpperLayerCnf *pUpperLayerAssocCnf;
7338 tCsrRoamInfo roamInfo;
7339 tCsrRoamInfo *pRoamInfo = NULL;
7340 tANI_U32 sessionId;
7341 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007342 smsLog( pMac, LOG1, FL("ASSOCIATION confirmation can be given to upper layer \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007343 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
7344 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007345 pUpperLayerAssocCnf = (tSirSmeAssocIndToUpperLayerCnf *)pMsgBuf;
7346 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pUpperLayerAssocCnf->bssId, &sessionId );
7347 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07007348
7349 if(!pSession)
7350 {
7351 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7352 return;
7353 }
7354
Jeff Johnson295189b2012-06-20 16:38:30 -07007355 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
7356 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07007357 pRoamInfo->staId = (tANI_U8)pUpperLayerAssocCnf->aid;
7358 pRoamInfo->rsnIELen = (tANI_U8)pUpperLayerAssocCnf->rsnIE.length;
7359 pRoamInfo->prsnIE = pUpperLayerAssocCnf->rsnIE.rsnIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007360 pRoamInfo->addIELen = (tANI_U8)pUpperLayerAssocCnf->addIE.length;
7361 pRoamInfo->paddIE = pUpperLayerAssocCnf->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007362 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pUpperLayerAssocCnf->peerMacAddr, sizeof(tSirMacAddr));
7363 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pUpperLayerAssocCnf->bssId, sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07007364 pRoamInfo->wmmEnabledSta = pUpperLayerAssocCnf->wmmEnabledSta;
Jeff Johnson295189b2012-06-20 16:38:30 -07007365 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) )
7366 {
7367 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED;
7368 pRoamInfo->fReassocReq = pUpperLayerAssocCnf->reassocReq;
7369 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
7370 }
7371 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
7372 {
7373 vos_sleep( 100 );
7374 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;//Sta
7375 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
7376 }
7377
Jeff Johnson295189b2012-06-20 16:38:30 -07007378 }
7379 break;
7380#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007381 default:
7382 csrRoamCheckForLinkStatusChange( pMac, pSirMsg );
7383 break;
7384 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007385}
7386
Jeff Johnson295189b2012-06-20 16:38:30 -07007387eHalStatus csrRoamIssueSetContextReq( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrEncryptionType EncryptType,
7388 tSirBssDescription *pBssDescription,
7389 tSirMacAddr *bssId, tANI_BOOLEAN addKey,
7390 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
7391 tANI_U8 keyId, tANI_U16 keyLength,
7392 tANI_U8 *pKey, tANI_U8 paeRole )
7393{
7394 eHalStatus status = eHAL_STATUS_SUCCESS;
7395 tAniEdType edType;
7396
7397 if(eCSR_ENCRYPT_TYPE_UNKNOWN == EncryptType)
7398 {
7399 EncryptType = eCSR_ENCRYPT_TYPE_NONE; //***
7400 }
7401
7402 edType = csrTranslateEncryptTypeToEdType( EncryptType );
7403
7404 // Allow 0 keys to be set for the non-WPA encrypt types... For WPA encrypt types, the num keys must be non-zero
7405 // or LIM will reject the set context (assumes the SET_CONTEXT does not occur until the keys are distrubuted).
7406 if ( CSR_IS_ENC_TYPE_STATIC( EncryptType ) ||
7407 addKey )
7408 {
7409 tCsrRoamSetKey setKey;
Jeff Johnson295189b2012-06-20 16:38:30 -07007410 setKey.encType = EncryptType;
7411 setKey.keyDirection = aniKeyDirection; //Tx, Rx or Tx-and-Rx
7412 palCopyMemory( pMac->hHdd, &setKey.peerMac, bssId, sizeof(tCsrBssid) );
7413 setKey.paeRole = paeRole; //0 for supplicant
7414 setKey.keyId = keyId; // Kye index
7415 setKey.keyLength = keyLength;
7416 if( keyLength )
7417 {
7418 palCopyMemory( pMac->hHdd, setKey.Key, pKey, keyLength );
7419 }
7420 status = csrRoamIssueSetKeyCommand( pMac, sessionId, &setKey, 0 );
7421 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007422 return (status);
7423}
7424
Jeff Johnson295189b2012-06-20 16:38:30 -07007425static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7426 tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7427{
7428 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7429 tSmeCmd *pCommand = NULL;
7430#ifdef FEATURE_WLAN_CCX
7431 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7432#endif /* FEATURE_WLAN_CCX */
7433
7434 do
7435 {
7436 pCommand = csrGetCommandBuffer(pMac);
7437 if(NULL == pCommand)
7438 {
7439 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7440 status = eHAL_STATUS_RESOURCES;
7441 break;
7442 }
7443 pCommand->command = eSmeCommandSetKey;
7444 pCommand->sessionId = (tANI_U8)sessionId;
7445 // validate the key length, Adjust if too long...
7446 // for static WEP the keys are not set thru' SetContextReq
7447 if ( ( eCSR_ENCRYPT_TYPE_WEP40 == pSetKey->encType ) ||
7448 ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pSetKey->encType ) )
7449 {
7450 //KeyLength maybe 0 for static WEP
7451 if( pSetKey->keyLength )
7452 {
7453 if ( pSetKey->keyLength < CSR_WEP40_KEY_LEN )
7454 {
7455 smsLog( pMac, LOGW, "Invalid WEP40 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7456 break;
7457 }
7458
7459 pCommand->u.setKeyCmd.keyLength = CSR_WEP40_KEY_LEN;
7460 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP40_KEY_LEN );
7461 }
7462 }
7463 else if ( ( eCSR_ENCRYPT_TYPE_WEP104 == pSetKey->encType ) ||
7464 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pSetKey->encType ) )
7465 {
7466 //KeyLength maybe 0 for static WEP
7467 if( pSetKey->keyLength )
7468 {
7469 if ( pSetKey->keyLength < CSR_WEP104_KEY_LEN )
7470 {
7471 smsLog( pMac, LOGW, "Invalid WEP104 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7472 break;
7473 }
7474
7475 pCommand->u.setKeyCmd.keyLength = CSR_WEP104_KEY_LEN;
7476 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP104_KEY_LEN );
7477 }
7478 }
7479 else if ( eCSR_ENCRYPT_TYPE_TKIP == pSetKey->encType )
7480 {
7481 if ( pSetKey->keyLength < CSR_TKIP_KEY_LEN )
7482 {
7483 smsLog( pMac, LOGW, "Invalid TKIP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7484 break;
7485 }
7486 pCommand->u.setKeyCmd.keyLength = CSR_TKIP_KEY_LEN;
7487 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_TKIP_KEY_LEN );
7488 }
7489 else if ( eCSR_ENCRYPT_TYPE_AES == pSetKey->encType )
7490 {
7491 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7492 {
7493 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7494 break;
7495 }
7496 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7497 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7498 }
7499#ifdef FEATURE_WLAN_WAPI
7500 else if ( eCSR_ENCRYPT_TYPE_WPI == pSetKey->encType )
7501 {
7502 if ( pSetKey->keyLength < CSR_WAPI_KEY_LEN )
7503 {
7504 smsLog( pMac, LOGW, "Invalid WAPI keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7505 break;
7506 }
7507 pCommand->u.setKeyCmd.keyLength = CSR_WAPI_KEY_LEN;
7508 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WAPI_KEY_LEN );
7509 }
7510#endif /* FEATURE_WLAN_WAPI */
7511#ifdef FEATURE_WLAN_CCX
7512 else if ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7513 {
7514 if ( pSetKey->keyLength < CSR_KRK_KEY_LEN )
7515 {
7516 smsLog( pMac, LOGW, "Invalid KRK keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7517 break;
7518 }
7519 palCopyMemory( pMac->hHdd, pSession->ccxCckmInfo.krk, pSetKey->Key, CSR_KRK_KEY_LEN );
7520 pSession->ccxCckmInfo.reassoc_req_num=1;
7521 pSession->ccxCckmInfo.krk_plumbed = eANI_BOOLEAN_TRUE;
7522 status = eHAL_STATUS_SUCCESS;
7523 break;
7524 }
7525#endif /* FEATURE_WLAN_CCX */
Jeff Johnsone7245742012-09-05 17:12:55 -07007526
Jeff Johnson295189b2012-06-20 16:38:30 -07007527#ifdef WLAN_FEATURE_11W
7528 //Check for 11w BIP
7529 else if ( eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType )
7530 {
7531 tANI_U16 count = 0;
7532 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7533 {
7534 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7535 break;
7536 }
7537 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7538 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7539 }
7540#endif
7541 status = eHAL_STATUS_SUCCESS;
7542 pCommand->u.setKeyCmd.roamId = roamId;
7543 pCommand->u.setKeyCmd.encType = pSetKey->encType;
7544 pCommand->u.setKeyCmd.keyDirection = pSetKey->keyDirection; //Tx, Rx or Tx-and-Rx
7545 palCopyMemory( pMac->hHdd, &pCommand->u.setKeyCmd.peerMac, &pSetKey->peerMac, sizeof(tCsrBssid) );
7546 pCommand->u.setKeyCmd.paeRole = pSetKey->paeRole; //0 for supplicant
7547 pCommand->u.setKeyCmd.keyId = pSetKey->keyId;
7548 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.keyRsc, pSetKey->keyRsc, CSR_MAX_RSC_LEN );
7549 //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
7550
7551 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
7552 if( !HAL_STATUS_SUCCESS( status ) )
7553 {
7554 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7555 }
7556 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007557 // Free the command if there has been a failure, or it is a
7558 // "local" operation like the set CCX CCKM KRK key.
7559 if( (!HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ))
7560#ifdef FEATURE_WLAN_CCX
7561 || ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7562#endif /* FEATURE_WLAN_CCX */
7563 )
7564 {
7565 csrReleaseCommandSetKey( pMac, pCommand );
7566 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007567 return( status );
7568}
7569
Jeff Johnson295189b2012-06-20 16:38:30 -07007570eHalStatus csrRoamIssueRemoveKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7571 tCsrRoamRemoveKey *pRemoveKey, tANI_U32 roamId )
7572{
7573 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7574 tSmeCmd *pCommand = NULL;
7575 tANI_BOOLEAN fImediate = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07007576 do
7577 {
7578 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7579 {
7580 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7581 status = eHAL_STATUS_CSR_WRONG_STATE;
7582 break;
7583 }
7584 pCommand = csrGetCommandBuffer(pMac);
7585 if(NULL == pCommand)
7586 {
7587 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7588 status = eHAL_STATUS_RESOURCES;
7589 break;
7590 }
7591 pCommand->command = eSmeCommandRemoveKey;
7592 pCommand->sessionId = (tANI_U8)sessionId;
7593 pCommand->u.removeKeyCmd.roamId = roamId;
7594 pCommand->u.removeKeyCmd.encType = pRemoveKey->encType;
7595 palCopyMemory( pMac->hHdd, &pCommand->u.removeKeyCmd.peerMac, &pRemoveKey->peerMac, sizeof(tSirMacAddr) );
7596 pCommand->u.removeKeyCmd.keyId = pRemoveKey->keyId;
7597 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7598 {
7599 //in this case, put it to the end of the Q incase there is a set key pending.
7600 fImediate = eANI_BOOLEAN_FALSE;
7601 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007602 smsLog( pMac, LOGE, FL("keyType=%d, keyId=%d, PeerMac=%02x, %02x, %02x, %02x, %02x, %02x\n"),
7603 pRemoveKey->encType, pRemoveKey->keyId,
7604 pCommand->u.removeKeyCmd.peerMac[0],
7605 pCommand->u.removeKeyCmd.peerMac[1],
7606 pCommand->u.removeKeyCmd.peerMac[2],
7607 pCommand->u.removeKeyCmd.peerMac[3],
7608 pCommand->u.removeKeyCmd.peerMac[4],
7609 pCommand->u.removeKeyCmd.peerMac[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007610 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
7611 if( !HAL_STATUS_SUCCESS( status ) )
7612 {
7613 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7614 break;
7615 }
7616 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007617 if( !HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ) )
7618 {
7619 csrReleaseCommandRemoveKey( pMac, pCommand );
7620 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007621 return (status );
7622}
7623
Jeff Johnson295189b2012-06-20 16:38:30 -07007624eHalStatus csrRoamProcessSetKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7625{
7626 eHalStatus status;
7627 tANI_U8 numKeys = ( pCommand->u.setKeyCmd.keyLength ) ? 1 : 0;
7628 tAniEdType edType = csrTranslateEncryptTypeToEdType( pCommand->u.setKeyCmd.encType );
7629 tANI_BOOLEAN fUnicast = ( pCommand->u.setKeyCmd.peerMac[0] == 0xFF ) ? eANI_BOOLEAN_FALSE : eANI_BOOLEAN_TRUE;
7630 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007631#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7632 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7633 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007634 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7635 {
7636 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7637 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7638 {
7639 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_REQ;
7640 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7641 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7642 }
7643 else
7644 {
7645 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_REQ;
7646 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7647 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7648 }
7649 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7650 if(CSR_IS_ENC_TYPE_STATIC(edType))
7651 {
7652 tANI_U32 defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007653 //It has to be static WEP here
7654 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, &defKeyId)))
7655 {
7656 setKeyEvent.keyId = (v_U8_t)defKeyId;
7657 }
7658 }
7659 else
7660 {
7661 setKeyEvent.keyId = pCommand->u.setKeyCmd.keyId;
7662 }
7663 setKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7664 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7665 }
7666#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007667 if( csrIsSetKeyAllowed(pMac, sessionId) )
7668 {
7669 status = csrSendMBSetContextReqMsg( pMac, sessionId,
7670 ( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac,
7671 numKeys, edType, fUnicast, pCommand->u.setKeyCmd.keyDirection,
7672 pCommand->u.setKeyCmd.keyId, pCommand->u.setKeyCmd.keyLength,
7673 pCommand->u.setKeyCmd.Key, pCommand->u.setKeyCmd.paeRole,
7674 pCommand->u.setKeyCmd.keyRsc);
7675 }
7676 else
7677 {
7678 smsLog( pMac, LOGW, FL(" cannot process not connected\n") );
7679 //Set this status so the error handling take care of the case.
7680 status = eHAL_STATUS_CSR_WRONG_STATE;
7681 }
7682 if( !HAL_STATUS_SUCCESS(status) )
7683 {
7684 smsLog( pMac, LOGE, FL(" error status %d\n"), status );
7685 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.setKeyCmd.roamId, eCSR_ROAM_SET_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007686#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7687 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7688 {
7689 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7690 {
7691 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
7692 }
7693 else
7694 {
7695 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
7696 }
7697 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
7698 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7699 }
7700#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007701 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007702 return ( status );
7703}
7704
Jeff Johnson295189b2012-06-20 16:38:30 -07007705eHalStatus csrRoamProcessRemoveKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7706{
7707 eHalStatus status;
7708 tpSirSmeRemoveKeyReq pMsg = NULL;
7709 tANI_U16 wMsgLen = sizeof(tSirSmeRemoveKeyReq);
7710 tANI_U8 *p;
7711 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007712#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7713 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7714 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007715 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7716 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_REQ;
7717 removeKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7718 removeKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7719 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7720 removeKeyEvent.keyId = pCommand->u.removeKeyCmd.keyId;
7721 removeKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7722 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7723#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007724 if( csrIsSetKeyAllowed(pMac, sessionId) )
7725 {
7726 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, wMsgLen );
7727 }
7728 else
7729 {
7730 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7731 //Set the error status so error handling kicks in below
7732 status = eHAL_STATUS_CSR_WRONG_STATE;
7733 }
7734 if( HAL_STATUS_SUCCESS( status ) )
7735 {
7736 palZeroMemory(pMac->hHdd, pMsg, wMsgLen);
7737 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REMOVEKEY_REQ);
7738 pMsg->length = pal_cpu_to_be16(wMsgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -07007739 pMsg->sessionId = (tANI_U8)sessionId;
7740 pMsg->transactionId = 0;
7741 p = (tANI_U8 *)pMsg + sizeof(pMsg->messageType) + sizeof(pMsg->length) +
7742 sizeof(pMsg->sessionId) + sizeof(pMsg->transactionId);
7743 // bssId - copy from session Info
7744 palCopyMemory( pMac->hHdd, p, &pMac->roam.roamSession[sessionId].connectedProfile.bssid, sizeof(tSirMacAddr) );
7745 p += sizeof(tSirMacAddr);
7746 // peerMacAddr
7747 palCopyMemory( pMac->hHdd, p, pCommand->u.removeKeyCmd.peerMac, sizeof(tSirMacAddr) );
7748 p += sizeof(tSirMacAddr);
7749 // edType
7750 *p = (tANI_U8)csrTranslateEncryptTypeToEdType( pCommand->u.removeKeyCmd.encType );
7751 p++;
7752 // weptype
7753 if( ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pCommand->u.removeKeyCmd.encType ) ||
7754 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pCommand->u.removeKeyCmd.encType ) )
7755 {
7756 *p = (tANI_U8)eSIR_WEP_STATIC;
7757 }
7758 else
7759 {
7760 *p = (tANI_U8)eSIR_WEP_DYNAMIC;
7761 }
7762 p++;
7763 //keyid
7764 *p = pCommand->u.removeKeyCmd.keyId;
7765 p++;
7766 *p = (pCommand->u.removeKeyCmd.peerMac[0] == 0xFF ) ? 0 : 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07007767 status = palSendMBMessage(pMac->hHdd, pMsg);
7768 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007769 if( !HAL_STATUS_SUCCESS( status ) )
7770 {
7771 smsLog( pMac, LOGE, FL(" error status \n"), status );
Jeff Johnson295189b2012-06-20 16:38:30 -07007772#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7773 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
7774 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;;
7775 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7776#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007777 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.removeKeyCmd.roamId, eCSR_ROAM_REMOVE_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
7778 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007779 return ( status );
7780}
7781
Jeff Johnson295189b2012-06-20 16:38:30 -07007782eHalStatus csrRoamSetKey( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7783{
7784 eHalStatus status;
7785
7786 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7787 {
7788 status = eHAL_STATUS_CSR_WRONG_STATE;
7789 }
7790 else
7791 {
7792 status = csrRoamIssueSetKeyCommand( pMac, sessionId, pSetKey, roamId );
7793 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007794 return ( status );
7795}
7796
Jeff Johnson295189b2012-06-20 16:38:30 -07007797/*
7798 Prepare a filter base on a profile for parsing the scan results.
7799 Upon successful return, caller MUST call csrFreeScanFilter on
7800 pScanFilter when it is done with the filter.
7801*/
7802eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
7803 tCsrScanResultFilter *pScanFilter)
7804{
7805 eHalStatus status = eHAL_STATUS_SUCCESS;
7806 tANI_U32 size = 0;
7807 tANI_U8 index = 0;
7808
7809 do
7810 {
7811 if(pProfile->BSSIDs.numOfBSSIDs)
7812 {
7813 size = sizeof(tCsrBssid) * pProfile->BSSIDs.numOfBSSIDs;
7814 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, size);
7815 if(!HAL_STATUS_SUCCESS(status))
7816 {
7817 break;
7818 }
7819 pScanFilter->BSSIDs.numOfBSSIDs = pProfile->BSSIDs.numOfBSSIDs;
7820 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, pProfile->BSSIDs.bssid, size);
7821 }
7822 if(pProfile->SSIDs.numOfSSIDs)
7823 {
7824 if( !CSR_IS_WDS_STA( pProfile ) )
7825 {
7826 pScanFilter->SSIDs.numOfSSIDs = pProfile->SSIDs.numOfSSIDs;
7827 }
7828 else
7829 {
7830 //For WDS station
7831 //We always use index 1 for self SSID. Index 0 for peer's SSID that we want to join
7832 pScanFilter->SSIDs.numOfSSIDs = 1;
7833 }
7834 size = sizeof(tCsrSSIDInfo) * pProfile->SSIDs.numOfSSIDs;
7835 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, size);
7836 if(!HAL_STATUS_SUCCESS(status))
7837 {
7838 break;
7839 }
7840 palCopyMemory(pMac->hHdd, pScanFilter->SSIDs.SSIDList, pProfile->SSIDs.SSIDList, size);
7841 }
7842 if(!pProfile->ChannelInfo.ChannelList || (pProfile->ChannelInfo.ChannelList[0] == 0) )
7843 {
7844 pScanFilter->ChannelInfo.numOfChannels = 0;
7845 pScanFilter->ChannelInfo.ChannelList = NULL;
7846 }
7847 else if(pProfile->ChannelInfo.numOfChannels)
7848 {
7849 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->ChannelInfo.ChannelList, sizeof(*pScanFilter->ChannelInfo.ChannelList) * pProfile->ChannelInfo.numOfChannels);
7850 pScanFilter->ChannelInfo.numOfChannels = 0;
7851 if(HAL_STATUS_SUCCESS(status))
7852 {
7853 for(index = 0; index < pProfile->ChannelInfo.numOfChannels; index++)
7854 {
7855 if(csrRoamIsChannelValid(pMac, pProfile->ChannelInfo.ChannelList[index]))
7856 {
7857 pScanFilter->ChannelInfo.ChannelList[pScanFilter->ChannelInfo.numOfChannels]
7858 = pProfile->ChannelInfo.ChannelList[index];
7859 pScanFilter->ChannelInfo.numOfChannels++;
7860 }
7861 else
7862 {
7863 smsLog(pMac, LOG1, FL("process a channel (%d) that is invalid\n"), pProfile->ChannelInfo.ChannelList[index]);
7864 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007865 }
7866 }
7867 else
7868 {
7869 break;
7870 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007871 }
7872 else
7873 {
7874 smsLog(pMac, LOGW, FL("Channel list empty\n"));
7875 status = eHAL_STATUS_FAILURE;
7876 break;
7877 }
7878 pScanFilter->uapsd_mask = pProfile->uapsd_mask;
7879 pScanFilter->authType = pProfile->AuthType;
7880 pScanFilter->EncryptionType = pProfile->EncryptionType;
7881 pScanFilter->mcEncryptionType = pProfile->mcEncryptionType;
7882 pScanFilter->BSSType = pProfile->BSSType;
7883 pScanFilter->phyMode = pProfile->phyMode;
7884#ifdef FEATURE_WLAN_WAPI
7885 //check if user asked for WAPI with 11n or auto mode, in that case modify
7886 //the phymode to 11g
7887 if(csrIsProfileWapi(pProfile))
7888 {
7889 if(pScanFilter->phyMode & eCSR_DOT11_MODE_11n)
7890 {
7891 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_11n;
7892 }
7893 if(pScanFilter->phyMode & eCSR_DOT11_MODE_AUTO)
7894 {
7895 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_AUTO;
7896 }
7897 if(!pScanFilter->phyMode)
7898 {
7899 pScanFilter->phyMode = eCSR_DOT11_MODE_11g;
7900 }
7901 }
7902#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07007903 /*Save the WPS info*/
7904 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
Jeff Johnson295189b2012-06-20 16:38:30 -07007905 if( pProfile->countryCode[0] )
7906 {
7907 //This causes the matching function to use countryCode as one of the criteria.
7908 palCopyMemory( pMac->hHdd, pScanFilter->countryCode, pProfile->countryCode,
7909 WNI_CFG_COUNTRY_CODE_LEN );
7910 }
7911#ifdef WLAN_FEATURE_VOWIFI_11R
7912 if (pProfile->MDID.mdiePresent)
7913 {
7914 pScanFilter->MDID.mdiePresent = 1;
7915 pScanFilter->MDID.mobilityDomain = pProfile->MDID.mobilityDomain;
7916 }
7917#endif
7918
7919 }while(0);
7920
7921 if(!HAL_STATUS_SUCCESS(status))
7922 {
7923 csrFreeScanFilter(pMac, pScanFilter);
7924 }
7925
7926 return(status);
7927}
7928
Jeff Johnson295189b2012-06-20 16:38:30 -07007929tANI_BOOLEAN csrRoamIssueWmStatusChange( tpAniSirGlobal pMac, tANI_U32 sessionId,
7930 eCsrRoamWmStatusChangeTypes Type, tSirSmeRsp *pSmeRsp )
7931{
7932 tANI_BOOLEAN fCommandQueued = eANI_BOOLEAN_FALSE;
7933 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07007934 do
7935 {
7936 // Validate the type is ok...
7937 if ( ( eCsrDisassociated != Type ) && ( eCsrDeauthenticated != Type ) ) break;
7938 pCommand = csrGetCommandBuffer( pMac );
7939 if ( !pCommand )
7940 {
7941 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7942 break;
7943 }
7944 //Change the substate in case it is waiting for key
7945 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7946 {
7947 csrRoamStopWaitForKeyTimer( pMac );
7948 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
7949 }
7950 pCommand->command = eSmeCommandWmStatusChange;
7951 pCommand->sessionId = (tANI_U8)sessionId;
7952 pCommand->u.wmStatusChangeCmd.Type = Type;
7953 if ( eCsrDisassociated == Type )
7954 {
7955 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg, pSmeRsp,
7956 sizeof( pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg ) );
7957 }
7958 else
7959 {
7960 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg, pSmeRsp,
7961 sizeof( pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg ) );
7962 }
7963 if( HAL_STATUS_SUCCESS( csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE) ) )
7964 {
7965 fCommandQueued = eANI_BOOLEAN_TRUE;
7966 }
7967 else
7968 {
7969 smsLog( pMac, LOGE, FL(" fail to send message \n") );
7970 csrReleaseCommandWmStatusChange( pMac, pCommand );
7971 }
7972
Jeff Johnson295189b2012-06-20 16:38:30 -07007973 /* AP has issued Dissac/Deauth, Set the operating mode value to configured value */
7974 csrSetDefaultDot11Mode( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -07007975 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07007976 return( fCommandQueued );
7977}
7978
Jeff Johnson295189b2012-06-20 16:38:30 -07007979static void csrUpdateRssi(tpAniSirGlobal pMac, void* pMsg)
7980{
7981 v_S7_t rssi = 0;
7982 tAniGetRssiReq *pGetRssiReq = (tAniGetRssiReq*)pMsg;
7983 if(pGetRssiReq)
7984 {
7985 if(NULL != pGetRssiReq->pVosContext)
7986 {
7987 WLANTL_GetRssi(pGetRssiReq->pVosContext, pGetRssiReq->staId, &rssi);
7988 }
7989 else
7990 {
7991 smsLog( pMac, LOGE, FL("pGetRssiReq->pVosContext is NULL\n"));
7992 return;
7993 }
7994
7995 if(NULL != pGetRssiReq->rssiCallback)
7996 {
7997 ((tCsrRssiCallback)(pGetRssiReq->rssiCallback))(rssi, pGetRssiReq->staId, pGetRssiReq->pDevContext);
7998 }
7999 else
8000 {
8001 smsLog( pMac, LOGE, FL("pGetRssiReq->rssiCallback is NULL\n"));
8002 return;
8003 }
8004 }
8005 else
8006 {
8007 smsLog( pMac, LOGE, FL("pGetRssiReq is NULL\n"));
8008 }
8009 return;
8010}
Jeff Johnsone7245742012-09-05 17:12:55 -07008011static void csrRoamRssiIndHdlr(tpAniSirGlobal pMac, void* pMsg)
8012{
8013 WLANTL_TlIndicationReq *pTlRssiInd = (WLANTL_TlIndicationReq*)pMsg;
8014 if(pTlRssiInd)
8015 {
8016 if(NULL != pTlRssiInd->tlCallback)
8017 {
8018 ((WLANTL_RSSICrossThresholdCBType)(pTlRssiInd->tlCallback))
8019 (pTlRssiInd->pAdapter, pTlRssiInd->rssiNotification, pTlRssiInd->pUserCtxt);
8020 }
8021 else
8022 {
8023 smsLog( pMac, LOGE, FL("pTlRssiInd->tlCallback is NULL\n"));
8024 }
8025 }
8026 else
8027 {
8028 smsLog( pMac, LOGE, FL("pTlRssiInd is NULL\n"));
8029 }
8030 return;
8031}
Jeff Johnson295189b2012-06-20 16:38:30 -07008032
8033void csrRoamCheckForLinkStatusChange( tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg )
8034{
8035 tSirSmeAssocInd *pAssocInd;
8036 tSirSmeDisassocInd *pDisassocInd;
8037 tSirSmeDeauthInd *pDeauthInd;
8038 tSirSmeWmStatusChangeNtf *pStatusChangeMsg;
8039 tSirSmeNewBssInfo *pNewBss;
8040 tSmeIbssPeerInd *pIbssPeerInd;
8041 tSirMacAddr Broadcastaddr = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
8042 tSirSmeApNewCaps *pApNewCaps;
8043 eCsrRoamResult result = eCSR_ROAM_RESULT_NONE;
8044 eRoamCmdStatus roamStatus = eCSR_ROAM_FAILED;
8045 tCsrRoamInfo *pRoamInfo = NULL;
8046 tCsrRoamInfo roamInfo;
8047 eHalStatus status;
8048 tANI_U32 sessionId = CSR_SESSION_ID_INVALID;
8049 tCsrRoamSession *pSession = NULL;
8050 tpSirSmeSwitchChannelInd pSwitchChnInd;
8051 tSmeMaxAssocInd *pSmeMaxAssocInd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008052#if defined ANI_PRODUCT_TYPE_AP
8053 pSirMsg->messageType = pal_be16_to_cpu(pSirMsg->messageType);
8054 pSirMsg->length = pal_be16_to_cpu(pSirMsg->length);
8055 pSirMsg->statusCode = pal_be32_to_cpu(pSirMsg->statusCode);
8056#else
8057 pSirMsg->messageType = (pSirMsg->messageType);
8058 pSirMsg->length = (pSirMsg->length);
8059 pSirMsg->statusCode = (pSirMsg->statusCode);
8060#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008061 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
Jeff Johnson295189b2012-06-20 16:38:30 -07008062 switch( pSirMsg->messageType )
8063 {
8064 case eWNI_SME_ASSOC_IND:
8065 {
8066 tCsrRoamSession *pSession;
8067 smsLog( pMac, LOG1, FL("ASSOCIATION Indication from SME\n"));
8068 pAssocInd = (tSirSmeAssocInd *)pSirMsg;
8069 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pAssocInd->bssId, &sessionId );
8070 if( HAL_STATUS_SUCCESS( status ) )
8071 {
8072 pSession = CSR_GET_SESSION(pMac, sessionId);
8073
Jeff Johnson32d95a32012-09-10 13:15:23 -07008074 if(!pSession)
8075 {
8076 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8077 return;
8078 }
8079
Jeff Johnson295189b2012-06-20 16:38:30 -07008080 pRoamInfo = &roamInfo;
8081
8082 // Required for indicating the frames to upper layer
8083 pRoamInfo->assocReqLength = pAssocInd->assocReqLength;
8084 pRoamInfo->assocReqPtr = pAssocInd->assocReqPtr;
8085
8086 pRoamInfo->beaconPtr = pAssocInd->beaconPtr;
8087 pRoamInfo->beaconLength = pAssocInd->beaconLength;
8088 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
8089 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8090
8091 pRoamInfo->staId = (tANI_U8)pAssocInd->staId;
8092 pRoamInfo->rsnIELen = (tANI_U8)pAssocInd->rsnIE.length;
8093 pRoamInfo->prsnIE = pAssocInd->rsnIE.rsnIEdata;
8094
8095 pRoamInfo->addIELen = (tANI_U8)pAssocInd->addIE.length;
8096 pRoamInfo->paddIE = pAssocInd->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07008097 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
8098 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pAssocInd->bssId, sizeof(tCsrBssid));
8099#ifdef WLAN_SOFTAP_FEATURE
8100 pRoamInfo->wmmEnabledSta = pAssocInd->wmmEnabledSta;
8101 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8102#endif
8103 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
8104#ifdef WLAN_SOFTAP_FEATURE
8105 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile))
8106 {
8107 if( CSR_IS_ENC_TYPE_STATIC( pSession->pCurRoamProfile->negotiatedUCEncryptionType ))
8108 {
8109 csrRoamIssueSetContextReq( pMac, sessionId, pSession->pCurRoamProfile->negotiatedUCEncryptionType,
8110 pSession->pConnectBssDesc,
8111 &(pRoamInfo->peerMac),
8112 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8113 pRoamInfo->fAuthRequired = FALSE;
8114 }
8115 else
8116 {
8117 pRoamInfo->fAuthRequired = TRUE;
8118 }
8119 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_IND);
8120 if (!HAL_STATUS_SUCCESS(status))
8121 pRoamInfo->statusCode = eSIR_SME_ASSOC_REFUSED;// Refused due to Mac filtering
8122 }
8123#endif
8124 /* Send Association completion message to PE */
8125 status = csrSendAssocCnfMsg( pMac, pAssocInd, status );//Sta
8126
8127 /* send a message to CSR itself just to avoid the EAPOL frames going
8128 * OTA before association response */
Jeff Johnson295189b2012-06-20 16:38:30 -07008129 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8130 {
8131 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8132 }
8133#ifdef WLAN_SOFTAP_FEATURE
8134 else if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) && (pRoamInfo->statusCode != eSIR_SME_ASSOC_REFUSED))
8135 {
8136 pRoamInfo->fReassocReq = pAssocInd->reassocReq;
8137 //status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
8138 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8139 }
8140#endif
8141 }
8142 }
8143 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008144 case eWNI_SME_DISASSOC_IND:
8145 smsLog( pMac, LOGE, FL("DISASSOCIATION Indication from MAC\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008146 // Check if AP dis-associated us because of MIC failure. If so,
8147 // then we need to take action immediately and not wait till the
8148 // the WmStatusChange requests is pushed and processed
8149 pDisassocInd = (tSirSmeDisassocInd *)pSirMsg;
8150 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDisassocInd->bssId, &sessionId );
8151 if( HAL_STATUS_SUCCESS( status ) )
8152 {
8153 // If we are in neighbor preauth done state then on receiving
8154 // disassoc or deauth we dont roam instead we just disassoc
8155 // from current ap and then go to disconnected state
8156 // This happens for CCX and 11r FT connections ONLY.
8157#ifdef WLAN_FEATURE_VOWIFI_11R
8158 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8159 {
8160 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8161 }
8162#endif
8163#ifdef FEATURE_WLAN_CCX
8164 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8165 {
8166 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8167 }
8168#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008169#ifdef FEATURE_WLAN_LFR
8170 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8171 {
8172 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8173 }
8174#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008175 pSession = CSR_GET_SESSION( pMac, sessionId );
8176
Jeff Johnson32d95a32012-09-10 13:15:23 -07008177 if(!pSession)
8178 {
8179 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8180 return;
8181 }
8182
Jeff Johnson295189b2012-06-20 16:38:30 -07008183 if ( csrIsConnStateInfra( pMac, sessionId ) )
8184 {
8185 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8186 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008187#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8188 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8189#endif
8190 csrRoamLinkDown(pMac, sessionId);
8191 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDisassociated, pSirMsg );
8192#ifdef WLAN_SOFTAP_FEATURE
8193 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8194 {
8195
8196 pRoamInfo = &roamInfo;
8197
8198 pRoamInfo->statusCode = pDisassocInd->statusCode;
8199 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8200
8201 pRoamInfo->staId = (tANI_U8)pDisassocInd->staId;
8202
8203 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocInd->peerMacAddr, sizeof(tSirMacAddr));
8204 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDisassocInd->bssId, sizeof(tCsrBssid));
8205
8206 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DISASSOC_IND);
8207 }
8208#endif
8209 }
8210 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008211 case eWNI_SME_DEAUTH_IND:
8212 smsLog( pMac, LOG1, FL("DEAUTHENTICATION Indication from MAC\n"));
8213 pDeauthInd = (tpSirSmeDeauthInd)pSirMsg;
8214 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDeauthInd->bssId, &sessionId );
8215 if( HAL_STATUS_SUCCESS( status ) )
8216 {
8217 // If we are in neighbor preauth done state then on receiving
8218 // disassoc or deauth we dont roam instead we just disassoc
8219 // from current ap and then go to disconnected state
8220 // This happens for CCX and 11r FT connections ONLY.
8221#ifdef WLAN_FEATURE_VOWIFI_11R
8222 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8223 {
8224 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8225 }
8226#endif
8227#ifdef FEATURE_WLAN_CCX
8228 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8229 {
8230 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8231 }
8232#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008233#ifdef FEATURE_WLAN_LFR
8234 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8235 {
8236 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8237 }
8238#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008239 pSession = CSR_GET_SESSION( pMac, sessionId );
8240
Jeff Johnson32d95a32012-09-10 13:15:23 -07008241 if(!pSession)
8242 {
8243 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8244 return;
8245 }
8246
Jeff Johnson295189b2012-06-20 16:38:30 -07008247 if ( csrIsConnStateInfra( pMac, sessionId ) )
8248 {
8249 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8250 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008251#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8252 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8253#endif
8254 csrRoamLinkDown(pMac, sessionId);
8255 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDeauthenticated, pSirMsg );
8256#ifdef WLAN_SOFTAP_FEATURE
8257 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8258 {
8259
8260 pRoamInfo = &roamInfo;
8261
8262 pRoamInfo->statusCode = pDeauthInd->statusCode;
8263 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8264
8265 pRoamInfo->staId = (tANI_U8)pDeauthInd->staId;
8266
8267 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthInd->peerMacAddr, sizeof(tSirMacAddr));
8268 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDeauthInd->bssId, sizeof(tCsrBssid));
8269
8270 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DEAUTH_IND);
8271 }
8272#endif
8273 }
8274 break;
8275
8276 case eWNI_SME_SWITCH_CHL_REQ: // in case of STA, the SWITCH_CHANNEL originates from its AP
8277 smsLog( pMac, LOGW, FL("eWNI_SME_SWITCH_CHL_REQ from SME\n"));
8278 pSwitchChnInd = (tpSirSmeSwitchChannelInd)pSirMsg;
8279 //Update with the new channel id.
8280 //The channel id is hidden in the statusCode.
8281 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pSwitchChnInd->bssId, &sessionId );
8282 if( HAL_STATUS_SUCCESS( status ) )
8283 {
8284 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008285 if(!pSession)
8286 {
8287 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8288 return;
8289 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008290 pSession->connectedProfile.operationChannel = (tANI_U8)pSwitchChnInd->newChannelId;
8291 if(pSession->pConnectBssDesc)
8292 {
8293 pSession->pConnectBssDesc->channelId = (tANI_U8)pSwitchChnInd->newChannelId;
8294 }
8295 }
8296 break;
8297
8298 case eWNI_SME_DEAUTH_RSP:
8299 smsLog( pMac, LOGW, FL("eWNI_SME_DEAUTH_RSP from SME\n"));
8300#ifdef WLAN_SOFTAP_FEATURE
8301 {
8302 tSirSmeDeauthRsp* pDeauthRsp = (tSirSmeDeauthRsp *)pSirMsg;
8303 sessionId = pDeauthRsp->sessionId;
8304 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8305 {
8306 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008307 if(!pSession)
8308 {
8309 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8310 return;
8311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008312 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8313 {
8314 pRoamInfo = &roamInfo;
8315 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8316 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthRsp->peerMacAddr, sizeof(tSirMacAddr));
8317 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8318 pRoamInfo->statusCode = pDeauthRsp->statusCode;
8319 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8320 }
8321 }
8322 }
8323#endif
8324 break;
8325
8326 case eWNI_SME_DISASSOC_RSP:
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07008327 /* session id is invalid here so cant use it to access the array curSubstate as index */
8328 smsLog( pMac, LOGW, FL("eWNI_SME_DISASSOC_RSP from SME \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008329#ifdef WLAN_SOFTAP_FEATURE
8330 {
8331 tSirSmeDisassocRsp *pDisassocRsp = (tSirSmeDisassocRsp *)pSirMsg;
8332 sessionId = pDisassocRsp->sessionId;
8333 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8334 {
8335 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008336 if(!pSession)
8337 {
8338 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8339 return;
8340 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008341 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8342 {
8343 pRoamInfo = &roamInfo;
8344 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8345 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocRsp->peerMacAddr, sizeof(tSirMacAddr));
8346 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8347 pRoamInfo->statusCode = pDisassocRsp->statusCode;
8348 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8349 }
8350 }
8351 }
8352#endif
8353 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008354 case eWNI_SME_MIC_FAILURE_IND:
8355 {
8356 tpSirSmeMicFailureInd pMicInd = (tpSirSmeMicFailureInd)pSirMsg;
8357 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
8358 eCsrRoamResult result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
Jeff Johnson295189b2012-06-20 16:38:30 -07008359#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8360 {
8361 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008362 if(!pSession)
8363 {
8364 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8365 return;
8366 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008367 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
8368 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
8369 secEvent.eventId = WLAN_SECURITY_EVENT_MIC_ERROR;
8370 secEvent.encryptionModeMulticast =
8371 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8372 secEvent.encryptionModeUnicast =
8373 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8374 secEvent.authMode =
8375 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8376 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
8377 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
8378 }
8379#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008380 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pMicInd->bssId, &sessionId );
8381 if( HAL_STATUS_SUCCESS( status ) )
8382 {
8383 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8384 roamInfo.u.pMICFailureInfo = &pMicInd->info;
8385 pRoamInfo = &roamInfo;
8386 if(pMicInd->info.multicast)
8387 {
8388 result = eCSR_ROAM_RESULT_MIC_ERROR_GROUP;
8389 }
8390 else
8391 {
8392 result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
8393 }
8394 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_MIC_ERROR_IND, result);
8395 }
8396 }
8397 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008398#ifdef WLAN_SOFTAP_FEATURE
8399 case eWNI_SME_WPS_PBC_PROBE_REQ_IND:
8400 {
8401 tpSirSmeProbeReqInd pProbeReqInd = (tpSirSmeProbeReqInd)pSirMsg;
8402 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008403 smsLog( pMac, LOG1, FL("WPS PBC Probe request Indication from SME\n"));
8404
8405 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pProbeReqInd->bssId, &sessionId );
8406 if( HAL_STATUS_SUCCESS( status ) )
8407 {
8408 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8409 roamInfo.u.pWPSPBCProbeReq = &pProbeReqInd->WPSPBCProbeReq;
8410 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_WPS_PBC_PROBE_REQ_IND,
8411 eCSR_ROAM_RESULT_WPS_PBC_PROBE_REQ_IND);
8412 }
8413 }
8414 break;
8415#endif
8416
Jeff Johnson295189b2012-06-20 16:38:30 -07008417 case eWNI_SME_WM_STATUS_CHANGE_NTF:
8418 pStatusChangeMsg = (tSirSmeWmStatusChangeNtf *)pSirMsg;
8419 switch( pStatusChangeMsg->statusChangeCode )
8420 {
8421 case eSIR_SME_IBSS_ACTIVE:
8422 sessionId = csrFindIbssSession( pMac );
8423 if( CSR_SESSION_ID_INVALID != sessionId )
8424 {
8425 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008426 if(!pSession)
8427 {
8428 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8429 return;
8430 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008431 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED;
8432 if(pSession->pConnectBssDesc)
8433 {
8434 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8435 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
8436 pRoamInfo = &roamInfo;
8437 }
8438 else
8439 {
8440 smsLog(pMac, LOGE, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8441 }
8442 result = eCSR_ROAM_RESULT_IBSS_CONNECT;
8443 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8444 }
8445 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008446 case eSIR_SME_IBSS_INACTIVE:
8447 sessionId = csrFindIbssSession( pMac );
8448 if( CSR_SESSION_ID_INVALID != sessionId )
8449 {
8450 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008451 if(!pSession)
8452 {
8453 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8454 return;
8455 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008456 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
8457 result = eCSR_ROAM_RESULT_IBSS_INACTIVE;
8458 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8459 }
8460 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008461 case eSIR_SME_JOINED_NEW_BSS: // IBSS coalescing.
8462 sessionId = csrFindIbssSession( pMac );
8463 if( CSR_SESSION_ID_INVALID != sessionId )
8464 {
8465 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008466 if(!pSession)
8467 {
8468 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8469 return;
8470 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008471 // update the connection state information
8472 pNewBss = &pStatusChangeMsg->statusChangeInfo.newBssInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008473#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8474 {
8475 vos_log_ibss_pkt_type *pIbssLog;
8476 tANI_U32 bi;
Jeff Johnson295189b2012-06-20 16:38:30 -07008477 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8478 if(pIbssLog)
8479 {
8480 pIbssLog->eventId = WLAN_IBSS_EVENT_COALESCING;
8481 if(pNewBss)
8482 {
8483 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pNewBss->bssId, 6);
8484 if(pNewBss->ssId.length)
8485 {
8486 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pNewBss->ssId.ssId, pNewBss->ssId.length);
8487 }
8488 pIbssLog->operatingChannel = pNewBss->channelNumber;
8489 }
8490 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
8491 {
8492 //***U8 is not enough for beacon interval
8493 pIbssLog->beaconInterval = (v_U8_t)bi;
8494 }
8495 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8496 }
8497 }
8498#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008499 csrRoamUpdateConnectedProfileFromNewBss( pMac, sessionId, pNewBss );
8500 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8501 pSession->pConnectBssDesc,
8502 &Broadcastaddr,
8503 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 );
8504 result = eCSR_ROAM_RESULT_IBSS_COALESCED;
8505 roamStatus = eCSR_ROAM_IBSS_IND;
8506 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pNewBss->bssId, sizeof(tCsrBssid));
8507 pRoamInfo = &roamInfo;
8508 //This BSSID is th ereal BSSID, let's save it
8509 if(pSession->pConnectBssDesc)
8510 {
8511 palCopyMemory(pMac->hHdd, pSession->pConnectBssDesc->bssId, &pNewBss->bssId, sizeof(tCsrBssid));
8512 }
8513 // Stop the join IBSS timer in case of join, for
8514 // genuine merge do nothing
8515 if(pSession->ibss_join_pending)
8516 {
8517 pSession->ibss_join_pending = FALSE;
8518 csrRoamStopIbssJoinTimer(pMac, sessionId);
8519 result = eCSR_ROAM_RESULT_IBSS_JOIN_SUCCESS;
8520 }
8521 }
8522 smsLog(pMac, LOGW, "CSR: eSIR_SME_JOINED_NEW_BSS received from PE\n");
8523 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008524 // detection by LIM that the capabilities of the associated AP have changed.
8525 case eSIR_SME_AP_CAPS_CHANGED:
8526 pApNewCaps = &pStatusChangeMsg->statusChangeInfo.apNewCaps;
8527 smsLog(pMac, LOGW, "CSR handling eSIR_SME_AP_CAPS_CHANGED\n");
8528 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pApNewCaps->bssId, &sessionId );
8529 if( HAL_STATUS_SUCCESS( status ) )
8530 {
8531 csrScanForCapabilityChange( pMac, pApNewCaps );
8532 result = eCSR_ROAM_RESULT_CAP_CHANGED;
8533 roamStatus = eCSR_ROAM_GEN_INFO;
8534 }
8535 break;
8536
8537 default:
8538 roamStatus = eCSR_ROAM_FAILED;
8539 result = eCSR_ROAM_RESULT_NONE;
8540 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008541 } // end switch on statusChangeCode
8542 if(eCSR_ROAM_RESULT_NONE != result)
8543 {
8544 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, roamStatus, result);
8545 }
8546 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008547 case eWNI_SME_IBSS_NEW_PEER_IND:
8548 pIbssPeerInd = (tSmeIbssPeerInd *)pSirMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07008549#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8550 {
8551 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07008552 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8553 if(pIbssLog)
8554 {
8555 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_JOIN;
8556 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8557 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8558 }
8559 }
8560#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008561 sessionId = csrFindIbssSession( pMac );
8562 if( CSR_SESSION_ID_INVALID != sessionId )
8563 {
8564 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008565
8566 if(!pSession)
8567 {
8568 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8569 return;
8570 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008571 // Issue the set Context request to LIM to establish the Unicast STA context for the new peer...
8572 if(pSession->pConnectBssDesc)
8573 {
8574 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8575 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8576 if(pIbssPeerInd->mesgLen > sizeof(tSmeIbssPeerInd))
8577 {
8578 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pbFrames,
8579 (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd)));
8580 if(HAL_STATUS_SUCCESS(status))
8581 {
8582 roamInfo.nBeaconLength = (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd));
8583 palCopyMemory(pMac->hHdd, roamInfo.pbFrames, ((tANI_U8 *)pIbssPeerInd) + sizeof(tSmeIbssPeerInd),
8584 roamInfo.nBeaconLength);
8585 }
8586 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8587 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8588 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8589 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pBssDesc,
8590 pSession->pConnectBssDesc->length);
8591 if(HAL_STATUS_SUCCESS(status))
8592 {
8593 palCopyMemory(pMac->hHdd, roamInfo.pBssDesc, pSession->pConnectBssDesc,
8594 pSession->pConnectBssDesc->length);
8595 }
8596 if(HAL_STATUS_SUCCESS(status))
8597 {
8598 pRoamInfo = &roamInfo;
8599 }
8600 else
8601 {
8602 if(roamInfo.pbFrames)
8603 {
8604 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8605 }
8606 if(roamInfo.pBssDesc)
8607 {
8608 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8609 }
8610 }
8611 }
8612 else
8613 {
8614 pRoamInfo = &roamInfo;
8615 }
8616 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8617 pSession->pConnectBssDesc,
8618 &(pIbssPeerInd->peerAddr),
8619 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8620 }
8621 else
8622 {
8623 smsLog(pMac, LOGW, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8624 }
8625 //send up the sec type for the new peer
8626 if (pRoamInfo)
8627 {
8628 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8629 }
8630 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0,
8631 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_NEW_PEER);
8632 if(pRoamInfo)
8633 {
8634 if(roamInfo.pbFrames)
8635 {
8636 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8637 }
8638 if(roamInfo.pBssDesc)
8639 {
8640 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8641 }
8642 }
8643 }
8644 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008645 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
8646 pIbssPeerInd = (tSmeIbssPeerInd*)pSirMsg;
8647 sessionId = csrFindIbssSession( pMac );
8648 if( CSR_SESSION_ID_INVALID != sessionId )
8649 {
Jeff Johnson295189b2012-06-20 16:38:30 -07008650#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8651 {
8652 vos_log_ibss_pkt_type *pIbssLog;
8653
8654 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8655 if(pIbssLog)
8656 {
8657 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_LEAVE;
8658 if(pIbssPeerInd)
8659 {
8660 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8661 }
8662 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8663 }
8664 }
8665#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008666 smsLog(pMac, LOGW, "CSR: Peer departed notification from LIM\n");
8667 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8668 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8669 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8670 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8671 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8672 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
8673 }
8674 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008675 case eWNI_SME_SETCONTEXT_RSP:
8676 {
8677 tSirSmeSetContextRsp *pRsp = (tSirSmeSetContextRsp *)pSirMsg;
8678 tListElem *pEntry;
8679 tSmeCmd *pCommand;
8680
8681 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8682 if ( pEntry )
8683 {
8684 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8685 if ( eSmeCommandSetKey == pCommand->command )
8686 {
8687 sessionId = pCommand->sessionId;
8688 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008689
8690 if(!pSession)
8691 {
8692 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8693 return;
8694 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008695
8696#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8697 if(eCSR_ENCRYPT_TYPE_NONE != pSession->connectedProfile.EncryptionType)
8698 {
8699 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
8700 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8701 if( pRsp->peerMacAddr[0] & 0x01 )
8702 {
8703 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
8704 }
8705 else
8706 {
8707 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
8708 }
8709 setKeyEvent.encryptionModeMulticast =
8710 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8711 setKeyEvent.encryptionModeUnicast =
8712 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8713 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8714 setKeyEvent.authMode =
8715 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8716 if( eSIR_SUCCESS != pRsp->statusCode )
8717 {
8718 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8719 }
8720 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
8721 }
8722#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
8723 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
8724 {
8725 //We are done with authentication, whethere succeed or not
8726 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
8727
8728 csrRoamStopWaitForKeyTimer( pMac );
8729 //We do it here because this linkup function is not called after association
8730 //when a key needs to be set.
8731 if( csrIsConnStateConnectedInfra(pMac, sessionId) )
8732 {
8733 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
8734 }
8735 }
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) );
Jeff Johnsone7245742012-09-05 17:12:55 -07008739 //Make sure we install the GTK before indicating to HDD as authenticated
8740 //This is to prevent broadcast packets go out after PTK and before GTK.
8741 if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr,
8742 sizeof(tSirMacAddr) ) )
8743 {
8744 result = eCSR_ROAM_RESULT_AUTHENTICATED;
8745 }
8746 else
8747 {
8748 result = eCSR_ROAM_RESULT_NONE;
8749 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008750 pRoamInfo = &roamInfo;
8751 }
8752 else
8753 {
8754 result = eCSR_ROAM_RESULT_FAILURE;
8755 smsLog( pMac, LOGE, "CSR: Roam Completion setkey command failed(%d) PeerMac %02X-%02X-%02X-%02X-%02X-%02X...\n",
8756 pRsp->statusCode, pRsp->peerMacAddr[0], pRsp->peerMacAddr[1], pRsp->peerMacAddr[2],
8757 pRsp->peerMacAddr[3], pRsp->peerMacAddr[4], pRsp->peerMacAddr[5] );
8758 }
8759 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8760 eCSR_ROAM_SET_KEY_COMPLETE, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07008761 // Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS
8762 // can go ahead and initiate the TSPEC if any are pending
8763 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -07008764#ifdef FEATURE_WLAN_CCX
8765 //Send Adjacent AP repot to new AP.
8766 if (result == eCSR_ROAM_RESULT_AUTHENTICATED &&
8767 pSession->isPrevApInfoValid &&
8768 pSession->connectedProfile.isCCXAssoc)
8769 {
8770#ifdef WLAN_FEATURE_VOWIFI
8771 csrCcxSendAdjacentApRepMsg(pMac, pSession);
8772#endif
8773 pSession->isPrevApInfoValid = FALSE;
8774 }
8775#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008776 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8777 {
8778 csrReleaseCommandSetKey( pMac, pCommand );
8779 }
8780 }
8781 else
8782 {
8783 smsLog( pMac, LOGE, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8784 }
8785 }
8786 else
8787 {
8788 smsLog( pMac, LOGE, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8789 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008790 smeProcessPendingQueue( pMac );
8791 }
8792 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008793 case eWNI_SME_REMOVEKEY_RSP:
8794 {
8795 tSirSmeRemoveKeyRsp *pRsp = (tSirSmeRemoveKeyRsp *)pSirMsg;
8796 tListElem *pEntry;
8797 tSmeCmd *pCommand;
8798
8799 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8800 if ( pEntry )
8801 {
8802 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8803 if ( eSmeCommandRemoveKey == pCommand->command )
8804 {
8805 sessionId = pCommand->sessionId;
8806 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008807
8808 if(!pSession)
8809 {
8810 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8811 return;
8812 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008813#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8814 {
8815 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
8816 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8817 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
8818 removeKeyEvent.encryptionModeMulticast =
8819 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8820 removeKeyEvent.encryptionModeUnicast =
8821 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8822 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8823 removeKeyEvent.authMode =
8824 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8825 if( eSIR_SUCCESS != pRsp->statusCode )
8826 {
8827 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8828 }
8829 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
8830 }
8831#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson43971f52012-07-17 12:26:56 -07008832 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008833 {
8834 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
8835 result = eCSR_ROAM_RESULT_NONE;
8836 pRoamInfo = &roamInfo;
8837 }
8838 else
8839 {
8840 result = eCSR_ROAM_RESULT_FAILURE;
8841 }
8842 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8843 eCSR_ROAM_REMOVE_KEY_COMPLETE, result);
8844 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8845 {
8846 csrReleaseCommandRemoveKey( pMac, pCommand );
8847 }
8848 }
8849 else
8850 {
8851 smsLog( pMac, LOGW, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8852 }
8853 }
8854 else
8855 {
8856 smsLog( pMac, LOGW, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8857 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008858 smeProcessPendingQueue( pMac );
8859 }
8860 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008861 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07008862 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008863 csrRoamStatsRspProcessor( pMac, pSirMsg );
8864 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008865 case eWNI_SME_GET_RSSI_REQ:
Mohit Khanna23863762012-09-11 17:40:09 -07008866 smsLog( pMac, LOG2, FL("GetRssiReq from self\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008867 csrUpdateRssi( pMac, pSirMsg );
8868 break;
8869
Jeff Johnson295189b2012-06-20 16:38:30 -07008870#ifdef WLAN_FEATURE_VOWIFI_11R
8871 case eWNI_SME_FT_PRE_AUTH_RSP:
8872 csrRoamFTPreAuthRspProcessor( pMac, (tpSirFTPreAuthRsp)pSirMsg );
8873 break;
8874#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008875 case eWNI_SME_MAX_ASSOC_EXCEEDED:
8876 pSmeMaxAssocInd = (tSmeMaxAssocInd*)pSirMsg;
8877 smsLog( pMac, LOG1, FL("send indication that max assoc have been reached and the new peer cannot be accepted\n"));
8878 sessionId = pSmeMaxAssocInd->sessionId;
8879 roamInfo.sessionId = sessionId;
8880 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pSmeMaxAssocInd->peerMac, sizeof(tCsrBssid));
8881 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8882 eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED);
8883 break;
8884
8885 case eWNI_SME_BTAMP_LOG_LINK_IND:
8886 smsLog( pMac, LOG1, FL("Establish logical link req from HCI serialized through MC thread\n"));
8887 btampEstablishLogLinkHdlr( pSirMsg );
8888 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07008889 case eWNI_SME_RSSI_IND:
8890 smsLog( pMac, LOG1, FL("RSSI indication from TL serialized through MC thread\n"));
8891 csrRoamRssiIndHdlr( pMac, pSirMsg );
8892 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008893
8894 default:
8895 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008896 } // end switch on message type
Jeff Johnson295189b2012-06-20 16:38:30 -07008897}
8898
Jeff Johnson295189b2012-06-20 16:38:30 -07008899void csrCallRoamingCompletionCallback(tpAniSirGlobal pMac, tCsrRoamSession *pSession,
8900 tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, eCsrRoamResult roamResult)
8901{
8902 if(pSession)
8903 {
8904 if(pSession->bRefAssocStartCnt)
8905 {
8906 pSession->bRefAssocStartCnt--;
8907 VOS_ASSERT( pSession->bRefAssocStartCnt == 0);
8908 //Need to call association_completion because there is an assoc_start pending.
8909 csrRoamCallCallback(pMac, pSession->sessionId, NULL, roamId,
8910 eCSR_ROAM_ASSOCIATION_COMPLETION,
8911 eCSR_ROAM_RESULT_FAILURE);
8912 }
8913 csrRoamCallCallback(pMac, pSession->sessionId, pRoamInfo, roamId, eCSR_ROAM_ROAMING_COMPLETION, roamResult);
8914 }
8915 else
8916 {
8917 smsLog(pMac, LOGW, FL(" pSession is NULL"));
8918 }
8919}
8920
8921
8922eHalStatus csrRoamStartRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamingReason roamingReason)
8923{
8924 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07008925 if(CSR_IS_LOSTLINK_ROAMING(roamingReason) &&
8926 (eANI_BOOLEAN_FALSE == pMac->roam.roamSession[sessionId].fCancelRoaming))
8927 {
8928 status = csrScanRequestLostLink1( pMac, sessionId );
8929 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008930 return(status);
8931}
8932
Jeff Johnson295189b2012-06-20 16:38:30 -07008933//return a boolean to indicate whether roaming completed or continue.
8934tANI_BOOLEAN csrRoamCompleteRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId,
8935 tANI_BOOLEAN fForce, eCsrRoamResult roamResult)
8936{
8937 tANI_BOOLEAN fCompleted = eANI_BOOLEAN_TRUE;
8938 tANI_TIMESTAMP roamTime = (tANI_TIMESTAMP)(pMac->roam.configParam.nRoamingTime * PAL_TICKS_PER_SECOND);
8939 tANI_TIMESTAMP curTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
8940 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07008941 if(!pSession)
8942 {
8943 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8944 return eANI_BOOLEAN_FALSE;
8945 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008946 //Check whether time is up
8947 if(pSession->fCancelRoaming || fForce ||
8948 ((curTime - pSession->roamingStartTime) > roamTime) ||
8949 eCsrReassocRoaming == pSession->roamingReason ||
8950 eCsrDynamicRoaming == pSession->roamingReason)
8951 {
8952 smsLog(pMac, LOGW, FL(" indicates roaming completion\n"));
8953 if(pSession->fCancelRoaming && CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason))
8954 {
8955 //roaming is cancelled, tell HDD to indicate disconnect
8956 //Because LIM overload deauth_ind for both deauth frame and missed beacon
8957 //we need to use this logic to detinguish it. For missed beacon, LIM set reason
8958 //to be eSIR_BEACON_MISSED
8959 if(eSIR_BEACON_MISSED == pSession->roamingStatusCode)
8960 {
8961 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8962 }
8963 else if(eCsrLostlinkRoamingDisassoc == pSession->roamingReason)
8964 {
8965 roamResult = eCSR_ROAM_RESULT_DISASSOC_IND;
8966 }
8967 else if(eCsrLostlinkRoamingDeauth == pSession->roamingReason)
8968 {
8969 roamResult = eCSR_ROAM_RESULT_DEAUTH_IND;
8970 }
8971 else
8972 {
8973 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8974 }
8975 }
8976 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8977 pSession->roamingReason = eCsrNotRoaming;
8978 }
8979 else
8980 {
8981 pSession->roamResult = roamResult;
8982 if(!HAL_STATUS_SUCCESS(csrRoamStartRoamingTimer(pMac, sessionId, PAL_TIMER_TO_SEC_UNIT)))
8983 {
8984 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8985 pSession->roamingReason = eCsrNotRoaming;
8986 }
8987 else
8988 {
8989 fCompleted = eANI_BOOLEAN_FALSE;
8990 }
8991 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008992 return(fCompleted);
8993}
8994
Jeff Johnson295189b2012-06-20 16:38:30 -07008995void csrRoamCancelRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId)
8996{
8997 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008998
8999 if(!pSession)
9000 {
9001 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9002 return;
9003 }
9004
Jeff Johnson295189b2012-06-20 16:38:30 -07009005 if(CSR_IS_ROAMING(pSession))
9006 {
9007 smsLog(pMac, LOGW, " Cancelling roaming\n");
9008 pSession->fCancelRoaming = eANI_BOOLEAN_TRUE;
9009 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
9010 {
9011 //No need to do anything in here because the handler takes care of it
9012 }
9013 else
9014 {
9015 eCsrRoamResult roamResult = CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason) ?
9016 eCSR_ROAM_RESULT_LOSTLINK : eCSR_ROAM_RESULT_NONE;
9017 //Roaming is stopped after here
9018 csrRoamCompleteRoaming(pMac, sessionId, eANI_BOOLEAN_TRUE, roamResult);
9019 //Since CSR may be in lostlink roaming situation, abort all roaming related activities
9020 csrScanAbortMacScan(pMac);
9021 csrRoamStopRoamingTimer(pMac, sessionId);
9022 }
9023 }
9024}
9025
Jeff Johnson295189b2012-06-20 16:38:30 -07009026void csrRoamRoamingTimerHandler(void *pv)
9027{
9028 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9029 tpAniSirGlobal pMac = pInfo->pMac;
9030 tANI_U32 sessionId = pInfo->sessionId;
9031 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009032
9033 if(!pSession)
9034 {
9035 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9036 return;
9037 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009038
9039 if(eANI_BOOLEAN_FALSE == pSession->fCancelRoaming)
9040 {
9041 if(!HAL_STATUS_SUCCESS(csrRoamStartRoaming(pMac, sessionId, pSession->roamingReason)))
9042 {
9043 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, pSession->roamResult);
9044 pSession->roamingReason = eCsrNotRoaming;
9045 }
9046 }
9047}
9048
Jeff Johnson295189b2012-06-20 16:38:30 -07009049eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9050{
9051 eHalStatus status;
9052 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009053
9054 if(!pSession)
9055 {
9056 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9057 return eHAL_STATUS_FAILURE;
9058 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009059
9060 smsLog(pMac, LOG1, " csrScanStartRoamingTimer \n ");
9061 pSession->roamingTimerInfo.sessionId = (tANI_U8)sessionId;
9062 status = palTimerStart(pMac->hHdd, pSession->hTimerRoaming, interval, eANI_BOOLEAN_FALSE);
9063
9064 return (status);
9065}
9066
Jeff Johnson295189b2012-06-20 16:38:30 -07009067eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9068{
9069 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerRoaming));
9070}
9071
Jeff Johnson295189b2012-06-20 16:38:30 -07009072void csrRoamWaitForKeyTimeOutHandler(void *pv)
9073{
9074 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9075 tpAniSirGlobal pMac = pInfo->pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07009076 if( CSR_IS_WAIT_FOR_KEY( pMac, pInfo->sessionId ) )
9077 {
9078 smsLog(pMac, LOGW, " SME pre-auth state timeout. \n ");
9079 //Change the substate so command queue is unblocked.
9080 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, pInfo->sessionId);
9081 }
9082
9083}
9084
Jeff Johnson295189b2012-06-20 16:38:30 -07009085eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval)
9086{
9087 eHalStatus status;
9088
9089 smsLog(pMac, LOG1, " csrScanStartWaitForKeyTimer \n ");
9090 status = palTimerStart(pMac->hHdd, pMac->roam.hTimerWaitForKey, interval, eANI_BOOLEAN_FALSE);
9091
9092 return (status);
9093}
9094
Jeff Johnson295189b2012-06-20 16:38:30 -07009095eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac)
9096{
9097 return (palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey));
9098}
9099
Jeff Johnson295189b2012-06-20 16:38:30 -07009100void csrRoamIbssJoinTimerHandler(void *pv)
9101{
9102 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9103 tpAniSirGlobal pMac = pInfo->pMac;
9104 eCsrRoamDisconnectReason reason = eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE;
9105 tANI_U32 sessionId = pInfo->sessionId;
9106 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009107
9108 if(!pSession)
9109 {
9110 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9111 return;
9112 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009113
9114 pSession->ibss_join_pending = FALSE;
9115 // JEZ100225: As of main/latest "tip", we are no longer doing this. Check on this.
9116 //csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
9117 // Send an IBSS stop request to PE
9118 csrRoamDisconnectInternal(pMac, sessionId, reason);
Jeff Johnson295189b2012-06-20 16:38:30 -07009119}
Jeff Johnson295189b2012-06-20 16:38:30 -07009120eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9121{
9122 eHalStatus status;
9123 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009124
9125 if(!pSession)
9126 {
9127 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9128 return eHAL_STATUS_FAILURE;
9129 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009130
9131 smsLog(pMac, LOG1, " csrRoamStartIbssJoinTimer \n ");
9132 pSession->ibssJoinTimerInfo.sessionId = (tANI_U8)sessionId;
9133 status = palTimerStart(pMac->hHdd, pSession->hTimerIbssJoining, interval, eANI_BOOLEAN_FALSE);
9134
9135 return (status);
9136}
Jeff Johnson295189b2012-06-20 16:38:30 -07009137eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9138{
9139 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerIbssJoining));
9140}
Jeff Johnson295189b2012-06-20 16:38:30 -07009141void csrRoamCompletion(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo, tSmeCmd *pCommand,
9142 eCsrRoamResult roamResult, tANI_BOOLEAN fSuccess)
9143{
9144 eRoamCmdStatus roamStatus = csrGetRoamCompleteStatus(pMac, sessionId);
9145 tANI_U32 roamId = 0;
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009146 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
9147 /* To silence the KW tool Null chaeck is added */
9148 if(!pSession)
9149 {
9150 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9151 return;
9152 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009153
9154 if(pCommand)
9155 {
9156 roamId = pCommand->u.roamCmd.roamId;
9157#if defined(VOSS_ENABLED)
9158 VOS_ASSERT( sessionId == pCommand->sessionId );
9159#endif
9160 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009161 if(eCSR_ROAM_ROAMING_COMPLETION == roamStatus)
9162 {
9163 //if success, force roaming completion
9164 csrRoamCompleteRoaming(pMac, sessionId, fSuccess, roamResult);
9165 }
9166 else
9167 {
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009168 VOS_ASSERT(pSession->bRefAssocStartCnt == 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009169 smsLog(pMac, LOGW, FL(" indicates association completion. roamResult = %d\n"), roamResult);
9170 csrRoamCallCallback(pMac, sessionId, pRoamInfo, roamId, roamStatus, roamResult);
9171 }
9172}
9173
Jeff Johnson295189b2012-06-20 16:38:30 -07009174eHalStatus csrRoamLostLink( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 type, tSirSmeRsp *pSirMsg)
9175{
9176 eHalStatus status = eHAL_STATUS_SUCCESS;
9177 tSirSmeDeauthInd *pDeauthIndMsg = NULL;
9178 tSirSmeDisassocInd *pDisassocIndMsg = NULL;
9179 eCsrRoamResult result = eCSR_ROAM_RESULT_LOSTLINK;
9180 tCsrRoamInfo *pRoamInfo = NULL;
9181 tCsrRoamInfo roamInfo;
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009182 tANI_BOOLEAN fToRoam;
Jeff Johnson295189b2012-06-20 16:38:30 -07009183 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009184 /* To silence the KW tool Null chaeck is added */
9185 if(!pSession)
9186 {
9187 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9188 return eHAL_STATUS_FAILURE;
9189 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009190 //Only need to roam for infra station. In this case P2P client will roam as well
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009191 fToRoam = CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile);
Jeff Johnson295189b2012-06-20 16:38:30 -07009192 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
9193 if ( eWNI_SME_DISASSOC_IND == type )
9194 {
9195 result = eCSR_ROAM_RESULT_DISASSOC_IND;
9196 pDisassocIndMsg = (tSirSmeDisassocInd *)pSirMsg;
9197 pSession->roamingStatusCode = pDisassocIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009198 pSession->joinFailStatusCode.reasonCode = pDisassocIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009199 }
9200 else if ( eWNI_SME_DEAUTH_IND == type )
9201 {
9202 result = eCSR_ROAM_RESULT_DEAUTH_IND;
9203 pDeauthIndMsg = (tSirSmeDeauthInd *)pSirMsg;
9204 pSession->roamingStatusCode = pDeauthIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009205 pSession->joinFailStatusCode.reasonCode = pDeauthIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009206 }
9207 else
9208 {
9209 smsLog(pMac, LOGW, FL("gets an unknown type (%d)\n"), type);
9210 result = eCSR_ROAM_RESULT_NONE;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009211 pSession->joinFailStatusCode.reasonCode = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07009212 }
9213
9214 // call profile lost link routine here
9215#ifdef WLAN_SOFTAP_FEATURE
9216 if(!CSR_IS_INFRA_AP(&pSession->connectedProfile))
9217#endif
9218 {
9219 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_LOSTLINK_DETECTED, result);
9220 }
9221
9222 if ( eWNI_SME_DISASSOC_IND == type )
9223 {
9224 status = csrSendMBDisassocCnfMsg(pMac, pDisassocIndMsg);
9225 }
9226 else if ( eWNI_SME_DEAUTH_IND == type )
9227 {
9228 status = csrSendMBDeauthCnfMsg(pMac, pDeauthIndMsg);
9229 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009230 if(!HAL_STATUS_SUCCESS(status))
9231 {
9232 //If fail to send confirmation to PE, not to trigger roaming
9233 fToRoam = eANI_BOOLEAN_FALSE;
9234 }
9235
9236 //tell HDD to disconnect
9237 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9238 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9239 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9240#ifdef WLAN_SOFTAP_FEATURE
9241 if( eWNI_SME_DISASSOC_IND == type)
9242 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009243 //staMacAddr
9244 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9245 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9246 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009247 else if( eWNI_SME_DEAUTH_IND == type )
9248 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009249 //staMacAddr
9250 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9251 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9252 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009253#endif
9254 smsLog(pMac, LOGW, FL("roamInfo.staId (%d)\n"), roamInfo.staId);
Jeff Johnson295189b2012-06-20 16:38:30 -07009255 if(fToRoam)
9256 {
Madan Mohan Koyyalamudiaf854cf2012-10-30 17:56:25 -07009257 //Tell HDD about the lost link
9258 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07009259 //Only remove the connected BSS in infrastructure mode
9260 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9261 //Not to do anying for lostlink with WDS
9262 if( pMac->roam.configParam.nRoamingTime )
9263 {
9264 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac, sessionId,
9265 ( eWNI_SME_DEAUTH_IND == type ) ?
9266 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc)))
9267 {
9268 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9269 //For IBSS, we need to give some more info to HDD
9270 if(csrIsBssTypeIBSS(pSession->connectedProfile.BSSType))
9271 {
9272 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
9273 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9274 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9275 }
9276 else
9277 {
9278 roamInfo.reasonCode = eCsrRoamReasonSmeIssuedForLostLink;
9279 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009280 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07009281 pSession->roamingReason = ( eWNI_SME_DEAUTH_IND == type ) ?
9282 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc;
9283 pSession->roamingStartTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
9284 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_LOSTLINK);
9285 }
9286 else
9287 {
9288 smsLog(pMac, LOGW, " %s Fail to start roaming, status = %d", __FUNCTION__, status);
9289 fToRoam = eANI_BOOLEAN_FALSE;
9290 }
9291 }
9292 else
9293 {
9294 //We are told not to roam, indicate lostlink
9295 fToRoam = eANI_BOOLEAN_FALSE;
9296 }
9297 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009298 if(!fToRoam)
9299 {
9300 if( eWNI_SME_DISASSOC_IND == type)
9301 {
9302 //staMacAddr
9303 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9304 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9305 }
9306 else if( eWNI_SME_DEAUTH_IND == type )
9307 {
9308 //staMacAddr
9309 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9310 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9311 }
Madan Mohan Koyyalamudiaf854cf2012-10-30 17:56:25 -07009312 //Tell HDD about the lost link
Jeff Johnson295189b2012-06-20 16:38:30 -07009313 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9314
9315 /*No need to start idle scan in case of IBSS/SAP
9316 Still enable idle scan for polling in case concurrent sessions are running */
9317 if(CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile))
9318 {
9319 csrScanStartIdleScan(pMac);
9320 }
9321 }
9322
9323 return (status);
9324}
9325
Jeff Johnson295189b2012-06-20 16:38:30 -07009326eHalStatus csrRoamLostLinkAfterhandoffFailure( tpAniSirGlobal pMac,tANI_U32 sessionId)
9327{
9328 eHalStatus status = eHAL_STATUS_SUCCESS;
9329 tListElem *pEntry = NULL;
9330 tSmeCmd *pCommand = NULL;
9331 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009332
9333 if(!pSession)
9334 {
9335 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9336 return eHAL_STATUS_FAILURE;
9337 }
9338
Jeff Johnson295189b2012-06-20 16:38:30 -07009339 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07009340 //Only remove the connected BSS in infrastructure mode
9341 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9342 if(pMac->roam.configParam.nRoamingTime)
9343 {
9344 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac,sessionId, pSession->roamingReason)))
9345 {
9346 //before starting the lost link logic release the roam command for handoff
9347 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
9348 if(pEntry)
9349 {
9350 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
9351 }
9352 if(pCommand)
9353 {
9354 if (( eSmeCommandRoam == pCommand->command ) &&
9355 ( eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason))
9356 {
9357 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9358 {
9359 csrReleaseCommandRoam( pMac, pCommand );
9360 }
9361 }
9362 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009363 smsLog( pMac, LOGW, "Lost link roaming started ...\n");
9364 }
9365 }
9366 else
9367 {
9368 //We are told not to roam, indicate lostlink
9369 status = eHAL_STATUS_FAILURE;
9370 }
9371
9372 return (status);
9373}
Jeff Johnson295189b2012-06-20 16:38:30 -07009374void csrRoamWmStatusChangeComplete( tpAniSirGlobal pMac )
9375{
9376 tListElem *pEntry;
9377 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07009378 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
9379 if ( pEntry )
9380 {
9381 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
9382 if ( eSmeCommandWmStatusChange == pCommand->command )
9383 {
9384 // Nothing to process in a Lost Link completion.... It just kicks off a
9385 // roaming sequence.
9386 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9387 {
9388 csrReleaseCommandWmStatusChange( pMac, pCommand );
9389 }
9390 else
9391 {
9392 smsLog( pMac, LOGE, " ******csrRoamWmStatusChangeComplete fail to release command\n");
9393 }
9394
9395 }
9396 else
9397 {
9398 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but LOST LINK command is not ACTIVE ...\n" );
9399 }
9400 }
9401 else
9402 {
9403 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but NO commands are ACTIVE ...\n" );
9404 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009405 smeProcessPendingQueue( pMac );
9406}
9407
Jeff Johnson295189b2012-06-20 16:38:30 -07009408void csrRoamProcessWmStatusChangeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
9409{
9410 eHalStatus status = eHAL_STATUS_FAILURE;
9411 tSirSmeRsp *pSirSmeMsg;
9412 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pCommand->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009413
9414 if(!pSession)
9415 {
9416 smsLog(pMac, LOGE, FL(" session %d not found "), pCommand->sessionId);
9417 return;
9418 }
9419
Jeff Johnson295189b2012-06-20 16:38:30 -07009420 switch ( pCommand->u.wmStatusChangeCmd.Type )
9421 {
9422 case eCsrDisassociated:
9423 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg;
9424 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DISASSOC_IND, pSirSmeMsg);
9425 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009426 case eCsrDeauthenticated:
9427 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg;
9428 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DEAUTH_IND, pSirSmeMsg);
9429 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009430 default:
9431 smsLog(pMac, LOGW, FL("gets an unknown command %d\n"), pCommand->u.wmStatusChangeCmd.Type);
9432 break;
9433 }
9434 //For WDS, we want to stop BSS as well when it is indicated that it is disconnected.
9435 if( CSR_IS_CONN_WDS(&pSession->connectedProfile) )
9436 {
9437 if( !HAL_STATUS_SUCCESS(csrRoamIssueStopBssCmd( pMac, pCommand->sessionId, eANI_BOOLEAN_TRUE )) )
9438 {
9439 //This is not good
9440 smsLog(pMac, LOGE, FL(" failed to issue stopBSS command\n"));
9441 }
9442 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009443 // Lost Link just triggers a roaming sequence. We can complte the Lost Link
9444 // command here since there is nothing else to do.
9445 csrRoamWmStatusChangeComplete( pMac );
9446}
9447
Jeff Johnson295189b2012-06-20 16:38:30 -07009448//This function returns band and mode information.
9449//The only tricky part is that if phyMode is set to 11abg, this function may return eCSR_CFG_DOT11_MODE_11B
9450//instead of eCSR_CFG_DOT11_MODE_11G if everything is set to auto-pick.
9451#ifdef WLAN_SOFTAP_FEATURE
9452static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9453 tANI_U8 operationChn, eCsrBand *pBand )
9454#else
9455static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn,
9456 tANI_U8 operationChn, eCsrBand *pBand )
9457#endif
9458{
Jeff Johnson295189b2012-06-20 16:38:30 -07009459#ifdef WLAN_SOFTAP_FEATURE
9460 eCsrPhyMode phyModeIn = (eCsrPhyMode)pProfile->phyMode;
9461 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pProfile, phyModeIn,
9462 pMac->roam.configParam.ProprietaryRatesEnabled);
9463#else
9464 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(phyModeIn,
9465 pMac->roam.configParam.ProprietaryRatesEnabled);
9466#endif
9467 eCsrBand eBand;
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -07009468
Jeff Johnson295189b2012-06-20 16:38:30 -07009469 //If the global setting for dot11Mode is set to auto/abg, we overwrite the setting in the profile.
9470#ifdef WLAN_SOFTAP_FEATURE
9471 if( ((!CSR_IS_INFRA_AP(pProfile )&& !CSR_IS_WDS(pProfile )) &&
9472 ((eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9473 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode))) ||
9474 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
9475#else
9476 if( (eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9477 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode) ||
9478 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
Jeff Johnson295189b2012-06-20 16:38:30 -07009479#endif
9480 {
9481 switch( pMac->roam.configParam.uCfgDot11Mode )
9482 {
9483 case eCSR_CFG_DOT11_MODE_11A:
9484 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9485 eBand = eCSR_BAND_5G;
9486 break;
9487 case eCSR_CFG_DOT11_MODE_11B:
9488 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9489 eBand = eCSR_BAND_24;
9490 break;
9491 case eCSR_CFG_DOT11_MODE_11G:
9492 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9493 eBand = eCSR_BAND_24;
9494 break;
9495 case eCSR_CFG_DOT11_MODE_11N:
9496 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
9497 eBand = eCSR_BAND_24;
9498 break;
9499 //case eCSR_CFG_DOT11_MODE_BEST:
9500 // cfgDot11Mode = eCSR_CFG_DOT11_MODE_BEST;
9501 // eBand = eCSR_BAND_24;
9502 // break;
9503 default:
9504 // Global dot11 Mode setting is 11a/b/g.
9505 // use the channel number to determine the Mode setting.
9506 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9507 {
9508 eBand = pMac->roam.configParam.eBand;
9509 if(eCSR_BAND_24 == eBand)
9510 {
9511 //See reason in else if ( CSR_IS_CHANNEL_24GHZ(operationChn) ) to pick 11B
9512 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9513 }
9514 else
9515 {
9516 //prefer 5GHz
9517 eBand = eCSR_BAND_5G;
9518 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9519 }
9520 }
9521 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9522 {
9523 // channel is a 2.4GHz channel. Set mode to 11g.
9524 //
9525 // !!LAC - WiFi tests require IBSS networks to start in 11b mode without any change to the
9526 // default parameter settings on the adapter. We use ACU to start an IBSS through creation
9527 // of a startIBSS profile. this startIBSS profile has Auto MACProtocol and the
9528 // adapter property setting for dot11Mode is also AUTO. So in this case, let's start
9529 // the IBSS network in 11b mode instead of 11g mode.
9530 //
9531 // so this is for Auto=profile->MacProtocol && Auto=Global.dot11Mode && profile->channel is < 14,
9532 // then start the IBSS in b mode.
9533 //
9534 // Note: we used to have this start as an 11g IBSS for best performance... now to specify that
9535 // the user will have to set the do11Mode in the property page to 11g to force it.
9536 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9537 eBand = eCSR_BAND_24;
9538 }
9539 else
9540 {
9541 // else, it's a 5.0GHz channel. Set mode to 11a.
9542 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9543 eBand = eCSR_BAND_5G;
9544 }
9545 break;
9546 }//switch
9547 }//if( eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
9548 else
9549 {
9550 //dot11 mode is set, lets pick the band
9551 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9552 {
9553 // channel is Auto also.
9554 eBand = pMac->roam.configParam.eBand;
9555 if(eCSR_BAND_ALL == eBand)
9556 {
9557 //prefer 5GHz
9558 eBand = eCSR_BAND_5G;
9559 }
9560 }
9561 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9562 {
9563 eBand = eCSR_BAND_24;
9564 }
9565 else
9566 {
9567 eBand = eCSR_BAND_5G;
9568 }
9569 }
9570 if(pBand)
9571 {
9572 *pBand = eBand;
9573 }
9574
9575 if (operationChn == 14){
9576 smsLog(pMac, LOGE, FL(" Switching to Dot11B mode \n"));
9577 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9578 }
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009579
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009580 if( (!CSR_IS_11n_ALLOWED(pProfile->EncryptionType.encryptionType[0] )) &&
9581 ((eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode) ||
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009582#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009583 (eCSR_CFG_DOT11_MODE_11AC == cfgDot11Mode) ||
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009584#endif
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009585 (eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode)) )
9586 {
9587 //We cannot do 11n here
9588 if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9589 {
9590 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9591 }
9592 else
9593 {
9594 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9595 }
9596 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009597 return( cfgDot11Mode );
9598}
9599
Jeff Johnson295189b2012-06-20 16:38:30 -07009600eHalStatus csrRoamIssueStopBss( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
9601{
9602 eHalStatus status;
9603 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009604
9605 if(!pSession)
9606 {
9607 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9608 return eHAL_STATUS_FAILURE;
9609 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009610
9611#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
9612 {
9613 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07009614 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
9615 if(pIbssLog)
9616 {
9617 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_REQ;
9618 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
9619 }
9620 }
9621#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07009622 pSession->ibss_join_pending = FALSE;
9623 csrRoamStopIbssJoinTimer(pMac, sessionId );
9624 // Set the roaming substate to 'stop Bss request'...
9625 csrRoamSubstateChange( pMac, NewSubstate, sessionId );
9626
9627 // attempt to stop the Bss (reason code is ignored...)
9628 status = csrSendMBStopBssReqMsg( pMac, sessionId );
9629
9630 return (status);
9631}
9632
Jeff Johnson295189b2012-06-20 16:38:30 -07009633//pNumChan is a caller allocated space with the sizeof pChannels
9634eHalStatus csrGetCfgValidChannels(tpAniSirGlobal pMac, tANI_U8 *pChannels, tANI_U32 *pNumChan)
9635{
9636
9637 return (ccmCfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
9638 (tANI_U8 *)pChannels,
9639 pNumChan));
9640}
9641
Jeff Johnson295189b2012-06-20 16:38:30 -07009642tANI_BOOLEAN csrRoamIsChannelValid( tpAniSirGlobal pMac, tANI_U8 channel )
9643{
9644 tANI_BOOLEAN fValid = FALSE;
9645 tANI_U32 idxValidChannels;
9646 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9647
9648 if (HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, pMac->roam.validChannelList, &len)))
9649 {
9650 for ( idxValidChannels = 0; ( idxValidChannels < len ); idxValidChannels++ )
9651 {
9652 if ( channel == pMac->roam.validChannelList[ idxValidChannels ] )
9653 {
9654 fValid = TRUE;
9655 break;
9656 }
9657 }
9658 }
9659 pMac->roam.numValidChannels = len;
9660 return fValid;
9661}
9662
Jeff Johnson295189b2012-06-20 16:38:30 -07009663tANI_BOOLEAN csrRoamIsValid40MhzChannel(tpAniSirGlobal pMac, tANI_U8 channel)
9664{
9665 tANI_BOOLEAN fValid = eANI_BOOLEAN_FALSE;
9666 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009667 for(i = 0; i < pMac->scan.base40MHzChannels.numChannels; i++)
9668 {
9669 if(channel == pMac->scan.base40MHzChannels.channelList[i])
9670 {
9671 fValid = eANI_BOOLEAN_TRUE;
9672 break;
9673 }
9674 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009675 return (fValid);
9676}
9677
Jeff Johnson295189b2012-06-20 16:38:30 -07009678//This function check and validate whether the NIC can do CB (40MHz)
Jeff Johnsone7245742012-09-05 17:12:55 -07009679 static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -07009680{
Jeff Johnsone7245742012-09-05 17:12:55 -07009681 ePhyChanBondState eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009682 tANI_U8 centerChn;
9683 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009684 if(CSR_IS_CHANNEL_24GHZ(primaryChn))
9685 {
9686 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
9687 }
9688 else
9689 {
9690 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
9691 }
9692 //Figure what the other side's CB mode
9693 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
9694 {
9695 if(pIes->HTCaps.present && (eHT_CHANNEL_WIDTH_40MHZ == pIes->HTCaps.supportedChannelWidthSet))
9696 {
9697 if(pIes->HTInfo.present)
9698 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009699 /* This is called during INFRA STA/CLIENT and should use the merged value of
9700 * supported channel width and recommended tx width as per standard
9701 */
9702 smsLog(pMac, LOG1, "scws %u rtws %u sco %u\n",
9703 pIes->HTCaps.supportedChannelWidthSet,
9704 pIes->HTInfo.recommendedTxWidthSet,
9705 pIes->HTInfo.secondaryChannelOffset);
9706
9707 if (pIes->HTInfo.recommendedTxWidthSet == eHT_CHANNEL_WIDTH_40MHZ)
9708 eRet = (ePhyChanBondState)pIes->HTInfo.secondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07009709 else
Jeff Johnsone7245742012-09-05 17:12:55 -07009710 eRet = PHY_SINGLE_CHANNEL_CENTERED;
9711 switch (eRet) {
9712 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
9713 centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
9714 break;
9715 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
9716 centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
9717 break;
9718 case PHY_SINGLE_CHANNEL_CENTERED:
9719 default:
9720 centerChn = primaryChn;
9721 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009722 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009723 if((PHY_SINGLE_CHANNEL_CENTERED != eRet) && !csrRoamIsValid40MhzChannel(pMac, centerChn))
Jeff Johnson295189b2012-06-20 16:38:30 -07009724 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009725 smsLog(pMac, LOGE, " Invalid center channel (%d), disable 40MHz mode\n", centerChn);
9726 //eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009727 }
9728 }
9729 }
9730 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009731 return eRet;
9732}
Jeff Johnson295189b2012-06-20 16:38:30 -07009733tANI_BOOLEAN csrIsEncryptionInList( tpAniSirGlobal pMac, tCsrEncryptionList *pCipherList, eCsrEncryptionType encryptionType )
9734{
9735 tANI_BOOLEAN fFound = FALSE;
9736 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009737 for( idx = 0; idx < pCipherList->numEntries; idx++ )
9738 {
9739 if( pCipherList->encryptionType[idx] == encryptionType )
9740 {
9741 fFound = TRUE;
9742 break;
9743 }
9744 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009745 return fFound;
9746}
Jeff Johnson295189b2012-06-20 16:38:30 -07009747tANI_BOOLEAN csrIsAuthInList( tpAniSirGlobal pMac, tCsrAuthList *pAuthList, eCsrAuthType authType )
9748{
9749 tANI_BOOLEAN fFound = FALSE;
9750 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009751 for( idx = 0; idx < pAuthList->numEntries; idx++ )
9752 {
9753 if( pAuthList->authType[idx] == authType )
9754 {
9755 fFound = TRUE;
9756 break;
9757 }
9758 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009759 return fFound;
9760}
Jeff Johnson295189b2012-06-20 16:38:30 -07009761tANI_BOOLEAN csrIsSameProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile1, tCsrRoamProfile *pProfile2)
9762{
9763 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9764 tCsrScanResultFilter *pScanFilter = NULL;
9765 eHalStatus status = eHAL_STATUS_SUCCESS;
9766
9767 if(pProfile1 && pProfile2)
9768 {
9769 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
9770 if(HAL_STATUS_SUCCESS(status))
9771 {
9772 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
9773 status = csrRoamPrepareFilterFromProfile(pMac, pProfile2, pScanFilter);
9774 if(HAL_STATUS_SUCCESS(status))
9775 {
9776 fCheck = eANI_BOOLEAN_FALSE;
9777 do
9778 {
9779 tANI_U32 i;
9780 for(i = 0; i < pScanFilter->SSIDs.numOfSSIDs; i++)
9781 {
9782 fCheck = csrIsSsidMatch( pMac, pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
9783 pScanFilter->SSIDs.SSIDList[i].SSID.length,
9784 pProfile1->SSID.ssId, pProfile1->SSID.length, eANI_BOOLEAN_FALSE );
9785 if ( fCheck ) break;
9786 }
9787 if(!fCheck)
9788 {
9789 break;
9790 }
9791 if( !csrIsAuthInList( pMac, &pProfile2->AuthType, pProfile1->AuthType)
9792 || pProfile2->BSSType != pProfile1->BSSType
9793 || !csrIsEncryptionInList( pMac, &pProfile2->EncryptionType, pProfile1->EncryptionType )
9794 )
9795 {
9796 fCheck = eANI_BOOLEAN_FALSE;
9797 break;
9798 }
9799#ifdef WLAN_FEATURE_VOWIFI_11R
9800 if (pProfile1->MDID.mdiePresent || pProfile2->MDID.mdiePresent)
9801 {
9802 if (pProfile1->MDID.mobilityDomain != pProfile2->MDID.mobilityDomain)
9803 {
9804 fCheck = eANI_BOOLEAN_FALSE;
9805 break;
9806 }
9807 }
9808#endif
9809 //Match found
9810 fCheck = eANI_BOOLEAN_TRUE;
9811 }while(0);
9812 csrFreeScanFilter(pMac, pScanFilter);
9813 }
9814 palFreeMemory(pMac->hHdd, pScanFilter);
9815 }
9816 }
9817
9818 return (fCheck);
9819}
9820
Jeff Johnson295189b2012-06-20 16:38:30 -07009821tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2)
9822{
9823 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9824 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009825 do
9826 {
9827 //Only check for static WEP
9828 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP40_STATICKEY) &&
9829 !csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP104_STATICKEY))
9830 {
9831 fCheck = eANI_BOOLEAN_TRUE;
9832 break;
9833 }
9834 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, pConnProfile->EncryptionType)) break;
9835 if(pConnProfile->Keys.defaultIndex != pProfile2->Keys.defaultIndex) break;
9836 for(i = 0; i < CSR_MAX_NUM_KEY; i++)
9837 {
9838 if(pConnProfile->Keys.KeyLength[i] != pProfile2->Keys.KeyLength[i]) break;
9839 if(!palEqualMemory(pMac->hHdd, &pConnProfile->Keys.KeyMaterial[i],
9840 &pProfile2->Keys.KeyMaterial[i], pProfile2->Keys.KeyLength[i]))
9841 {
9842 break;
9843 }
9844 }
9845 if( i == CSR_MAX_NUM_KEY)
9846 {
9847 fCheck = eANI_BOOLEAN_TRUE;
9848 }
9849 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009850 return (fCheck);
9851}
9852
Jeff Johnson295189b2012-06-20 16:38:30 -07009853//IBSS
9854
Jeff Johnson295189b2012-06-20 16:38:30 -07009855tANI_U8 csrRoamGetIbssStartChannelNumber50( tpAniSirGlobal pMac )
9856{
9857 tANI_U8 channel = 0;
9858 tANI_U32 idx;
9859 tANI_U32 idxValidChannels;
9860 tANI_BOOLEAN fFound = FALSE;
9861 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9862
9863 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel5G)
9864 {
9865 channel = pMac->roam.configParam.AdHocChannel5G;
9866 if(!csrRoamIsChannelValid(pMac, channel))
9867 {
9868 channel = 0;
9869 }
9870 }
9871 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9872 {
9873 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_50 ) && !fFound; idx++ )
9874 {
9875 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9876 {
9877 if ( csrStartIbssChannels50[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9878 {
9879 fFound = TRUE;
9880 channel = csrStartIbssChannels50[ idx ];
9881 }
9882 }
9883 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009884 // this is rare, but if it does happen, we find anyone in 11a bandwidth and return the first 11a channel found!
9885 if (!fFound)
9886 {
9887 for ( idxValidChannels = 0; idxValidChannels < len ; idxValidChannels++ )
9888 {
9889 if ( CSR_IS_CHANNEL_5GHZ(pMac->roam.validChannelList[ idx ]) ) // the max channel# in 11g is 14
9890 {
9891 channel = csrStartIbssChannels50[ idx ];
9892 break;
9893 }
9894 }
9895 }
9896 }//if
9897
9898 return( channel );
9899}
9900
Jeff Johnson295189b2012-06-20 16:38:30 -07009901tANI_U8 csrRoamGetIbssStartChannelNumber24( tpAniSirGlobal pMac )
9902{
9903 tANI_U8 channel = 1;
9904 tANI_U32 idx;
9905 tANI_U32 idxValidChannels;
9906 tANI_BOOLEAN fFound = FALSE;
9907 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9908
9909 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel24)
9910 {
9911 channel = pMac->roam.configParam.AdHocChannel24;
9912 if(!csrRoamIsChannelValid(pMac, channel))
9913 {
9914 channel = 0;
9915 }
9916 }
9917
9918 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9919 {
9920 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_24 ) && !fFound; idx++ )
9921 {
9922 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9923 {
9924 if ( csrStartIbssChannels24[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9925 {
9926 fFound = TRUE;
9927 channel = csrStartIbssChannels24[ idx ];
9928 }
9929 }
9930 }
9931 }
9932
9933 return( channel );
9934}
9935
Jeff Johnson295189b2012-06-20 16:38:30 -07009936static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9937 tCsrRoamStartBssParams *pParam )
9938{
9939 eCsrCfgDot11Mode cfgDot11Mode;
9940 eCsrBand eBand;
9941 tANI_U8 channel = 0;
9942 tSirNwType nwType;
9943 tANI_U8 operationChannel = 0;
9944
9945 if(pProfile->ChannelInfo.numOfChannels && pProfile->ChannelInfo.ChannelList)
9946 {
9947 operationChannel = pProfile->ChannelInfo.ChannelList[0];
9948 }
9949
9950#ifdef WLAN_SOFTAP_FEATURE
9951 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
9952#else
9953 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
9954#endif
9955
9956#ifdef WLAN_FEATURE_P2P
9957 if( ( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
9958 (pProfile->csrPersona == VOS_P2P_GO_MODE) )
9959 && ( cfgDot11Mode == eCSR_CFG_DOT11_MODE_11B)
9960 )
9961 {
9962 /* This should never happen */
9963 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL,
9964 FL("For P2PClient/P2P-GO (persona %d) cfgDot11Mode is 11B\n"),
9965 pProfile->csrPersona);
9966 VOS_ASSERT(0);
9967 }
9968#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009969 switch( cfgDot11Mode )
9970 {
9971 case eCSR_CFG_DOT11_MODE_11G:
9972 nwType = eSIR_11G_NW_TYPE;
9973 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009974 case eCSR_CFG_DOT11_MODE_11B:
9975 nwType = eSIR_11B_NW_TYPE;
9976 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009977 case eCSR_CFG_DOT11_MODE_11A:
9978 nwType = eSIR_11A_NW_TYPE;
9979 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009980 default:
9981 case eCSR_CFG_DOT11_MODE_11N:
9982 case eCSR_CFG_DOT11_MODE_TAURUS:
9983 //Because LIM only verifies it against 11a, 11b or 11g, set only 11g or 11a here
9984 if(eCSR_BAND_24 == eBand)
9985 {
9986 nwType = eSIR_11G_NW_TYPE;
9987 }
9988 else
9989 {
9990 nwType = eSIR_11A_NW_TYPE;
9991 }
9992 break;
9993 }
9994
9995 pParam->extendedRateSet.numRates = 0;
9996
9997 switch ( nwType )
9998 {
9999 default:
10000 smsLog(pMac, LOGE, FL("sees an unknown pSirNwType (%d)\n"), nwType);
10001 case eSIR_11A_NW_TYPE:
10002
10003 pParam->operationalRateSet.numRates = 8;
10004
10005 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
10006 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
10007 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
10008 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
10009 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
10010 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
10011 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
10012 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
10013
10014 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10015 {
10016 channel = csrRoamGetIbssStartChannelNumber50( pMac );
10017 if( 0 == channel &&
10018 CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) &&
10019 CSR_IS_PHY_MODE_DUAL_BAND(pMac->roam.configParam.phyMode)
10020 )
10021 {
10022 //We could not find a 5G channel by auto pick, let's try 2.4G channels
10023 //We only do this here because csrRoamGetPhyModeBandForBss always picks 11a for AUTO
10024 nwType = eSIR_11B_NW_TYPE;
10025 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10026 pParam->operationalRateSet.numRates = 4;
10027 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10028 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10029 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10030 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
10031 }
10032 }
10033 else
10034 {
10035 channel = operationChannel;
10036 }
10037 break;
10038
10039 case eSIR_11B_NW_TYPE:
10040 pParam->operationalRateSet.numRates = 4;
10041 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10042 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10043 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10044 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -070010045 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10046 {
10047 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10048 }
10049 else
10050 {
10051 channel = operationChannel;
10052 }
10053
10054 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070010055 case eSIR_11G_NW_TYPE:
10056#ifdef WLAN_FEATURE_P2P
10057 /* For P2P Client and P2P GO, disable 11b rates */
10058 if( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
10059 (pProfile->csrPersona == VOS_P2P_GO_MODE)
10060 )
10061 {
10062 pParam->operationalRateSet.numRates = 8;
10063
10064 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
10065 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
10066 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
10067 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
10068 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
10069 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
10070 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
10071 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
10072 }
10073 else
10074#endif
10075 {
10076 pParam->operationalRateSet.numRates = 4;
Jeff Johnson295189b2012-06-20 16:38:30 -070010077 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10078 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10079 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10080 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
10081
10082 pParam->extendedRateSet.numRates = 8;
Jeff Johnson295189b2012-06-20 16:38:30 -070010083 pParam->extendedRateSet.rate[0] = SIR_MAC_RATE_6;
10084 pParam->extendedRateSet.rate[1] = SIR_MAC_RATE_9;
10085 pParam->extendedRateSet.rate[2] = SIR_MAC_RATE_12;
10086 pParam->extendedRateSet.rate[3] = SIR_MAC_RATE_18;
10087 pParam->extendedRateSet.rate[4] = SIR_MAC_RATE_24;
10088 pParam->extendedRateSet.rate[5] = SIR_MAC_RATE_36;
10089 pParam->extendedRateSet.rate[6] = SIR_MAC_RATE_48;
10090 pParam->extendedRateSet.rate[7] = SIR_MAC_RATE_54;
10091 }
10092
10093 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10094 {
10095 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10096 }
10097 else
10098 {
10099 channel = operationChannel;
10100 }
10101
10102 break;
10103 }
10104 pParam->operationChn = channel;
10105 pParam->sirNwType = nwType;
10106}
10107
Jeff Johnson295189b2012-06-20 16:38:30 -070010108static void csrRoamGetBssStartParmsFromBssDesc( tpAniSirGlobal pMac, tSirBssDescription *pBssDesc,
10109 tDot11fBeaconIEs *pIes, tCsrRoamStartBssParams *pParam )
10110{
10111
10112 if( pParam )
10113 {
10114 pParam->sirNwType = pBssDesc->nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070010115 pParam->cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010116 pParam->operationChn = pBssDesc->channelId;
10117 palCopyMemory( pMac->hHdd, &pParam->bssid, pBssDesc->bssId, sizeof(tCsrBssid) );
10118
10119 if( pIes )
10120 {
10121 if(pIes->SuppRates.present)
10122 {
10123 pParam->operationalRateSet.numRates = pIes->SuppRates.num_rates;
10124 if(pIes->SuppRates.num_rates > SIR_MAC_RATESET_EID_MAX)
10125 {
10126 smsLog(pMac, LOGE, FL("num_rates :%d is more than SIR_MAC_RATESET_EID_MAX, resetting to SIR_MAC_RATESET_EID_MAX\n"),
10127 pIes->SuppRates.num_rates);
10128 pIes->SuppRates.num_rates = SIR_MAC_RATESET_EID_MAX;
10129 }
10130 palCopyMemory(pMac->hHdd, pParam->operationalRateSet.rate, pIes->SuppRates.rates,
10131 sizeof(*pIes->SuppRates.rates) * pIes->SuppRates.num_rates);
10132 }
10133 if( pIes->SSID.present )
10134 {
10135 pParam->ssId.length = pIes->SSID.num_ssid;
10136 palCopyMemory(pMac->hHdd, pParam->ssId.ssId, pIes->SSID.ssid, pParam->ssId.length);
10137 }
10138 pParam->cbMode = csrGetCBModeFromIes(pMac, pParam->operationChn, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -070010139 }
10140 else
10141 {
10142 pParam->ssId.length = 0;
10143 pParam->operationalRateSet.numRates = 0;
10144 }
10145 }
10146}
10147
Jeff Johnson295189b2012-06-20 16:38:30 -070010148static void csrRoamDetermineMaxRateForAdHoc( tpAniSirGlobal pMac, tSirMacRateSet *pSirRateSet )
10149{
10150 tANI_U8 MaxRate = 0;
10151 tANI_U32 i;
10152 tANI_U8 *pRate;
10153
10154 pRate = pSirRateSet->rate;
10155 for ( i = 0; i < pSirRateSet->numRates; i++ )
10156 {
10157 MaxRate = CSR_MAX( MaxRate, ( pRate[ i ] & (~CSR_DOT11_BASIC_RATE_MASK) ) );
10158 }
10159
10160 // Save the max rate in the connected state information...
10161
10162 // modify LastRates variable as well
10163
10164 return;
10165}
10166
Jeff Johnson295189b2012-06-20 16:38:30 -070010167//this function finds a valid secondary channel for channel bonding with "channel".
10168//Param: channel -- primary channel, caller must validate it
10169// cbChoice -- CB directory
10170//Return: if 0, no secondary channel is found. Otherwise a valid secondary channel.
10171static tANI_U8 csrRoamGetSecondaryChannel(tpAniSirGlobal pMac, tANI_U8 channel, eCsrCBChoice cbChoice)
10172{
10173 tANI_U8 chnUp = 0, chnDown = 0, chnRet = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010174 switch (cbChoice)
10175 {
10176 case eCSR_CB_OFF:
10177 chnUp = 0;
10178 chnDown = 0;
10179 break;
10180 case eCSR_CB_DOWN:
10181 chnUp = 0;
10182 chnDown = channel - CSR_CB_CHANNEL_GAP;
10183 break;
10184 case eCSR_CB_UP:
10185 chnUp = channel + CSR_CB_CHANNEL_GAP;
10186 chnDown = 0;
10187 break;
10188 case eCSR_CB_AUTO:
10189 //consider every other value means auto
10190 default:
10191 chnUp = channel + CSR_CB_CHANNEL_GAP;
10192 chnDown = channel - CSR_CB_CHANNEL_GAP;
10193 break;
10194 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010195 //if CB_UP or auto, try channel up first
10196 if(chnUp && CSR_IS_SAME_BAND_CHANNELS(chnUp, channel) && csrRoamIsChannelValid(pMac, chnUp))
10197 {
10198 //found a valid up channel for channel bonding
10199 //check whether the center channel is valid
10200 if(csrRoamIsValid40MhzChannel(pMac, channel + CSR_CB_CENTER_CHANNEL_OFFSET))
10201 {
10202 chnRet = chnUp;
10203 }
10204 }
10205 if(chnRet == 0 && chnDown && CSR_IS_SAME_BAND_CHANNELS(chnDown, channel) && csrRoamIsChannelValid(pMac, chnDown))
10206 {
10207 //found a valid down channel for channel bonding
10208 if(csrRoamIsValid40MhzChannel(pMac, channel - CSR_CB_CENTER_CHANNEL_OFFSET))
10209 {
10210 chnRet = chnDown;
10211 }
10212 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010213 return chnRet;
10214}
10215
Jeff Johnson295189b2012-06-20 16:38:30 -070010216eHalStatus csrRoamIssueStartBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamStartBssParams *pParam,
10217 tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc, tANI_U32 roamId )
10218{
10219 eHalStatus status = eHAL_STATUS_SUCCESS;
10220 eCsrBand eBand;
Jeff Johnson295189b2012-06-20 16:38:30 -070010221 // Set the roaming substate to 'Start BSS attempt'...
10222 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_START_BSS_REQ, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070010223#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10224 //Need to figure out whether we need to log WDS???
10225 if( CSR_IS_IBSS( pProfile ) )
10226 {
10227 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -070010228 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
10229 if(pIbssLog)
10230 {
10231 if(pBssDesc)
10232 {
10233 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_REQ;
10234 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pBssDesc->bssId, 6);
10235 }
10236 else
10237 {
10238 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_REQ;
10239 }
10240 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pParam->ssId.ssId,
10241 pParam->ssId.length);
10242 if(pProfile->ChannelInfo.numOfChannels == 0)
10243 {
10244 pIbssLog->channelSetting = AUTO_PICK;
10245 }
10246 else
10247 {
10248 pIbssLog->channelSetting = SPECIFIED;
10249 }
10250 pIbssLog->operatingChannel = pParam->operationChn;
10251 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
10252 }
10253 }
10254#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
10255 //Put RSN information in for Starting BSS
10256 pParam->nRSNIELength = (tANI_U16)pProfile->nRSNReqIELength;
10257 pParam->pRSNIE = pProfile->pRSNReqIE;
10258
Jeff Johnson295189b2012-06-20 16:38:30 -070010259#ifdef WLAN_SOFTAP_FEATURE
10260 pParam->privacy = pProfile->privacy;
10261 pParam->fwdWPSPBCProbeReq = pProfile->fwdWPSPBCProbeReq;
10262 pParam->authType = pProfile->csr80211AuthType;
10263 pParam->beaconInterval = pProfile->beaconInterval;
10264 pParam->dtimPeriod = pProfile->dtimPeriod;
10265 pParam->ApUapsdEnable = pProfile->ApUapsdEnable;
10266 pParam->ssidHidden = pProfile->SSIDs.SSIDList[0].ssidHidden;
10267 if (CSR_IS_INFRA_AP(pProfile)&& (pParam->operationChn != 0))
10268 {
10269 if (csrIsValidChannel(pMac, pParam->operationChn) != eHAL_STATUS_SUCCESS)
10270 {
10271 pParam->operationChn = INFRA_AP_DEFAULT_CHANNEL;
10272 }
10273 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010274 pParam->protEnabled = pProfile->protEnabled;
10275 pParam->obssProtEnabled = pProfile->obssProtEnabled;
10276 pParam->ht_protection = pProfile->cfg_protection;
10277 pParam->wps_state = pProfile->wps_state;
10278#endif
10279
Jeff Johnson295189b2012-06-20 16:38:30 -070010280#ifdef WLAN_SOFTAP_FEATURE
10281 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, pParam->operationChn /* pProfile->operationChannel*/,
10282 &eBand);
10283#else
10284 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile->operationChannel,
10285 &eBand);
10286#endif
10287 pParam->bssPersona = pProfile->csrPersona;
10288 // When starting an IBSS, start on the channel from the Profile.
10289 status = csrSendMBStartBssReqMsg( pMac, sessionId, pProfile->BSSType, pParam, pBssDesc );
Jeff Johnson295189b2012-06-20 16:38:30 -070010290 return (status);
10291}
10292
Jeff Johnson295189b2012-06-20 16:38:30 -070010293static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
Jeff Johnsone7245742012-09-05 17:12:55 -070010294 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -070010295{
10296 tANI_U8 Channel, SecondChn;
Jeff Johnsone7245742012-09-05 17:12:55 -070010297 ePhyChanBondState cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010298 eCsrCBChoice cbChoice;
10299 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010300
10301 if(!pSession)
10302 {
10303 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10304 return;
10305 }
10306
Jeff Johnson295189b2012-06-20 16:38:30 -070010307 if( pBssDesc )
10308 {
10309 csrRoamGetBssStartParmsFromBssDesc( pMac, pBssDesc, pIes, &pSession->bssParams );
10310 //Since csrRoamGetBssStartParmsFromBssDesc fills in the bssid for pSession->bssParams
10311 //The following code has to be do after that.
10312 //For WDS station, use selfMac as the self BSSID
10313 if( CSR_IS_WDS_STA( pProfile ) )
10314 {
10315 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10316 }
10317 }
10318 else
10319 {
10320 csrRoamGetBssStartParms(pMac, pProfile, &pSession->bssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010321 //Use the first SSID
10322 if(pProfile->SSIDs.numOfSSIDs)
10323 {
10324 palCopyMemory(pMac->hHdd, &pSession->bssParams.ssId, pProfile->SSIDs.SSIDList, sizeof(tSirMacSSid));
10325 }
10326 //For WDS station, use selfMac as the self BSSID
10327 if( CSR_IS_WDS_STA( pProfile ) )
10328 {
10329 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10330 }
10331 //Use the first BSSID
10332 else if( pProfile->BSSIDs.numOfBSSIDs )
10333 {
10334 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid, sizeof(tCsrBssid));
10335 }
10336 else
10337 {
10338 palZeroMemory( pMac->hHdd, &pSession->bssParams.bssid, sizeof(tCsrBssid) );
10339 }
10340 }
10341 Channel = pSession->bssParams.operationChn;
Jeff Johnson295189b2012-06-20 16:38:30 -070010342 //Set operating channel in pProfile which will be used
10343 //in csrRoamSetBssConfigCfg() to determine channel bonding
10344 //mode and will be configured in CFG later
10345 pProfile->operationChannel = Channel;
10346
10347 if(Channel == 0)
10348 {
10349 smsLog(pMac, LOGW, " CSR cannot find a channel to start IBSS\n");
10350 }
10351 else
10352 {
10353
10354 csrRoamDetermineMaxRateForAdHoc( pMac, &pSession->bssParams.operationalRateSet );
Jeff Johnsone7245742012-09-05 17:12:55 -070010355 if (CSR_IS_INFRA_AP(pProfile))
10356 {
10357 if(CSR_IS_CHANNEL_24GHZ(Channel))
10358 {
10359 cbMode = pMac->roam.configParam.channelBondingMode24GHz;
10360 }
10361 else
10362 {
10363 cbMode = pMac->roam.configParam.channelBondingMode5GHz;
10364 }
10365 smsLog(pMac, LOG1, "##softap cbMode %d\n", cbMode);
10366 pBssConfig->cbMode = cbMode;
10367 pSession->bssParams.cbMode = cbMode;
10368 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010369
10370 if( CSR_IS_START_IBSS( pProfile ) )
10371 {
10372 //TBH: channel bonding is not supported for Libra
10373 if( pProfile->ChannelInfo.ChannelList && eCSR_OPERATING_CHANNEL_AUTO != pProfile->ChannelInfo.ChannelList[0] )
10374 {
10375 Channel = pProfile->ChannelInfo.ChannelList[0];
10376 cbChoice = pProfile->CBMode;
10377 }
10378 else {
10379 cbChoice = pMac->roam.configParam.cbChoice;
10380 }
10381 pSession->bssParams.operationChn = Channel;
10382 //make sure channel is valid
10383 if(!csrRoamIsChannelValid(pMac, Channel))
10384 {
10385 //set Channel to 0 to let lim know this is invalid
10386 //We still send this request down to lim even though we know the channel is wrong because
10387 //lim will response with error and hdd's eWNI_SME_START_BSS_RSP handler will roam other profile (if any)
10388 Channel = 0;
10389 pSession->bssParams.operationChn = 0;
10390 }
10391 else {
10392 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070010393 if(CSR_IS_CHANNEL_24GHZ(Channel))
10394 {
10395 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
10396 }
10397 else
10398 {
10399 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
10400 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010401 //now we have a valid channel
10402 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
10403 {
10404 //let's pick a secondard channel
10405 SecondChn = csrRoamGetSecondaryChannel(pMac, Channel, cbChoice);
Jeff Johnson295189b2012-06-20 16:38:30 -070010406 if(SecondChn > Channel)
10407 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010408 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010409 }
10410 else if(SecondChn && SecondChn < Channel)
10411 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010412 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010413 }
10414 else
10415 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010416 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010417 }
10418 pSession->bssParams.cbMode = cbMode;
10419 }
10420 else
10421 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010422 pSession->bssParams.cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010423 }
10424 }
10425 }
10426 }
10427}
10428
Jeff Johnson295189b2012-06-20 16:38:30 -070010429static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
10430 tANI_BOOLEAN *pfSameIbss )
10431{
10432 eHalStatus status = eHAL_STATUS_SUCCESS;
10433 tANI_BOOLEAN fSameIbss = FALSE;
10434
10435 if ( csrIsConnStateIbss( pMac, sessionId ) )
10436 {
10437 // Check if any profile parameter has changed ? If any profile parameter
10438 // has changed then stop old BSS and start a new one with new parameters
10439 if ( csrIsSameProfile( pMac, &pMac->roam.roamSession[sessionId].connectedProfile, pProfile ) )
10440 {
10441 fSameIbss = TRUE;
10442 }
10443 else
10444 {
10445 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10446 }
10447 }
10448 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10449 {
10450 // Disassociate from the connected Infrastructure network...
10451 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10452 }
10453 else
10454 {
10455 tBssConfigParam *pBssConfig;
10456
10457 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
10458 if(HAL_STATUS_SUCCESS(status))
10459 {
10460 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
10461 // there is no Bss description before we start an IBSS so we need to adopt
10462 // all Bss configuration parameters from the Profile.
10463 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, pBssConfig, NULL);
10464 if(HAL_STATUS_SUCCESS(status))
10465 {
10466 //save dotMode
10467 pMac->roam.roamSession[sessionId].bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
10468 //Prepare some more parameters for this IBSS
Jeff Johnsone7245742012-09-05 17:12:55 -070010469 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010470 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
10471 }
10472
10473 palFreeMemory(pMac->hHdd, pBssConfig);
10474 }//Allocate memory
10475 }
10476
10477 if(pfSameIbss)
10478 {
10479 *pfSameIbss = fSameIbss;
10480 }
10481 return( status );
10482}
10483
Jeff Johnson295189b2012-06-20 16:38:30 -070010484static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId,
10485 tSirSmeNewBssInfo *pNewBss )
10486{
10487 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010488
10489 if(!pSession)
10490 {
10491 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10492 return;
10493 }
10494
Jeff Johnson295189b2012-06-20 16:38:30 -070010495 if( pNewBss )
10496 {
10497 // Set the operating channel.
10498 pSession->connectedProfile.operationChannel = pNewBss->channelNumber;
10499 // move the BSSId from the BSS description into the connected state information.
10500 palCopyMemory( pMac->hHdd, &pSession->connectedProfile.bssid,
10501 &(pNewBss->bssId), sizeof( tCsrBssid ) );
10502 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010503 return;
10504}
10505
Jeff Johnson295189b2012-06-20 16:38:30 -070010506#ifdef FEATURE_WLAN_WAPI
10507eHalStatus csrRoamSetBKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tBkidCacheInfo *pBKIDCache,
10508 tANI_U32 numItems )
10509{
10510 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10511 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010512 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10513 {
10514 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10515 return status;
10516 }
10517 smsLog(pMac, LOGW, "csrRoamSetBKIDCache called, numItems = %d\n", numItems);
10518 pSession = CSR_GET_SESSION( pMac, sessionId );
10519 if(numItems <= CSR_MAX_BKID_ALLOWED)
10520 {
10521 status = eHAL_STATUS_SUCCESS;
10522 //numItems may be 0 to clear the cache
10523 pSession->NumBkidCache = (tANI_U16)numItems;
10524 if(numItems && pBKIDCache)
10525 {
10526 status = palCopyMemory( pMac->hHdd, pSession->BkidCacheInfo, pBKIDCache,
10527 sizeof(tBkidCacheInfo) * numItems );
10528 }
10529 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010530 return (status);
10531}
Jeff Johnson295189b2012-06-20 16:38:30 -070010532eHalStatus csrRoamGetBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum,
10533 tBkidCacheInfo *pBkidCache)
10534{
10535 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10536 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010537 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10538 {
10539 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10540 return status;
10541 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010542 pSession = CSR_GET_SESSION( pMac, sessionId );
10543 if(pNum && pBkidCache)
10544 {
10545 if(pSession->NumBkidCache == 0)
10546 {
10547 *pNum = 0;
10548 status = eHAL_STATUS_SUCCESS;
10549 }
10550 else if(*pNum >= pSession->NumBkidCache)
10551 {
10552 if(pSession->NumBkidCache > CSR_MAX_PMKID_ALLOWED)
10553 {
10554 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10555 pSession->NumBkidCache);
10556 pSession->NumBkidCache = CSR_MAX_PMKID_ALLOWED;
10557 }
10558 palCopyMemory( pMac->hHdd, pBkidCache, pSession->BkidCacheInfo,
10559 sizeof(tBkidCacheInfo) * pSession->NumBkidCache );
10560 *pNum = pSession->NumBkidCache;
10561 status = eHAL_STATUS_SUCCESS;
10562 }
10563 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010564 return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -070010565}
Jeff Johnson295189b2012-06-20 16:38:30 -070010566tANI_U32 csrRoamGetNumBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10567{
10568 return (pMac->roam.roamSession[sessionId].NumBkidCache);
Jeff Johnson295189b2012-06-20 16:38:30 -070010569}
10570#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010571eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
10572 tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems )
10573{
10574 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10575 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010576
10577 if(!pSession)
10578 {
10579 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10580 return eHAL_STATUS_FAILURE;
10581 }
10582
Jeff Johnson295189b2012-06-20 16:38:30 -070010583 smsLog(pMac, LOGW, "csrRoamSetPMKIDCache called, numItems = %d\n", numItems);
10584 if(numItems <= CSR_MAX_PMKID_ALLOWED)
10585 {
10586#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10587 {
10588 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
10589 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
10590 secEvent.eventId = WLAN_SECURITY_EVENT_PMKID_UPDATE;
10591 secEvent.encryptionModeMulticast =
10592 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
10593 secEvent.encryptionModeUnicast =
10594 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
10595 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
10596 secEvent.authMode =
10597 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
10598 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
10599 }
10600#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -070010601 status = eHAL_STATUS_SUCCESS;
10602 //numItems may be 0 to clear the cache
10603 pSession->NumPmkidCache = (tANI_U16)numItems;
10604 if(numItems && pPMKIDCache)
10605 {
10606 status = palCopyMemory( pMac->hHdd, pSession->PmkidCacheInfo, pPMKIDCache,
10607 sizeof(tPmkidCacheInfo) * numItems );
10608 }
10609 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010610 return (status);
10611}
10612
Jeff Johnson295189b2012-06-20 16:38:30 -070010613tANI_U32 csrRoamGetNumPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10614{
10615 return (pMac->roam.roamSession[sessionId].NumPmkidCache);
10616}
10617
Jeff Johnson295189b2012-06-20 16:38:30 -070010618eHalStatus csrRoamGetPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum, tPmkidCacheInfo *pPmkidCache)
10619{
10620 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10621 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010622
10623 if(!pSession)
10624 {
10625 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10626 return eHAL_STATUS_FAILURE;
10627 }
10628
Jeff Johnson295189b2012-06-20 16:38:30 -070010629 if(pNum && pPmkidCache)
10630 {
10631 if(pSession->NumPmkidCache == 0)
10632 {
10633 *pNum = 0;
10634 status = eHAL_STATUS_SUCCESS;
10635 }
10636 else if(*pNum >= pSession->NumPmkidCache)
10637 {
10638 if(pSession->NumPmkidCache > CSR_MAX_PMKID_ALLOWED)
10639 {
10640 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10641 pSession->NumPmkidCache);
10642 pSession->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
10643 }
10644 palCopyMemory( pMac->hHdd, pPmkidCache, pSession->PmkidCacheInfo,
10645 sizeof(tPmkidCacheInfo) * pSession->NumPmkidCache );
10646 *pNum = pSession->NumPmkidCache;
10647 status = eHAL_STATUS_SUCCESS;
10648 }
10649 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010650 return (status);
10651}
10652
Jeff Johnson295189b2012-06-20 16:38:30 -070010653eHalStatus csrRoamGetWpaRsnReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10654{
10655 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10656 tANI_U32 len;
10657 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010658
10659 if(!pSession)
10660 {
10661 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10662 return eHAL_STATUS_FAILURE;
10663 }
10664
Jeff Johnson295189b2012-06-20 16:38:30 -070010665 if(pLen)
10666 {
10667 len = *pLen;
10668 *pLen = pSession->nWpaRsnReqIeLength;
10669 if(pBuf)
10670 {
10671 if(len >= pSession->nWpaRsnReqIeLength)
10672 {
10673 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnReqIE, pSession->nWpaRsnReqIeLength);
10674 }
10675 }
10676 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010677 return (status);
10678}
10679
Jeff Johnson295189b2012-06-20 16:38:30 -070010680eHalStatus csrRoamGetWpaRsnRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10681{
10682 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10683 tANI_U32 len;
10684 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010685
10686 if(!pSession)
10687 {
10688 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10689 return eHAL_STATUS_FAILURE;
10690 }
10691
Jeff Johnson295189b2012-06-20 16:38:30 -070010692 if(pLen)
10693 {
10694 len = *pLen;
10695 *pLen = pSession->nWpaRsnRspIeLength;
10696 if(pBuf)
10697 {
10698 if(len >= pSession->nWpaRsnRspIeLength)
10699 {
10700 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnRspIE, pSession->nWpaRsnRspIeLength);
10701 }
10702 }
10703 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010704 return (status);
10705}
Jeff Johnson295189b2012-06-20 16:38:30 -070010706#ifdef FEATURE_WLAN_WAPI
10707eHalStatus csrRoamGetWapiReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10708{
10709 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10710 tANI_U32 len;
10711 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010712
10713 if(!pSession)
10714 {
10715 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10716 return eHAL_STATUS_FAILURE;
10717 }
10718
Jeff Johnson295189b2012-06-20 16:38:30 -070010719 if(pLen)
10720 {
10721 len = *pLen;
10722 *pLen = pSession->nWapiReqIeLength;
10723 if(pBuf)
10724 {
10725 if(len >= pSession->nWapiReqIeLength)
10726 {
10727 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiReqIE, pSession->nWapiReqIeLength);
10728 }
10729 }
10730 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010731 return (status);
10732}
Jeff Johnson295189b2012-06-20 16:38:30 -070010733eHalStatus csrRoamGetWapiRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10734{
10735 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10736 tANI_U32 len;
10737 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010738
10739 if(!pSession)
10740 {
10741 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10742 return eHAL_STATUS_FAILURE;
10743 }
10744
Jeff Johnson295189b2012-06-20 16:38:30 -070010745 if(pLen)
10746 {
10747 len = *pLen;
10748 *pLen = pSession->nWapiRspIeLength;
10749 if(pBuf)
10750 {
10751 if(len >= pSession->nWapiRspIeLength)
10752 {
10753 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiRspIE, pSession->nWapiRspIeLength);
10754 }
10755 }
10756 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010757 return (status);
10758}
10759#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010760eRoamCmdStatus csrGetRoamCompleteStatus(tpAniSirGlobal pMac, tANI_U32 sessionId)
10761{
10762 eRoamCmdStatus retStatus = eCSR_ROAM_CONNECT_COMPLETION;
10763 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010764
10765 if(!pSession)
10766 {
10767 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10768 return (retStatus);
10769 }
10770
Jeff Johnson295189b2012-06-20 16:38:30 -070010771 if(CSR_IS_ROAMING(pSession))
10772 {
10773 retStatus = eCSR_ROAM_ROAMING_COMPLETION;
10774 pSession->fRoaming = eANI_BOOLEAN_FALSE;
10775 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010776 return (retStatus);
10777}
10778
Jeff Johnson295189b2012-06-20 16:38:30 -070010779//This function remove the connected BSS from te cached scan result
10780eHalStatus csrRoamRemoveConnectedBssFromScanCache(tpAniSirGlobal pMac,
10781 tCsrRoamConnectedProfile *pConnProfile)
10782{
10783 eHalStatus status = eHAL_STATUS_FAILURE;
10784 tCsrScanResultFilter *pScanFilter = NULL;
10785 tListElem *pEntry;
10786 tCsrScanResult *pResult;
10787 tDot11fBeaconIEs *pIes;
10788 tANI_BOOLEAN fMatch;
Jeff Johnson295189b2012-06-20 16:38:30 -070010789 if(!(csrIsMacAddressZero(pMac, &pConnProfile->bssid) ||
10790 csrIsMacAddressBroadcast(pMac, &pConnProfile->bssid)))
10791 {
10792 do
10793 {
10794 //Prepare the filter. Only fill in the necessary fields. Not all fields are needed
10795 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
10796 if(!HAL_STATUS_SUCCESS(status)) break;
10797 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
10798 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, sizeof(tCsrBssid));
10799 if(!HAL_STATUS_SUCCESS(status)) break;
10800 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, &pConnProfile->bssid, sizeof(tCsrBssid));
10801 pScanFilter->BSSIDs.numOfBSSIDs = 1;
10802 if(!csrIsNULLSSID(pConnProfile->SSID.ssId, pConnProfile->SSID.length))
10803 {
10804 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
10805 if(!HAL_STATUS_SUCCESS(status)) break;
10806 palCopyMemory(pMac->hHdd, &pScanFilter->SSIDs.SSIDList[0].SSID, &pConnProfile->SSID, sizeof(tSirMacSSid));
10807 }
10808 pScanFilter->authType.numEntries = 1;
10809 pScanFilter->authType.authType[0] = pConnProfile->AuthType;
10810 pScanFilter->BSSType = pConnProfile->BSSType;
10811 pScanFilter->EncryptionType.numEntries = 1;
10812 pScanFilter->EncryptionType.encryptionType[0] = pConnProfile->EncryptionType;
10813 pScanFilter->mcEncryptionType.numEntries = 1;
10814 pScanFilter->mcEncryptionType.encryptionType[0] = pConnProfile->mcEncryptionType;
10815 //We ignore the channel for now, BSSID should be enough
10816 pScanFilter->ChannelInfo.numOfChannels = 0;
10817 //Also ignore the following fields
10818 pScanFilter->uapsd_mask = 0;
10819 pScanFilter->bWPSAssociation = eANI_BOOLEAN_FALSE;
10820 pScanFilter->countryCode[0] = 0;
10821 pScanFilter->phyMode = eCSR_DOT11_MODE_TAURUS;
Jeff Johnson295189b2012-06-20 16:38:30 -070010822 csrLLLock(&pMac->scan.scanResultList);
10823 pEntry = csrLLPeekHead( &pMac->scan.scanResultList, LL_ACCESS_NOLOCK );
10824 while( pEntry )
10825 {
10826 pResult = GET_BASE_ADDR( pEntry, tCsrScanResult, Link );
10827 pIes = (tDot11fBeaconIEs *)( pResult->Result.pvIes );
10828 fMatch = csrMatchBSS(pMac, &pResult->Result.BssDescriptor,
10829 pScanFilter, NULL, NULL, NULL, &pIes);
10830 //Release the IEs allocated by csrMatchBSS is needed
10831 if( !pResult->Result.pvIes )
10832 {
10833 //need to free the IEs since it is allocated by csrMatchBSS
10834 palFreeMemory(pMac->hHdd, pIes);
10835 }
10836 if(fMatch)
10837 {
10838 //We found the one
10839 if( csrLLRemoveEntry(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK) )
10840 {
10841 //Free the memory
10842 csrFreeScanResultEntry( pMac, pResult );
10843 }
10844 break;
10845 }
10846 pEntry = csrLLNext(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK);
10847 }//while
10848 csrLLUnlock(&pMac->scan.scanResultList);
10849 }while(0);
10850 if(pScanFilter)
10851 {
10852 csrFreeScanFilter(pMac, pScanFilter);
10853 palFreeMemory(pMac->hHdd, pScanFilter);
10854 }
10855 }
10856 return (status);
10857}
10858
Jeff Johnson295189b2012-06-20 16:38:30 -070010859//BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -070010860eHalStatus csrIsBTAMPAllowed( tpAniSirGlobal pMac, tANI_U32 chnId )
10861{
10862 eHalStatus status = eHAL_STATUS_SUCCESS;
10863 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070010864 for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
10865 {
10866 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
10867 {
10868 if( csrIsConnStateIbss( pMac, sessionId ) || csrIsBTAMP( pMac, sessionId ) )
10869 {
10870 //co-exist with IBSS or BT-AMP is not supported
10871 smsLog( pMac, LOGW, " BTAMP is not allowed due to IBSS/BT-AMP exist in session %d\n", sessionId );
10872 status = eHAL_STATUS_CSR_WRONG_STATE;
10873 break;
10874 }
10875 if( csrIsConnStateInfra( pMac, sessionId ) )
10876 {
10877 if( chnId &&
10878 ( (tANI_U8)chnId != pMac->roam.roamSession[sessionId].connectedProfile.operationChannel ) )
10879 {
10880 smsLog( pMac, LOGW, " BTAMP is not allowed due to channel (%d) diff than infr channel (%d)\n",
10881 chnId, pMac->roam.roamSession[sessionId].connectedProfile.operationChannel );
10882 status = eHAL_STATUS_CSR_WRONG_STATE;
10883 break;
10884 }
10885 }
10886 }
10887 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010888 return ( status );
10889}
10890
Jeff Johnson295189b2012-06-20 16:38:30 -070010891static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc )
10892{
10893 eHalStatus status = eHAL_STATUS_SUCCESS;
10894 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10895 tBssConfigParam bssConfig;
Jeff Johnson32d95a32012-09-10 13:15:23 -070010896
10897 if(!pSession)
10898 {
10899 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10900 return eHAL_STATUS_FAILURE;
10901 }
10902
Jeff Johnson295189b2012-06-20 16:38:30 -070010903 if ( csrIsConnStateIbss( pMac, sessionId ) )
10904 {
10905 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10906 }
10907 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10908 {
10909 // Disassociate from the connected Infrastructure network...
10910 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10911 }
10912 else
10913 {
10914#if defined(VOSS_ENABLED)
10915 //We don't expect Bt-AMP HDD not to disconnect the last connection first at this time.
10916 //Otherwise we need to add code to handle the
10917 //situation just like IBSS. Though for WDS station, we need to send disassoc to PE first then
10918 //send stop_bss to PE, before we can continue.
10919 VOS_ASSERT( !csrIsConnStateWds( pMac, sessionId ) );
10920#endif
10921 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(tBssConfigParam));
10922 /* Assume HDD provide bssid in profile */
10923 palCopyMemory( pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid[0], sizeof(tCsrBssid) );
10924 // there is no Bss description before we start an WDS so we need
10925 // to adopt all Bss configuration parameters from the Profile.
10926 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, &bssConfig, pBssDesc);
10927 if(HAL_STATUS_SUCCESS(status))
10928 {
10929 //Save profile for late use
10930 csrFreeRoamProfile( pMac, sessionId );
10931 if (HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
10932 (void **)&pSession->pCurRoamProfile,
10933 sizeof(tCsrRoamProfile))))
10934 {
10935 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
10936 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, pProfile);
10937 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010938 //Prepare some more parameters for this WDS
Jeff Johnsone7245742012-09-05 17:12:55 -070010939 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010940 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
10941 }
10942 }
10943
10944 return( status );
10945}
10946
Jeff Johnson295189b2012-06-20 16:38:30 -070010947////////////////////Mail box
10948
Jeff Johnson295189b2012-06-20 16:38:30 -070010949//pBuf is caller allocated memory point to &(tSirSmeJoinReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10950//or &(tSirSmeReassocReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10951static void csrPrepareJoinReassocReqBuffer( tpAniSirGlobal pMac,
10952 tSirBssDescription *pBssDescription,
10953 tANI_U8 *pBuf, tANI_U8 uapsdMask)
10954{
10955 tCsrChannelSet channelGroup;
10956 tSirMacCapabilityInfo *pAP_capabilityInfo;
10957 tAniBool fTmp;
10958 tANI_BOOLEAN found = FALSE;
10959 tANI_U32 size = 0;
10960 tANI_U16 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010961 // plug in neighborhood occupancy info (i.e. BSSes on primary or secondary channels)
10962 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundPri
10963 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecDown
10964 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecUp
Jeff Johnson295189b2012-06-20 16:38:30 -070010965 // 802.11h
10966 //We can do this because it is in HOST CPU order for now.
10967 pAP_capabilityInfo = (tSirMacCapabilityInfo *)&pBssDescription->capabilityInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070010968 //tell the target AP my 11H capability only if both AP and STA support 11H and the channel being used is 11a
10969 if ( csrIs11hSupported( pMac ) && pAP_capabilityInfo->spectrumMgt && eSIR_11A_NW_TYPE == pBssDescription->nwType )
10970 {
10971 fTmp = (tAniBool)pal_cpu_to_be32(1);
10972 }
10973 else
10974 fTmp = (tAniBool)0;
10975
10976 // corresponds to --- pMsg->spectrumMgtIndicator = ON;
10977 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&fTmp, sizeof(tAniBool) );
10978 pBuf += sizeof(tAniBool);
10979 *pBuf++ = MIN_STA_PWR_CAP_DBM; // it is for pMsg->powerCap.minTxPower = 0;
10980 found = csrSearchChannelListForTxPower(pMac, pBssDescription, &channelGroup);
Jeff Johnson295189b2012-06-20 16:38:30 -070010981 // This is required for 11k test VoWiFi Ent: Test 2.
10982 // We need the power capabilities for Assoc Req.
10983 // This macro is provided by the halPhyCfg.h. We pick our
10984 // max and min capability by the halPhy provided macros
10985 *pBuf++ = MAX_STA_PWR_CAP_DBM;
Jeff Johnson295189b2012-06-20 16:38:30 -070010986 size = sizeof(pMac->roam.validChannelList);
10987 if(HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &size)))
10988 {
10989 *pBuf++ = (tANI_U8)size; //tSirSupChnl->numChnl
10990 for ( i = 0; i < size; i++)
10991 {
10992 *pBuf++ = pMac->roam.validChannelList[ i ]; //tSirSupChnl->channelList[ i ]
10993
10994 }
10995 }
10996 else
10997 {
10998 smsLog(pMac, LOGE, FL("can not find any valid channel\n"));
10999 *pBuf++ = 0; //tSirSupChnl->numChnl
11000 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011001 //Check whether it is ok to enter UAPSD
11002#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11003 if( btcIsReadyForUapsd(pMac) )
11004#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11005 {
11006 *pBuf++ = uapsdMask;
11007 }
11008#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11009 else
11010 {
11011 smsLog(pMac, LOGE, FL(" BTC doesn't allow UAPSD for uapsd_mask(0x%X)\n"), uapsdMask);
11012 *pBuf++ = 0;
11013 }
11014#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11015
Jeff Johnson295189b2012-06-20 16:38:30 -070011016 // move the entire BssDescription into the join request.
11017 palCopyMemory( pMac->hHdd, pBuf, pBssDescription,
11018 pBssDescription->length + sizeof( pBssDescription->length ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070011019 pBuf += pBssDescription->length + sizeof( pBssDescription->length ); // update to new location
11020}
11021
Jeff Johnson295189b2012-06-20 16:38:30 -070011022/*
11023 * The communication between HDD and LIM is thru mailbox (MB).
11024 * Both sides will access the data structure "tSirSmeJoinReq".
11025 * The rule is, while the components of "tSirSmeJoinReq" can be accessed in the regular way like tSirSmeJoinReq.assocType, this guideline
11026 * stops at component tSirRSNie; any acces to the components after tSirRSNie is forbidden because the space from tSirRSNie is quueezed
11027 * with the component "tSirBssDescription". And since the size of actual 'tSirBssDescription' varies, the receiving side (which is the routine
11028 * limJoinReqSerDes() of limSerDesUtils.cc) should keep in mind not to access the components DIRECTLY after tSirRSNie.
11029 */
11030eHalStatus csrSendJoinReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11031 tCsrRoamProfile *pProfile, tDot11fBeaconIEs *pIes )
11032{
11033 eHalStatus status = eHAL_STATUS_SUCCESS;
11034 tSirSmeJoinReq *pMsg;
11035 tANI_U8 *pBuf;
11036 tANI_U16 msgLen, wTmp, ieLen;
11037 tSirMacRateSet OpRateSet;
11038 tSirMacRateSet ExRateSet;
11039 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11040 tANI_U32 dwTmp;
11041 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011042
11043 if(!pSession)
11044 {
11045 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11046 return eHAL_STATUS_FAILURE;
11047 }
11048
Jeff Johnson295189b2012-06-20 16:38:30 -070011049 do {
11050 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
11051 pSession->joinFailStatusCode.reasonCode = 0;
11052 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11053 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11054 // IE fields, but the length field in the bssDescription needs to be interpreted to
11055 // determine length of the IE fields.
11056 //
11057 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11058 // add in the length from the bssDescription (then add the size of the 'length' field
11059 // itself because that is NOT included in the length field).
11060 msgLen = sizeof( tSirSmeJoinReq ) - sizeof( *pBssDescription ) +
11061 pBssDescription->length + sizeof( pBssDescription->length ) +
11062 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 -070011063 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11064 if ( !HAL_STATUS_SUCCESS(status) ) break;
11065 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11066 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_JOIN_REQ);
11067 pMsg->length = pal_cpu_to_be16(msgLen);
11068 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070011069 // sessionId
11070 *pBuf = (tANI_U8)sessionId;
11071 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011072 // transactionId
11073 *pBuf = 0;
11074 *( pBuf + 1 ) = 0;
11075 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011076 // ssId
11077 if( pIes->SSID.present && pIes->SSID.num_ssid )
11078 {
11079 // ssId len
11080 *pBuf = pIes->SSID.num_ssid;
11081 pBuf++;
11082 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11083 pBuf += pIes->SSID.num_ssid;
11084 }
11085 else
11086 {
11087 *pBuf = 0;
11088 pBuf++;
11089 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011090 // selfMacAddr
11091 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11092 pBuf += sizeof(tSirMacAddr);
11093 // bsstype
11094 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11095 if (dwTmp == eSIR_BTAMP_STA_MODE) dwTmp = eSIR_BTAMP_AP_MODE; // Override BssType for BTAMP
11096 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11097 pBuf += sizeof(tSirBssType);
11098 // dot11mode
11099 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11100 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011101 //Persona
11102 *pBuf = (tANI_U8)pProfile->csrPersona;
11103 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011104 //CBMode
11105 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11106 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011107
11108 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
Jeff Johnsone7245742012-09-05 17:12:55 -070011109 FL("CSR PERSONA=%d CSR CbMode %d"), pProfile->csrPersona, pSession->bssParams.cbMode);
11110
Jeff Johnson295189b2012-06-20 16:38:30 -070011111 // uapsdPerAcBitmask
11112 *pBuf = pProfile->uapsd_mask;
11113 pBuf++;
11114
Jeff Johnsone7245742012-09-05 17:12:55 -070011115
Jeff Johnson295189b2012-06-20 16:38:30 -070011116
11117#if (WNI_POLARIS_FW_PACKAGE == ADVANCED)
11118#endif /*(WNI_POLARIS_FW_PACKAGE == ADVANCED)*/
Jeff Johnson295189b2012-06-20 16:38:30 -070011119 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet);
11120 if (HAL_STATUS_SUCCESS(status) )
11121 {
11122 // OperationalRateSet
11123 if (OpRateSet.numRates) {
11124 *pBuf++ = OpRateSet.numRates;
11125 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11126 pBuf += OpRateSet.numRates;
11127 } else *pBuf++ = 0;
11128 // ExtendedRateSet
11129 if (ExRateSet.numRates) {
11130 *pBuf++ = ExRateSet.numRates;
11131 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11132 pBuf += ExRateSet.numRates;
11133 } else *pBuf++ = 0;
11134 }
11135 else
11136 {
11137 *pBuf++ = 0;
11138 *pBuf++ = 0;
11139 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011140 // rsnIE
11141 if ( csrIsProfileWpa( pProfile ) )
11142 {
11143 // Insert the Wpa IE into the join request
11144 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11145 (tCsrWpaIe *)( wpaRsnIE ) );
11146 }
11147 else if( csrIsProfileRSN( pProfile ) )
11148 {
11149 // Insert the RSN IE into the join request
11150 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11151 (tCsrRSNIe *)( wpaRsnIE ) );
11152 }
11153#ifdef FEATURE_WLAN_WAPI
11154 else if( csrIsProfileWapi( pProfile ) )
11155 {
11156 // Insert the WAPI IE into the join request
11157 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11158 (tCsrWapiIe *)( wpaRsnIE ) );
11159 }
11160#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070011161 else
11162 {
11163 ieLen = 0;
11164 }
11165 //remember the IE for future use
11166 if( ieLen )
11167 {
11168 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11169 {
11170 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);
11171 ieLen = DOT11F_IE_RSN_MAX_LEN;
11172 }
11173#ifdef FEATURE_WLAN_WAPI
11174 if( csrIsProfileWapi( pProfile ) )
11175 {
11176 //Check whether we need to allocate more memory
11177 if(ieLen > pSession->nWapiReqIeLength)
11178 {
11179 if(pSession->pWapiReqIE && pSession->nWapiReqIeLength)
11180 {
11181 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11182 }
11183 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiReqIE, ieLen);
11184 if(!HAL_STATUS_SUCCESS(status)) break;
11185 }
11186 pSession->nWapiReqIeLength = ieLen;
11187 palCopyMemory(pMac->hHdd, pSession->pWapiReqIE, wpaRsnIE, ieLen);
11188 wTmp = pal_cpu_to_be16( ieLen );
11189 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11190 pBuf += sizeof(tANI_U16);
11191 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11192 pBuf += ieLen;
11193 }
11194 else//should be WPA/WPA2 otherwise
11195#endif /* FEATURE_WLAN_WAPI */
11196 {
11197 //Check whether we need to allocate more memory
11198 if(ieLen > pSession->nWpaRsnReqIeLength)
11199 {
11200 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11201 {
11202 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11203 }
11204 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11205 if(!HAL_STATUS_SUCCESS(status)) break;
11206 }
11207 pSession->nWpaRsnReqIeLength = ieLen;
11208 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11209 wTmp = pal_cpu_to_be16( ieLen );
11210 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11211 pBuf += sizeof(tANI_U16);
11212 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11213 pBuf += ieLen;
11214 }
11215 }
11216 else
11217 {
11218 //free whatever old info
11219 pSession->nWpaRsnReqIeLength = 0;
11220 if(pSession->pWpaRsnReqIE)
11221 {
11222 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11223 pSession->pWpaRsnReqIE = NULL;
11224 }
11225#ifdef FEATURE_WLAN_WAPI
11226 pSession->nWapiReqIeLength = 0;
11227 if(pSession->pWapiReqIE)
11228 {
11229 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11230 pSession->pWapiReqIE = NULL;
11231 }
11232#endif /* FEATURE_WLAN_WAPI */
11233 //length is two bytes
11234 *pBuf = 0;
11235 *(pBuf + 1) = 0;
11236 pBuf += 2;
11237 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011238#ifdef FEATURE_WLAN_CCX
11239 // Never include the cckmIE in an Join Request
11240 //length is two bytes
11241 *pBuf = 0;
11242 *(pBuf + 1) = 0;
11243 pBuf += 2;
11244#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011245 // addIEScan
11246 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11247 {
11248 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011249 if(ieLen > pSession->nAddIEScanLength)
11250 {
11251 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11252 {
11253 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11254 }
11255 status = palAllocateMemory(pMac->hHdd,
11256 (void **)&pSession->pAddIEScan, ieLen);
11257 if(!HAL_STATUS_SUCCESS(status)) break;
11258 }
11259 pSession->nAddIEScanLength = ieLen;
11260 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11261 pProfile->pAddIEScan, ieLen);
11262 wTmp = pal_cpu_to_be16( ieLen );
11263 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11264 pBuf += sizeof(tANI_U16);
11265 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11266 pBuf += ieLen;
11267 }
11268 else
11269 {
11270 pSession->nAddIEScanLength = 0;
11271 if(pSession->pAddIEScan)
11272 {
11273 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11274 pSession->pAddIEScan = NULL;
11275 }
11276 *pBuf = 0;
11277 *(pBuf + 1) = 0;
11278 pBuf += 2;
11279 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011280 // addIEAssoc
11281 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11282 {
11283 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011284 if(ieLen > pSession->nAddIEAssocLength)
11285 {
11286 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11287 {
11288 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11289 }
11290 status = palAllocateMemory(pMac->hHdd,
11291 (void **)&pSession->pAddIEAssoc, ieLen);
11292 if(!HAL_STATUS_SUCCESS(status)) break;
11293 }
11294 pSession->nAddIEAssocLength = ieLen;
11295 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11296 pProfile->pAddIEAssoc, ieLen);
11297 wTmp = pal_cpu_to_be16( ieLen );
11298 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11299 pBuf += sizeof(tANI_U16);
11300 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11301 pBuf += ieLen;
11302 }
11303 else
11304 {
11305 pSession->nAddIEAssocLength = 0;
11306 if(pSession->pAddIEAssoc)
11307 {
11308 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11309 pSession->pAddIEAssoc = NULL;
11310 }
11311 *pBuf = 0;
11312 *(pBuf + 1) = 0;
11313 pBuf += 2;
11314 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011315 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11316 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11317 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011318 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11319 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11320 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011321#ifdef WLAN_FEATURE_VOWIFI_11R
11322 if (csrIsProfile11r( pProfile ) )
11323 {
11324 // is11Rconnection;
11325 dwTmp = pal_cpu_to_be32(TRUE);
11326 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11327 pBuf += sizeof(tAniBool);
11328 }
11329 else
11330 {
11331 // is11Rconnection;
11332 dwTmp = pal_cpu_to_be32(FALSE);
11333 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11334 pBuf += sizeof(tAniBool);
11335 }
11336#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011337#ifdef FEATURE_WLAN_CCX
11338 /* A profile can not be both CCX and 11R. But an 802.11R AP
11339 * may be advertising support for CCX as well. So if we are
11340 * associating Open or explicitly CCX then we will get CCX.
11341 * If we are associating explictly 11R only then we will get
11342 * 11R.
11343 */
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011344 if ((csrIsProfileCCX(pProfile) ||
11345 ((pIes->CCXVersion.present)
11346 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11347 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11348 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11349 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11350 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11351 && (!(csrIsProfile11r( pProfile )))
11352 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011353 {
11354 // isCCXconnection;
11355 dwTmp = pal_cpu_to_be32(TRUE);
11356 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11357 pBuf += sizeof(tAniBool);
11358 }
11359 else
11360 {
11361 //isCCXconnection;
11362 dwTmp = pal_cpu_to_be32(FALSE);
11363 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11364 pBuf += sizeof(tAniBool);
11365 }
11366 {
11367 tCCXTspecInfo ccxTspec;
11368 // CCX-Tspec IEs in the ASSOC request is presently not supported
11369 // so nullify the TSPEC parameters
11370 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11371 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11372 pBuf += sizeof(tCCXTspecInfo);
11373 }
11374#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011375#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011376 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011377 if (pMac->roam.configParam.isFastTransitionEnabled
11378#ifdef FEATURE_WLAN_LFR
11379 || csrRoamIsFastRoamEnabled(pMac)
11380#endif
11381 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011382 {
11383 dwTmp = pal_cpu_to_be32(TRUE);
11384 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11385 pBuf += sizeof(tAniBool);
11386 }
11387 else
11388 {
11389 dwTmp = pal_cpu_to_be32(FALSE);
11390 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11391 pBuf += sizeof(tAniBool);
11392 }
11393#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011394#ifdef FEATURE_WLAN_LFR
11395 if(csrRoamIsFastRoamEnabled(pMac))
11396 {
11397 //legacy fast roaming enabled
11398 dwTmp = pal_cpu_to_be32(TRUE);
11399 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11400 pBuf += sizeof(tAniBool);
11401 }
11402 else
11403 {
11404 dwTmp = pal_cpu_to_be32(FALSE);
11405 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11406 pBuf += sizeof(tAniBool);
11407 }
11408#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011409 //BssDesc
11410 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf,
11411 (tANI_U8)pProfile->uapsd_mask);
Jeff Johnson295189b2012-06-20 16:38:30 -070011412 status = palSendMBMessage(pMac->hHdd, pMsg );
11413 if(!HAL_STATUS_SUCCESS(status))
11414 {
11415 break;
11416 }
11417 //Tush-QoS: notify QoS module that join happening
11418 else
11419 {
11420#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11421 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_JOIN_REQ, NULL);
11422#endif
11423 }
11424 } while( 0 );
11425 return( status );
11426}
11427
Jeff Johnson295189b2012-06-20 16:38:30 -070011428eHalStatus csrSendSmeReassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11429 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile )
11430{
11431 eHalStatus status;
11432 tSirSmeReassocReq *pMsg;
11433 tANI_U8 *pBuf;
11434 v_U8_t acm_mask = 0, uapsd_mask;
11435 tANI_U16 msgLen, ieLen, wTmp;
11436 tANI_U32 dwTmp;
11437 tSirMacRateSet OpRateSet;
11438 tSirMacRateSet ExRateSet;
11439 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11440 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011441
11442 if(!pSession)
11443 {
11444 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11445 return eHAL_STATUS_FAILURE;
11446 }
11447
Jeff Johnson295189b2012-06-20 16:38:30 -070011448 /* To satisfy klockworks */
11449 if (pBssDescription == NULL)
11450 {
11451 smsLog(pMac, LOGE, FL(" pBssDescription is NULL\n"));
11452 return eHAL_STATUS_FAILURE;
11453 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011454 do {
11455 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11456 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11457 // IE fields, but the length field in the bssDescription needs to be interpreted to
11458 // determine length of the IE fields.
11459 //
11460 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11461 // add in the length from the bssDescription (then add the size of the 'length' field
11462 // itself because that is NOT included in the length field).
11463 msgLen = sizeof( tSirSmeReassocReq ) - sizeof( *pBssDescription ) +
11464 pBssDescription->length + sizeof( pBssDescription->length ) +
11465 sizeof( tCsrWpaIe ) + sizeof( tCsrWpaAuthIe ) + sizeof( tANI_U16 ); // add in the size of the WPA IE that we may build.
11466 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11467 if ( !HAL_STATUS_SUCCESS(status) ) break;
11468 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11469 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REASSOC_REQ);
11470 pMsg->length = pal_cpu_to_be16(msgLen);
11471 pBuf = &pMsg->sessionId;
11472 // sessionId
11473 *pBuf++ = (tANI_U8)sessionId;
11474 // transactionId
11475 *pBuf = 0;
11476 *(pBuf + 1) = 0;
11477 pBuf += sizeof (tANI_U16);
11478 // ssId
11479 if( pIes->SSID.present && pIes->SSID.num_ssid )
11480 {
11481 // ssId len
11482 *pBuf++ = pIes->SSID.num_ssid;
11483 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11484 pBuf += pIes->SSID.num_ssid;
11485 }
11486 else
11487 {
11488 *pBuf++ = 0;
11489 }
11490 // selfMacAddr
11491 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11492 pBuf += sizeof(tSirMacAddr);
11493 // bsstype
11494 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11495 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11496 pBuf += sizeof(tSirBssType);
11497 // dot11mode
11498 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11499 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011500 //Persona
11501 *pBuf = (tANI_U8)pProfile->csrPersona;
11502 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011503 //CBMode
11504 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11505 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011506
Jeff Johnsone7245742012-09-05 17:12:55 -070011507 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
11508 FL("CSR PERSONA=%d CSR CBMode=%u\n"), pProfile->csrPersona, pSession->bssParams.cbMode);
11509
Jeff Johnson295189b2012-06-20 16:38:30 -070011510 // uapsdPerAcBitmask
11511 *pBuf = pProfile->uapsd_mask;
11512 pBuf++;
11513
Jeff Johnson295189b2012-06-20 16:38:30 -070011514 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode,
11515 pBssDescription, pIes, &OpRateSet, &ExRateSet);
11516 if (HAL_STATUS_SUCCESS(status) )
11517 {
11518 // OperationalRateSet
11519 if (OpRateSet.numRates)
11520 {
11521 *pBuf++ = OpRateSet.numRates;
11522 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11523 pBuf += OpRateSet.numRates;
11524 }
11525 else *pBuf++ = 0;
11526 // ExtendedRateSet
11527 if (ExRateSet.numRates)
11528 {
11529 *pBuf++ = ExRateSet.numRates;
11530 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11531 pBuf += ExRateSet.numRates;
11532 }
11533 else *pBuf++ = 0;
11534 }
11535 else
11536 {
11537 *pBuf++ = 0;
11538 *pBuf++ = 0;
11539 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011540 // rsnIE
11541 if ( csrIsProfileWpa( pProfile ) )
11542 {
11543 // Insert the Wpa IE into the join request
11544 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11545 (tCsrWpaIe *)( wpaRsnIE ) );
11546 }
11547 else if( csrIsProfileRSN( pProfile ) )
11548 {
11549 // Insert the RSN IE into the join request
11550 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11551 (tCsrRSNIe *)( wpaRsnIE ) );
11552 }
11553#ifdef FEATURE_WLAN_WAPI
11554 else if( csrIsProfileWapi( pProfile ) )
11555 {
11556 // Insert the WAPI IE into the join request
11557 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11558 (tCsrWapiIe *)( wpaRsnIE) );
11559 }
11560#endif /* FEATURE_WLAN_WAPI */
11561 else
11562 {
11563 ieLen = 0;
11564 }
11565 //remember the IE for future use
11566 if( ieLen )
11567 {
11568 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11569 {
11570 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);
11571 ieLen = DOT11F_IE_RSN_MAX_LEN;
11572 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011573 //Check whether we need to allocate more memory
11574 if(ieLen > pSession->nWpaRsnReqIeLength)
11575 {
11576 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11577 {
11578 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11579 }
11580 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11581 if(!HAL_STATUS_SUCCESS(status)) break;
11582 }
11583 pSession->nWpaRsnReqIeLength = ieLen;
11584 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11585 wTmp = pal_cpu_to_be16( ieLen );
11586 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11587 pBuf += sizeof(tANI_U16);
11588 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11589 pBuf += ieLen;
11590 }
11591 else
11592 {
11593 //free whatever old info
11594 pSession->nWpaRsnReqIeLength = 0;
11595 if(pSession->pWpaRsnReqIE)
11596 {
11597 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11598 pSession->pWpaRsnReqIE = NULL;
11599 }
11600 //length is two bytes
11601 *pBuf = 0;
11602 *(pBuf + 1) = 0;
11603 pBuf += 2;
11604 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011605#ifdef FEATURE_WLAN_CCX
11606 // cckmIE
11607 if( csrIsProfileCCX( pProfile ) )
11608 {
11609 // Insert the CCKM IE into the join request
11610 ieLen = csrConstructCcxCckmIe( pMac,
11611 pSession,
11612 pProfile,
11613 pBssDescription,
11614 pSession->pWpaRsnReqIE,
11615 pSession->nWpaRsnReqIeLength,
11616 (void *)( wpaRsnIE ) );
11617 }
11618 else
11619 {
11620 ieLen = 0;
11621 }
11622 //If present, copy the IE into the eWNI_SME_REASSOC_REQ message buffer
11623 if( ieLen )
11624 {
11625 //Copy the CCKM IE over from the temp buffer (wpaRsnIE)
11626 wTmp = pal_cpu_to_be16( ieLen );
11627 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11628 pBuf += sizeof(tANI_U16);
11629 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11630 pBuf += ieLen;
11631 }
11632 else
11633 {
11634 //Indicate you have no CCKM IE
11635 //length is two bytes
11636 *pBuf = 0;
11637 *(pBuf + 1) = 0;
11638 pBuf += 2;
11639 }
11640#endif /* FEATURE_WLAN_CCX */
Jeff Johnson295189b2012-06-20 16:38:30 -070011641 // addIEScan
11642 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11643 {
11644 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011645 if(ieLen > pSession->nAddIEScanLength)
11646 {
11647 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11648 {
11649 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11650 }
11651 status = palAllocateMemory(pMac->hHdd,
11652 (void **)&pSession->pAddIEScan, ieLen);
11653 if(!HAL_STATUS_SUCCESS(status)) break;
11654 }
11655 pSession->nAddIEScanLength = ieLen;
11656 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11657 pProfile->pAddIEScan, ieLen);
11658 wTmp = pal_cpu_to_be16( ieLen );
11659 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11660 pBuf += sizeof(tANI_U16);
11661 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11662 pBuf += ieLen;
11663 }
11664 else
11665 {
11666 pSession->nAddIEScanLength = 0;
11667 if(pSession->pAddIEScan)
11668 {
11669 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11670 pSession->pAddIEScan = NULL;
11671 }
11672 *pBuf = 0;
11673 *(pBuf + 1) = 0;
11674 pBuf += 2;
11675 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011676 // addIEAssoc
11677 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11678 {
11679 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011680 if(ieLen > pSession->nAddIEAssocLength)
11681 {
11682 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11683 {
11684 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11685 }
11686 status = palAllocateMemory(pMac->hHdd,
11687 (void **)&pSession->pAddIEAssoc, ieLen);
11688 if(!HAL_STATUS_SUCCESS(status)) break;
11689 }
11690 pSession->nAddIEAssocLength = ieLen;
11691 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11692 pProfile->pAddIEAssoc, ieLen);
11693 wTmp = pal_cpu_to_be16( ieLen );
11694 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11695 pBuf += sizeof(tANI_U16);
11696 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11697 pBuf += ieLen;
11698 }
11699 else
11700 {
11701 pSession->nAddIEAssocLength = 0;
11702 if(pSession->pAddIEAssoc)
11703 {
11704 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11705 pSession->pAddIEAssoc = NULL;
11706 }
11707 *pBuf = 0;
11708 *(pBuf + 1) = 0;
11709 pBuf += 2;
11710 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011711 //Unmask any AC in reassoc that is ACM-set
11712 uapsd_mask = (v_U8_t)pProfile->uapsd_mask;
11713 if( uapsd_mask && ( NULL != pBssDescription ) )
11714 {
11715 if( CSR_IS_QOS_BSS(pIes) && CSR_IS_UAPSD_BSS(pIes) )
11716 {
11717#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11718 acm_mask = sme_QosGetACMMask(pMac, pBssDescription, pIes);
11719#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11720 uapsd_mask &= ~(acm_mask);
11721 }
11722 else
11723 {
11724 uapsd_mask = 0;
11725 }
11726 }
11727
11728 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11729 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11730 pBuf += sizeof(tANI_U32);
11731
11732 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11733 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11734 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011735#ifdef WLAN_FEATURE_VOWIFI_11R
11736 // is11Rconnection;
11737 dwTmp = csrIsProfile11r( pProfile )? pal_cpu_to_be32(TRUE) : 0;
11738 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11739 pBuf += sizeof(tAniBool);
Jeff Johnson295189b2012-06-20 16:38:30 -070011740#ifdef FEATURE_WLAN_CCX
11741 //isCCXconnection;
11742 //CCKM profile, ccxversion ie present, not 11r and ini file has CCX enabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011743 dwTmp = ( ((csrIsProfileCCX(pProfile) ||
11744 ((pIes->CCXVersion.present)
11745 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11746 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11747 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11748 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11749 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11750 && (!(csrIsProfile11r( pProfile )))
11751 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
11752 ? pal_cpu_to_be32(TRUE) : 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070011753 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11754 pBuf += sizeof(tAniBool);
11755#endif // FEATURE_WLAN_CCX
11756#endif // WLAN_FEATURE_VOWIFI_11R
Jeff Johnson295189b2012-06-20 16:38:30 -070011757#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011758 if ((csrIsProfileCCX(pProfile) ||
11759 ((pIes->CCXVersion.present)
11760 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11761 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11762 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11763 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11764 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11765 && (!(csrIsProfile11r( pProfile )))
11766 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011767 {
11768 tCCXTspecInfo ccxTspec;
Jeff Johnson295189b2012-06-20 16:38:30 -070011769 // CCX Tspec information
11770 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11771 ccxTspec.numTspecs = sme_QosCCxRetrieveTspecInfo(pMac, sessionId, (tTspecInfo *) &ccxTspec.tspec[0]);
11772 *pBuf = ccxTspec.numTspecs;
11773 pBuf += sizeof(tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070011774 // Copy the TSPEC information only if present
11775 if (ccxTspec.numTspecs) {
11776 palCopyMemory(pMac->hHdd, pBuf, (void*)&ccxTspec.tspec[0], (ccxTspec.numTspecs*sizeof(tTspecInfo)));
11777 }
11778 pBuf += sizeof(ccxTspec.tspec);
11779 }
11780 else
11781 {
11782 {
11783 tCCXTspecInfo ccxTspec;
11784 // CCX-Tspec IEs in the ASSOC request is presently not supported
11785 // so nullify the TSPEC parameters
11786 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11787 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11788 pBuf += sizeof(tCCXTspecInfo);
11789 }
11790 }
11791#endif // FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011792#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011793 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011794 if (pMac->roam.configParam.isFastTransitionEnabled
11795#ifdef FEATURE_WLAN_LFR
11796 || csrRoamIsFastRoamEnabled(pMac)
11797#endif
11798 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011799 {
11800 dwTmp = pal_cpu_to_be32(TRUE);
11801 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11802 pBuf += sizeof(tAniBool);
11803 }
11804 else
11805 {
11806 dwTmp = pal_cpu_to_be32(FALSE);
11807 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11808 pBuf += sizeof(tAniBool);
11809 }
11810#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011811#ifdef FEATURE_WLAN_LFR
11812 if(csrRoamIsFastRoamEnabled(pMac))
11813 {
11814 //legacy fast roaming enabled
11815 dwTmp = pal_cpu_to_be32(TRUE);
11816 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11817 pBuf += sizeof(tAniBool);
11818 }
11819 else
11820 {
11821 dwTmp = pal_cpu_to_be32(FALSE);
11822 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11823 pBuf += sizeof(tAniBool);
11824 }
11825#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011826 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf, uapsd_mask);
11827
11828#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11829 //Tush-QoS: notify QoS module that reassoc happening
11830 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_REASSOC_REQ, NULL);
11831#endif
11832 status = palSendMBMessage( pMac->hHdd, pMsg );
11833 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011834 return( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070011835}
11836
Jeff Johnson295189b2012-06-20 16:38:30 -070011837//
11838eHalStatus csrSendMBDisassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11839{
11840 eHalStatus status = eHAL_STATUS_SUCCESS;
11841 tSirSmeDisassocReq *pMsg;
11842 tANI_U8 *pBuf;
11843 tANI_U16 wTmp;
11844#ifdef WLAN_SOFTAP_FEATURE
11845 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11846 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11847 return eHAL_STATUS_FAILURE;
11848#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011849 do {
11850 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocReq ));
11851 if ( !HAL_STATUS_SUCCESS(status) ) break;
11852 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocReq ));
11853 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_REQ);
11854 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011855 pBuf = &pMsg->sessionId;
11856 // sessionId
11857 *pBuf++ = (tANI_U8)sessionId;
11858 // transactionId
11859 *pBuf = 0;
11860 *( pBuf + 1 ) = 0;
11861 pBuf += sizeof(tANI_U16);
11862
11863#ifdef WLAN_SOFTAP_FEATURE
11864 if ( (pSession->pCurRoamProfile != NULL ) &&
11865 ( reasonCode == eSIR_MAC_UNSPEC_FAILURE_REASON ) &&
11866 ((CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) || (CSR_IS_WDS_AP(pSession->pCurRoamProfile))))
11867 {
11868 // Set the bssid address before sending the message to LIM
11869 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( tSirMacAddr ) );
11870 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011871 // Set the peer MAC address before sending the message to LIM
11872 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) ); //perMacAddr is passed as bssId for softAP
11873 pBuf = pBuf + sizeof ( tSirMacAddr );
11874 }
11875 else
11876 {
11877#endif
11878 // Set the peer MAC address before sending the message to LIM
11879 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) );
11880 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011881 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->bssId ) );
11882 pBuf = pBuf + sizeof ( tSirMacAddr );
11883#ifdef WLAN_SOFTAP_FEATURE
11884 }
11885#endif
11886 if(!HAL_STATUS_SUCCESS(status))
11887 {
11888 palFreeMemory(pMac->hHdd, pMsg);
11889 break;
11890 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011891 // reasonCode
11892 wTmp = pal_cpu_to_be16(reasonCode);
11893 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11894 if(!HAL_STATUS_SUCCESS(status))
11895 {
11896 palFreeMemory(pMac->hHdd, pMsg);
11897 break;
11898 }
11899 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011900 /* The state will be DISASSOC_HANDOFF only when we are doing handoff.
11901 Here we should not send the disassoc over the air to the AP */
11902 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO(pMac, sessionId)
11903#ifdef WLAN_FEATURE_VOWIFI_11R
11904 && csrRoamIs11rAssoc(pMac)
11905#endif
11906 )
11907 {
11908 *pBuf = CSR_DONT_SEND_DISASSOC_OVER_THE_AIR; /* Set DoNotSendOverTheAir flag to 1 only for handoff case */
11909 }
11910 pBuf += sizeof(tANI_U8);
11911 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011912 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011913 return( status );
11914}
Jeff Johnson295189b2012-06-20 16:38:30 -070011915#ifdef WLAN_SOFTAP_FEATURE
11916eHalStatus csrSendMBTkipCounterMeasuresReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN bEnable, tSirMacAddr bssId )
11917{
11918 eHalStatus status = eHAL_STATUS_SUCCESS;
11919 tSirSmeTkipCntrMeasReq *pMsg;
11920 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011921 do
11922 {
11923 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11924 if ( !HAL_STATUS_SUCCESS(status) ) break;
11925 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11926 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_TKIP_CNTR_MEAS_REQ);
11927 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeTkipCntrMeasReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011928 pBuf = &pMsg->sessionId;
11929 // sessionId
11930 *pBuf++ = (tANI_U8)sessionId;
11931 // transactionId
11932 *pBuf = 0;
11933 *( pBuf + 1 ) = 0;
11934 pBuf += sizeof(tANI_U16);
11935 // bssid
11936 status = palCopyMemory( pMac->hHdd, pMsg->bssId, bssId, sizeof( tSirMacAddr ) );
11937 pBuf = pBuf + sizeof ( tSirMacAddr );
11938 // bEnable
11939 *pBuf = (tANI_BOOLEAN)bEnable;
11940 if(!HAL_STATUS_SUCCESS(status))
11941 {
11942 palFreeMemory(pMac->hHdd, pMsg);
11943 break;
11944 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011945 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011946 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011947 return( status );
11948}
Jeff Johnson295189b2012-06-20 16:38:30 -070011949eHalStatus
11950csrSendMBGetAssociatedStasReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
11951 VOS_MODULE_ID modId, tSirMacAddr bssId,
11952 void *pUsrContext, void *pfnSapEventCallback,
11953 tANI_U8 *pAssocStasBuf )
11954{
11955 eHalStatus status = eHAL_STATUS_SUCCESS;
11956 tSirSmeGetAssocSTAsReq *pMsg;
11957 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11958 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011959 do
11960 {
11961 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11962 if (!HAL_STATUS_SUCCESS(status)) break;
11963 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11964 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_ASSOC_STAS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011965 pBuf = (tANI_U8 *)&pMsg->bssId;
11966 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011967 // bssId
11968 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11969 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011970 // modId
11971 dwTmp = pal_cpu_to_be16((tANI_U16)modId);
11972 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U16));
11973 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011974 // pUsrContext
11975 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11976 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11977 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011978 // pfnSapEventCallback
11979 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
11980 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11981 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011982 // pAssocStasBuf
11983 dwTmp = pal_cpu_to_be32((tANI_U32)pAssocStasBuf);
11984 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11985 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011986 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070011987 status = palSendMBMessage( pMac->hHdd, pMsg );
11988 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011989 return( status );
11990 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011991eHalStatus
11992csrSendMBGetWPSPBCSessions( tpAniSirGlobal pMac, tANI_U32 sessionId,
11993 tSirMacAddr bssId, void *pUsrContext, void *pfnSapEventCallback,v_MACADDR_t pRemoveMac)
11994 {
11995 eHalStatus status = eHAL_STATUS_SUCCESS;
11996 tSirSmeGetWPSPBCSessionsReq *pMsg;
11997 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11998 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011999 do
12000 {
12001 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirSmeGetWPSPBCSessionsReq) );
12002 if (!HAL_STATUS_SUCCESS(status)) break;
12003 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetWPSPBCSessionsReq ) );
12004 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_WPSPBC_SESSION_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012005 pBuf = (tANI_U8 *)&pMsg->pUsrContext;
12006 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012007 // pUsrContext
12008 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
12009 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12010 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012011 // pSapEventCallback
12012 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
12013 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12014 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012015 // bssId
12016 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
12017 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070012018 // MAC Address of STA in WPS session
12019 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pRemoveMac.bytes, sizeof(v_MACADDR_t));
12020 pBuf += sizeof(v_MACADDR_t);
Jeff Johnson295189b2012-06-20 16:38:30 -070012021 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070012022 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012023 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012024 return( status );
12025}
12026#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012027eHalStatus csrSendMBDeauthReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
12028{
12029 eHalStatus status = eHAL_STATUS_SUCCESS;
12030 tSirSmeDeauthReq *pMsg;
12031 tANI_U8 *pBuf;
12032 tANI_U16 wTmp;
12033 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12034 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
12035 return eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012036 do {
12037 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthReq ));
12038 if ( !HAL_STATUS_SUCCESS(status) ) break;
12039 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthReq ));
12040 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_REQ);
12041 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthReq ));
12042 //sessionId
12043 pBuf = &pMsg->sessionId;
12044 *pBuf++ = (tANI_U8)sessionId;
12045
12046 //tansactionId
12047 *pBuf = 0;
12048 *(pBuf + 1 ) = 0;
12049 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012050 if ((pSession->pCurRoamProfile != NULL) && (
12051#ifdef WLAN_SOFTAP_FEATURE
12052 (CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) ||
12053#endif
12054 (CSR_IS_WDS_AP(pSession->pCurRoamProfile)))){
12055 // Set the BSSID before sending the message to LIM
12056 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( pMsg->peerMacAddr ) );
12057 pBuf = pBuf + sizeof(tSirMacAddr);
12058 }
12059 else
12060 {
12061 // Set the BSSID before sending the message to LIM
12062 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
12063 pBuf = pBuf + sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070012064 }
12065 if(!HAL_STATUS_SUCCESS(status))
12066 {
12067 palFreeMemory(pMac->hHdd, pMsg);
12068 break;
12069 }
12070 // Set the peer MAC address before sending the message to LIM
12071 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *) pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
12072 pBuf = pBuf + sizeof(tSirMacAddr);
12073 if(!HAL_STATUS_SUCCESS(status))
12074 {
12075 palFreeMemory(pMac->hHdd, pMsg);
12076 break;
12077 }
12078 wTmp = pal_cpu_to_be16(reasonCode);
12079 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp,sizeof( tANI_U16 ) );
12080 if(!HAL_STATUS_SUCCESS(status))
12081 {
12082 palFreeMemory(pMac->hHdd, pMsg);
12083 break;
12084 }
12085 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012086 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012087 return( status );
12088}
12089
Jeff Johnson295189b2012-06-20 16:38:30 -070012090eHalStatus csrSendMBDisassocCnfMsg( tpAniSirGlobal pMac, tpSirSmeDisassocInd pDisassocInd )
12091{
12092 eHalStatus status = eHAL_STATUS_SUCCESS;
12093 tSirSmeDisassocCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070012094 do {
12095 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocCnf ));
12096 if ( !HAL_STATUS_SUCCESS(status) ) break;
12097 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocCnf ));
12098 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_CNF);
12099 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12100 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocCnf ));
12101 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDisassocInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12102 if(!HAL_STATUS_SUCCESS(status))
12103 {
12104 palFreeMemory(pMac->hHdd, pMsg);
12105 break;
12106 }
12107//To test reconn
12108 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDisassocInd->bssId, sizeof(pMsg->peerMacAddr));
12109 if(!HAL_STATUS_SUCCESS(status))
12110 {
12111 palFreeMemory(pMac->hHdd, pMsg);
12112 break;
12113 }
12114//To test reconn ends
Jeff Johnson295189b2012-06-20 16:38:30 -070012115 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012116 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012117 return( status );
12118}
12119
Jeff Johnson295189b2012-06-20 16:38:30 -070012120eHalStatus csrSendMBDeauthCnfMsg( tpAniSirGlobal pMac, tpSirSmeDeauthInd pDeauthInd )
12121{
12122 eHalStatus status = eHAL_STATUS_SUCCESS;
12123 tSirSmeDeauthCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070012124 do {
12125 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthCnf ));
12126 if ( !HAL_STATUS_SUCCESS(status) ) break;
12127 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthCnf ));
12128 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_CNF);
12129 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12130 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthCnf ));
12131 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDeauthInd->bssId, sizeof(pMsg->bssId));
12132 if(!HAL_STATUS_SUCCESS(status))
12133 {
12134 palFreeMemory(pMac->hHdd, pMsg);
12135 break;
12136 }
12137 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDeauthInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12138 if(!HAL_STATUS_SUCCESS(status))
12139 {
12140 palFreeMemory(pMac->hHdd, pMsg);
12141 break;
12142 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012143 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012144 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012145 return( status );
12146}
Jeff Johnson295189b2012-06-20 16:38:30 -070012147eHalStatus csrSendAssocCnfMsg( tpAniSirGlobal pMac, tpSirSmeAssocInd pAssocInd, eHalStatus Halstatus )
12148{
12149 eHalStatus status = eHAL_STATUS_SUCCESS;
12150 tSirSmeAssocCnf *pMsg;
12151 tANI_U8 *pBuf;
12152 tSirResultCodes statusCode;
12153 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012154 do {
12155 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocCnf ));
12156 if ( !HAL_STATUS_SUCCESS(status) ) break;
12157 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocCnf ));
12158 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ASSOC_CNF);
12159 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocCnf ));
Jeff Johnson295189b2012-06-20 16:38:30 -070012160 pBuf = (tANI_U8 *)&pMsg->statusCode;
12161 if(HAL_STATUS_SUCCESS(Halstatus))
12162 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12163 else
12164 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12165 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12166 pBuf += sizeof(tSirResultCodes);
12167 // bssId
12168 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12169 pBuf += sizeof (tSirMacAddr);
12170 // peerMacAddr
12171 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12172 pBuf += sizeof (tSirMacAddr);
12173 // aid
12174 wTmp = pal_cpu_to_be16(pAssocInd->aid);
12175 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12176 pBuf += sizeof (tANI_U16);
12177 // alternateBssId
12178 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12179 pBuf += sizeof (tSirMacAddr);
12180 // alternateChannelId
12181 *pBuf = 11;
Jeff Johnson295189b2012-06-20 16:38:30 -070012182 status = palSendMBMessage( pMac->hHdd, pMsg );
12183 if(!HAL_STATUS_SUCCESS(status))
12184 {
12185 //pMsg is freed by palSendMBMessage
12186 break;
12187 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012188 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012189 return( status );
12190}
Jeff Johnson295189b2012-06-20 16:38:30 -070012191#ifdef WLAN_SOFTAP_FEATURE
12192eHalStatus csrSendAssocIndToUpperLayerCnfMsg( tpAniSirGlobal pMac,
12193 tpSirSmeAssocInd pAssocInd,
12194 eHalStatus Halstatus,
12195 tANI_U8 sessionId)
12196{
12197 tSirMsgQ msgQ;
12198 eHalStatus status = eHAL_STATUS_SUCCESS;
12199 tSirSmeAssocIndToUpperLayerCnf *pMsg;
12200 tANI_U8 *pBuf;
12201 tSirResultCodes statusCode;
12202 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012203 do {
12204 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12205 if ( !HAL_STATUS_SUCCESS(status) ) break;
12206 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
Jeff Johnsone7245742012-09-05 17:12:55 -070012207
Jeff Johnson295189b2012-06-20 16:38:30 -070012208 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPPER_LAYER_ASSOC_CNF);
12209 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12210
12211 pMsg->sessionId = sessionId;
12212
12213 pBuf = (tANI_U8 *)&pMsg->statusCode;
12214 if(HAL_STATUS_SUCCESS(Halstatus))
12215 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12216 else
12217 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12218 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12219 pBuf += sizeof(tSirResultCodes);
12220 // bssId
12221 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12222 pBuf += sizeof (tSirMacAddr);
12223 // peerMacAddr
12224 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12225 pBuf += sizeof (tSirMacAddr);
12226 // StaId
12227 wTmp = pal_cpu_to_be16(pAssocInd->staId);
12228 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12229 pBuf += sizeof (tANI_U16);
12230 // alternateBssId
12231 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12232 pBuf += sizeof (tSirMacAddr);
12233 // alternateChannelId
12234 *pBuf = 11;
12235 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012236 // Instead of copying roam Info, we just copy only WmmEnabled , RsnIE information
12237 //Wmm
12238 *pBuf = pAssocInd->wmmEnabledSta;
12239 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012240 //RSN IE
12241 status = palCopyMemory(pMac->hHdd, (tSirRSNie *)pBuf, &pAssocInd->rsnIE, sizeof(tSirRSNie));
12242 pBuf += sizeof (tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012243 //Additional IE
12244 status = palCopyMemory(pMac->hHdd, (void *)pBuf, &pAssocInd->addIE, sizeof(tSirAddie));
12245 pBuf += sizeof (tSirAddie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012246 //reassocReq
12247 *pBuf = pAssocInd->reassocReq;
12248 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012249 msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF;
12250 msgQ.bodyptr = pMsg;
12251 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012252 SysProcessMmhMsg(pMac, &msgQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012253 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012254 return( status );
12255}
12256#endif
12257
Jeff Johnson295189b2012-06-20 16:38:30 -070012258eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId ,
12259 tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType,
12260 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
12261 tANI_U8 keyId, tANI_U8 keyLength, tANI_U8 *pKey, tANI_U8 paeRole,
12262 tANI_U8 *pKeyRsc )
12263{
12264 tSirSmeSetContextReq *pMsg;
12265 tANI_U16 msgLen;
12266 eHalStatus status = eHAL_STATUS_FAILURE;
12267 tAniEdType tmpEdType;
12268 tAniKeyDirection tmpDirection;
12269 tANI_U8 *pBuf;
12270 tANI_U8 *p;
12271 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012272 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012273 if( ( 1 != numKeys ) && ( 0 != numKeys ) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012274 // all of these fields appear in every SET_CONTEXT message. Below we'll add in the size for each
12275 // key set. Since we only support upto one key, we always allocate memory for 1 key
12276 msgLen = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) +
12277 sizeof( tSirMacAddr ) + 1 + sizeof(tANI_U16) +
12278 sizeof( pMsg->keyMaterial.length ) + sizeof( pMsg->keyMaterial.edType ) + sizeof( pMsg->keyMaterial.numKeys ) +
12279 ( sizeof( pMsg->keyMaterial.key ) );
12280
12281 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12282 if ( !HAL_STATUS_SUCCESS(status) ) break;
12283 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12284 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SETCONTEXT_REQ);
12285 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012286 //sessionId
12287 pBuf = &pMsg->sessionId;
12288 *pBuf = (tANI_U8)sessionId;
12289 pBuf++;
12290 // transactionId
12291 *pBuf = 0;
12292 *(pBuf + 1) = 0;
12293 pBuf += sizeof(tANI_U16);
12294 // peerMacAddr
12295 palCopyMemory( pMac->hHdd, pBuf,
12296 (tANI_U8 *)peerMacAddr, sizeof(tSirMacAddr) );
12297
12298 pBuf += sizeof(tSirMacAddr);
12299
12300 // bssId
12301 palCopyMemory( pMac->hHdd, pBuf,
12302 (tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12303
12304 pBuf += sizeof(tSirMacAddr);
12305
12306 p = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012307 // Set the pMsg->keyMaterial.length field (this length is defined as all data that follows the edType field
12308 // in the tSirKeyMaterial keyMaterial; field).
12309 //
12310 // !!NOTE: This keyMaterial.length contains the length of a MAX size key, though the keyLength can be
12311 // shorter than this max size. Is LIM interpreting this ok ?
12312 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 -070012313 // set pMsg->keyMaterial.edType
12314 tmpEdType = (tAniEdType)pal_cpu_to_be32(edType);
12315 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpEdType, sizeof(tAniEdType) );
12316 p += sizeof( pMsg->keyMaterial.edType );
Jeff Johnson295189b2012-06-20 16:38:30 -070012317 // set the pMsg->keyMaterial.numKeys field
12318 *p = numKeys;
12319 p += sizeof( pMsg->keyMaterial.numKeys );
Jeff Johnson295189b2012-06-20 16:38:30 -070012320 // set pSirKey->keyId = keyId;
12321 *p = keyId;
12322 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012323 // set pSirKey->unicast = (tANI_U8)fUnicast;
12324 *p = (tANI_U8)fUnicast;
12325 p += sizeof( pMsg->keyMaterial.key[ 0 ].unicast );
Jeff Johnson295189b2012-06-20 16:38:30 -070012326 // set pSirKey->keyDirection = aniKeyDirection;
12327 tmpDirection = (tAniKeyDirection)pal_cpu_to_be32(aniKeyDirection);
12328 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpDirection, sizeof(tAniKeyDirection) );
12329 p += sizeof(tAniKeyDirection);
12330 // pSirKey->keyRsc = ;;
12331 palCopyMemory( pMac->hHdd, p, pKeyRsc, CSR_MAX_RSC_LEN );
12332 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyRsc );
Jeff Johnson295189b2012-06-20 16:38:30 -070012333 // set pSirKey->paeRole
12334 *p = paeRole; // 0 is Supplicant
12335 p++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012336 // set pSirKey->keyLength = keyLength;
12337 p = pal_set_U16( p, pal_cpu_to_be16(keyLength) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012338 if ( keyLength && pKey )
12339 {
12340 palCopyMemory( pMac->hHdd, p, pKey, keyLength );
12341 if(keyLength == 16)
12342 {
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012343 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 -070012344 keyId, edType, pKey[0], pKey[1], pKey[2], pKey[3], pKey[4],
12345 pKey[5], pKey[6], pKey[7], pKey[8],
12346 pKey[9], pKey[10], pKey[11], pKey[12], pKey[13], pKey[14], pKey[15]);
12347 }
12348 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012349 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012350 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012351 return( status );
12352}
12353
Jeff Johnson295189b2012-06-20 16:38:30 -070012354eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamBssType bssType,
12355 tCsrRoamStartBssParams *pParam, tSirBssDescription *pBssDesc )
12356{
12357 eHalStatus status;
12358 tSirSmeStartBssReq *pMsg;
12359 tANI_U8 *pBuf = NULL;
12360 tANI_U8 *wTmpBuf = NULL;
12361 tANI_U16 msgLen, wTmp;
12362 tANI_U32 dwTmp;
12363 tSirNwType nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070012364 ePhyChanBondState cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070012365#ifdef WLAN_SOFTAP_FEATURE
12366 tANI_U32 authType;
12367#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012368 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012369
12370 if(!pSession)
12371 {
12372 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12373 return eHAL_STATUS_FAILURE;
12374 }
12375
Jeff Johnson295189b2012-06-20 16:38:30 -070012376 do {
12377 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
12378 pSession->joinFailStatusCode.reasonCode = 0;
12379 msgLen = sizeof(tSirSmeStartBssReq);
12380 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12381 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012382 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12383 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BSS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012384 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012385 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012386 //sessionId
12387 *pBuf = (tANI_U8)sessionId;
12388 pBuf++;
12389 // transactionId
12390 *pBuf = 0;
12391 *(pBuf + 1) = 0;
12392 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012393 // bssid
12394 palCopyMemory( pMac->hHdd, pBuf, pParam->bssid, sizeof(tSirMacAddr) );
12395 pBuf += sizeof(tSirMacAddr);
12396 // selfMacAddr
12397 palCopyMemory( pMac->hHdd, pBuf, pSession->selfMacAddr, sizeof(tSirMacAddr) );
12398 pBuf += sizeof(tSirMacAddr);
12399 // beaconInterval
12400 if( pBssDesc && pBssDesc->beaconInterval )
12401 {
12402 wTmp = pal_cpu_to_be16( pBssDesc->beaconInterval );
12403 }
12404#ifdef WLAN_SOFTAP_FEATURE
12405 else if(pParam->beaconInterval)
12406 {
12407 wTmp = pal_cpu_to_be16( pParam->beaconInterval );
12408 }
12409#endif
12410 else
12411 {
12412 wTmp = pal_cpu_to_be16( WNI_CFG_BEACON_INTERVAL_STADEF );
12413 }
Jeff Johnsone7245742012-09-05 17:12:55 -070012414 if(csrIsconcurrentsessionValid (pMac, sessionId,
12415 pParam->bssPersona)
12416 == eHAL_STATUS_SUCCESS )
12417 {
12418 csrValidateBeaconInterval(pMac, pParam->operationChn, &wTmp, sessionId,
12419 pParam->bssPersona);
12420 //Update the beacon Interval
12421 pParam->beaconInterval = wTmp;
12422 }
12423 else
12424 {
12425 smsLog( pMac,LOGE, FL("****Start BSS failed persona already exists***\n"));
12426 status = eHAL_STATUS_FAILURE;
12427 return status;
12428 }
12429
Jeff Johnson295189b2012-06-20 16:38:30 -070012430 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12431 pBuf += sizeof(tANI_U16);
12432 // dot11mode
12433 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pParam->uCfgDot11Mode );
12434 pBuf += 1;
12435 // bssType
12436 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( bssType ) );
12437 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
12438 pBuf += sizeof(tSirBssType);
12439 // ssId
12440 if( pParam->ssId.length )
12441 {
12442 // ssId len
12443 *pBuf = pParam->ssId.length;
12444 pBuf++;
12445 palCopyMemory( pMac->hHdd, pBuf, pParam->ssId.ssId, pParam->ssId.length );
12446 pBuf += pParam->ssId.length;
12447 }
12448 else
12449 {
12450 *pBuf = 0;
12451 pBuf++;
12452 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012453 // set the channel Id
12454 *pBuf = pParam->operationChn;
12455 pBuf++;
12456 //What should we really do for the cbmode.
Jeff Johnsone7245742012-09-05 17:12:55 -070012457 cbMode = (ePhyChanBondState)pal_cpu_to_be32(pParam->cbMode);
12458 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(ePhyChanBondState) );
12459 pBuf += sizeof(ePhyChanBondState);
Jeff Johnson295189b2012-06-20 16:38:30 -070012460
12461#ifdef WLAN_SOFTAP_FEATURE
12462 // Set privacy
12463 *pBuf = pParam->privacy;
12464 pBuf++;
12465
12466 //Set Uapsd
12467 *pBuf = pParam->ApUapsdEnable;
12468 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012469 //Set SSID hidden
12470 *pBuf = pParam->ssidHidden;
12471 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012472 *pBuf = (tANI_U8)pParam->fwdWPSPBCProbeReq;
12473 pBuf++;
12474
12475 //Ht protection Enable/Disable
12476 *pBuf = (tANI_U8)pParam->protEnabled;
12477 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012478 //Enable Beacons to Receive for OBSS protection Enable/Disable
12479 *pBuf = (tANI_U8)pParam->obssProtEnabled;
12480 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012481 //set cfg related to protection
12482 wTmp = pal_cpu_to_be16( pParam->ht_protection );
12483 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12484 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012485 // Set Auth type
12486 authType = pal_cpu_to_be32(pParam->authType);
12487 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&authType, sizeof(tANI_U32));
12488 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012489 // Set DTIM
12490 dwTmp = pal_cpu_to_be32(pParam->dtimPeriod);
12491 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12492 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012493 // Set wps_state
12494 *pBuf = pParam->wps_state;
12495 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012496#endif
12497 //Persona
12498 *pBuf = (tANI_U8)pParam->bssPersona;
12499 pBuf++;
12500
Jeff Johnsone7245742012-09-05 17:12:55 -070012501
Jeff Johnson295189b2012-06-20 16:38:30 -070012502
12503 // set RSN IE
12504 if( pParam->nRSNIELength > sizeof(pMsg->rsnIE.rsnIEdata) )
12505 {
12506 status = eHAL_STATUS_INVALID_PARAMETER;
12507 palFreeMemory( pMac->hHdd, pMsg );
12508 break;
12509 }
12510 wTmp = pal_cpu_to_be16( pParam->nRSNIELength );
12511 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12512 pBuf += sizeof(tANI_U16);
12513 if( wTmp )
12514 {
12515 wTmp = pParam->nRSNIELength;
12516 palCopyMemory( pMac->hHdd, pBuf, pParam->pRSNIE, wTmp );
12517 pBuf += wTmp;
12518 }
12519 nwType = (tSirNwType)pal_cpu_to_be32(pParam->sirNwType);
12520 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&nwType, sizeof(tSirNwType) );
12521 pBuf += sizeof(tSirNwType);
Jeff Johnson295189b2012-06-20 16:38:30 -070012522 *pBuf = pParam->operationalRateSet.numRates; //tSirMacRateSet->numRates
12523 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012524 palCopyMemory( pMac->hHdd, pBuf, pParam->operationalRateSet.rate, pParam->operationalRateSet.numRates );
12525 pBuf += pParam->operationalRateSet.numRates ;
12526 *pBuf++ = pParam->extendedRateSet.numRates;
12527 if(0 != pParam->extendedRateSet.numRates)
12528 {
12529 palCopyMemory( pMac->hHdd, pBuf, pParam->extendedRateSet.rate, pParam->extendedRateSet.numRates );
12530 pBuf += pParam->extendedRateSet.numRates;
12531 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012532 msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
12533 pMsg->length = pal_cpu_to_be16(msgLen);
12534
12535 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012536 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012537 return( status );
12538}
12539
Jeff Johnson295189b2012-06-20 16:38:30 -070012540eHalStatus csrSendMBStopBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId )
12541{
12542 eHalStatus status = eHAL_STATUS_FAILURE;
12543 tSirSmeStopBssReq *pMsg;
12544 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12545 tANI_U8 *pBuf;
12546 tANI_U16 msgLen;
Jeff Johnson32d95a32012-09-10 13:15:23 -070012547
12548 if(!pSession)
12549 {
12550 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12551 return eHAL_STATUS_FAILURE;
12552 }
12553
Jeff Johnson295189b2012-06-20 16:38:30 -070012554 do {
12555 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12556 if ( !HAL_STATUS_SUCCESS(status) ) break;
12557 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12558 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12559 pBuf = &pMsg->sessionId;
12560 //sessionId
12561 *pBuf = (tANI_U8)sessionId;
12562 pBuf++;
12563 // transactionId
12564 *pBuf = 0;
12565 pBuf += sizeof(tANI_U16);
12566 //reason code
12567 *pBuf = 0;
12568 pBuf += sizeof(tSirResultCodes);
12569 // bssid
12570 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12571 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12572 {
12573 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->selfMacAddr, sizeof(tSirMacAddr) );
12574 }
12575 else
12576 {
12577 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12578 }
12579 pBuf += sizeof(tSirMacAddr);
12580 msgLen = sizeof(tANI_U16) + sizeof(tANI_U16) + 1 + sizeof(tANI_U16) + sizeof(tSirResultCodes) + sizeof(tSirMacAddr);
12581 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012582 status = palSendMBMessage( pMac->hHdd, pMsg );
12583#if 0
12584 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12585 if ( !HAL_STATUS_SUCCESS(status) ) break;
12586 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12587 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12588 pMsg->reasonCode = 0;
12589 // bssid
12590 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12591 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12592 {
12593 pbBssid = (tANI_U8 *)&pSession->selfMacAddr;
12594 }
12595 else
12596 {
12597 pbBssid = (tANI_U8 *)&pSession->connectedProfile.bssid;
12598 }
12599 palCopyMemory( pMac->hHdd, &pMsg->bssId, pbBssid, sizeof(tSirMacAddr) );
12600 pMsg->transactionId = 0;
12601 pMsg->sessionId = (tANI_U8)sessionId;
12602 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeStopBssReq ));
12603 status = palSendMBMessage( pMac->hHdd, pMsg );
12604#endif
12605 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012606 return( status );
12607}
12608
Jeff Johnson295189b2012-06-20 16:38:30 -070012609eHalStatus csrReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId,
12610 tCsrRoamModifyProfileFields *pModProfileFields,
12611 tANI_U32 *pRoamId, v_BOOL_t fForce)
12612{
Jeff Johnson295189b2012-06-20 16:38:30 -070012613 eHalStatus status = eHAL_STATUS_FAILURE;
12614 tANI_U32 roamId = 0;
12615 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012616 if((csrIsConnStateConnected(pMac, sessionId)) &&
12617 (fForce || (!palEqualMemory(pMac->hHdd, &pModProfileFields,
12618 &pSession->connectedProfile.modifyProfileFields,
12619 sizeof(tCsrRoamModifyProfileFields)))) )
12620 {
12621 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
12622 if(pRoamId)
12623 {
12624 *pRoamId = roamId;
12625 }
12626
Jeff Johnson295189b2012-06-20 16:38:30 -070012627 status = csrRoamIssueReassoc(pMac, sessionId, NULL, pModProfileFields,
12628 eCsrSmeIssuedReassocToSameAP, roamId,
12629 eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -070012630 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012631 return status;
12632}
Jeff Johnson295189b2012-06-20 16:38:30 -070012633static eHalStatus csrRoamSessionOpened(tpAniSirGlobal pMac, tANI_U32 sessionId)
12634{
12635 eHalStatus status = eHAL_STATUS_SUCCESS;
12636 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070012637 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
12638 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
12639 eCSR_ROAM_SESSION_OPENED, eCSR_ROAM_RESULT_NONE);
12640 return (status);
12641}
Jeff Johnson295189b2012-06-20 16:38:30 -070012642eHalStatus csrProcessAddStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12643{
12644 eHalStatus status = eHAL_STATUS_SUCCESS;
12645 tListElem *pEntry = NULL;
12646 tSmeCmd *pCommand = NULL;
12647 tSirSmeAddStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012648 do
12649 {
12650 if(pMsg == NULL)
12651 {
12652 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
12653 status = eHAL_STATUS_FAILURE;
12654 break;
12655 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012656 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12657 if(pEntry)
12658 {
12659 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12660 if(eSmeCommandAddStaSession == pCommand->command)
12661 {
12662 pRsp = (tSirSmeAddStaSelfRsp*)pMsg;
12663 smsLog( pMac, LOG1, "Add Sta rsp status = %d\n", pRsp->status );
12664 //Nothing to be done. May be indicate the self sta addition success by calling session callback (TODO).
Jeff Johnson295189b2012-06-20 16:38:30 -070012665 csrRoamSessionOpened(pMac, pCommand->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012666 //Remove this command out of the active list
12667 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12668 {
12669 //Now put this command back on the avilable command list
12670 csrReleaseCommand(pMac, pCommand);
12671 }
12672 smeProcessPendingQueue( pMac );
12673 }
12674 else
12675 {
12676 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO Add sta session command are ACTIVE ...\n",
12677 __FUNCTION__);
12678 status = eHAL_STATUS_FAILURE;
12679 break;
12680 }
12681 }
12682 else
12683 {
12684 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
12685 __FUNCTION__);
12686 status = eHAL_STATUS_FAILURE;
12687 break;
12688 }
12689 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012690 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012691}
Jeff Johnson295189b2012-06-20 16:38:30 -070012692eHalStatus csrSendMBAddSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12693{
12694 tSirSmeAddStaSelfReq *pMsg;
12695 tANI_U16 msgLen;
12696 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012697 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012698 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12699 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012700 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12701 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012702 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012703 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ADD_STA_SELF_REQ);
12704 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012705 // self station address
12706 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012707 smsLog( pMac, LOG1, FL("selfMac=%02x, %02x, %02x, %02x, %02x, %02x"),
Jeff Johnson295189b2012-06-20 16:38:30 -070012708 pMsg->selfMacAddr[0],
12709 pMsg->selfMacAddr[1],
12710 pMsg->selfMacAddr[2],
12711 pMsg->selfMacAddr[3],
12712 pMsg->selfMacAddr[4],
12713 pMsg->selfMacAddr[5]);
12714 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012715 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012716 return( status );
12717}
Jeff Johnson295189b2012-06-20 16:38:30 -070012718eHalStatus csrIssueAddStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr sessionMacAddr)
12719{
12720 eHalStatus status = eHAL_STATUS_SUCCESS;
12721 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012722 pCommand = csrGetCommandBuffer(pMac);
12723 if(NULL == pCommand)
12724 {
12725 status = eHAL_STATUS_RESOURCES;
12726 }
12727 else
12728 {
12729 pCommand->command = eSmeCommandAddStaSession;
12730 pCommand->sessionId = (tANI_U8)sessionId;
12731 palCopyMemory( pMac->hHdd, pCommand->u.addStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012732 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12733 if( !HAL_STATUS_SUCCESS( status ) )
12734 {
12735 //Should be panic??
12736 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12737 }
12738 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012739 return (status);
12740}
Jeff Johnson295189b2012-06-20 16:38:30 -070012741eHalStatus csrProcessAddStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12742{
12743 return csrSendMBAddSelfStaReqMsg( pMac,
12744 pCommand->u.addStaSessionCmd.selfMacAddr );
12745}
Jeff Johnson295189b2012-06-20 16:38:30 -070012746eHalStatus csrRoamOpenSession( tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext,
12747 tANI_U8 *pSelfMacAddr, tANI_U8 *pbSessionId )
12748{
12749 eHalStatus status = eHAL_STATUS_SUCCESS;
12750 tANI_U32 i;
12751 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070012752 *pbSessionId = CSR_SESSION_ID_INVALID;
12753 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12754 {
12755 if( !CSR_IS_SESSION_VALID( pMac, i ) )
12756 {
12757 pSession = CSR_GET_SESSION( pMac, i );
12758 status = eHAL_STATUS_SUCCESS;
12759 pSession->sessionActive = eANI_BOOLEAN_TRUE;
12760 pSession->sessionId = (tANI_U8)i;
12761 pSession->callback = callback;
12762 pSession->pContext = pContext;
12763 palCopyMemory( pMac->hHdd, &pSession->selfMacAddr, pSelfMacAddr, sizeof(tCsrBssid) );
12764 *pbSessionId = (tANI_U8)i;
Jeff Johnson295189b2012-06-20 16:38:30 -070012765 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerRoaming, csrRoamRoamingTimerHandler,
12766 &pSession->roamingTimerInfo);
12767 if(!HAL_STATUS_SUCCESS(status))
12768 {
12769 smsLog(pMac, LOGE, FL("cannot allocate memory for Roaming timer\n"));
12770 break;
12771 }
12772#ifdef FEATURE_WLAN_BTAMP_UT_RF
12773 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerJoinRetry, csrRoamJoinRetryTimerHandler,
12774 &pSession->joinRetryTimerInfo);
12775 if(!HAL_STATUS_SUCCESS(status))
12776 {
12777 smsLog(pMac, LOGE, FL("cannot allocate memory for joinretry timer\n"));
12778 break;
12779 }
12780#endif
12781 pSession->ibssJoinTimerInfo.pMac = pMac;
12782 pSession->ibssJoinTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
Jeff Johnson295189b2012-06-20 16:38:30 -070012783 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerIbssJoining, csrRoamIbssJoinTimerHandler,
12784 &pSession->ibssJoinTimerInfo);
12785 if(!HAL_STATUS_SUCCESS(status))
12786 {
12787 smsLog(pMac, LOGE, FL("cannot allocate memory for IbssJoining timer\n"));
12788 break;
12789 }
12790 status = csrIssueAddStaForSessionReq ( pMac, i, pSelfMacAddr );
12791 break;
12792 }
12793 }
12794 if( CSR_ROAM_SESSION_MAX == i )
12795 {
12796 //No session is available
12797 status = eHAL_STATUS_RESOURCES;
12798 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012799 return ( status );
12800}
Jeff Johnson295189b2012-06-20 16:38:30 -070012801eHalStatus csrProcessDelStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12802{
12803 eHalStatus status = eHAL_STATUS_SUCCESS;
12804 tListElem *pEntry = NULL;
12805 tSmeCmd *pCommand = NULL;
12806 tSirSmeDelStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012807 do
12808 {
12809 if(pMsg == NULL)
12810 {
12811 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
12812 status = eHAL_STATUS_FAILURE;
12813 break;
12814 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012815 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12816 if(pEntry)
12817 {
12818 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12819 if(eSmeCommandDelStaSession == pCommand->command)
12820 {
12821 tANI_U8 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012822 pRsp = (tSirSmeDelStaSelfRsp*)pMsg;
12823 smsLog( pMac, LOG1, "Del Sta rsp status = %d\n", pRsp->status );
Jeff Johnson295189b2012-06-20 16:38:30 -070012824 //This session is done.
12825 csrCleanupSession(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012826 if(pCommand->u.delStaSessionCmd.callback)
12827 {
12828
12829 status = sme_ReleaseGlobalLock( &pMac->sme );
12830 if ( HAL_STATUS_SUCCESS( status ) )
12831 {
12832 pCommand->u.delStaSessionCmd.callback(
12833 pCommand->u.delStaSessionCmd.pContext);
12834 status = sme_AcquireGlobalLock( &pMac->sme );
12835 if (! HAL_STATUS_SUCCESS( status ) )
12836 {
12837 smsLog(pMac, LOGP, "%s: Failed to Acquire Lock\n", __FUNCTION__);
12838 return status;
12839 }
12840 }
12841 else {
12842 smsLog(pMac, LOGE, "%s: Failed to Release Lock\n", __FUNCTION__);
12843 }
12844 }
12845
12846 //Remove this command out of the active list
12847 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12848 {
12849 //Now put this command back on the avilable command list
12850 csrReleaseCommand(pMac, pCommand);
12851 }
12852 smeProcessPendingQueue( pMac );
12853 }
12854 else
12855 {
12856 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO Del sta session command are ACTIVE ...\n",
12857 __FUNCTION__);
12858 status = eHAL_STATUS_FAILURE;
12859 break;
12860 }
12861 }
12862 else
12863 {
12864 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
12865 __FUNCTION__);
12866 status = eHAL_STATUS_FAILURE;
12867 break;
12868 }
12869 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012870 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012871}
Jeff Johnson295189b2012-06-20 16:38:30 -070012872eHalStatus csrSendMBDelSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12873{
12874 tSirSmeDelStaSelfReq *pMsg;
12875 tANI_U16 msgLen;
12876 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012877 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012878 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12879 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012880 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12881 if ( !HAL_STATUS_SUCCESS(status) ) break;
12882
12883 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012884 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEL_STA_SELF_REQ);
12885 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012886 // self station address
12887 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012888 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012889 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012890 return( status );
12891}
Jeff Johnson295189b2012-06-20 16:38:30 -070012892eHalStatus csrIssueDelStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId,
12893 tSirMacAddr sessionMacAddr,
12894 csrRoamSessionCloseCallback callback,
12895 void *pContext)
12896{
12897 eHalStatus status = eHAL_STATUS_SUCCESS;
12898 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012899 pCommand = csrGetCommandBuffer(pMac);
12900 if(NULL == pCommand)
12901 {
12902 status = eHAL_STATUS_RESOURCES;
12903 }
12904 else
12905 {
12906 pCommand->command = eSmeCommandDelStaSession;
12907 pCommand->sessionId = (tANI_U8)sessionId;
12908 pCommand->u.delStaSessionCmd.callback = callback;
12909 pCommand->u.delStaSessionCmd.pContext = pContext;
12910 palCopyMemory( pMac->hHdd, pCommand->u.delStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012911 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12912 if( !HAL_STATUS_SUCCESS( status ) )
12913 {
12914 //Should be panic??
12915 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12916 }
12917 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012918 return (status);
12919}
Jeff Johnson295189b2012-06-20 16:38:30 -070012920eHalStatus csrProcessDelStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12921{
12922 return csrSendMBDelSelfStaReqMsg( pMac,
12923 pCommand->u.delStaSessionCmd.selfMacAddr );
12924}
Jeff Johnson295189b2012-06-20 16:38:30 -070012925static void purgeCsrSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId)
12926{
12927 tDblLinkList *pList = &pMac->roam.roamCmdPendingList;
12928 tListElem *pEntry, *pNext;
12929 tSmeCmd *pCommand;
12930 tDblLinkList localList;
12931
12932 vos_mem_zero(&localList, sizeof(tDblLinkList));
12933 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
12934 {
12935 smsLog(pMac, LOGE, FL(" failed to open list"));
12936 return;
12937 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012938 csrLLLock(pList);
12939 pEntry = csrLLPeekHead(pList, LL_ACCESS_NOLOCK);
12940 while(pEntry != NULL)
12941 {
12942 pNext = csrLLNext(pList, pEntry, LL_ACCESS_NOLOCK);
12943 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12944 if(pCommand->sessionId == sessionId)
12945 {
12946 if(csrLLRemoveEntry(pList, pEntry, LL_ACCESS_NOLOCK))
12947 {
12948 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
12949 }
12950 }
12951 pEntry = pNext;
12952 }
12953 csrLLUnlock(pList);
12954
12955 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
12956 {
12957 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12958 csrAbortCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
12959 }
12960 csrLLClose(&localList);
12961}
12962
Jeff Johnson295189b2012-06-20 16:38:30 -070012963void csrCleanupSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
12964{
12965 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12966 {
12967 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012968 csrRoamStop(pMac, sessionId);
12969 csrFreeConnectBssDesc(pMac, sessionId);
12970 csrRoamFreeConnectProfile( pMac, &pSession->connectedProfile );
12971 csrRoamFreeConnectedInfo ( pMac, &pSession->connectedInfo);
12972 palTimerFree(pMac->hHdd, pSession->hTimerRoaming);
12973#ifdef FEATURE_WLAN_BTAMP_UT_RF
12974 palTimerFree(pMac->hHdd, pSession->hTimerJoinRetry);
12975#endif
12976 palTimerFree(pMac->hHdd, pSession->hTimerIbssJoining);
12977 purgeSmeSessionCmdList(pMac, sessionId);
12978 purgeCsrSessionCmdList(pMac, sessionId);
12979 csrInitSession(pMac, sessionId);
12980 }
12981}
12982
Jeff Johnson295189b2012-06-20 16:38:30 -070012983eHalStatus csrRoamCloseSession( tpAniSirGlobal pMac, tANI_U32 sessionId,
12984 tANI_BOOLEAN fSync,
12985 csrRoamSessionCloseCallback callback,
12986 void *pContext )
12987{
12988 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -070012989 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12990 {
12991 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12992 if(fSync)
12993 {
12994 csrCleanupSession(pMac, sessionId);
12995 }
12996 else
12997 {
12998 purgeSmeSessionCmdList(pMac, sessionId);
12999 purgeCsrSessionCmdList(pMac, sessionId);
13000 status = csrIssueDelStaForSessionReq( pMac, sessionId,
13001 pSession->selfMacAddr, callback, pContext);
13002 }
13003 }
13004 else
13005 {
13006 status = eHAL_STATUS_INVALID_PARAMETER;
13007 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013008 return ( status );
13009}
13010
Jeff Johnson295189b2012-06-20 16:38:30 -070013011static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId )
13012{
13013 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070013014
13015 if(!pSession)
13016 {
13017 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
13018 return;
13019 }
13020
Jeff Johnson295189b2012-06-20 16:38:30 -070013021 pSession->sessionActive = eANI_BOOLEAN_FALSE;
13022 pSession->sessionId = CSR_SESSION_ID_INVALID;
13023 pSession->callback = NULL;
13024 pSession->pContext = NULL;
13025 pSession->ibss_join_pending = FALSE;
13026 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
13027 // TODO : Confirm pMac->roam.fReadyForPowerSave = eANI_BOOLEAN_FALSE;
13028 csrFreeRoamProfile( pMac, sessionId );
13029 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
13030 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
13031 csrFreeConnectBssDesc(pMac, sessionId);
13032 csrScanEnable(pMac);
13033 palZeroMemory( pMac->hHdd, &pSession->selfMacAddr, sizeof(tCsrBssid) );
13034 if(pSession->pWpaRsnReqIE)
13035 {
13036 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
13037 pSession->pWpaRsnReqIE = NULL;
13038 }
13039 pSession->nWpaRsnReqIeLength = 0;
13040 if(pSession->pWpaRsnRspIE)
13041 {
13042 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
13043 pSession->pWpaRsnRspIE = NULL;
13044 }
13045 pSession->nWpaRsnRspIeLength = 0;
13046#ifdef FEATURE_WLAN_WAPI
13047 if(pSession->pWapiReqIE)
13048 {
13049 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
13050 pSession->pWapiReqIE = NULL;
13051 }
13052 pSession->nWapiReqIeLength = 0;
13053 if(pSession->pWapiRspIE)
13054 {
13055 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
13056 pSession->pWapiRspIE = NULL;
13057 }
13058 pSession->nWapiRspIeLength = 0;
13059#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070013060 if(pSession->pAddIEScan)
13061 {
13062 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
13063 pSession->pAddIEScan = NULL;
13064 }
13065 pSession->nAddIEScanLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013066 if(pSession->pAddIEAssoc)
13067 {
13068 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
13069 pSession->pAddIEAssoc = NULL;
13070}
13071 pSession->nAddIEAssocLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013072}
13073
Jeff Johnson295189b2012-06-20 16:38:30 -070013074eHalStatus csrRoamGetSessionIdFromBSSID( tpAniSirGlobal pMac, tCsrBssid *bssid, tANI_U32 *pSessionId )
13075{
13076 eHalStatus status = eHAL_STATUS_FAILURE;
13077 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070013078 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
13079 {
13080 if( CSR_IS_SESSION_VALID( pMac, i ) )
13081 {
13082 if( csrIsMacAddressEqual( pMac, bssid, &pMac->roam.roamSession[i].connectedProfile.bssid ) )
13083 {
13084 //Found it
13085 status = eHAL_STATUS_SUCCESS;
13086 *pSessionId = i;
13087 break;
13088 }
13089 }
13090 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013091 return( status );
13092}
13093
Jeff Johnson295189b2012-06-20 16:38:30 -070013094//This function assumes that we only support one IBSS session. We cannot use BSSID to identify
13095//session because for IBSS, the bssid changes.
13096static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac )
13097{
13098 tANI_U32 i, nRet = CSR_SESSION_ID_INVALID;
13099 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070013100 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
13101 {
13102 if( CSR_IS_SESSION_VALID( pMac, i ) )
13103 {
13104 pSession = CSR_GET_SESSION( pMac, i );
13105 if( pSession->pCurRoamProfile && ( csrIsBssTypeIBSS( pSession->connectedProfile.BSSType ) ) )
13106 {
13107 //Found it
13108 nRet = i;
13109 break;
13110 }
13111 }
13112 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013113 return (nRet);
13114}
Jeff Johnson295189b2012-06-20 16:38:30 -070013115static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid)
13116{
13117 /* Update the current BSS info in ho control block based on connected
13118 profile info from pmac global structure */
13119
Jeff Johnson295189b2012-06-20 16:38:30 -070013120 smsLog(pMac, LOGW, " csrRoamLinkUp: WLAN link UP with AP= %02x-%02x-%02x-%02x-%02x-%02x\n",
13121 bssid[ 0 ], bssid[ 1 ], bssid[ 2 ],
13122 bssid[ 3 ], bssid[ 4 ], bssid[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -070013123 /* Check for user misconfig of RSSI trigger threshold */
13124 pMac->roam.configParam.vccRssiThreshold =
13125 ( 0 == pMac->roam.configParam.vccRssiThreshold ) ?
13126 CSR_VCC_RSSI_THRESHOLD : pMac->roam.configParam.vccRssiThreshold;
13127 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
Jeff Johnson295189b2012-06-20 16:38:30 -070013128 /* Check for user misconfig of UL MAC Loss trigger threshold */
13129 pMac->roam.configParam.vccUlMacLossThreshold =
13130 ( 0 == pMac->roam.configParam.vccUlMacLossThreshold ) ?
13131 CSR_VCC_UL_MAC_LOSS_THRESHOLD : pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013132#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13133 {
13134 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013135 /* Indicate the neighbor roal algorithm about the connect indication */
13136 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssid, &sessionId);
13137 csrNeighborRoamIndicateConnect(pMac, sessionId, VOS_STATUS_SUCCESS);
13138 }
13139#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070013140}
13141
Jeff Johnson295189b2012-06-20 16:38:30 -070013142static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId)
13143{
13144 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070013145
13146 if(!pSession)
13147 {
13148 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
13149 return;
13150 }
13151
Jeff Johnson295189b2012-06-20 16:38:30 -070013152 //Only to handle the case for Handover on infra link
13153 if( eCSR_BSS_TYPE_INFRASTRUCTURE != pSession->connectedProfile.BSSType )
13154 {
13155 return;
13156 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013157 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
13158 csrRoamDeregStatisticsReq(pMac);
13159 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13160#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13161 /* Indicate the neighbor roal algorithm about the disconnect indication */
13162 csrNeighborRoamIndicateDisconnect(pMac, sessionId);
13163#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070013164
13165 //Remove this code once SLM_Sessionization is supported
13166 //BMPS_WORKAROUND_NOT_NEEDED
13167 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -070013168 csrIsInfraApStarted( pMac ) &&
13169 pMac->roam.configParam.doBMPSWorkaround)
Jeff Johnsone7245742012-09-05 17:12:55 -070013170 {
13171 pMac->roam.configParam.doBMPSWorkaround = 0;
13172 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013173}
13174
Jeff Johnson295189b2012-06-20 16:38:30 -070013175void csrRoamTlStatsTimerHandler(void *pv)
13176{
13177 tpAniSirGlobal pMac = PMAC_STRUCT( pv );
13178 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013179 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13180
Jeff Johnsone7245742012-09-05 17:12:55 -070013181 smsLog(pMac, LOG1, FL(" TL stat timer is no-op. It needs to support multiple stations"));
13182
Jeff Johnson295189b2012-06-20 16:38:30 -070013183#if 0
13184 // TODO Persession .???
13185 //req TL for stats
13186 if(WLANTL_GetStatistics(pMac->roam.gVosContext, &tlStats, pMac->roam.connectedInfo.staId))
13187 {
13188 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:couldn't get the stats from TL\n"));
13189 }
13190 else
13191 {
13192 //save in SME
13193 csrRoamSaveStatsFromTl(pMac, tlStats);
13194 }
13195#endif
13196 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13197 {
13198 if(pMac->roam.tlStatsReqInfo.periodicity)
13199 {
13200 //start timer
13201 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13202 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13203 if(!HAL_STATUS_SUCCESS(status))
13204 {
13205 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:cannot start TlStatsTimer timer\n"));
13206 return;
13207 }
13208 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13209 }
13210 }
13211}
Jeff Johnson295189b2012-06-20 16:38:30 -070013212void csrRoamPeStatsTimerHandler(void *pv)
13213{
13214 tCsrPeStatsReqInfo *pPeStatsReqListEntry = (tCsrPeStatsReqInfo *)pv;
13215 eHalStatus status;
13216 tpAniSirGlobal pMac = pPeStatsReqListEntry->pMac;
13217 VOS_STATUS vosStatus;
13218 tPmcPowerState powerState;
Jeff Johnson295189b2012-06-20 16:38:30 -070013219 pPeStatsReqListEntry->timerRunning = FALSE;
13220 if( pPeStatsReqListEntry->timerStopFailed == TRUE )
13221 {
13222 // If we entered here, meaning the timer could not be successfully
13223 // stopped in csrRoamRemoveEntryFromPeStatsReqList(). So do it here.
13224
13225 /* Destroy the timer */
13226 vosStatus = vos_timer_destroy( &pPeStatsReqListEntry->hPeStatsTimer );
13227 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13228 {
13229 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to destroy hPeStatsTimer timer\n"));
13230 }
13231
13232 // Free the entry
13233 palFreeMemory(pMac->hHdd, pPeStatsReqListEntry);
13234 pPeStatsReqListEntry = NULL;
13235 }
13236 else
13237 {
13238 if(!pPeStatsReqListEntry->rspPending)
13239 {
13240 status = csrSendMBStatsReqMsg(pMac, pPeStatsReqListEntry->statsMask & ~(1 << eCsrGlobalClassDStats),
13241 pPeStatsReqListEntry->staId);
13242 if(!HAL_STATUS_SUCCESS(status))
13243 {
13244 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to send down stats req to PE\n"));
13245 }
13246 else
13247 {
13248 pPeStatsReqListEntry->rspPending = TRUE;
13249 }
13250 }
13251
13252 //send down a req
13253 if(pPeStatsReqListEntry->periodicity &&
13254 (VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pPeStatsReqListEntry->hPeStatsTimer)))
13255 {
13256 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
13257 if(ePMC_FULL_POWER == powerState)
13258 {
13259 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
13260 {
13261 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
13262 }
13263 }
13264 else
13265 {
13266 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
13267 {
13268 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
13269 }
13270 }
13271 //start timer
13272 vosStatus = vos_timer_start( &pPeStatsReqListEntry->hPeStatsTimer, pPeStatsReqListEntry->periodicity );
13273 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13274 {
13275 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:cannot start hPeStatsTimer timer\n"));
13276 return;
13277 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013278 pPeStatsReqListEntry->timerRunning = TRUE;
13279
13280 }
13281
13282 }
13283}
Jeff Johnson295189b2012-06-20 16:38:30 -070013284void csrRoamStatsClientTimerHandler(void *pv)
13285{
13286 tCsrStatsClientReqInfo *pStaEntry = (tCsrStatsClientReqInfo *)pv;
Jeff Johnson295189b2012-06-20 16:38:30 -070013287 if(VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pStaEntry->timer))
13288 {
13289#if 0
13290 // TODO Stats fix for multisession
13291 //start the timer
13292 vosStatus = vos_timer_start( &pStaEntry->timer, pStaEntry->periodicity );
13293
13294 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13295 {
13296 smsLog(pStaEntry->pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013297 }
13298#endif
13299 }
13300#if 0
13301 //send up the stats report
13302 csrRoamReportStatistics(pStaEntry->pMac, pStaEntry->statsMask, pStaEntry->callback,
13303 pStaEntry->staId, pStaEntry->pContext);
13304#endif
13305}
13306
13307
13308
Jeff Johnson295189b2012-06-20 16:38:30 -070013309eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId)
13310{
13311 tAniGetPEStatsReq *pMsg;
13312 eHalStatus status = eHAL_STATUS_SUCCESS;
13313 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetPEStatsReq));
13314 if ( !HAL_STATUS_SUCCESS(status) )
13315 {
13316 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to allocate mem for stats req \n");
13317 return status;
13318 }
13319 // need to initiate a stats request to PE
13320 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_STATISTICS_REQ);
13321 pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
13322 pMsg->staId = staId;
13323 pMsg->statsMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070013324 status = palSendMBMessage(pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070013325 if(!HAL_STATUS_SUCCESS(status))
13326 {
13327 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to send down the stats req \n");
13328 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013329 return status;
13330}
Jeff Johnson295189b2012-06-20 16:38:30 -070013331void csrRoamStatsRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg)
13332{
13333 tAniGetPEStatsRsp *pSmeStatsRsp;
13334 eHalStatus status = eHAL_STATUS_FAILURE;
13335 tListElem *pEntry = NULL;
13336 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
13337 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13338 tANI_U32 tempMask = 0;
13339 tANI_U8 counter = 0;
13340 tANI_U8 *pStats = NULL;
13341 tANI_U32 length = 0;
13342 v_PVOID_t pvosGCtx;
13343 v_S7_t rssi = 0;
13344 tANI_U32 *pRssi = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013345 pSmeStatsRsp = (tAniGetPEStatsRsp *)pSirMsg;
13346 if(pSmeStatsRsp->rc)
13347 {
13348 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:stats rsp from PE shows failure\n"));
13349 goto post_update;
13350 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013351 tempMask = pSmeStatsRsp->statsMask;
13352 pStats = ((tANI_U8 *)&pSmeStatsRsp->statsMask) + sizeof(pSmeStatsRsp->statsMask);
Jeff Johnson295189b2012-06-20 16:38:30 -070013353 /* subtract all statistics from this length, and after processing the entire
13354 * 'stat' part of the message, if the length is not zero, then rssi is piggy packed
13355 * in this 'stats' message.
13356 */
13357 length = pSmeStatsRsp->msgLen - sizeof(tAniGetPEStatsRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070013358 //new stats info from PE, fill up the stats strucutres in PMAC
13359 while(tempMask)
13360 {
13361 if(tempMask & 1)
13362 {
13363 switch(counter)
13364 {
13365 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013366 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013367 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
13368 pStats, sizeof(tCsrSummaryStatsInfo));
13369 if(!HAL_STATUS_SUCCESS(status))
13370 {
13371 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy summary stats\n"));
13372 }
13373 pStats += sizeof(tCsrSummaryStatsInfo);
13374 length -= sizeof(tCsrSummaryStatsInfo);
13375 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013376 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013377 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013378 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classAStatsInfo,
13379 pStats, sizeof(tCsrGlobalClassAStatsInfo));
13380 if(!HAL_STATUS_SUCCESS(status))
13381 {
13382 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassA stats\n"));
13383 }
13384 pStats += sizeof(tCsrGlobalClassAStatsInfo);
13385 length -= sizeof(tCsrGlobalClassAStatsInfo);
13386 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013387 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013388 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013389 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classBStatsInfo,
13390 pStats, sizeof(tCsrGlobalClassBStatsInfo));
13391 if(!HAL_STATUS_SUCCESS(status))
13392 {
13393 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassB stats\n"));
13394 }
13395 pStats += sizeof(tCsrGlobalClassBStatsInfo);
13396 length -= sizeof(tCsrGlobalClassBStatsInfo);
13397 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013398 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013399 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013400 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classCStatsInfo,
13401 pStats, sizeof(tCsrGlobalClassCStatsInfo));
13402 if(!HAL_STATUS_SUCCESS(status))
13403 {
13404 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassC stats\n"));
13405 }
13406 pStats += sizeof(tCsrGlobalClassCStatsInfo);
13407 length -= sizeof(tCsrGlobalClassCStatsInfo);
13408 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013409 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013410 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013411 if( CSR_MAX_STA > pSmeStatsRsp->staId )
13412 {
13413 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.perStaStatsInfo[pSmeStatsRsp->staId],
13414 pStats, sizeof(tCsrPerStaStatsInfo));
13415 }
13416 else
13417 {
13418 status = eHAL_STATUS_FAILURE;
13419 smsLog( pMac, LOGE, FL("csrRoamStatsRspProcessor:out bound staId:%d\n"), pSmeStatsRsp->staId);
13420 VOS_ASSERT( 0 );
13421 }
13422 if(!HAL_STATUS_SUCCESS(status))
13423 {
13424 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy PerSta stats\n"));
13425 }
13426 pStats += sizeof(tCsrPerStaStatsInfo);
13427 length -= sizeof(tCsrPerStaStatsInfo);
13428 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013429 default:
13430 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:unknown stats type\n"));
13431 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013432 }
13433 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013434 tempMask >>=1;
13435 counter++;
13436 }
13437 pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
13438 if (length != 0)
13439 {
13440 pRssi = (tANI_U32*)pStats;
13441 rssi = (v_S7_t)*pRssi;
13442 }
13443 else
13444 {
13445 /* If riva is not sending rssi, continue to use the hack */
13446 rssi = RSSI_HACK_BMPS;
13447 }
13448 WDA_UpdateRssiBmps(pvosGCtx, pSmeStatsRsp->staId, rssi);
Jeff Johnson295189b2012-06-20 16:38:30 -070013449post_update:
13450 //make sure to update the pe stats req list
13451 pEntry = csrRoamFindInPeStatsReqList(pMac, pSmeStatsRsp->statsMask);
13452 if(pEntry)
13453 {
13454 pPeStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
13455 pPeStaEntry->rspPending = FALSE;
13456
13457 }
13458 //check the one timer cases
13459 pEntry = csrRoamCheckClientReqList(pMac, pSmeStatsRsp->statsMask);
13460 if(pEntry)
13461 {
Jeff Johnson295189b2012-06-20 16:38:30 -070013462 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013463 if(pTempStaEntry->timerExpired)
13464 {
13465 //send up the stats report
13466 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
13467 pTempStaEntry->staId, pTempStaEntry->pContext);
13468 //also remove from the client list
13469 csrRoamRemoveStatListEntry(pMac, pEntry);
13470 pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013471 }
13472 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013473}
Jeff Johnson295189b2012-06-20 16:38:30 -070013474tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13475{
13476 tListElem *pEntry = NULL;
13477 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013478 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013479 if(!pEntry)
13480 {
13481 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013482 smsLog(pMac, LOG2, "csrRoamFindInPeStatsReqList: List empty, no request to PE\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013483 return NULL;
13484 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013485 while( pEntry )
13486 {
13487 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013488 if(pTempStaEntry->statsMask == statsMask)
13489 {
Mohit Khanna23863762012-09-11 17:40:09 -070013490 smsLog(pMac, LOG3, "csrRoamFindInPeStatsReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013491 break;
13492 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013493 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
13494 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013495 return pEntry;
13496}
13497
Jeff Johnson295189b2012-06-20 16:38:30 -070013498tListElem * csrRoamChecknUpdateClientReqList(tpAniSirGlobal pMac, tCsrStatsClientReqInfo *pStaEntry,
13499 tANI_BOOLEAN update)
13500{
13501 tListElem *pEntry;
13502 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013503 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013504 if(!pEntry)
13505 {
13506 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013507 smsLog(pMac, LOG2, "csrRoamChecknUpdateClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013508 "upper layer client(s)\n");
13509 return NULL;
13510 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013511 while( pEntry )
13512 {
13513 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013514 if((pTempStaEntry->requesterId == pStaEntry->requesterId) &&
13515 (pTempStaEntry->statsMask == pStaEntry->statsMask))
13516 {
Mohit Khanna23863762012-09-11 17:40:09 -070013517 smsLog(pMac, LOG3, "csrRoamChecknUpdateClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013518 if(update)
13519 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013520 pTempStaEntry->periodicity = pStaEntry->periodicity;
13521 pTempStaEntry->callback = pStaEntry->callback;
13522 pTempStaEntry->pContext = pStaEntry->pContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013523 }
13524 break;
13525 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013526 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13527 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013528 return pEntry;
13529}
Jeff Johnson295189b2012-06-20 16:38:30 -070013530tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13531{
13532 tListElem *pEntry;
13533 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013534 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013535 if(!pEntry)
13536 {
13537 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013538 smsLog(pMac, LOG2, "csrRoamCheckClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013539 "upper layer client(s)\n");
13540 return NULL;
13541 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013542 while( pEntry )
13543 {
13544 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013545 if((pTempStaEntry->statsMask & ~(1 << eCsrGlobalClassDStats)) == statsMask)
13546 {
Mohit Khanna23863762012-09-11 17:40:09 -070013547 smsLog(pMac, LOG3, "csrRoamCheckClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013548 break;
13549 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013550 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13551 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013552 return pEntry;
13553}
Jeff Johnson295189b2012-06-20 16:38:30 -070013554eHalStatus csrRoamRegisterLinkQualityIndCallback(tpAniSirGlobal pMac,
13555 csrRoamLinkQualityIndCallback callback,
13556 void *pContext)
13557{
13558 pMac->roam.linkQualityIndInfo.callback = callback;
13559 pMac->roam.linkQualityIndInfo.context = pContext;
13560 if( NULL == callback )
13561 {
13562 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being deregistered");
13563 }
13564 else
13565 {
13566 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being registered");
Jeff Johnson295189b2012-06-20 16:38:30 -070013567 /* do we need to invoke the callback to notify client of initial value ?? */
13568 }
13569 return eHAL_STATUS_SUCCESS;
13570}
Jeff Johnson295189b2012-06-20 16:38:30 -070013571void csrRoamVccTrigger(tpAniSirGlobal pMac)
13572{
13573 eCsrRoamLinkQualityInd newVccLinkQuality;
13574 tANI_U32 ul_mac_loss = 0;
13575 tANI_U32 ul_mac_loss_trigger_threshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013576 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
13577 /*-------------------------------------------------------------------------
13578 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013579 Check for a change in link quality and notify client if necessary
13580 -------------------------------------------------------------------------*/
13581 ul_mac_loss_trigger_threshold =
13582 pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013583 VOS_ASSERT( ul_mac_loss_trigger_threshold != 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070013584 smsLog(pMac, LOGW, "csrRoamVccTrigger: UL_MAC_LOSS_THRESHOLD is %d\n",
13585 ul_mac_loss_trigger_threshold );
Jeff Johnson295189b2012-06-20 16:38:30 -070013586 if(ul_mac_loss_trigger_threshold < ul_mac_loss)
13587 {
13588 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is POOR \n");
13589 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13590 }
13591 else
13592 {
13593 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is GOOD\n");
13594 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13595 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013596 smsLog(pMac, LOGW, "csrRoamVccTrigger: link qual : *** UL_MAC_LOSS %d *** ",
13597 ul_mac_loss);
Jeff Johnson295189b2012-06-20 16:38:30 -070013598 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13599 {
13600 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality changed: trigger necessary\n");
13601 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13602 {
13603 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality indication %d\n",
13604 newVccLinkQuality );
13605
13606 /* we now invoke the callback once to notify client of initial value */
13607 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13608 pMac->roam.linkQualityIndInfo.context );
13609 //event: EVENT_WLAN_VCC
13610 }
13611 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013612 pMac->roam.vccLinkQuality = newVccLinkQuality;
13613
Jeff Johnson295189b2012-06-20 16:38:30 -070013614}
Jeff Johnson295189b2012-06-20 16:38:30 -070013615VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal,
13616 v_U8_t rssiNotification,
13617 void * context)
13618{
13619 tpAniSirGlobal pMac = PMAC_STRUCT( context );
13620 eCsrRoamLinkQualityInd newVccLinkQuality;
13621 // TODO : Session info unavailable
13622 tANI_U32 sessionId = 0;
13623 VOS_STATUS status = VOS_STATUS_SUCCESS;
13624 /*-------------------------------------------------------------------------
13625 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013626 Check for a change in link quality and notify client if necessary
13627 -------------------------------------------------------------------------*/
13628 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: RSSI trigger threshold is %d\n",
13629 pMac->roam.configParam.vccRssiThreshold);
13630 if(!csrIsConnStateConnectedInfra(pMac, sessionId))
13631 {
13632 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: ignoring the indication as we are not connected\n");
13633 return VOS_STATUS_SUCCESS;
13634 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013635 if(WLANTL_HO_THRESHOLD_DOWN == rssiNotification)
13636 {
13637 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is POOR\n");
13638 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13639 }
13640 else if(WLANTL_HO_THRESHOLD_UP == rssiNotification)
13641 {
13642 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is GOOD \n");
13643 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13644 }
13645 else
13646 {
13647 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: unknown rssi notification %d\n", rssiNotification);
13648 //Set to this so the code below won't do anything
13649 newVccLinkQuality = pMac->roam.vccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013650 VOS_ASSERT(0);
13651 }
13652
Jeff Johnson295189b2012-06-20 16:38:30 -070013653 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13654 {
13655 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality changed: trigger necessary\n");
13656 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13657 {
13658 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality indication %d\n",
13659 newVccLinkQuality);
Jeff Johnson295189b2012-06-20 16:38:30 -070013660 /* we now invoke the callback once to notify client of initial value */
13661 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13662 pMac->roam.linkQualityIndInfo.context );
13663 //event: EVENT_WLAN_VCC
13664 }
13665 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013666 pMac->roam.vccLinkQuality = newVccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013667 return status;
13668}
Jeff Johnson295189b2012-06-20 16:38:30 -070013669tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
13670 tDblLinkList *pStaList,
13671 tCsrStatsClientReqInfo *pStaEntry)
13672{
13673 tCsrStatsClientReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013674 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013675 //if same entity requested for same set of stats with different periodicity &
13676 // callback update it
13677 if(NULL == csrRoamChecknUpdateClientReqList(pMac, pStaEntry, TRUE))
13678 {
13679
13680 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrStatsClientReqInfo));
13681 if (!HAL_STATUS_SUCCESS(status))
13682 {
13683 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoList: couldn't allocate memory for the "
13684 "entry\n");
13685 return NULL;
13686 }
13687
Jeff Johnson295189b2012-06-20 16:38:30 -070013688 pNewStaEntry->callback = pStaEntry->callback;
13689 pNewStaEntry->pContext = pStaEntry->pContext;
13690 pNewStaEntry->periodicity = pStaEntry->periodicity;
13691 pNewStaEntry->requesterId = pStaEntry->requesterId;
13692 pNewStaEntry->statsMask = pStaEntry->statsMask;
13693 pNewStaEntry->pPeStaEntry = pStaEntry->pPeStaEntry;
13694 pNewStaEntry->pMac = pStaEntry->pMac;
13695 pNewStaEntry->staId = pStaEntry->staId;
13696 pNewStaEntry->timerExpired = pStaEntry->timerExpired;
13697
13698 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
13699 }
13700 return pNewStaEntry;
13701}
13702
Jeff Johnson295189b2012-06-20 16:38:30 -070013703tCsrPeStatsReqInfo * csrRoamInsertEntryIntoPeStatsReqList( tpAniSirGlobal pMac,
13704 tDblLinkList *pStaList,
13705 tCsrPeStatsReqInfo *pStaEntry)
13706{
13707 tCsrPeStatsReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013708 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013709 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrPeStatsReqInfo));
13710 if (!HAL_STATUS_SUCCESS(status))
13711 {
13712 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoPeStatsReqList: couldn't allocate memory for the "
13713 "entry\n");
13714 return NULL;
13715 }
13716
Jeff Johnson295189b2012-06-20 16:38:30 -070013717 pNewStaEntry->hPeStatsTimer = pStaEntry->hPeStatsTimer;
13718 pNewStaEntry->numClient = pStaEntry->numClient;
13719 pNewStaEntry->periodicity = pStaEntry->periodicity;
13720 pNewStaEntry->statsMask = pStaEntry->statsMask;
13721 pNewStaEntry->pMac = pStaEntry->pMac;
13722 pNewStaEntry->staId = pStaEntry->staId;
13723 pNewStaEntry->timerRunning = pStaEntry->timerRunning;
13724 pNewStaEntry->rspPending = pStaEntry->rspPending;
13725
13726 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013727 return pNewStaEntry;
13728}
Jeff Johnson295189b2012-06-20 16:38:30 -070013729eHalStatus csrGetRssi(tpAniSirGlobal pMac,
13730 tCsrRssiCallback callback,
13731 tANI_U8 staId, tCsrBssid bssId, void *pContext, void* pVosContext)
13732{
13733 eHalStatus status = eHAL_STATUS_SUCCESS;
13734 vos_msg_t msg;
13735 tANI_U32 sessionId;
13736
13737 tAniGetRssiReq *pMsg;
13738 smsLog(pMac, LOG2, FL("called"));
13739 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetRssiReq));
13740 if ( !HAL_STATUS_SUCCESS(status) )
13741 {
13742 smsLog(pMac, LOGE, " csrGetRssi: failed to allocate mem for req \n");
13743 return status;
13744 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013745 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssId, &sessionId);
13746
13747 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_RSSI_REQ);
13748 pMsg->msgLen = (tANI_U16)sizeof(tAniGetRssiReq);
13749 pMsg->sessionId = sessionId;
13750 pMsg->staId = staId;
13751 pMsg->rssiCallback = callback;
13752 pMsg->pDevContext = pContext;
13753 pMsg->pVosContext = pVosContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013754 msg.type = eWNI_SME_GET_RSSI_REQ;
13755 msg.bodyptr = pMsg;
13756 msg.reserved = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013757 if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
13758 {
13759 smsLog(pMac, LOGE, " csrGetRssi failed to post msg to self \n");
13760 palFreeMemory(pMac->hHdd, (void *)pMsg);
13761 status = eHAL_STATUS_FAILURE;
13762 }
13763 smsLog(pMac, LOG2, FL("returned"));
13764 return status;
13765}
Jeff Johnson295189b2012-06-20 16:38:30 -070013766eHalStatus csrGetStatistics(tpAniSirGlobal pMac, eCsrStatsRequesterType requesterId,
13767 tANI_U32 statsMask,
13768 tCsrStatsCallback callback,
13769 tANI_U32 periodicity, tANI_BOOLEAN cache,
13770 tANI_U8 staId, void *pContext)
13771{
13772 tCsrStatsClientReqInfo staEntry;
13773 tCsrStatsClientReqInfo *pStaEntry = NULL;
13774 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13775 tListElem *pEntry = NULL;
13776 tANI_BOOLEAN found = FALSE;
13777 eHalStatus status = eHAL_STATUS_SUCCESS;
13778 tANI_BOOLEAN insertInClientList = FALSE;
13779 VOS_STATUS vosStatus;
Jeff Johnsone7245742012-09-05 17:12:55 -070013780 WLANTL_TRANSFER_STA_TYPE *pTlStats;
Jeff Johnson295189b2012-06-20 16:38:30 -070013781
13782 if( csrIsAllSessionDisconnected(pMac) )
13783 {
13784 //smsLog(pMac, LOGW, "csrGetStatistics: wrong state curState(%d) not connected\n", pMac->roam.curState);
13785 return eHAL_STATUS_FAILURE;
13786 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013787 if((!statsMask) && (!callback))
13788 {
13789 //msg
13790 smsLog(pMac, LOGW, "csrGetStatistics: statsMask & callback empty in the request\n");
13791 return eHAL_STATUS_FAILURE;
13792 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013793 //for the search list method for deregister
13794 staEntry.requesterId = requesterId;
13795 staEntry.statsMask = statsMask;
13796 //requester wants to deregister or just an error
13797 if((statsMask) && (!callback))
13798 {
13799 pEntry = csrRoamChecknUpdateClientReqList(pMac, &staEntry, FALSE);
13800 if(!pEntry)
13801 {
13802 //msg
13803 smsLog(pMac, LOGW, "csrGetStatistics: callback is empty in the request & couldn't "
13804 "find any existing request in statsClientReqList\n");
13805 return eHAL_STATUS_FAILURE;
13806 }
13807 else
13808 {
13809 //clean up & return
13810 pStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnsond13512a2012-07-17 11:42:19 -070013811 if(NULL != pStaEntry->pPeStaEntry)
Jeff Johnson295189b2012-06-20 16:38:30 -070013812 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013813 pStaEntry->pPeStaEntry->numClient--;
13814 //check if we need to delete the entry from peStatsReqList too
13815 if(!pStaEntry->pPeStaEntry->numClient)
13816 {
13817 csrRoamRemoveEntryFromPeStatsReqList(pMac, pStaEntry->pPeStaEntry);
13818 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013819 }
Jeff Johnsond13512a2012-07-17 11:42:19 -070013820
Jeff Johnson295189b2012-06-20 16:38:30 -070013821 //check if we need to stop the tl stats timer too
13822 pMac->roam.tlStatsReqInfo.numClient--;
13823 if(!pMac->roam.tlStatsReqInfo.numClient)
13824 {
13825 if(pMac->roam.tlStatsReqInfo.timerRunning)
13826 {
13827 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
13828 if(!HAL_STATUS_SUCCESS(status))
13829 {
13830 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot stop TlStatsTimer timer\n"));
13831 return eHAL_STATUS_FAILURE;
13832 }
13833 }
13834 pMac->roam.tlStatsReqInfo.periodicity = 0;
13835 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13836 }
13837 vos_timer_stop( &pStaEntry->timer );
Jeff Johnson295189b2012-06-20 16:38:30 -070013838 // Destroy the vos timer...
13839 vosStatus = vos_timer_destroy( &pStaEntry->timer );
13840 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13841 {
13842 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to destroy Client req timer\n"));
13843 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013844 csrRoamRemoveStatListEntry(pMac, pEntry);
13845 pStaEntry = NULL;
13846 return eHAL_STATUS_SUCCESS;
13847 }
13848 }
13849
13850 if(cache && !periodicity)
13851 {
13852 //return the cached stats
13853 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13854 }
13855 else
13856 {
13857 //add the request in the client req list
13858 staEntry.callback = callback;
13859 staEntry.pContext = pContext;
13860 staEntry.periodicity = periodicity;
13861 staEntry.pPeStaEntry = NULL;
13862 staEntry.staId = staId;
13863 staEntry.pMac = pMac;
13864 staEntry.timerExpired = FALSE;
13865
13866
Jeff Johnson295189b2012-06-20 16:38:30 -070013867 //if periodic report requested with non cached result from PE/TL
13868 if(periodicity)
13869 {
13870
13871 //if looking for stats from PE
13872 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13873 {
13874
13875 //check if same request made already & waiting for rsp
13876 pPeStaEntry = csrRoamCheckPeStatsReqList(pMac, statsMask & ~(1 << eCsrGlobalClassDStats),
13877 periodicity, &found, staId);
13878 if(!pPeStaEntry)
13879 {
13880 //bail out, maxed out on number of req for PE
13881 return eHAL_STATUS_FAILURE;
13882 }
13883 else
13884 {
13885 staEntry.pPeStaEntry = pPeStaEntry;
13886 }
13887
13888 }
13889 //request stats from TL rightaway if requested by client, update tlStatsReqInfo if needed
13890 if(statsMask & (1 << eCsrGlobalClassDStats))
13891 {
13892 if(cache && pMac->roam.tlStatsReqInfo.numClient)
13893 {
13894 smsLog(pMac, LOGE, FL("csrGetStatistics:Looking for cached stats from TL\n"));
13895 }
13896 else
13897 {
13898
13899 //update periodicity
13900 if(pMac->roam.tlStatsReqInfo.periodicity)
13901 {
13902 pMac->roam.tlStatsReqInfo.periodicity =
13903 CSR_ROAM_MIN(periodicity, pMac->roam.tlStatsReqInfo.periodicity);
13904 }
13905 else
13906 {
13907 pMac->roam.tlStatsReqInfo.periodicity = periodicity;
13908 }
13909 if(pMac->roam.tlStatsReqInfo.periodicity < CSR_MIN_TL_STAT_QUERY_PERIOD)
13910 {
13911 pMac->roam.tlStatsReqInfo.periodicity = CSR_MIN_TL_STAT_QUERY_PERIOD;
13912 }
13913
13914 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13915 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013916 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13917 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013918 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013919 //req TL for class D stats
13920 if(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId))
13921 {
13922 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13923 }
13924 else
13925 {
13926 //save in SME
13927 csrRoamSaveStatsFromTl(pMac, pTlStats);
13928 }
13929 vos_mem_free(pTlStats);
13930 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013931 }
13932 else
13933 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013934 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013935 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013936
Jeff Johnson295189b2012-06-20 16:38:30 -070013937 if(pMac->roam.tlStatsReqInfo.periodicity)
13938 {
13939 //start timer
13940 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13941 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13942 if(!HAL_STATUS_SUCCESS(status))
13943 {
13944 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start TlStatsTimer timer\n"));
13945 return eHAL_STATUS_FAILURE;
13946 }
13947 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13948 }
13949 }
13950 }
13951 pMac->roam.tlStatsReqInfo.numClient++;
13952 }
13953
13954 insertInClientList = TRUE;
13955 }
13956 //if one time report requested with non cached result from PE/TL
13957 else if(!cache && !periodicity)
13958 {
13959 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13960 {
13961 //send down a req
13962 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
13963 if(!HAL_STATUS_SUCCESS(status))
13964 {
13965 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to send down stats req to PE\n"));
13966 }
13967 //so that when the stats rsp comes back from PE we respond to upper layer
13968 //right away
13969 staEntry.timerExpired = TRUE;
13970 insertInClientList = TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -070013971 }
13972 if(statsMask & (1 << eCsrGlobalClassDStats))
13973 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013974 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13975 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013976 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013977 //req TL for class D stats
13978 if(!VOS_IS_STATUS_SUCCESS(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId)))
13979 {
13980 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13981 }
13982 else
13983 {
13984 //save in SME
13985 csrRoamSaveStatsFromTl(pMac, pTlStats);
13986 }
13987 vos_mem_free(pTlStats);
13988 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013989 }
13990 else
13991 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013992 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013993 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013994
13995 }
13996 //if looking for stats from TL only
13997 if(!insertInClientList)
13998 {
13999 //return the stats
14000 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
14001 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014002 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014003 if(insertInClientList)
14004 {
14005 pStaEntry = csrRoamInsertEntryIntoList(pMac, &pMac->roam.statsClientReqList, &staEntry);
14006 if(!pStaEntry)
14007 {
14008 //msg
14009 smsLog(pMac, LOGW, "csrGetStatistics: Failed to insert req in statsClientReqList\n");
14010 return eHAL_STATUS_FAILURE;
14011 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014012 pStaEntry->periodicity = periodicity;
Jeff Johnson295189b2012-06-20 16:38:30 -070014013 //Init & start timer if needed
14014 if(periodicity)
14015 {
14016 vosStatus = vos_timer_init( &pStaEntry->timer, VOS_TIMER_TYPE_SW,
14017 csrRoamStatsClientTimerHandler, pStaEntry );
14018 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14019 {
14020 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot init StatsClient timer\n"));
14021 return eHAL_STATUS_FAILURE;
14022 }
14023 vosStatus = vos_timer_start( &pStaEntry->timer, periodicity );
14024 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14025 {
14026 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
14027 return eHAL_STATUS_FAILURE;
14028 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014029 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014030 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014031 }
14032 return eHAL_STATUS_SUCCESS;
14033}
14034
Jeff Johnson295189b2012-06-20 16:38:30 -070014035tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask,
14036 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId)
14037{
14038 tANI_BOOLEAN found = FALSE;
14039 eHalStatus status = eHAL_STATUS_SUCCESS;
14040 tCsrPeStatsReqInfo staEntry;
14041 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
14042 tListElem *pStaEntry = NULL;
14043 VOS_STATUS vosStatus;
14044 tPmcPowerState powerState;
14045 *pFound = FALSE;
14046
14047 pStaEntry = csrRoamFindInPeStatsReqList(pMac, statsMask);
14048 if(pStaEntry)
14049 {
14050 pTempStaEntry = GET_BASE_ADDR( pStaEntry, tCsrPeStatsReqInfo, link );
14051 if(pTempStaEntry->periodicity)
14052 {
14053 pTempStaEntry->periodicity =
14054 CSR_ROAM_MIN(periodicity, pTempStaEntry->periodicity);
14055 }
14056 else
14057 {
14058 pTempStaEntry->periodicity = periodicity;
14059 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014060 pTempStaEntry->numClient++;
14061 found = TRUE;
14062 }
14063 else
14064 {
14065 palZeroMemory(pMac->hHdd, &staEntry, sizeof(tCsrPeStatsReqInfo));
14066 staEntry.numClient = 1;
14067 staEntry.periodicity = periodicity;
14068 staEntry.pMac = pMac;
14069 staEntry.rspPending = FALSE;
14070 staEntry.staId = staId;
14071 staEntry.statsMask = statsMask;
14072 staEntry.timerRunning = FALSE;
14073 pTempStaEntry = csrRoamInsertEntryIntoPeStatsReqList(pMac, &pMac->roam.peStatsReqList, &staEntry);
14074 if(!pTempStaEntry)
14075 {
14076 //msg
14077 smsLog(pMac, LOGW, "csrRoamCheckPeStatsReqList: Failed to insert req in peStatsReqList\n");
14078 return NULL;
14079 }
14080 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014081 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
14082 if(ePMC_FULL_POWER == powerState)
14083 {
14084 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
14085 {
14086 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
14087 }
14088 }
14089 else
14090 {
14091 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
14092 {
14093 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
14094 }
14095 }
14096 if(!pTempStaEntry->timerRunning)
14097 {
14098 //send down a req in case of one time req, for periodic ones wait for timer to expire
14099 if(!pTempStaEntry->rspPending &&
14100 !pTempStaEntry->periodicity)
14101 {
14102 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
14103 if(!HAL_STATUS_SUCCESS(status))
14104 {
14105 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:failed to send down stats req to PE\n"));
14106 }
14107 else
14108 {
14109 pTempStaEntry->rspPending = TRUE;
14110 }
14111 }
14112 if(pTempStaEntry->periodicity)
14113 {
14114 if(!found)
14115 {
14116
14117 vosStatus = vos_timer_init( &pTempStaEntry->hPeStatsTimer, VOS_TIMER_TYPE_SW,
14118 csrRoamPeStatsTimerHandler, pTempStaEntry );
14119 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14120 {
14121 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot init hPeStatsTimer timer\n"));
14122 return NULL;
14123 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014124 }
14125 //start timer
14126 smsLog(pMac, LOG1, "csrRoamCheckPeStatsReqList:peStatsTimer period %d\n", pTempStaEntry->periodicity);
Jeff Johnson295189b2012-06-20 16:38:30 -070014127 vosStatus = vos_timer_start( &pTempStaEntry->hPeStatsTimer, pTempStaEntry->periodicity );
14128 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14129 {
14130 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot start hPeStatsTimer timer\n"));
14131 return NULL;
14132 }
14133 pTempStaEntry->timerRunning = TRUE;
14134 }
14135 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014136 *pFound = found;
14137 return pTempStaEntry;
14138}
14139
Jeff Johnson295189b2012-06-20 16:38:30 -070014140/*
14141 pStaEntry is no longer invalid upon the return of this function.
14142*/
14143static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry)
14144{
14145 if(pEntry)
14146 {
14147 if(csrLLRemoveEntry(&pMac->roam.statsClientReqList, pEntry, LL_ACCESS_LOCK))
14148 {
14149 palFreeMemory(pMac->hHdd, GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link ));
Jeff Johnsone7245742012-09-05 17:12:55 -070014150 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014151 }
14152 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014153
14154void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry)
14155{
14156 tListElem *pEntry;
14157 tCsrPeStatsReqInfo *pTempStaEntry;
14158 VOS_STATUS vosStatus;
14159 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014160 if(!pEntry)
14161 {
14162 //list empty
14163 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: List empty, no stats req for PE\n");
14164 return;
14165 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014166 while( pEntry )
14167 {
14168 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014169 if( pTempStaEntry && pTempStaEntry->statsMask == pPeStaEntry->statsMask)
14170 {
14171 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: match found\n");
14172 if(pTempStaEntry->timerRunning)
14173 {
14174 vosStatus = vos_timer_stop( &pTempStaEntry->hPeStatsTimer );
14175 /* If we are not able to stop the timer here, just remove
14176 * the entry from the linked list. Destroy the timer object
14177 * and free the memory in the timer CB
14178 */
14179 if( vosStatus == VOS_STATUS_SUCCESS )
14180 {
14181 /* the timer is successfully stopped */
14182 pTempStaEntry->timerRunning = FALSE;
14183
14184 /* Destroy the timer */
14185 vosStatus = vos_timer_destroy( &pTempStaEntry->hPeStatsTimer );
14186 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14187 {
14188 smsLog(pMac, LOGE, FL("csrRoamRemoveEntryFromPeStatsReqList:failed to destroy hPeStatsTimer timer\n"));
14189 }
14190 }
14191 else
14192 {
14193 // the timer could not be stopped. Hence destroy and free the
14194 // memory for the PE stat entry in the timer CB.
14195 pTempStaEntry->timerStopFailed = TRUE;
14196 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014197 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014198
14199 if(csrLLRemoveEntry(&pMac->roam.peStatsReqList, pEntry, LL_ACCESS_LOCK))
14200 {
14201 // Only free the memory if we could stop the timer successfully
14202 if(!pTempStaEntry->timerStopFailed)
14203 {
14204 palFreeMemory(pMac->hHdd, pTempStaEntry);
14205 pTempStaEntry = NULL;
14206 }
14207 break;
14208 }
14209
14210 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
14211 }
14212 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014213 return;
14214}
14215
14216
Jeff Johnsone7245742012-09-05 17:12:55 -070014217void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070014218{
14219
Jeff Johnsone7245742012-09-05 17:12:55 -070014220 pMac->roam.classDStatsInfo.num_rx_bytes_crc_ok = pTlStats->rxBcntCRCok;
14221 pMac->roam.classDStatsInfo.rx_bc_byte_cnt = pTlStats->rxBCBcnt;
14222 pMac->roam.classDStatsInfo.rx_bc_frm_cnt = pTlStats->rxBCFcnt;
14223 pMac->roam.classDStatsInfo.rx_byte_cnt = pTlStats->rxBcnt;
14224 pMac->roam.classDStatsInfo.rx_mc_byte_cnt = pTlStats->rxMCBcnt;
14225 pMac->roam.classDStatsInfo.rx_mc_frm_cnt = pTlStats->rxMCFcnt;
14226 pMac->roam.classDStatsInfo.rx_rate = pTlStats->rxRate;
Jeff Johnson295189b2012-06-20 16:38:30 -070014227 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014228 pMac->roam.classDStatsInfo.rx_uc_byte_cnt[0] = pTlStats->rxUCBcnt;
14229 pMac->roam.classDStatsInfo.rx_uc_frm_cnt = pTlStats->rxUCFcnt;
14230 pMac->roam.classDStatsInfo.tx_bc_byte_cnt = pTlStats->txBCBcnt;
14231 pMac->roam.classDStatsInfo.tx_bc_frm_cnt = pTlStats->txBCFcnt;
14232 pMac->roam.classDStatsInfo.tx_mc_byte_cnt = pTlStats->txMCBcnt;
14233 pMac->roam.classDStatsInfo.tx_mc_frm_cnt = pTlStats->txMCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014234 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014235 pMac->roam.classDStatsInfo.tx_uc_byte_cnt[0] = pTlStats->txUCBcnt;
14236 pMac->roam.classDStatsInfo.tx_uc_frm_cnt = pTlStats->txUCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014237
14238}
14239
Jeff Johnson295189b2012-06-20 16:38:30 -070014240void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
14241 tCsrStatsCallback callback, tANI_U8 staId, void *pContext)
14242{
14243 tANI_U8 stats[500];
14244 tANI_U8 *pStats = NULL;
14245 tANI_U32 tempMask = 0;
14246 tANI_U8 counter = 0;
14247 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014248 if(!callback)
14249 {
14250 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report callback NULL\n"));
14251 return;
14252 }
14253 if(!statsMask)
14254 {
14255 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report statsMask is 0\n"));
14256 return;
14257 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014258 pStats = stats;
Jeff Johnson295189b2012-06-20 16:38:30 -070014259 tempMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070014260 while(tempMask)
14261 {
14262 if(tempMask & 1)
14263 {
14264 //new stats info from PE, fill up the stats strucutres in PMAC
14265 switch(counter)
14266 {
14267 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014268 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014269 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
14270 sizeof(tCsrSummaryStatsInfo));
14271 if(!HAL_STATUS_SUCCESS(status))
14272 {
14273 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy summary stats\n"));
14274 }
14275 pStats += sizeof(tCsrSummaryStatsInfo);
14276 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014277 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014278 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014279 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classAStatsInfo,
14280 sizeof(tCsrGlobalClassAStatsInfo));
14281 if(!HAL_STATUS_SUCCESS(status))
14282 {
14283 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassA stats\n"));
14284 }
14285 pStats += sizeof(tCsrGlobalClassAStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014286 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014287 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014288 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014289 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classBStatsInfo,
14290 sizeof(tCsrGlobalClassBStatsInfo));
14291 if(!HAL_STATUS_SUCCESS(status))
14292 {
14293 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassB stats\n"));
14294 }
14295 pStats += sizeof(tCsrGlobalClassBStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014296 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014297 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014298 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014299 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classCStatsInfo,
14300 sizeof(tCsrGlobalClassCStatsInfo));
14301 if(!HAL_STATUS_SUCCESS(status))
14302 {
14303 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassC stats\n"));
14304 }
14305 pStats += sizeof(tCsrGlobalClassCStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014306 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014307 case eCsrGlobalClassDStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014308 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassD stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014309 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classDStatsInfo,
14310 sizeof(tCsrGlobalClassDStatsInfo));
14311 if(!HAL_STATUS_SUCCESS(status))
14312 {
14313 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassD stats\n"));
14314 }
14315 pStats += sizeof(tCsrGlobalClassDStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014316 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014317 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014318 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014319 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.perStaStatsInfo[staId],
14320 sizeof(tCsrPerStaStatsInfo));
14321 if(!HAL_STATUS_SUCCESS(status))
14322 {
14323 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy PerSta stats\n"));
14324 }
14325 pStats += sizeof(tCsrPerStaStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014326 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014327 default:
14328 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:unknown stats type\n"));
14329 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014330 }
14331 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014332 tempMask >>=1;
14333 counter++;
14334 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014335 callback(stats, pContext );
Jeff Johnson295189b2012-06-20 16:38:30 -070014336}
14337
Jeff Johnson295189b2012-06-20 16:38:30 -070014338eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac)
14339{
14340 tListElem *pEntry = NULL;
14341 tListElem *pPrevEntry = NULL;
14342 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
14343 eHalStatus status = eHAL_STATUS_SUCCESS;
14344 VOS_STATUS vosStatus;
14345 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014346 if(!pEntry)
14347 {
14348 //list empty
14349 smsLog(pMac, LOGW, "csrRoamDeregStatisticsReq: List empty, no request from "
14350 "upper layer client(s)\n");
14351 return status;
14352 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014353 while( pEntry )
14354 {
14355 if(pPrevEntry)
14356 {
14357 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14358 //send up the stats report
14359 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14360 pTempStaEntry->staId, pTempStaEntry->pContext);
14361 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14362 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014363 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014364 if (pTempStaEntry->pPeStaEntry) //pPeStaEntry can be NULL
14365 {
Jeff Johnsone7245742012-09-05 17:12:55 -070014366 pTempStaEntry->pPeStaEntry->numClient--;
14367 //check if we need to delete the entry from peStatsReqList too
14368 if(!pTempStaEntry->pPeStaEntry->numClient)
14369 {
14370 csrRoamRemoveEntryFromPeStatsReqList(pMac, pTempStaEntry->pPeStaEntry);
14371 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014372 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014373 //check if we need to stop the tl stats timer too
14374 pMac->roam.tlStatsReqInfo.numClient--;
14375 if(!pMac->roam.tlStatsReqInfo.numClient)
14376 {
14377 if(pMac->roam.tlStatsReqInfo.timerRunning)
14378 {
14379 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
14380 if(!HAL_STATUS_SUCCESS(status))
14381 {
14382 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:cannot stop TlStatsTimer timer\n"));
14383 //we will continue
14384 }
14385 }
14386 pMac->roam.tlStatsReqInfo.periodicity = 0;
14387 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
14388 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014389 if (pTempStaEntry->periodicity)
14390 {
14391 //While creating StaEntry in csrGetStatistics,
14392 //Initializing and starting timer only when periodicity is set.
14393 //So Stop and Destroy timer only when periodicity is set.
14394
Jeff Johnsone7245742012-09-05 17:12:55 -070014395 vos_timer_stop( &pTempStaEntry->timer );
14396 // Destroy the vos timer...
14397 vosStatus = vos_timer_destroy( &pTempStaEntry->timer );
14398 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14399 {
14400 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:failed to destroy Client req timer\n"));
14401 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014402 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014403
Jeff Johnson295189b2012-06-20 16:38:30 -070014404
14405 pPrevEntry = pEntry;
14406 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
14407 }
14408 //the last one
14409 if(pPrevEntry)
14410 {
14411 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14412 //send up the stats report
14413 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14414 pTempStaEntry->staId, pTempStaEntry->pContext);
14415 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14416 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014417 return status;
14418
14419}
14420
Jeff Johnson295189b2012-06-20 16:38:30 -070014421eHalStatus csrIsFullPowerNeeded( tpAniSirGlobal pMac, tSmeCmd *pCommand,
14422 tRequestFullPowerReason *pReason,
14423 tANI_BOOLEAN *pfNeedPower )
14424{
14425 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14426 tRequestFullPowerReason reason = eSME_REASON_OTHER;
14427 tPmcState pmcState;
14428 eHalStatus status = eHAL_STATUS_SUCCESS;
14429 // TODO : Session info unavailable
14430 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070014431 if( pfNeedPower )
14432 {
14433 *pfNeedPower = eANI_BOOLEAN_FALSE;
14434 }
14435 //We only handle CSR commands
14436 if( !(eSmeCsrCommandMask & pCommand->command) )
14437 {
14438 return eHAL_STATUS_SUCCESS;
14439 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014440 //Check PMC state first
14441 pmcState = pmcGetPmcState( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014442 switch( pmcState )
14443 {
14444 case REQUEST_IMPS:
14445 case IMPS:
14446 if( eSmeCommandScan == pCommand->command )
14447 {
14448 switch( pCommand->u.scanCmd.reason )
14449 {
14450 case eCsrScanGetResult:
14451 case eCsrScanBGScanAbort:
14452 case eCsrScanBGScanEnable:
14453 case eCsrScanGetScanChnInfo:
14454 //Internal process, no need for full power
14455 fNeedFullPower = eANI_BOOLEAN_FALSE;
14456 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014457 default:
14458 //Other scans are real scan, ask for power
14459 fNeedFullPower = eANI_BOOLEAN_TRUE;
14460 break;
14461 } //switch
14462 }
14463 else
14464 {
14465 //ask for power for roam and status change
14466 fNeedFullPower = eANI_BOOLEAN_TRUE;
14467 }
14468 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014469 case REQUEST_BMPS:
14470 case BMPS:
14471 case REQUEST_START_UAPSD:
14472 case UAPSD:
14473 //We treat WOWL same as BMPS
14474 case REQUEST_ENTER_WOWL:
14475 case WOWL:
14476 if( eSmeCommandRoam == pCommand->command )
14477 {
14478 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
14479 tCsrScanResult *pScanResult;
14480 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070014481 switch ( pCommand->u.roamCmd.roamReason )
14482 {
14483 case eCsrForcedDisassoc:
14484 case eCsrForcedDisassocMICFailure:
14485 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14486 fNeedFullPower = eANI_BOOLEAN_TRUE;
14487 break;
14488 case eCsrSmeIssuedDisassocForHandoff:
14489 case eCsrForcedDeauth:
14490 case eCsrHddIssuedReassocToSameAP:
14491 case eCsrSmeIssuedReassocToSameAP:
14492 fNeedFullPower = eANI_BOOLEAN_TRUE;
14493 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014494 case eCsrCapsChange:
14495 fNeedFullPower = eANI_BOOLEAN_TRUE;
14496 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014497 default:
14498 //Check whether the profile is already connected. If so, no need for full power
14499 //Note: IBSS is ignored for now because we don't support powersave in IBSS
14500 if ( csrIsConnStateConnectedInfra(pMac, sessionId) && pBSSList )
14501 {
14502 //Only need to check the first one
14503 pEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
14504 if( pEntry )
14505 {
14506 pScanResult = GET_BASE_ADDR(pEntry, tCsrScanResult, Link);
14507#if 0
14508 // TODO : Session Specific info pConnectBssDesc
14509 if( csrIsBssIdEqual( pMac, &pScanResult->Result.BssDescriptor, pMac->roam.pConnectBssDesc ) &&
14510 csrIsSsidEqual( pMac, pMac->roam.pConnectBssDesc,
14511 &pScanResult->Result.BssDescriptor, (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ) ) )
14512 {
14513 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
14514 // with Authenticating first. To force this, stop the current association (Disassociate) and
14515 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
14516 // a new Association.
14517 if(csrIsSameProfile(pMac, &pMac->roam.connectedProfile, pProfile))
14518 {
14519 if(csrRoamIsSameProfileKeys(pMac, &pMac->roam.connectedProfile, pProfile))
14520 {
14521 //Done, eventually, the command reaches eCsrReassocToSelfNoCapChange;
14522 //No need for full power
14523 //Set the flag so the code later can avoid to do the above
14524 //check again.
14525 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_TRUE;
14526 break;
14527 }
14528 }
14529 }
14530#endif
14531 }
14532 }
14533 //If we are here, full power is needed
14534 fNeedFullPower = eANI_BOOLEAN_TRUE;
14535 break;
14536 }
14537 }
14538 else if( eSmeCommandWmStatusChange == pCommand->command )
14539 {
14540 //need full power for all
14541 fNeedFullPower = eANI_BOOLEAN_TRUE;
14542 reason = eSME_LINK_DISCONNECTED_BY_OTHER;
14543 }
14544 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014545 case REQUEST_STOP_UAPSD:
14546 case REQUEST_EXIT_WOWL:
14547 if( eSmeCommandRoam == pCommand->command )
14548 {
14549 fNeedFullPower = eANI_BOOLEAN_TRUE;
14550 switch ( pCommand->u.roamCmd.roamReason )
14551 {
14552 case eCsrForcedDisassoc:
14553 case eCsrForcedDisassocMICFailure:
14554 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14555 break;
14556 default:
14557 break;
14558 }
14559 }
14560 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014561 case STOPPED:
14562 case REQUEST_STANDBY:
14563 case STANDBY:
14564 case LOW_POWER:
14565 //We are not supposed to do anything
14566 smsLog( pMac, LOGE, FL( " cannot process because PMC is in stopped/standby state %d\n" ), pmcState );
14567 status = eHAL_STATUS_FAILURE;
14568 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014569 case FULL_POWER:
14570 case REQUEST_FULL_POWER:
14571 default:
14572 //No need to ask for full power. This has to be FULL_POWER state
14573 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014574 } //switch
Jeff Johnson295189b2012-06-20 16:38:30 -070014575 if( pReason )
14576 {
14577 *pReason = reason;
14578 }
14579 if( pfNeedPower )
14580 {
14581 *pfNeedPower = fNeedFullPower;
14582 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014583 return ( status );
14584}
14585
Jeff Johnson295189b2012-06-20 16:38:30 -070014586static eHalStatus csrRequestFullPower( tpAniSirGlobal pMac, tSmeCmd *pCommand )
14587{
14588 eHalStatus status = eHAL_STATUS_SUCCESS;
14589 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14590 tRequestFullPowerReason reason = eSME_REASON_OTHER;
Jeff Johnson295189b2012-06-20 16:38:30 -070014591 status = csrIsFullPowerNeeded( pMac, pCommand, &reason, &fNeedFullPower );
Jeff Johnson295189b2012-06-20 16:38:30 -070014592 if( fNeedFullPower && HAL_STATUS_SUCCESS( status ) )
14593 {
14594 status = pmcRequestFullPower(pMac, csrFullPowerCallback, pMac, reason);
14595 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014596 return ( status );
14597}
14598
Jeff Johnson295189b2012-06-20 16:38:30 -070014599tSmeCmd *csrGetCommandBuffer( tpAniSirGlobal pMac )
14600{
14601 tSmeCmd *pCmd = smeGetCommandBuffer( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014602 if( pCmd )
14603 {
14604 pMac->roam.sPendingCommands++;
14605 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014606 return ( pCmd );
14607}
14608
Jeff Johnson295189b2012-06-20 16:38:30 -070014609void csrReleaseCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand)
14610{
14611 if (pMac->roam.sPendingCommands > 0)
14612 {
14613 //All command allocated through csrGetCommandBuffer need to
14614 //decrement the pending count when releasing.
14615 pMac->roam.sPendingCommands--;
14616 smeReleaseCommand( pMac, pCommand );
14617 }
14618 else
14619 {
14620 smsLog(pMac, LOGE, FL( "no pending commands"));
14621 VOS_ASSERT(0);
14622 }
14623}
14624
Jeff Johnson295189b2012-06-20 16:38:30 -070014625//Return SUCCESS is the command is queued, failed
14626eHalStatus csrQueueSmeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fHighPriority )
14627{
14628 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070014629 if( (eSmeCommandScan == pCommand->command) && pMac->scan.fDropScanCmd )
14630 {
14631 smsLog(pMac, LOGW, FL(" drop scan (scan reason %d) command"),
14632 pCommand->u.scanCmd.reason);
14633 return eHAL_STATUS_CSR_WRONG_STATE;
14634 }
14635
14636 //We can call request full power first before putting the command into pending Q
14637 //because we are holding SME lock at this point.
14638 status = csrRequestFullPower( pMac, pCommand );
14639 if( HAL_STATUS_SUCCESS( status ) )
14640 {
14641 tANI_BOOLEAN fNoCmdPending;
Jeff Johnson295189b2012-06-20 16:38:30 -070014642 //make sure roamCmdPendingList is not empty first
14643 fNoCmdPending = csrLLIsListEmpty( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_FALSE );
14644 if( fNoCmdPending )
14645 {
14646 smePushCommand( pMac, pCommand, fHighPriority );
14647 }
14648 else
14649 {
14650 //Other commands are waiting for PMC callback, queue the new command to the pending Q
14651 //no list lock is needed since SME lock is held
14652 if( !fHighPriority )
14653 {
14654 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14655 }
14656 else {
14657 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14658 }
14659 }
14660 }
14661 else if( eHAL_STATUS_PMC_PENDING == status )
14662 {
14663 //no list lock is needed since SME lock is held
14664 if( !fHighPriority )
14665 {
14666 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14667 }
14668 else {
14669 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14670 }
14671 //Let caller know the command is queue
14672 status = eHAL_STATUS_SUCCESS;
14673 }
14674 else
14675 {
14676 //Not to decrease pMac->roam.sPendingCommands here. Caller will decrease it when it
14677 //release the command.
14678 smsLog( pMac, LOGE, FL( " cannot queue command %d\n" ), pCommand->command );
14679 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014680 return ( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070014681}
Jeff Johnson295189b2012-06-20 16:38:30 -070014682#ifdef WLAN_SOFTAP_FEATURE
14683eHalStatus csrRoamUpdateAPWPSIE( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirAPWPSIEs* pAPWPSIES )
14684{
14685 eHalStatus status = eHAL_STATUS_SUCCESS;
14686 tSirUpdateAPWPSIEsReq *pMsg;
14687 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
14688
14689 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14690 if (NULL == pSession)
14691 {
14692 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14693 return eHAL_STATUS_FAILURE;
14694 }
14695
Jeff Johnson295189b2012-06-20 16:38:30 -070014696 do
14697 {
14698 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14699 if (!HAL_STATUS_SUCCESS(status)) break;
14700 palZeroMemory( pMac->hHdd, pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14701 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPDATE_APWPSIE_REQ);
14702
14703 pBuf = (tANI_U8 *)&pMsg->transactionId;
14704 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014705 // transactionId
14706 *pBuf = 0;
14707 *( pBuf + 1 ) = 0;
14708 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070014709 // bssId
14710 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14711 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014712 //sessionId
14713 *pBuf++ = (tANI_U8)sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014714 // APWPSIEs
14715 palCopyMemory( pMac->hHdd, (tSirAPWPSIEs *)pBuf, pAPWPSIES, sizeof(tSirAPWPSIEs));
14716 pBuf += sizeof(tSirAPWPSIEs);
Jeff Johnson295189b2012-06-20 16:38:30 -070014717 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014718 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014719 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014720 return ( status );
14721}
Jeff Johnson295189b2012-06-20 16:38:30 -070014722eHalStatus csrRoamUpdateWPARSNIEs( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirRSNie * pAPSirRSNie)
14723{
14724 eHalStatus status = eHAL_STATUS_SUCCESS;
14725 tSirUpdateAPWPARSNIEsReq *pMsg;
14726 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070014727 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14728 if (NULL == pSession)
14729 {
14730 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14731 return eHAL_STATUS_FAILURE;
14732 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014733 do
14734 {
14735 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPARSNIEsReq) );
14736 if (!HAL_STATUS_SUCCESS(status)) break;
14737 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirUpdateAPWPARSNIEsReq ) );
14738 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SET_APWPARSNIEs_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070014739 pBuf = (tANI_U8 *)&pMsg->transactionId;
14740 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014741 // transactionId
14742 *pBuf = 0;
14743 *( pBuf + 1 ) = 0;
14744 pBuf += sizeof(tANI_U16);
14745
14746 // bssId
14747 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14748 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014749 // sessionId
14750 *pBuf++ = (tANI_U8)sessionId;
14751
14752 // APWPARSNIEs
14753 palCopyMemory( pMac->hHdd, (tSirRSNie *)pBuf, pAPSirRSNie, sizeof(tSirRSNie));
14754 pBuf += sizeof(tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070014755 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014756 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014757 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014758 return ( status );
14759}
Jeff Johnson295189b2012-06-20 16:38:30 -070014760#endif //#ifdef WLAN_SOFTAP_FEATURE
14761
14762#ifdef WLAN_FEATURE_VOWIFI_11R
14763//eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tCsrBssid preAuthBssid, tANI_U8 channelId)
14764eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tpSirBssDescription pBssDescription)
14765{
14766 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14767 tpSirFTPreAuthReq pftPreAuthReq;
14768 tANI_U16 auth_req_len = 0;
14769 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070014770 auth_req_len = sizeof(tSirFTPreAuthReq);
14771 pftPreAuthReq = (tpSirFTPreAuthReq)vos_mem_malloc(auth_req_len);
14772 if (pftPreAuthReq == NULL)
14773 {
14774 smsLog(pMac, LOGE, FL("Memory allocation for FT Preauth request failed"));
14775 return eHAL_STATUS_RESOURCES;
14776 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014777 // Save the SME Session ID here. We need it while processing the preauth response
14778 pMac->ft.ftSmeContext.smeSessionId = sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014779 vos_mem_zero(pftPreAuthReq, auth_req_len);
14780
14781 pftPreAuthReq->pbssDescription = (tpSirBssDescription)vos_mem_malloc(
14782 sizeof(pBssDescription->length) + pBssDescription->length);
14783
14784 pftPreAuthReq->messageType = pal_cpu_to_be16(eWNI_SME_FT_PRE_AUTH_REQ);
14785
14786 pftPreAuthReq->preAuthchannelNum = pBssDescription->channelId;
14787
Jeff Johnson295189b2012-06-20 16:38:30 -070014788 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->currbssId, (void *)pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070014789 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->preAuthbssId, (void *)pBssDescription->bssId, sizeof(tSirMacAddr));
14790
Jeff Johnson295189b2012-06-20 16:38:30 -070014791#ifdef WLAN_FEATURE_VOWIFI_11R
14792 if (csrRoamIs11rAssoc(pMac))
14793 {
14794 pftPreAuthReq->ft_ies_length = (tANI_U16)pMac->ft.ftSmeContext.auth_ft_ies_length;
14795 palCopyMemory(pMac->hHdd, pftPreAuthReq->ft_ies, pMac->ft.ftSmeContext.auth_ft_ies,
14796 pMac->ft.ftSmeContext.auth_ft_ies_length);
14797 }
14798 else
14799#endif
14800 {
14801 pftPreAuthReq->ft_ies_length = 0;
14802 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014803 vos_mem_copy(pftPreAuthReq->pbssDescription, pBssDescription, pBssDescription->length);
Jeff Johnson295189b2012-06-20 16:38:30 -070014804 pftPreAuthReq->length = pal_cpu_to_be16(sizeof(tSirFTPreAuthReq) + sizeof(pBssDescription->length) +
14805 pBssDescription->length);
Jeff Johnson295189b2012-06-20 16:38:30 -070014806 return palSendMBMessage(pMac->hHdd, pftPreAuthReq);
14807}
Jeff Johnson295189b2012-06-20 16:38:30 -070014808/*--------------------------------------------------------------------------
14809 * This will receive and process the FT Pre Auth Rsp from the current
14810 * associated ap.
14811 *
14812 * This will invoke the hdd call back. This is so that hdd can now
14813 * send the FTIEs from the Auth Rsp (Auth Seq 2) to the supplicant.
14814 ------------------------------------------------------------------------*/
14815void csrRoamFTPreAuthRspProcessor( tHalHandle hHal, tpSirFTPreAuthRsp pFTPreAuthRsp )
14816{
14817 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14818 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014819#ifdef FEATURE_WLAN_LFR
14820 tCsrRoamInfo roamInfo;
14821#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014822
14823#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
14824 smsLog( pMac, LOGE, FL("Preauth response status code %d"), pFTPreAuthRsp->status);
14825#endif
Madan Mohan Koyyalamudi7a579cc2012-10-21 11:25:39 -070014826#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
14827 status = csrNeighborRoamPreauthRspHandler(pMac, (VOS_STATUS)pFTPreAuthRsp->status);
14828 if (status != eHAL_STATUS_SUCCESS) {
14829 /*
14830 * Bail out if pre-auth was not even processed.
14831 */
14832 smsLog(pMac, LOGW, FL("Preauth was not processed: %d"), status);
14833 return;
14834 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014835#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014836 /* The below function calls/timers should be invoked only if the pre-auth is successful */
14837 if (VOS_STATUS_SUCCESS != (VOS_STATUS)pFTPreAuthRsp->status)
14838 return;
Jeff Johnson295189b2012-06-20 16:38:30 -070014839 // Implies a success
14840 pMac->ft.ftSmeContext.FTState = eFT_AUTH_COMPLETE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014841 // Indicate SME QoS module the completion of Preauth success. This will trigger the creation of RIC IEs
14842 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = pFTPreAuthRsp;
14843 sme_QosCsrEventInd(pMac, pMac->ft.ftSmeContext.smeSessionId, SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070014844 /* Start the pre-auth reassoc interval timer with a period of 400ms. When this expires,
14845 * actual transition from the current to handoff AP is triggered */
14846 status = palTimerStart(pMac->hHdd, pMac->ft.ftSmeContext.preAuthReassocIntvlTimer,
14847 60 * PAL_TIMER_TO_MS_UNIT,
14848 eANI_BOOLEAN_FALSE);
14849 if (eHAL_STATUS_SUCCESS != status)
14850 {
14851 smsLog(pMac, LOGE, FL("Preauth reassoc interval timer start failed to start with status %d\n"), status);
14852 return;
14853 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014854 // Save the received response
14855 palCopyMemory(pMac->hHdd, (void *)&pMac->ft.ftSmeContext.preAuthbssId, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14856 if (csrRoamIs11rAssoc(pMac))
14857 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, NULL, 0,
14858 eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
14859
14860 // Currently we dont do anything special for CCX connection.
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014861#ifdef FEATURE_WLAN_LFR
14862 // If Legacy Fast Roaming is enabled, signal the supplicant
14863 // So he can send us a PMK-ID for this candidate AP.
14864 if (csrRoamIsFastRoamEnabled(pMac))
14865 {
14866 // Save the bssid from the received response
14867 palCopyMemory(pMac->hHdd, (void *)&roamInfo.bssid, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14868 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, &roamInfo, 0, eCSR_ROAM_PMK_NOTIFY, 0);
14869 }
14870
14871#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014872
14873 // Done with it, init it.
14874 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = NULL;
14875}
14876#endif
14877#ifdef FEATURE_WLAN_BTAMP_UT_RF
14878void csrRoamJoinRetryTimerHandler(void *pv)
14879{
14880 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
14881 tpAniSirGlobal pMac = pInfo->pMac;
14882 tANI_U32 sessionId = pInfo->sessionId;
14883 tCsrRoamSession *pSession;
14884
14885 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14886 {
14887 smsLog( pMac, LOGE, FL( " retrying the last roam profile on session %d\n" ), sessionId );
14888 pSession = CSR_GET_SESSION( pMac, sessionId );
14889 if(pSession->pCurRoamProfile && csrIsConnStateDisconnected(pMac, sessionId))
14890 {
14891 if( !HAL_STATUS_SUCCESS(csrRoamJoinLastProfile(pMac, sessionId)) )
14892 {
14893 smsLog( pMac, LOGE, FL( " fail to retry the last roam profile\n" ) );
14894 }
14895 }
14896 }
14897}
Jeff Johnson295189b2012-06-20 16:38:30 -070014898eHalStatus csrRoamStartJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
14899{
14900 eHalStatus status = eHAL_STATUS_FAILURE;
14901 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14902
14903 if(pSession->pCurRoamProfile && pSession->maxRetryCount)
14904 {
14905 smsLog(pMac, LOGE, FL(" call sessionId %d retry count %d left\n "), sessionId, pSession->maxRetryCount);
14906 pSession->maxRetryCount--;
14907 pSession->joinRetryTimerInfo.pMac = pMac;
14908 pSession->joinRetryTimerInfo.sessionId = (tANI_U8)sessionId;
14909 status = palTimerStart(pMac->hHdd, pSession->hTimerJoinRetry, interval, eANI_BOOLEAN_FALSE);
14910 if(!HAL_STATUS_SUCCESS(status))
14911 {
14912 smsLog(pMac, LOGE, FL(" fail to start timer status %s \n "), status);
14913 }
14914 }
14915 else
14916 {
14917 smsLog(pMac, LOGE, FL(" not to start timer due to no profile or reach mac ret (%d)\n "),
14918 pSession->maxRetryCount);
14919 }
14920
14921 return (status);
14922}
Jeff Johnson295189b2012-06-20 16:38:30 -070014923eHalStatus csrRoamStopJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
14924{
14925 smsLog(pMac, LOGE, " csrRoamStopJoinRetryTimer \n ");
14926 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14927 {
14928 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerJoinRetry));
14929 }
14930
14931 return eHAL_STATUS_SUCCESS;
14932}
14933#endif
14934
14935
14936/*
14937 pBuf points to the beginning of the message
14938 LIM packs disassoc rsp as below,
14939 messageType - 2 bytes
14940 messageLength - 2 bytes
14941 sessionId - 1 byte
14942 transactionId - 2 bytes (tANI_U16)
14943 reasonCode - 4 bytes (sizeof(tSirResultCodes))
14944 peerMacAddr - 6 bytes
14945 The rest is conditionally defined of (WNI_POLARIS_FW_PRODUCT == AP) and not used
14946*/
14947static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp)
14948{
14949 if(pBuf && pRsp)
14950 {
14951 pBuf += 4; //skip type and length
14952 pRsp->sessionId = *pBuf++;
14953 pal_get_U16( pBuf, (tANI_U16 *)&pRsp->transactionId );
14954 pBuf += 2;
14955 pal_get_U32( pBuf, (tANI_U32 *)&pRsp->statusCode );
14956 pBuf += 4;
14957 vos_mem_copy(pRsp->peerMacAddr, pBuf, 6);
14958 }
14959}
14960
Jeff Johnsond13512a2012-07-17 11:42:19 -070014961eHalStatus csrGetDefaultCountryCodeFrmNv(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14962{
14963 static uNvTables nvTables;
14964 eHalStatus status = eHAL_STATUS_SUCCESS;
14965 VOS_STATUS vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
14966
14967 /* read the country code from NV and use it */
14968 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
14969 {
14970 palCopyMemory( pMac->hHdd, pCountry,
14971 nvTables.defaultCountryTable.countryCode,
14972 WNI_CFG_COUNTRY_CODE_LEN );
14973 return status;
14974 }
14975 else
14976 {
14977 palCopyMemory( pMac->hHdd, pCountry,
14978 "XXX",
14979 WNI_CFG_COUNTRY_CODE_LEN );
14980 status = eHAL_STATUS_FAILURE;
14981 return status;
14982 }
14983}
14984
14985eHalStatus csrGetCurrentCountryCode(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14986{
14987 palCopyMemory( pMac->hHdd, pCountry,
14988 pMac->scan.countryCode11d,
14989 WNI_CFG_COUNTRY_CODE_LEN );
14990 return eHAL_STATUS_SUCCESS;
14991}