blob: 5dacc1adba0cf5941efb0840979b989527107c68 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Masti, Narayanraddif10fd792015-12-15 15:01:01 +05302 * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
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.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**========================================================================
29
30 \file wlan_hdd_assoc.c
31 \brief WLAN Host Device Driver implementation
Shailender Karmuchia734f332013-04-19 14:02:48 -070032
Jeff Johnson295189b2012-06-20 16:38:30 -070033 ========================================================================*/
Shailender Karmuchia734f332013-04-19 14:02:48 -070034/**=========================================================================
35 EDIT HISTORY FOR FILE
36
37
38 This section contains comments describing changes made to the module.
39 Notice that changes are listed in reverse chronological order.
40
41
42 $Header:$ $DateTime: $ $Author: $
43
44
45 when who what, where, why
Jeff Johnson295189b2012-06-20 16:38:30 -070046 -------- --- --------------------------------------------------------
Shailender Karmuchia734f332013-04-19 14:02:48 -070047 05/06/09 Shailender Created module.
Jeff Johnson295189b2012-06-20 16:38:30 -070048 ==========================================================================*/
Shailender Karmuchia734f332013-04-19 14:02:48 -070049
Jeff Johnson295189b2012-06-20 16:38:30 -070050#include "wlan_hdd_includes.h"
51#include <aniGlobal.h>
52#include "dot11f.h"
53#include "wlan_nlink_common.h"
54#include "wlan_btc_svc.h"
55#include "wlan_hdd_power.h"
Konamki, Sreelakshmib9c45712015-07-29 11:48:19 +053056#include "wlan_hdd_trace.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070057#include <linux/ieee80211.h>
58#include <linux/wireless.h>
59#include <net/cfg80211.h>
60#include "wlan_hdd_cfg80211.h"
61#include "csrInsideApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070062#include "wlan_hdd_p2p.h"
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +053063#include <vos_sched.h>
Mohit Khanna698ba2a2012-12-04 15:08:18 -080064#include "wlan_hdd_tdls.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070065#include "sme_Api.h"
Sushant Kaushikba6764e2014-06-30 19:52:09 +053066#include "wlan_hdd_hostapd.h"
Mukul Sharma84f27252014-07-14 18:11:42 +053067#include "vos_utils.h"
Siddharth Bhalda0d1622015-04-24 15:47:49 +053068#include <wlan_hdd_wext.h>
Mukul Sharma84f27252014-07-14 18:11:42 +053069
Jeff Johnson295189b2012-06-20 16:38:30 -070070v_BOOL_t mibIsDot11DesiredBssTypeInfrastructure( hdd_adapter_t *pAdapter );
71
Shailender Karmuchia734f332013-04-19 14:02:48 -070072struct ether_addr
Jeff Johnson295189b2012-06-20 16:38:30 -070073{
74 u_char ether_addr_octet[6];
75};
76// These are needed to recognize WPA and RSN suite types
77#define HDD_WPA_OUI_SIZE 4
78v_U8_t ccpWpaOui00[ HDD_WPA_OUI_SIZE ] = { 0x00, 0x50, 0xf2, 0x00 };
79v_U8_t ccpWpaOui01[ HDD_WPA_OUI_SIZE ] = { 0x00, 0x50, 0xf2, 0x01 };
80v_U8_t ccpWpaOui02[ HDD_WPA_OUI_SIZE ] = { 0x00, 0x50, 0xf2, 0x02 };
81v_U8_t ccpWpaOui03[ HDD_WPA_OUI_SIZE ] = { 0x00, 0x50, 0xf2, 0x03 };
82v_U8_t ccpWpaOui04[ HDD_WPA_OUI_SIZE ] = { 0x00, 0x50, 0xf2, 0x04 };
83v_U8_t ccpWpaOui05[ HDD_WPA_OUI_SIZE ] = { 0x00, 0x50, 0xf2, 0x05 };
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080084#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -070085v_U8_t ccpWpaOui06[ HDD_WPA_OUI_SIZE ] = { 0x00, 0x40, 0x96, 0x00 }; // CCKM
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080086#endif /* FEATURE_WLAN_ESE */
Jeff Johnson295189b2012-06-20 16:38:30 -070087#define HDD_RSN_OUI_SIZE 4
88v_U8_t ccpRSNOui00[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x00 }; // group cipher
89v_U8_t ccpRSNOui01[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x01 }; // WEP-40 or RSN
90v_U8_t ccpRSNOui02[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x02 }; // TKIP or RSN-PSK
91v_U8_t ccpRSNOui03[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x03 }; // Reserved
92v_U8_t ccpRSNOui04[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x04 }; // AES-CCMP
93v_U8_t ccpRSNOui05[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x05 }; // WEP-104
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080094#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -070095v_U8_t ccpRSNOui06[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x40, 0x96, 0x00 }; // CCKM
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080096#endif /* FEATURE_WLAN_ESE */
Chet Lanctot186b5732013-03-18 10:26:30 -070097#ifdef WLAN_FEATURE_11W
98v_U8_t ccpRSNOui07[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x06 }; // RSN-PSK-SHA256
Abhishek Singhae408032014-09-25 17:22:04 +053099/* RSN-8021X-SHA256 */
100v_U8_t ccpRSNOui08[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x05 };
Chet Lanctot186b5732013-03-18 10:26:30 -0700101#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700102
Shailender Karmuchia734f332013-04-19 14:02:48 -0700103#if defined(WLAN_FEATURE_VOWIFI_11R)
Jeff Johnson295189b2012-06-20 16:38:30 -0700104// Offset where the EID-Len-IE, start.
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700105#define FT_ASSOC_RSP_IES_OFFSET 6 /* Capability(2) + AID(2) + Status Code(2)*/
106#define FT_ASSOC_REQ_IES_OFFSET 4 /* Capability(2) + LI(2) */
Jeff Johnson295189b2012-06-20 16:38:30 -0700107#endif
108
109#define BEACON_FRAME_IES_OFFSET 12
110
Chet Lanctot186b5732013-03-18 10:26:30 -0700111#ifdef WLAN_FEATURE_11W
112void hdd_indicateUnprotMgmtFrame(hdd_adapter_t *pAdapter,
113 tANI_U32 nFrameLength,
114 tANI_U8* pbFrames,
115 tANI_U8 frameType );
116#endif
117
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800118#if defined(FEATURE_WLAN_ESE) && defined(FEATURE_WLAN_ESE_UPLOAD)
Srinivas Girigowda5cecb202013-10-08 09:13:25 -0700119static void hdd_indicateTsmIe(hdd_adapter_t *pAdapter, tANI_U8 tid,
120 tANI_U8 state,
121 tANI_U16 measInterval );
122static void hdd_indicateCckmPreAuth(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo);
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800123static void hdd_indicateEseAdjApRepInd(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo);
124static void hdd_indicateEseBcnReportInd(const hdd_adapter_t *pAdapter, const tCsrRoamInfo *pRoamInfo);
Srinivas Girigowda5cecb202013-10-08 09:13:25 -0700125
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800126#endif /* FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
Srinivas Girigowda5cecb202013-10-08 09:13:25 -0700127
Gopichand Nakkala3d295922013-05-07 16:19:14 +0530128static eHalStatus hdd_RoamSetKeyCompleteHandler( hdd_adapter_t *pAdapter,
129 tCsrRoamInfo *pRoamInfo,
130 tANI_U32 roamId,
131 eRoamCmdStatus roamStatus,
132 eCsrRoamResult roamResult );
133
Madan Mohan Koyyalamudid5acbf52012-11-28 01:45:08 +0530134v_VOID_t hdd_connSetConnectionState( hdd_station_ctx_t *pHddStaCtx,
135 eConnectionState connState )
136{
137 // save the new connection state
Arun Kumar Khandavalli94a2bb02013-12-28 19:17:25 +0530138 hddLog(LOG1, FL("ConnectionState Changed from oldState:%d to State:%d"),
139 pHddStaCtx->conn_info.connState,connState);
Jeff Johnson295189b2012-06-20 16:38:30 -0700140 pHddStaCtx->conn_info.connState = connState;
141}
142
143// returns FALSE if not connected.
144// returns TRUE for the two 'connected' states (Infra Associated or IBSS Connected ).
145// returns the connection state. Can specify NULL if you dont' want to get the actual state.
146
Shailender Karmuchia734f332013-04-19 14:02:48 -0700147static inline v_BOOL_t hdd_connGetConnectionState( hdd_station_ctx_t *pHddStaCtx,
148 eConnectionState *pConnState )
Jeff Johnson295189b2012-06-20 16:38:30 -0700149{
Shailender Karmuchia734f332013-04-19 14:02:48 -0700150 v_BOOL_t fConnected;
Jeff Johnson295189b2012-06-20 16:38:30 -0700151 eConnectionState connState;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700152
Jeff Johnson295189b2012-06-20 16:38:30 -0700153 // get the connection state.
154 connState = pHddStaCtx->conn_info.connState;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700155 // Set the fConnected return variable based on the Connected State.
Jeff Johnson295189b2012-06-20 16:38:30 -0700156 if ( eConnectionState_Associated == connState ||
Shailender Karmuchi642e9812013-05-30 14:34:49 -0700157 eConnectionState_IbssConnected == connState ||
158 eConnectionState_IbssDisconnected == connState)
Jeff Johnson295189b2012-06-20 16:38:30 -0700159 {
160 fConnected = VOS_TRUE;
161 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700162 else
Jeff Johnson295189b2012-06-20 16:38:30 -0700163 {
164 fConnected = VOS_FALSE;
165 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700166
Jeff Johnson295189b2012-06-20 16:38:30 -0700167 if ( pConnState )
168 {
169 *pConnState = connState;
170 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700171
Jeff Johnson295189b2012-06-20 16:38:30 -0700172 return( fConnected );
173}
174
175v_BOOL_t hdd_connIsConnected( hdd_station_ctx_t *pHddStaCtx )
176{
177 return( hdd_connGetConnectionState( pHddStaCtx, NULL ) );
Shailender Karmuchia734f332013-04-19 14:02:48 -0700178}
Jeff Johnson295189b2012-06-20 16:38:30 -0700179
Agarwal Ashish450ffde2014-04-08 19:53:00 +0530180eCsrBand hdd_connGetConnectedBand( hdd_station_ctx_t *pHddStaCtx )
181{
182 v_U8_t staChannel = 0;
183
184 if ( eConnectionState_Associated == pHddStaCtx->conn_info.connState )
185 {
186 staChannel = pHddStaCtx->conn_info.operationChannel;
187 }
188
189 if ( staChannel > 0 && staChannel < 14 )
190 return eCSR_BAND_24;
191 else if (staChannel >= 36 && staChannel <= 165 )
192 return eCSR_BAND_5G;
193 else /* If station is not connected return as eCSR_BAND_ALL */
194 return eCSR_BAND_ALL;
195}
196
197
Jeff Johnson295189b2012-06-20 16:38:30 -0700198//TODO - Not used anyhwere. Can be removed.
199#if 0
200//
201v_BOOL_t hdd_connIsConnectedInfra( hdd_adapter_t *pAdapter )
202{
203 v_BOOL_t fConnectedInfra = FALSE;
204 eConnectionState connState;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700205
Jeff Johnson295189b2012-06-20 16:38:30 -0700206 if ( hdd_connGetConnectionState( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter), &connState ) )
Shailender Karmuchia734f332013-04-19 14:02:48 -0700207 {
208 if ( eConnectionState_Associated == connState )
Jeff Johnson295189b2012-06-20 16:38:30 -0700209 {
210 fConnectedInfra = TRUE;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700211 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700212 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700213
Jeff Johnson295189b2012-06-20 16:38:30 -0700214 return( fConnectedInfra );
215}
216#endif
Shailender Karmuchia734f332013-04-19 14:02:48 -0700217
Jeff Johnson295189b2012-06-20 16:38:30 -0700218static inline v_BOOL_t hdd_connGetConnectedCipherAlgo( hdd_station_ctx_t *pHddStaCtx, eCsrEncryptionType *pConnectedCipherAlgo )
219{
220 v_BOOL_t fConnected = VOS_FALSE;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700221
Jeff Johnson295189b2012-06-20 16:38:30 -0700222 fConnected = hdd_connGetConnectionState( pHddStaCtx, NULL );
Shailender Karmuchia734f332013-04-19 14:02:48 -0700223
224 if ( pConnectedCipherAlgo )
Jeff Johnson295189b2012-06-20 16:38:30 -0700225 {
226 *pConnectedCipherAlgo = pHddStaCtx->conn_info.ucEncryptionType;
227 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700228
Jeff Johnson295189b2012-06-20 16:38:30 -0700229 return( fConnected );
230}
Shailender Karmuchia734f332013-04-19 14:02:48 -0700231
Jeff Johnson295189b2012-06-20 16:38:30 -0700232inline v_BOOL_t hdd_connGetConnectedBssType( hdd_station_ctx_t *pHddStaCtx, eMib_dot11DesiredBssType *pConnectedBssType )
233{
234 v_BOOL_t fConnected = VOS_FALSE;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700235
Jeff Johnson295189b2012-06-20 16:38:30 -0700236 fConnected = hdd_connGetConnectionState( pHddStaCtx, NULL );
Shailender Karmuchia734f332013-04-19 14:02:48 -0700237
238 if ( pConnectedBssType )
Jeff Johnson295189b2012-06-20 16:38:30 -0700239 {
240 *pConnectedBssType = pHddStaCtx->conn_info.connDot11DesiredBssType;
241 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700242
Jeff Johnson295189b2012-06-20 16:38:30 -0700243 return( fConnected );
244}
245
246static inline void hdd_connSaveConnectedBssType( hdd_station_ctx_t *pHddStaCtx, eCsrRoamBssType csrRoamBssType )
247{
Shailender Karmuchia734f332013-04-19 14:02:48 -0700248 switch( csrRoamBssType )
Jeff Johnson295189b2012-06-20 16:38:30 -0700249 {
250 case eCSR_BSS_TYPE_INFRASTRUCTURE:
251 pHddStaCtx->conn_info.connDot11DesiredBssType = eMib_dot11DesiredBssType_infrastructure;
252 break;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700253
Jeff Johnson295189b2012-06-20 16:38:30 -0700254 case eCSR_BSS_TYPE_IBSS:
255 case eCSR_BSS_TYPE_START_IBSS:
256 pHddStaCtx->conn_info.connDot11DesiredBssType = eMib_dot11DesiredBssType_independent;
257 break;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700258
259 /** We will never set the BssType to 'any' when attempting a connection
Jeff Johnson295189b2012-06-20 16:38:30 -0700260 so CSR should never send this back to us.*/
Shailender Karmuchia734f332013-04-19 14:02:48 -0700261 case eCSR_BSS_TYPE_ANY:
Jeff Johnson295189b2012-06-20 16:38:30 -0700262 default:
263 VOS_ASSERT( 0 );
Shailender Karmuchia734f332013-04-19 14:02:48 -0700264 break;
265 }
266
Jeff Johnson295189b2012-06-20 16:38:30 -0700267}
268
269void hdd_connSaveConnectInfo( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo, eCsrRoamBssType eBssType )
270{
271 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
272 eCsrEncryptionType encryptType = eCSR_ENCRYPT_TYPE_NONE;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700273
Jeff Johnson295189b2012-06-20 16:38:30 -0700274 VOS_ASSERT( pRoamInfo );
Shailender Karmuchia734f332013-04-19 14:02:48 -0700275
276 if ( pRoamInfo )
Jeff Johnson295189b2012-06-20 16:38:30 -0700277 {
Shailender Karmuchia734f332013-04-19 14:02:48 -0700278 // Save the BSSID for the connection...
Jeff Johnson295189b2012-06-20 16:38:30 -0700279 if ( eCSR_BSS_TYPE_INFRASTRUCTURE == eBssType )
280 {
281 VOS_ASSERT( pRoamInfo->pBssDesc );
282 vos_mem_copy(pHddStaCtx->conn_info.bssId, pRoamInfo->bssid,6 );
283
284 // Save the Station ID for this station from the 'Roam Info'.
285 //For IBSS mode, staId is assigned in NEW_PEER_IND
286 //For reassoc, the staID doesn't change and it may be invalid in this structure
287 //so no change here.
288 if( !pRoamInfo->fReassocReq )
289 {
290 pHddStaCtx->conn_info.staId [0]= pRoamInfo->staId;
291 }
292 }
293 else if ( eCSR_BSS_TYPE_IBSS == eBssType )
Shailender Karmuchia734f332013-04-19 14:02:48 -0700294 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700295 vos_mem_copy(pHddStaCtx->conn_info.bssId, pRoamInfo->bssid,sizeof(pRoamInfo->bssid) );
Shailender Karmuchia734f332013-04-19 14:02:48 -0700296 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700297 else
298 {
299 // can't happen. We need a valid IBSS or Infra setting in the BSSDescription
300 // or we can't function.
301 VOS_ASSERT( 0 );
302 }
303
304 // notify WMM
305 hdd_wmm_connect(pAdapter, pRoamInfo, eBssType);
306
307 if( !pRoamInfo->u.pConnectedProfile )
308 {
309 VOS_ASSERT( pRoamInfo->u.pConnectedProfile );
310 }
311 else
312 {
313 // Get Multicast Encryption Type
314 encryptType = pRoamInfo->u.pConnectedProfile->mcEncryptionType;
315 pHddStaCtx->conn_info.mcEncryptionType = encryptType;
316 // Get Unicast Encrytion Type
317 encryptType = pRoamInfo->u.pConnectedProfile->EncryptionType;
318 pHddStaCtx->conn_info.ucEncryptionType = encryptType;
319
320 pHddStaCtx->conn_info.authType = pRoamInfo->u.pConnectedProfile->AuthType;
321
322 pHddStaCtx->conn_info.operationChannel = pRoamInfo->u.pConnectedProfile->operationChannel;
323
324 // Save the ssid for the connection
325 vos_mem_copy( &pHddStaCtx->conn_info.SSID.SSID, &pRoamInfo->u.pConnectedProfile->SSID, sizeof( tSirMacSSid ) );
Gopichand Nakkaladacbcb52013-04-18 16:41:54 +0530326
327 // Save dot11mode in which STA associated to AP
328 pHddStaCtx->conn_info.dot11Mode = pRoamInfo->u.pConnectedProfile->dot11Mode;
Deepthi Gowriae6a1662015-10-12 12:59:37 +0530329
330 pHddStaCtx->conn_info.rate_flags = pRoamInfo->maxRateFlags;
Jeff Johnson295189b2012-06-20 16:38:30 -0700331 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700332 }
333
Jeff Johnson295189b2012-06-20 16:38:30 -0700334 // save the connected BssType
Shailender Karmuchia734f332013-04-19 14:02:48 -0700335 hdd_connSaveConnectedBssType( pHddStaCtx, eBssType );
336
Jeff Johnson295189b2012-06-20 16:38:30 -0700337}
338
339#if defined(WLAN_FEATURE_VOWIFI_11R)
340/*
341 * Send the 11R key information to the supplicant.
342 * Only then can the supplicant generate the PMK-R1.
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800343 * (BTW, the ESE supplicant also needs the Assoc Resp IEs
Jeff Johnson295189b2012-06-20 16:38:30 -0700344 * for the same purpose.)
345 *
346 * Mainly the Assoc Rsp IEs are passed here. For the IMDA
347 * this contains the R1KHID, R0KHID and the MDID.
348 * For FT, this consists of the Reassoc Rsp FTIEs.
349 * This is the Assoc Response.
350 */
Shailender Karmuchia734f332013-04-19 14:02:48 -0700351static void hdd_SendFTAssocResponse(struct net_device *dev, hdd_adapter_t *pAdapter,
Jeff Johnson295189b2012-06-20 16:38:30 -0700352 tCsrRoamInfo *pCsrRoamInfo)
353{
354 union iwreq_data wrqu;
355 char *buff;
356 unsigned int len = 0;
357 u8 *pFTAssocRsp = NULL;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700358
359 if (pCsrRoamInfo->nAssocRspLength == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -0700360 {
361 hddLog(LOGE,
362 "%s: pCsrRoamInfo->nAssocRspLength=%d",
363 __func__, (int)pCsrRoamInfo->nAssocRspLength);
364 return;
365 }
366
Shailender Karmuchia734f332013-04-19 14:02:48 -0700367 pFTAssocRsp = (u8 *)(pCsrRoamInfo->pbFrames + pCsrRoamInfo->nBeaconLength +
Jeff Johnson295189b2012-06-20 16:38:30 -0700368 pCsrRoamInfo->nAssocReqLength);
Shailender Karmuchia734f332013-04-19 14:02:48 -0700369 if (pFTAssocRsp == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -0700370 {
Shailender Karmuchia734f332013-04-19 14:02:48 -0700371 hddLog(LOGE, "%s: AssocReq or AssocRsp is NULL", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700372 return;
373 }
374
375 // pFTAssocRsp needs to point to the IEs
376 pFTAssocRsp += FT_ASSOC_RSP_IES_OFFSET;
377 hddLog(LOG1, "%s: AssocRsp is now at %02x%02x", __func__,
378 (unsigned int)pFTAssocRsp[0],
379 (unsigned int)pFTAssocRsp[1]);
380
381 // We need to send the IEs to the supplicant.
382 buff = kmalloc(IW_GENERIC_IE_MAX, GFP_ATOMIC);
Shailender Karmuchia734f332013-04-19 14:02:48 -0700383 if (buff == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -0700384 {
Shailender Karmuchia734f332013-04-19 14:02:48 -0700385 hddLog(LOGE, "%s: kmalloc unable to allocate memory", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700386 return;
387 }
388
389 // Send the Assoc Resp, the supplicant needs this for initial Auth.
390 len = pCsrRoamInfo->nAssocRspLength - FT_ASSOC_RSP_IES_OFFSET;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700391 wrqu.data.length = len;
Jeff Johnson295189b2012-06-20 16:38:30 -0700392 memset(buff, 0, IW_GENERIC_IE_MAX);
Shailender Karmuchia734f332013-04-19 14:02:48 -0700393 memcpy(buff, pFTAssocRsp, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700394 wireless_send_event(dev, IWEVASSOCRESPIE, &wrqu, buff);
395
396 kfree(buff);
397}
Shailender Karmuchia734f332013-04-19 14:02:48 -0700398#endif /* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -0700399
400#ifdef WLAN_FEATURE_VOWIFI_11R
401
402/*---------------------------------------------------
403 *
404 * Send the FTIEs, RIC IEs during FT. This is eventually
405 * used to send the FT events to the supplicant
406 *
407 * At the reception of Auth2 we send the RIC followed
408 * by the auth response IEs to the supplicant.
409 * Once both are received in the supplicant, an FT
410 * event is generated to the supplicant.
411 *
412 *---------------------------------------------------
413 */
414void hdd_SendFTEvent(hdd_adapter_t *pAdapter)
415{
Jeff Johnson295189b2012-06-20 16:38:30 -0700416 tANI_U16 auth_resp_len = 0;
417 tANI_U32 ric_ies_length = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700418 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
419
Gopichand Nakkala66923aa2013-03-06 23:17:24 +0530420#if defined(KERNEL_SUPPORT_11R_CFG80211)
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700421 struct cfg80211_ft_event_params ftEvent;
422 v_U8_t ftIe[DOT11F_IE_FTINFO_MAX_LEN];
423 v_U8_t ricIe[DOT11F_IE_RICDESCRIPTOR_MAX_LEN];
424 struct net_device *dev = pAdapter->dev;
425#else
426 char *buff;
427 union iwreq_data wrqu;
428 tANI_U16 str_len;
429#endif
430
Gopichand Nakkala66923aa2013-03-06 23:17:24 +0530431#if defined(KERNEL_SUPPORT_11R_CFG80211)
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530432 vos_mem_zero(ftIe, DOT11F_IE_FTINFO_MAX_LEN);
433 vos_mem_zero(ricIe, DOT11F_IE_RICDESCRIPTOR_MAX_LEN);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700434
Kanchanapally, Vidyullatha31b8d142015-01-30 14:25:18 +0530435 sme_GetRICIEs(pHddCtx->hHal, (u8 *)ricIe,
436 DOT11F_IE_RICDESCRIPTOR_MAX_LEN, &ric_ies_length );
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530437 if (ric_ies_length == 0)
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700438 {
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530439 hddLog(LOGW,
440 "%s: RIC IEs is of length 0 not sending RIC Information for now",
441 __func__);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700442 }
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700443
444 ftEvent.ric_ies = ricIe;
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530445 ftEvent.ric_ies_len = ric_ies_length;
446 hddLog(LOG1, "%s: RIC IEs is of length %d", __func__, (int)ric_ies_length);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700447
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530448 sme_GetFTPreAuthResponse(pHddCtx->hHal, (u8 *)ftIe,
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -0800449 DOT11F_IE_FTINFO_MAX_LEN, &auth_resp_len);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700450
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530451 if (auth_resp_len == 0)
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700452 {
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530453 hddLog(LOGE, "%s: AuthRsp FTIES is of length 0", __func__);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700454 return;
455 }
456
Gopichand Nakkala3d295922013-05-07 16:19:14 +0530457 sme_SetFTPreAuthState(pHddCtx->hHal, TRUE);
Gopichand Nakkala356fb102013-03-06 12:34:04 +0530458
Gopichand Nakkala3d295922013-05-07 16:19:14 +0530459 ftEvent.target_ap = ftIe;
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700460
461 ftEvent.ies = (u8 *)(ftIe + SIR_MAC_ADDR_LENGTH);
462 ftEvent.ies_len = auth_resp_len - SIR_MAC_ADDR_LENGTH;
463
Jeff Johnson59a121e2013-11-30 09:46:08 -0800464 hddLog(LOG1, "%s ftEvent.ies_len %zu", __FUNCTION__, ftEvent.ies_len);
465 hddLog(LOG1, "%s ftEvent.ric_ies_len %zu",
466 __FUNCTION__, ftEvent.ric_ies_len );
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530467 hddLog(LOG1, "%s ftEvent.target_ap %2x-%2x-%2x-%2x-%2x-%2x ",
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -0800468 __FUNCTION__, ftEvent.target_ap[0], ftEvent.target_ap[1],
469 ftEvent.target_ap[2], ftEvent.target_ap[3], ftEvent.target_ap[4],
470 ftEvent.target_ap[5]);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700471
Gopichand Nakkala356fb102013-03-06 12:34:04 +0530472 (void)cfg80211_ft_event(dev, &ftEvent);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700473
474#else
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530475 // We need to send the IEs to the supplicant
Jeff Johnson295189b2012-06-20 16:38:30 -0700476 buff = kmalloc(IW_CUSTOM_MAX, GFP_ATOMIC);
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530477 if (buff == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -0700478 {
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530479 hddLog(LOGE, "%s: kmalloc unable to allocate memory", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700480 return;
481 }
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530482 vos_mem_zero(buff, IW_CUSTOM_MAX);
Jeff Johnson295189b2012-06-20 16:38:30 -0700483
Shailender Karmuchia734f332013-04-19 14:02:48 -0700484 // Sme needs to send the RIC IEs first
Jeff Johnson295189b2012-06-20 16:38:30 -0700485 str_len = strlcpy(buff, "RIC=", IW_CUSTOM_MAX);
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530486 sme_GetRICIEs( pHddCtx->hHal, (u8 *)&(buff[str_len]),
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -0800487 (IW_CUSTOM_MAX - str_len), &ric_ies_length );
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530488 if (ric_ies_length == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -0700489 {
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530490 hddLog(LOGW,
491 "%s: RIC IEs is of length 0 not sending RIC Information for now",
492 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700493 }
494 else
495 {
496 wrqu.data.length = str_len + ric_ies_length;
497 wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buff);
498 }
499
500 // Sme needs to provide the Auth Resp
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530501 vos_mem_zero(buff, IW_CUSTOM_MAX);
Jeff Johnson295189b2012-06-20 16:38:30 -0700502 str_len = strlcpy(buff, "AUTH=", IW_CUSTOM_MAX);
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530503 sme_GetFTPreAuthResponse(pHddCtx->hHal, (u8 *)&buff[str_len],
504 (IW_CUSTOM_MAX - str_len), &auth_resp_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700505
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530506 if (auth_resp_len == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -0700507 {
Gopichand Nakkalad7d13652013-02-15 01:48:00 +0530508 hddLog(LOGE, "%s: AuthRsp FTIES is of length 0", __func__);
Bhargav Shah8b5b2f72015-07-14 11:53:46 +0530509 kfree(buff);
Jeff Johnson295189b2012-06-20 16:38:30 -0700510 return;
511 }
512
513 wrqu.data.length = str_len + auth_resp_len;
514 wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buff);
515
516 kfree(buff);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -0700517#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700518}
519
520#endif /* WLAN_FEATURE_VOWIFI_11R */
521
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800522#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -0700523
524/*
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800525 * Send the ESE required "new AP Channel info" to the supplicant.
Jeff Johnson295189b2012-06-20 16:38:30 -0700526 * (This keeps the supplicant "up to date" on the current channel.)
527 *
528 * The current (new AP) channel information is passed in.
529 */
Shailender Karmuchia734f332013-04-19 14:02:48 -0700530static void hdd_SendNewAPChannelInfo(struct net_device *dev, hdd_adapter_t *pAdapter,
Jeff Johnson295189b2012-06-20 16:38:30 -0700531 tCsrRoamInfo *pCsrRoamInfo)
532{
533 union iwreq_data wrqu;
534 tSirBssDescription *descriptor = pCsrRoamInfo->pBssDesc;
Jeff Johnson295189b2012-06-20 16:38:30 -0700535
Shailender Karmuchia734f332013-04-19 14:02:48 -0700536
537 if (descriptor == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -0700538 {
539 hddLog(LOGE,
Arif Hussain6d2a3322013-11-17 19:50:10 -0800540 "%s: pCsrRoamInfo->pBssDesc=%p",
Jeff Johnson295189b2012-06-20 16:38:30 -0700541 __func__, descriptor);
542 return;
543 }
544
545 // Send the Channel event, the supplicant needs this to generate the Adjacent AP report.
Arif Hussain6d2a3322013-11-17 19:50:10 -0800546 hddLog(LOGW, "%s: Sending up an SIOCGIWFREQ, channelId=%d", __func__, descriptor->channelId);
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 memset(&wrqu, '\0', sizeof(wrqu));
548 wrqu.freq.m = descriptor->channelId;
549 wrqu.freq.e = 0;
550 wrqu.freq.i = 0;
551 wireless_send_event(pAdapter->dev, SIOCGIWFREQ, &wrqu, NULL);
552}
553
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800554#endif /* FEATURE_WLAN_ESE */
Jeff Johnson295189b2012-06-20 16:38:30 -0700555
556void hdd_SendUpdateBeaconIEsEvent(hdd_adapter_t *pAdapter, tCsrRoamInfo *pCsrRoamInfo)
557{
558 union iwreq_data wrqu;
559 u8 *pBeaconIes;
560 u8 currentLen = 0;
561 char *buff;
562 int totalIeLen = 0, currentOffset = 0, strLen;
563
564 memset(&wrqu, '\0', sizeof(wrqu));
565
566 if (0 == pCsrRoamInfo->nBeaconLength)
567 {
568 hddLog(LOGE, "%s: pCsrRoamInfo->nBeaconFrameLength = 0", __func__);
569 return;
570 }
571 pBeaconIes = (u8 *)(pCsrRoamInfo->pbFrames + BEACON_FRAME_IES_OFFSET);
Shailender Karmuchia734f332013-04-19 14:02:48 -0700572 if (pBeaconIes == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -0700573 {
Shailender Karmuchia734f332013-04-19 14:02:48 -0700574 hddLog(LOGE, "%s: Beacon IEs is NULL", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700575 return;
576 }
577
578 // pBeaconIes needs to point to the IEs
579 hddLog(LOG1, "%s: Beacon IEs is now at %02x%02x", __func__,
580 (unsigned int)pBeaconIes[0],
581 (unsigned int)pBeaconIes[1]);
582 hddLog(LOG1, "%s: Beacon IEs length = %d", __func__, pCsrRoamInfo->nBeaconLength - BEACON_FRAME_IES_OFFSET);
Shailender Karmuchia734f332013-04-19 14:02:48 -0700583
Jeff Johnson295189b2012-06-20 16:38:30 -0700584 // We need to send the IEs to the supplicant.
585 buff = kmalloc(IW_CUSTOM_MAX, GFP_ATOMIC);
Shailender Karmuchia734f332013-04-19 14:02:48 -0700586 if (buff == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -0700587 {
Shailender Karmuchia734f332013-04-19 14:02:48 -0700588 hddLog(LOGE, "%s: kmalloc unable to allocate memory", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 return;
590 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700591 vos_mem_zero(buff, IW_CUSTOM_MAX);
Jeff Johnson295189b2012-06-20 16:38:30 -0700592
593 strLen = strlcpy(buff,"BEACONIEs=", IW_CUSTOM_MAX);
594 currentLen = strLen + 1;
595
596 totalIeLen = pCsrRoamInfo->nBeaconLength - BEACON_FRAME_IES_OFFSET;
597 do
598 {
Shailender Karmuchia734f332013-04-19 14:02:48 -0700599 /* If the beacon size exceeds max CUSTOM event size, break it into chunks of CUSTOM event
Jeff Johnson295189b2012-06-20 16:38:30 -0700600 * max size and send it to supplicant. Changes are done in supplicant to handle this */
601 vos_mem_zero(&buff[strLen + 1], IW_CUSTOM_MAX - (strLen + 1));
602 currentLen = VOS_MIN(totalIeLen, IW_CUSTOM_MAX - (strLen + 1) - 1);
603 vos_mem_copy(&buff[strLen + 1], pBeaconIes+currentOffset, currentLen);
604 currentOffset += currentLen;
605 totalIeLen -= currentLen;
606 wrqu.data.length = strLen + 1 + currentLen;
607 if (totalIeLen)
Shailender Karmuchia734f332013-04-19 14:02:48 -0700608 buff[strLen] = 1; // This tells supplicant more chunks are pending
Jeff Johnson295189b2012-06-20 16:38:30 -0700609 else
610 buff[strLen] = 0; // For last chunk of beacon IE to supplicant
611
612 hddLog(LOG1, "%s: Beacon IEs length to supplicant = %d", __func__, currentLen);
613 wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buff);
614 } while (totalIeLen > 0);
615
616 kfree(buff);
617}
618
619static void hdd_SendAssociationEvent(struct net_device *dev,tCsrRoamInfo *pCsrRoamInfo)
620{
621 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
622 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
623 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
624 union iwreq_data wrqu;
625 int we_event;
626 char *msg;
627 int type = -1;
628
Shailender Karmuchia734f332013-04-19 14:02:48 -0700629#if defined (WLAN_FEATURE_VOWIFI_11R)
630 // Added to find the auth type on the fly at run time
631 // rather than with cfg to see if FT is enabled
632 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Jeff Johnson295189b2012-06-20 16:38:30 -0700633 tCsrRoamProfile* pRoamProfile = &(pWextState->roamProfile);
634#endif
Shailender Karmuchia734f332013-04-19 14:02:48 -0700635
Jeff Johnson295189b2012-06-20 16:38:30 -0700636 memset(&wrqu, '\0', sizeof(wrqu));
Shailender Karmuchia734f332013-04-19 14:02:48 -0700637 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
Jeff Johnson295189b2012-06-20 16:38:30 -0700638 we_event = SIOCGIWAP;
Shailender Karmuchia734f332013-04-19 14:02:48 -0700639
Jeff Johnson295189b2012-06-20 16:38:30 -0700640 if(eConnectionState_Associated == pHddStaCtx->conn_info.connState)/* Associated */
641 {
Agarwal Ashish51325b52014-06-16 16:50:49 +0530642 /* In case of roaming ; We are not doing disconnect.
643 * If disconnect is not being done for roam; We will not
644 * decrease count for Active sessions. We should not increase active
645 * active session in case of roaming.
646 */
Padma, Santhosh Kumar87ba40f2014-11-26 19:40:15 +0530647 if((pHddStaCtx->ft_carrier_on == FALSE) && !pCsrRoamInfo->fReassocReq)
Agarwal Ashish51325b52014-06-16 16:50:49 +0530648 {
649 wlan_hdd_incr_active_session(pHddCtx, pAdapter->device_mode);
650 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700651 memcpy(wrqu.ap_addr.sa_data, pCsrRoamInfo->pBssDesc->bssId, sizeof(pCsrRoamInfo->pBssDesc->bssId));
652 type = WLAN_STA_ASSOC_DONE_IND;
653
Madan Mohan Koyyalamudi26bd7142012-10-30 18:14:19 -0700654#ifdef WLAN_FEATURE_P2P_DEBUG
655 if(pAdapter->device_mode == WLAN_HDD_P2P_CLIENT)
656 {
657 if(globalP2PConnectionStatus == P2P_CLIENT_CONNECTING_STATE_1)
658 {
659 globalP2PConnectionStatus = P2P_CLIENT_CONNECTED_STATE_1;
660 hddLog(VOS_TRACE_LEVEL_ERROR,"[P2P State] Changing state from "
661 "Connecting state to Connected State for 8-way "
662 "Handshake");
663 }
664 else if(globalP2PConnectionStatus == P2P_CLIENT_CONNECTING_STATE_2)
665 {
666 globalP2PConnectionStatus = P2P_CLIENT_COMPLETED_STATE;
667 hddLog(VOS_TRACE_LEVEL_ERROR,"[P2P State] Changing state from "
668 "Connecting state to P2P Client Connection Completed");
669 }
670 }
671#endif
Sushant Kaushikdc3184b2015-10-09 12:00:21 +0530672 hddLog(VOS_TRACE_LEVEL_ERROR, MAC_ADDRESS_STR " connected to "
673 MAC_ADDRESS_STR,
Arif Hussain77d044f2014-01-03 19:56:04 -0800674 MAC_ADDR_ARRAY(pAdapter->macAddressCurrent.bytes),
Kiet Lam34947452014-01-21 23:23:40 -0800675 MAC_ADDR_ARRAY(wrqu.ap_addr.sa_data));
Jeff Johnson295189b2012-06-20 16:38:30 -0700676 hdd_SendUpdateBeaconIEsEvent(pAdapter, pCsrRoamInfo);
677
Bhargav Shahd0715912015-10-01 18:17:37 +0530678 hdd_manage_delack_timer(pHddCtx);
679
Jeff Johnson295189b2012-06-20 16:38:30 -0700680 /* Send IWEVASSOCRESPIE Event if WLAN_FEATURE_CIQ_METRICS is Enabled Or
681 * Send IWEVASSOCRESPIE Event if WLAN_FEATURE_VOWIFI_11R is Enabled
682 * and fFTEnable is TRUE */
683#ifdef WLAN_FEATURE_VOWIFI_11R
684 // Send FT Keys to the supplicant when FT is enabled
685 if ((pRoamProfile->AuthType.authType[0] == eCSR_AUTH_TYPE_FT_RSN_PSK) ||
Shailender Karmuchia734f332013-04-19 14:02:48 -0700686 (pRoamProfile->AuthType.authType[0] == eCSR_AUTH_TYPE_FT_RSN)
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800687#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -0700688 || (pRoamProfile->AuthType.authType[0] == eCSR_AUTH_TYPE_CCKM_RSN) ||
689 (pRoamProfile->AuthType.authType[0] == eCSR_AUTH_TYPE_CCKM_WPA)
690#endif
691 )
692 {
693 hdd_SendFTAssocResponse(dev, pAdapter, pCsrRoamInfo);
694 }
695#endif
696 }
697 else if (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState) // IBss Associated
698 {
Agarwal Ashish51325b52014-06-16 16:50:49 +0530699 wlan_hdd_incr_active_session(pHddCtx, pAdapter->device_mode);
Jeff Johnson4416a782013-03-25 14:17:50 -0700700 memcpy(wrqu.ap_addr.sa_data, pHddStaCtx->conn_info.bssId, ETH_ALEN);
Jeff Johnson295189b2012-06-20 16:38:30 -0700701 type = WLAN_STA_ASSOC_DONE_IND;
Deepthi Gowric7591cc2015-12-28 15:43:17 +0530702
703 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
704 "wlan: new IBSS connection to " MAC_ADDRESS_STR,
705 MAC_ADDR_ARRAY(pHddStaCtx->conn_info.bssId));
Jeff Johnson295189b2012-06-20 16:38:30 -0700706 }
707 else /* Not Associated */
708 {
Deepthi Gowric7591cc2015-12-28 15:43:17 +0530709 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
710 "wlan: disconnected");
Jeff Johnson295189b2012-06-20 16:38:30 -0700711 type = WLAN_STA_DISASSOC_DONE_IND;
712 memset(wrqu.ap_addr.sa_data,'\0',ETH_ALEN);
Bhargav Shahd0715912015-10-01 18:17:37 +0530713
714 hdd_manage_delack_timer(pHddCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -0700715 }
Sudhir Sattayappa Kohalli90e4c752013-03-21 14:25:04 -0700716 hdd_dump_concurrency_info(pHddCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -0700717
718 msg = NULL;
719 /*During the WLAN uninitialization,supplicant is stopped before the
720 driver so not sending the status of the connection to supplicant*/
Mihir Shete18156292014-03-11 15:38:30 +0530721 if(pHddCtx->isLoadUnloadInProgress == WLAN_HDD_NO_LOAD_UNLOAD_IN_PROGRESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700722 {
723 wireless_send_event(dev, we_event, &wrqu, msg);
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800724#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -0700725 if(eConnectionState_Associated == pHddStaCtx->conn_info.connState)/* Associated */
Shailender Karmuchia734f332013-04-19 14:02:48 -0700726 {
727 if ( (pRoamProfile->AuthType.authType[0] == eCSR_AUTH_TYPE_CCKM_RSN) ||
728 (pRoamProfile->AuthType.authType[0] == eCSR_AUTH_TYPE_CCKM_WPA) )
Jeff Johnson295189b2012-06-20 16:38:30 -0700729 hdd_SendNewAPChannelInfo(dev, pAdapter, pCsrRoamInfo);
730 }
731#endif
732 }
733 send_btc_nlink_msg(type, 0);
734}
735
736void hdd_connRemoveConnectInfo( hdd_station_ctx_t *pHddStaCtx )
737{
738 // Remove staId, bssId and peerMacAddress
739 pHddStaCtx->conn_info.staId [ 0 ] = 0;
740 vos_mem_zero( &pHddStaCtx->conn_info.bssId, sizeof( v_MACADDR_t ) );
741 vos_mem_zero( &pHddStaCtx->conn_info.peerMacAddress[ 0 ], sizeof( v_MACADDR_t ) );
742
743 // Clear all security settings
744 pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
745 pHddStaCtx->conn_info.mcEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
746 pHddStaCtx->conn_info.ucEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
747
748 vos_mem_zero( &pHddStaCtx->conn_info.Keys, sizeof( tCsrKeys ) );
Ravi Joshib58ca0d2013-10-29 09:50:23 -0700749 vos_mem_zero( &pHddStaCtx->ibss_enc_key, sizeof(tCsrRoamSetKey) );
Jeff Johnson295189b2012-06-20 16:38:30 -0700750
751 // Set not-connected state
752 pHddStaCtx->conn_info.connDot11DesiredBssType = eCSR_BSS_TYPE_ANY;
Jeff Johnson295189b2012-06-20 16:38:30 -0700753
754 vos_mem_zero( &pHddStaCtx->conn_info.SSID, sizeof( tCsrSSIDInfo ) );
755}
Katya Nigam47528772015-02-11 12:24:49 +0530756
757VOS_STATUS hdd_ibss_deinit_tx_rx_sta ( hdd_adapter_t *pAdapter, v_U8_t STAId )
758{
Katya Nigam1fd24402015-02-16 14:52:19 +0530759 v_U8_t ac;
760 /**Track whether OS TX queue has been disabled.*/
761 v_BOOL_t txSuspended[NUM_TX_QUEUES];
762 v_U8_t tlAC;
Katya Nigam47528772015-02-11 12:24:49 +0530763 v_U8_t i;
764 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
765 hdd_ibss_peer_info_t *pPeerInfo;
766
767 if( NULL == pHddStaCtx )
768 {
769 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
770 "%s: HDD station context NULL ",__func__);
771 return VOS_STATUS_E_FAILURE;
772 }
Katya Nigam1fd24402015-02-16 14:52:19 +0530773
Katya Nigam47528772015-02-11 12:24:49 +0530774 pPeerInfo = &pHddStaCtx->ibss_peer_info;
775 if (FALSE == pPeerInfo->ibssStaInfo[STAId].isUsed)
776 {
777 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_ERROR,
778 "%s: Deinit station not inited %d", __func__, STAId );
779 return VOS_STATUS_E_FAILURE;
780 }
781
782 hdd_flush_ibss_tx_queues(pAdapter, STAId);
Katya Nigam1fd24402015-02-16 14:52:19 +0530783
784 for (ac = HDD_LINUX_AC_VO; ac <= HDD_LINUX_AC_BK; ac++)
785 {
786 tlAC = hdd_QdiscAcToTlAC[ac];
787 txSuspended[ac] = pPeerInfo->ibssStaInfo[STAId].txSuspended[tlAC];
788 }
789
Katya Nigam47528772015-02-11 12:24:49 +0530790 vos_mem_zero(&pPeerInfo->ibssStaInfo[STAId], sizeof(hdd_ibss_station_info_t));
791
Katya Nigam1fd24402015-02-16 14:52:19 +0530792 /* re-init hdd list, since netdev can still open adapter until
793 * driver gets unloaded
794 */
795 for (i = 0; i < NUM_TX_QUEUES; i ++)
796 {
797 hdd_list_init(&pPeerInfo->ibssStaInfo[STAId].wmm_tx_queue[i],
798 HDD_TX_QUEUE_MAX_LEN);
799 }
800
801 for (ac = HDD_LINUX_AC_VO; ac <= HDD_LINUX_AC_BK; ac++)
802 {
803 if (txSuspended[ac])
804 {
805 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_INFO,
806 "%s: TX queue re-enabled", __func__);
807 netif_wake_subqueue(pAdapter->dev, ac);
808 }
809 }
Katya Nigam47528772015-02-11 12:24:49 +0530810 return VOS_STATUS_SUCCESS;
811}
812
813static VOS_STATUS hdd_ibss_DeregisterSTA( hdd_adapter_t *pAdapter, tANI_U8 staId )
814{
815 VOS_STATUS vosStatus;
816
817 vosStatus = WLANTL_ClearSTAClient( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext, staId );
818 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
819 {
820 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
821 "%s: WLANTL_ClearSTAClient() failed to for staID %d. "
822 "Status= %d [0x%08X]",
823 __func__, staId, vosStatus, vosStatus );
824 }
825
826 vosStatus = hdd_ibss_deinit_tx_rx_sta ( pAdapter, staId );
827 if( VOS_STATUS_E_FAILURE == vosStatus )
828 {
829 VOS_TRACE ( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_ERROR,
830 "hdd_ibss_deinit_tx_rx_sta() failed for staID %d. "
831 "Status = %d [0x%08X]",
832 staId, vosStatus, vosStatus );
833 }
834
835 return( vosStatus );
836}
837
838VOS_STATUS hdd_ibss_init_tx_rx_sta( hdd_adapter_t *pAdapter, v_U8_t STAId, v_MACADDR_t *pmacAddrSTA)
839{
840 v_U8_t i = 0;
841 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
842 hdd_ibss_peer_info_t * pPeerInfo = &pHddStaCtx->ibss_peer_info;
843
844 if (pPeerInfo->ibssStaInfo[STAId].isUsed)
845 {
846 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_ERROR,
847 "%s: Reinit station %d", __func__, STAId );
848 return VOS_STATUS_E_FAILURE;
849 }
850
851 vos_mem_zero(&pPeerInfo->ibssStaInfo[STAId], sizeof(hdd_ibss_station_info_t));
852 for (i = 0; i < NUM_TX_QUEUES; i ++)
853 {
854 hdd_list_init(&pPeerInfo->ibssStaInfo[STAId].wmm_tx_queue[i], HDD_TX_QUEUE_MAX_LEN);
855 }
856
857 pPeerInfo->ibssStaInfo[STAId].isUsed = VOS_TRUE;
858 pPeerInfo->ibssStaInfo[STAId].isDeauthInProgress = VOS_FALSE;
859 vos_copy_macaddr( &pPeerInfo->ibssStaInfo[STAId].macAddrSTA, pmacAddrSTA);
860
861 return VOS_STATUS_SUCCESS;
862}
863
864static VOS_STATUS hdd_ibss_RegisterSTA( hdd_adapter_t *pAdapter,
865 tCsrRoamInfo *pRoamInfo,
866 v_U8_t staId,
867 v_MACADDR_t *pPeerMacAddress,
868 tSirBssDescription *pBssDesc )
869{
870 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
871 WLAN_STADescType staDesc = {0};
872 eCsrEncryptionType connectedCipherAlgo;
873 v_BOOL_t fConnected;
874 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
875 hdd_ibss_peer_info_t * pPeerInfo = &pHddStaCtx->ibss_peer_info;
876 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
877
878 if ( pPeerInfo->ibssStaInfo[staId].isUsed )
879 {
880 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_INFO,
881 "clean up old entry for STA %d", staId);
882 hdd_ibss_DeregisterSTA( pAdapter, staId );
883 }
884
885 staDesc.ucSTAId = staId;
886 staDesc.wSTAType = WLAN_STA_IBSS;
887
888 // Note that for IBSS, the STA MAC address and BSSID are goign to be different where
889 // in infrastructure, they are the same (BSSID is the MAC address of the AP). So,
890 // for IBSS we have a second field to pass to TL in the STA descriptor that we don't
891 // pass when making an Infrastructure connection.
892 vos_mem_copy(staDesc.vSTAMACAddress.bytes, pPeerMacAddress->bytes,sizeof(pPeerMacAddress->bytes));
893 vos_mem_copy( staDesc.vBSSIDforIBSS.bytes, pHddStaCtx->conn_info.bssId, 6 );
894 vos_copy_macaddr( &staDesc.vSelfMACAddress, &pAdapter->macAddressCurrent );
895
896 if (hdd_wmm_is_active(pAdapter))
897 {
898 staDesc.ucQosEnabled = 1;
899 }
900 else
901 {
902 staDesc.ucQosEnabled = 0;
903 }
904 VOS_TRACE( VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_INFO,
905 "HDD SOFTAP register TL QoS_enabled=%d",
906 staDesc.ucQosEnabled );
907
908 fConnected = hdd_connGetConnectedCipherAlgo( pHddStaCtx, &connectedCipherAlgo );
909 if ( connectedCipherAlgo != eCSR_ENCRYPT_TYPE_NONE )
910 {
911 staDesc.ucProtectedFrame = 1;
912 }
913 else
914 {
915 staDesc.ucProtectedFrame = 0;
916
917 }
918
919 hdd_ibss_init_tx_rx_sta(pAdapter, staId, &staDesc.vSTAMACAddress);
920
921 // UMA is Not ready yet, Xlation will be done by TL
922 staDesc.ucSwFrameTXXlation = 1;
923 staDesc.ucSwFrameRXXlation = 1;
924 staDesc.ucAddRmvLLC = 1;
925 // Initialize signatures and state
926 staDesc.ucUcastSig = pRoamInfo->ucastSig;
927 staDesc.ucBcastSig = pRoamInfo->bcastSig;
928 staDesc.ucInitState = WLANTL_STA_AUTHENTICATED;
929
930 staDesc.ucIsReplayCheckValid = VOS_FALSE;
931
932 // Register the Station with TL.
933 vosStatus = WLANTL_RegisterSTAClient( pHddCtx->pvosContext,
934 hdd_rx_packet_cbk,
935 hdd_tx_complete_cbk,
936 hdd_ibss_tx_fetch_packet_cbk, &staDesc,
937 pBssDesc->rssi );
938 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
939 {
940 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
941 "WLANTL_RegisterSTAClient() failed to register. Status= %d [0x%08X]",
942 vosStatus, vosStatus );
943 return vosStatus;
944 }
945
946 //Timer value should be in milliseconds
947 if ( pHddCtx->cfg_ini->dynSplitscan &&
948 ( VOS_TIMER_STATE_RUNNING !=
949 vos_timer_getCurrentState(&pHddCtx->tx_rx_trafficTmr)))
950 {
951 vos_timer_start(&pHddCtx->tx_rx_trafficTmr,
952 pHddCtx->cfg_ini->trafficMntrTmrForSplitScan);
953 }
954
955 pPeerInfo->ibssStaInfo[staId].ucSTAId = staId;
956 pPeerInfo->ibssStaInfo[staId].isQosEnabled = staDesc.ucQosEnabled;
957
958 vosStatus = WLANTL_ChangeSTAState( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext, staDesc.ucSTAId,
959 WLANTL_STA_AUTHENTICATED );
960
961 pPeerInfo->ibssStaInfo[staId].tlSTAState = WLANTL_STA_AUTHENTICATED;
962 pHddStaCtx->conn_info.uIsAuthenticated = VOS_TRUE;
963
964 return( vosStatus );
965}
966
Jeff Johnson295189b2012-06-20 16:38:30 -0700967/* TODO Revist this function. and data path */
968static VOS_STATUS hdd_roamDeregisterSTA( hdd_adapter_t *pAdapter, tANI_U8 staId )
969{
970 VOS_STATUS vosStatus;
Ravi Joshif9520d62013-10-18 04:11:46 -0700971
Katya Nigam47528772015-02-11 12:24:49 +0530972 hdd_disconnect_tx_rx(pAdapter);
Ravi Joshif9520d62013-10-18 04:11:46 -0700973
Jeff Johnson295189b2012-06-20 16:38:30 -0700974 vosStatus = WLANTL_ClearSTAClient( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext, staId );
975 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
976 {
Gopichand Nakkalad786fa32013-03-20 23:48:19 +0530977 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson295189b2012-06-20 16:38:30 -0700978 "%s: WLANTL_ClearSTAClient() failed to for staID %d. "
Jeff Johnson0299d0a2013-10-30 12:37:43 -0700979 "Status= %d [0x%08X]",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700980 __func__, staId, vosStatus, vosStatus );
Jeff Johnson295189b2012-06-20 16:38:30 -0700981 }
982 return( vosStatus );
983}
984
985
986static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
987 tANI_U32 roamId, eRoamCmdStatus roamStatus,
988 eCsrRoamResult roamResult )
989{
990 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -0700991 VOS_STATUS vstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -0700992 struct net_device *dev = pAdapter->dev;
993 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
994 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
krunal soni3fc26642013-10-08 22:41:42 -0700995 v_U8_t sta_id;
Abhishek Singha6cfaa42014-06-23 13:11:07 +0530996 v_BOOL_t sendDisconInd = TRUE;
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700997
998 // Sanity check
999 if(dev == NULL)
1000 {
Agarwal Ashish971c2882013-10-30 20:11:12 +05301001 hddLog(VOS_TRACE_LEVEL_ERROR,
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001002 "%s: net_dev is released return", __func__);
1003 return eHAL_STATUS_FAILURE;
1004 }
1005
Jeff Johnson295189b2012-06-20 16:38:30 -07001006 // notify apps that we can't pass traffic anymore
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05301007 hddLog(VOS_TRACE_LEVEL_INFO, FL("Disabling queues"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001008 netif_tx_disable(dev);
1009 netif_carrier_off(dev);
Mukul Sharma09ab4bd2014-11-24 18:07:26 +05301010 //TxTimeoutCount need to reset in case of disconnect handler
1011 pAdapter->hdd_stats.hddTxRxStats.continuousTxTimeoutCount = 0;
Shailender Karmuchia734f332013-04-19 14:02:48 -07001012
Jeff Johnsone7245742012-09-05 17:12:55 -07001013 INIT_COMPLETION(pAdapter->disconnect_comp_var);
Agarwal Ashishc65b5ca2014-07-28 21:02:57 +05301014 /* If only STA mode is on */
1015 if((pHddCtx->concurrency_mode <= 1) &&
1016 (pHddCtx->no_of_open_sessions[WLAN_HDD_INFRA_STATION] <= 1))
1017 {
1018 pHddCtx->isAmpAllowed = VOS_TRUE;
1019 }
1020
Agarwal Ashish47d18112014-08-04 19:55:07 +05301021 /* Need to apply spin lock before decreasing active sessions
1022 * as there can be chance for double decrement if context switch
1023 * Calls wlan_hdd_disconnect.
1024 */
1025
1026 spin_lock_bh(&pAdapter->lock_for_active_session);
Abhishek Singh087de602015-10-21 17:18:55 +05301027
1028 /* HDD has initiated disconnect, do not send disconnect indication
Mahesh A Saptasagarb5a15142016-05-25 11:27:43 +05301029 * to kernel. Sending disconnected event to kernel for userspace
1030 * initiated disconnect will be handled by diconnect handler call
1031 * to cfg80211_disconnected
Abhishek Singh087de602015-10-21 17:18:55 +05301032 */
Mahesh A Saptasagarb5a15142016-05-25 11:27:43 +05301033 if ((eConnectionState_Disconnecting == pHddStaCtx->conn_info.connState) ||
1034 (eConnectionState_NotConnected == pHddStaCtx->conn_info.connState))
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301035 {
1036 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1037 FL(" HDD has initiated a disconnect, no need to send"
1038 " disconnect indication to kernel"));
1039 sendDisconInd = FALSE;
1040 }
Agarwal Ashishc65b5ca2014-07-28 21:02:57 +05301041 else if (eConnectionState_Associated == pHddStaCtx->conn_info.connState)
Jeff Johnson295189b2012-06-20 16:38:30 -07001042 {
Agarwal Ashishc65b5ca2014-07-28 21:02:57 +05301043 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Abhishek Singh087de602015-10-21 17:18:55 +05301044 FL("Set HDD connState to eConnectionState_Disconnecting from %d "),
Agarwal Ashish47d18112014-08-04 19:55:07 +05301045 pHddStaCtx->conn_info.connState);
Agarwal Ashishc65b5ca2014-07-28 21:02:57 +05301046 hdd_connSetConnectionState( pHddStaCtx, eConnectionState_Disconnecting );
1047 wlan_hdd_decr_active_session(pHddCtx, pAdapter->device_mode);
Jeff Johnson295189b2012-06-20 16:38:30 -07001048 }
Agarwal Ashish47d18112014-08-04 19:55:07 +05301049 spin_unlock_bh(&pAdapter->lock_for_active_session);
1050
Jeff Johnson295189b2012-06-20 16:38:30 -07001051 hdd_clearRoamProfileIe( pAdapter );
Kumar Anand82c009f2014-05-29 00:29:42 -07001052
1053 hdd_wmm_init( pAdapter );
Jeff Johnson295189b2012-06-20 16:38:30 -07001054
1055 // indicate 'disconnect' status to wpa_supplicant...
1056 hdd_SendAssociationEvent(dev,pRoamInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -07001057 /* indicate disconnected event to nl80211 */
1058 if(roamStatus != eCSR_ROAM_IBSS_LEAVE)
1059 {
1060 /*During the WLAN uninitialization,supplicant is stopped before the
1061 driver so not sending the status of the connection to supplicant*/
Mihir Shete18156292014-03-11 15:38:30 +05301062 if(pHddCtx->isLoadUnloadInProgress == WLAN_HDD_NO_LOAD_UNLOAD_IN_PROGRESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001063 {
Sushant Kaushik0b343422015-05-25 17:15:55 +05301064 if (sendDisconInd)
1065 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,
1066 "%s: sent disconnected event to nl80211",
1067 __func__);
Madan Mohan Koyyalamudi26bd7142012-10-30 18:14:19 -07001068#ifdef WLAN_FEATURE_P2P_DEBUG
1069 if(pAdapter->device_mode == WLAN_HDD_P2P_CLIENT)
1070 {
1071 if(globalP2PConnectionStatus == P2P_CLIENT_CONNECTED_STATE_1)
1072 {
1073 globalP2PConnectionStatus = P2P_CLIENT_DISCONNECTED_STATE;
1074 hddLog(VOS_TRACE_LEVEL_ERROR,"[P2P State] 8 way Handshake completed "
1075 "and moved to disconnected state");
1076 }
1077 else if(globalP2PConnectionStatus == P2P_CLIENT_COMPLETED_STATE)
1078 {
1079 globalP2PConnectionStatus = P2P_NOT_ACTIVE;
1080 hddLog(VOS_TRACE_LEVEL_ERROR,"[P2P State] P2P Client is removed "
1081 "and moved to inactive state");
1082 }
1083 }
1084#endif
Sushant Kaushikbad61892015-07-10 16:43:28 +05301085 if ((roamStatus == eCSR_ROAM_LOSTLINK) &&
1086 !pRoamInfo->reasonCode)
1087 wlan_hdd_get_frame_logs(pAdapter,
1088 WLAN_HDD_GET_FRAME_LOG_CMD_SEND_AND_CLEAR);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301089 /*Only send indication to kernel if not initiated by kernel*/
1090 if ( sendDisconInd )
Jeff Johnson295189b2012-06-20 16:38:30 -07001091 {
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301092 /* To avoid wpa_supplicant sending "HANGED" CMD to ICS UI */
1093 if ( eCSR_ROAM_LOSTLINK == roamStatus )
1094 {
Mahesh A Saptasagar9ff4bcc2016-06-01 17:17:50 +05301095 wlan_hdd_cfg80211_indicate_disconnect(dev, false,
1096 pRoamInfo->reasonCode);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301097 }
1098 else
1099 {
Mahesh A Saptasagar9ff4bcc2016-06-01 17:17:50 +05301100 wlan_hdd_cfg80211_indicate_disconnect(dev, false,
Mahesh A Saptasagarb5a15142016-05-25 11:27:43 +05301101 WLAN_REASON_UNSPECIFIED);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301102 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001103 }
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05301104
1105 if (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT)
1106 {
1107 hddLog(LOG1,
1108 FL("P2P client is getting removed and we are tryig to re-enable TDLS"));
1109 wlan_hdd_tdls_reenable(pHddCtx);
Masti, Narayanraddifdde4d02015-04-16 14:41:51 +05301110 }
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05301111
Jeff Johnson295189b2012-06-20 16:38:30 -07001112 //If the Device Mode is Station
1113 // and the P2P Client is Connected
1114 //Enable BMPS
Jeff Johnsone7245742012-09-05 17:12:55 -07001115
1116 // In case of JB, as Change-Iface may or maynot be called for p2p0
Shailender Karmuchia734f332013-04-19 14:02:48 -07001117 // Enable BMPS/IMPS in case P2P_CLIENT disconnected
Sudhir Sattayappa Kohallib1d8c3a2013-06-18 14:47:20 -07001118 if(VOS_STATUS_SUCCESS == hdd_issta_p2p_clientconnected(pHddCtx))
Jeff Johnson295189b2012-06-20 16:38:30 -07001119 {
1120 //Enable BMPS only of other Session is P2P Client
1121 hdd_context_t *pHddCtx = NULL;
Shailender Karmuchia734f332013-04-19 14:02:48 -07001122 v_CONTEXT_t pVosContext = vos_get_global_context( VOS_MODULE_ID_HDD, NULL );
Jeff Johnson295189b2012-06-20 16:38:30 -07001123
1124 if (NULL != pVosContext)
1125 {
1126 pHddCtx = vos_get_context( VOS_MODULE_ID_HDD, pVosContext);
1127
1128 if(NULL != pHddCtx)
1129 {
1130 //Only P2P Client is there Enable Bmps back
Agarwal Ashish51325b52014-06-16 16:50:49 +05301131 if((0 == pHddCtx->no_of_open_sessions[VOS_STA_SAP_MODE]) &&
1132 (0 == pHddCtx->no_of_open_sessions[VOS_P2P_GO_MODE]))
Jeff Johnson295189b2012-06-20 16:38:30 -07001133 {
Gopichand Nakkalaa2fe5b02013-06-06 16:32:28 +05301134 if (pHddCtx->hdd_wlan_suspended)
1135 {
1136 hdd_set_pwrparams(pHddCtx);
1137 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001138 hdd_enable_bmps_imps(pHddCtx);
Gopichand Nakkalaa2fe5b02013-06-06 16:32:28 +05301139 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001140 }
1141 }
1142 }
1143 }
1144 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07001145
Madan Mohan Koyyalamudi70c52d32013-08-07 14:42:16 +05301146 hdd_wmm_adapter_clear(pAdapter);
Kapil Guptae6867482016-06-26 13:31:37 +05301147 /* Clear PER based roam stats */
1148#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
1149 if (sme_IsFeatureSupportedByFW(PER_BASED_ROAMING) &&
1150 (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) &&
1151 pHddCtx->cfg_ini && pHddCtx->cfg_ini->isPERRoamEnabled &&
1152 pHddCtx->cfg_ini->isPERRoamRxPathEnabled)
1153 sme_unset_per_roam_rxconfig(pHddCtx->hHal);
1154#endif
Mukul Sharmac159c432014-01-15 15:42:46 +05301155#if defined(WLAN_FEATURE_VOWIFI_11R)
1156 sme_FTReset(WLAN_HDD_GET_HAL_CTX(pAdapter));
1157#endif
Katya Nigam63ce1772014-09-26 15:53:49 +05301158
1159 if (eCSR_ROAM_IBSS_LEAVE == roamStatus)
1160 {
Abhishek Singh06e67ba2014-12-08 17:16:33 +05301161 v_U8_t i;
1162
Katya Nigam63ce1772014-09-26 15:53:49 +05301163 sta_id = IBSS_BROADCAST_STAID;
Katya Nigam47528772015-02-11 12:24:49 +05301164 vstatus = hdd_ibss_DeregisterSTA( pAdapter, sta_id );
Katya Nigam63ce1772014-09-26 15:53:49 +05301165 if ( !VOS_IS_STATUS_SUCCESS(vstatus ) )
1166 {
1167 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Abhishek Singh06e67ba2014-12-08 17:16:33 +05301168 FL("hdd_roamDeregisterSTA() failed to for staID %d. "
1169 "Status= %d [0x%x]"),
Katya Nigam63ce1772014-09-26 15:53:49 +05301170 sta_id, status, status );
1171
1172 status = eHAL_STATUS_FAILURE;
1173 }
Katya Nigam63ce1772014-09-26 15:53:49 +05301174 pHddCtx->sta_to_adapter[sta_id] = NULL;
1175
Abhishek Singh06e67ba2014-12-08 17:16:33 +05301176 /*Clear all the peer sta register with TL.*/
1177 for (i =0; i < HDD_MAX_NUM_IBSS_STA; i++ )
1178 {
1179 if (0 != pHddStaCtx->conn_info.staId[i])
1180 {
1181 sta_id = pHddStaCtx->conn_info.staId[i];
1182
1183 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1184 FL("Deregister StaID %d"),sta_id);
Katya Nigam47528772015-02-11 12:24:49 +05301185 vstatus = hdd_ibss_DeregisterSTA( pAdapter, sta_id );
Abhishek Singh06e67ba2014-12-08 17:16:33 +05301186 if ( !VOS_IS_STATUS_SUCCESS(vstatus ) )
1187 {
1188 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1189 FL("hdd_roamDeregisterSTA() failed to for staID %d. "
1190 "Status= %d [0x%x]"),
1191 sta_id, status, status );
1192 status = eHAL_STATUS_FAILURE;
1193 }
1194
Nirav Shah7e3c8132015-06-22 23:51:42 +05301195 vstatus = hdd_sta_id_hash_remove_entry(pAdapter,
1196 sta_id, &pHddStaCtx->conn_info.peerMacAddress[i]);
1197 if (vstatus != VOS_STATUS_SUCCESS) {
1198 hddLog(VOS_TRACE_LEVEL_ERROR,
1199 FL("Not able to remove staid hash %d"),
1200 sta_id);
1201 status = eHAL_STATUS_FAILURE;
1202 } else {
1203 hddLog(VOS_TRACE_LEVEL_INFO,
1204 FL("ibss station removed sta_id %d mac:"
1205 MAC_ADDRESS_STR), sta_id,
1206 MAC_ADDR_ARRAY(pHddStaCtx->conn_info.peerMacAddress[i].bytes));
1207 }
1208
Abhishek Singh06e67ba2014-12-08 17:16:33 +05301209 /*set the staid and peer mac as 0, all other reset are
1210 * done in hdd_connRemoveConnectInfo.
1211 */
1212 pHddStaCtx->conn_info.staId[i]= 0;
1213 vos_mem_zero( &pHddStaCtx->conn_info.peerMacAddress[i], sizeof( v_MACADDR_t ) );
1214
1215 if (sta_id < (WLAN_MAX_STA_COUNT + 3))
1216 pHddCtx->sta_to_adapter[sta_id] = NULL;
1217 }
1218 }
1219
Katya Nigam63ce1772014-09-26 15:53:49 +05301220 }
Abhishek Singh06e67ba2014-12-08 17:16:33 +05301221 else
Jeff Johnson295189b2012-06-20 16:38:30 -07001222 {
Abhishek Singh06e67ba2014-12-08 17:16:33 +05301223 sta_id = pHddStaCtx->conn_info.staId[0];
1224
1225 //We should clear all sta register with TL, for now, only one.
1226 vstatus = hdd_roamDeregisterSTA( pAdapter, sta_id );
1227 if ( !VOS_IS_STATUS_SUCCESS(vstatus ) )
1228 {
1229 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1230 FL("hdd_roamDeregisterSTA() failed to for staID %d. "
1231 "Status= %d [0x%x]"),
krunal soni3fc26642013-10-08 22:41:42 -07001232 sta_id, status, status );
Jeff Johnson295189b2012-06-20 16:38:30 -07001233
Abhishek Singh06e67ba2014-12-08 17:16:33 +05301234 status = eHAL_STATUS_FAILURE;
1235 }
1236
1237 pHddCtx->sta_to_adapter[sta_id] = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001238 }
Srinivas Dasarideb7ae92014-12-19 15:26:40 +05301239
1240#ifdef WLAN_FEATURE_LINK_LAYER_STATS
1241 if (VOS_STATUS_SUCCESS !=
1242 WLANTL_ClearInterfaceStats((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
1243 pHddStaCtx->conn_info.staId[0], WIFI_STATS_IFACE_AC))
1244 {
1245 hddLog(VOS_TRACE_LEVEL_ERROR, "%s:"
1246 "WLANTL_ClearInterfaceStats Failed", __func__);
1247 }
1248 pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VO] = 0;
1249 pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_VI] = 0;
1250 pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BE] = 0;
1251 pAdapter->hdd_stats.hddTxRxStats.txMcast[WLANTL_AC_BK] = 0;
1252#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
1253
Jeff Johnson295189b2012-06-20 16:38:30 -07001254 // Clear saved connection information in HDD
1255 hdd_connRemoveConnectInfo( pHddStaCtx );
Abhishek Singhf4669da2014-05-26 15:07:49 +05301256 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1257 "%s: Set HDD connState to eConnectionState_NotConnected",
1258 __func__);
1259 hdd_connSetConnectionState( pHddStaCtx, eConnectionState_NotConnected );
Gopichand Nakkala870cbae2013-03-15 21:16:09 +05301260#ifdef WLAN_FEATURE_GTK_OFFLOAD
1261 if ((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
1262 (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode))
1263 {
Gopichand Nakkalad36ee622013-05-07 14:13:27 +05301264 memset(&pHddStaCtx->gtkOffloadReqParams, 0,
1265 sizeof (tSirGtkOffloadParams));
1266 pHddStaCtx->gtkOffloadReqParams.ulFlags = GTK_OFFLOAD_DISABLE;
Gopichand Nakkala870cbae2013-03-15 21:16:09 +05301267 }
1268#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001269
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001270#ifdef FEATURE_WLAN_TDLS
krunal soni3fc26642013-10-08 22:41:42 -07001271 if (eCSR_ROAM_IBSS_LEAVE != roamStatus)
1272 {
1273 wlan_hdd_tdls_disconnection_callback(pAdapter);
1274 }
Gopichand Nakkalac3694582013-02-13 20:51:22 -08001275#endif
1276
Jeff Johnson295189b2012-06-20 16:38:30 -07001277 //Unblock anyone waiting for disconnect to complete
1278 complete(&pAdapter->disconnect_comp_var);
1279 return( status );
1280}
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05301281
1282static void hdd_postTLPacketPendingInd(hdd_adapter_t *pAdapter,
1283 v_U8_t staId)
1284{
1285 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1286 v_SINT_t i;
1287 v_SIZE_t size;
1288 VOS_STATUS status;
1289 v_BOOL_t granted = VOS_FALSE;
1290
1291 if ((pAdapter->device_mode == WLAN_HDD_INFRA_STATION) ||
1292 (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT) ||
1293 (pAdapter->device_mode == WLAN_HDD_P2P_DEVICE))
1294 {
1295 //Indicate to TL that there is pending data if a queue is non empty
1296 for (i = WLANTL_AC_HIGH_PRIO; i>=0; --i)
1297 {
1298 size = 0;
1299 hdd_list_size(&pAdapter->wmm_tx_queue[i], &size);
1300 if (size > 0)
1301 {
1302 if (i != WLANTL_AC_HIGH_PRIO)
1303 {
1304 if (VOS_FALSE ==
1305 pAdapter->hddWmmStatus.wmmAcStatus[i].wmmAcAccessAllowed)
1306 {
1307 hdd_wmm_acquire_access(pAdapter,
1308 (WLANTL_ACEnumType)i, &granted);
1309 pAdapter->psbChanged |= (1 << i);
1310 }
1311 else
1312 granted = VOS_TRUE;
1313 }
1314
1315 if (granted || (i == WLANTL_AC_HIGH_PRIO))
1316 {
1317 status = WLANTL_STAPktPending(pHddCtx->pvosContext,
1318 staId, (WLANTL_ACEnumType)i);
1319 if (!VOS_IS_STATUS_SUCCESS(status))
1320 {
1321 VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
1322 "%s: Failure in indicating pkt to TL for QID=%d",
1323 __func__, i);
1324 }
1325 }
1326 }
1327 }
1328 }
1329}
1330
Jeff Johnson295189b2012-06-20 16:38:30 -07001331static VOS_STATUS hdd_roamRegisterSTA( hdd_adapter_t *pAdapter,
1332 tCsrRoamInfo *pRoamInfo,
1333 v_U8_t staId,
1334 v_MACADDR_t *pPeerMacAddress,
1335 tSirBssDescription *pBssDesc )
1336{
1337 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
1338 WLAN_STADescType staDesc = {0};
1339 eCsrEncryptionType connectedCipherAlgo;
1340 v_BOOL_t fConnected;
1341 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
1342 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Sudhir Sattayappa Kohalli37620692013-08-05 14:02:26 -07001343 hdd_config_t *cfg_param = pHddCtx->cfg_ini;
Shailender Karmuchia734f332013-04-19 14:02:48 -07001344
1345 if ( NULL == pBssDesc)
1346 {
1347 return VOS_STATUS_E_FAILURE;
1348 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001349 // Get the Station ID from the one saved during the assocation.
1350 staDesc.ucSTAId = staId;
1351
Katya Nigam47528772015-02-11 12:24:49 +05301352 staDesc.wSTAType = WLAN_STA_INFRA;
Shailender Karmuchia734f332013-04-19 14:02:48 -07001353
Katya Nigam47528772015-02-11 12:24:49 +05301354 // grab the bssid from the connection info in the adapter structure and hand that
1355 // over to TL when registering.
1356 vos_mem_copy( staDesc.vSTAMACAddress.bytes, pHddStaCtx->conn_info.bssId,
1357 sizeof(pHddStaCtx->conn_info.bssId) );
Shailender Karmuchia734f332013-04-19 14:02:48 -07001358
Jeff Johnson295189b2012-06-20 16:38:30 -07001359 vos_copy_macaddr( &staDesc.vSelfMACAddress, &pAdapter->macAddressCurrent );
1360
1361 // set the QoS field appropriately
1362 if (hdd_wmm_is_active(pAdapter))
1363 {
1364 staDesc.ucQosEnabled = 1;
1365 }
1366 else
1367 {
1368 staDesc.ucQosEnabled = 0;
1369 }
1370
1371 fConnected = hdd_connGetConnectedCipherAlgo( pHddStaCtx, &connectedCipherAlgo );
1372 if ( connectedCipherAlgo != eCSR_ENCRYPT_TYPE_NONE )
1373 {
1374 staDesc.ucProtectedFrame = 1;
1375 }
1376 else
1377 {
1378 staDesc.ucProtectedFrame = 0;
1379
1380 }
1381
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08001382#ifdef FEATURE_WLAN_ESE
1383 staDesc.ucIsEseSta = pRoamInfo->isESEAssoc;
1384#endif //FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07001385
1386#ifdef VOLANS_ENABLE_SW_REPLAY_CHECK
1387 /* check whether replay check is valid for the station or not */
1388 if( (eCSR_ENCRYPT_TYPE_TKIP == connectedCipherAlgo) || (eCSR_ENCRYPT_TYPE_AES == connectedCipherAlgo))
1389 {
1390 /* Encryption mode is either TKIP or AES
1391 and replay check is valid for only these
1392 two encryption modes */
1393 staDesc.ucIsReplayCheckValid = VOS_TRUE;
1394 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1395 "HDD register TL ucIsReplayCheckValid %d: Replay check is needed for station", staDesc.ucIsReplayCheckValid);
1396 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07001397
Jeff Johnson295189b2012-06-20 16:38:30 -07001398 else
1399 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07001400 /* For other encryption modes replay check is
Jeff Johnson295189b2012-06-20 16:38:30 -07001401 not needed */
Shailender Karmuchia734f332013-04-19 14:02:48 -07001402 staDesc.ucIsReplayCheckValid = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001403 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1404 "HDD register TL ucIsReplayCheckValid %d", staDesc.ucIsReplayCheckValid);
1405 }
1406#endif
1407
1408#ifdef FEATURE_WLAN_WAPI
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001409 hddLog(LOG1, "%s: WAPI STA Registered: %d", __func__, pAdapter->wapi_info.fIsWapiSta);
Jeff Johnson295189b2012-06-20 16:38:30 -07001410 if (pAdapter->wapi_info.fIsWapiSta)
1411 {
1412 staDesc.ucIsWapiSta = 1;
1413 }
1414 else
1415 {
1416 staDesc.ucIsWapiSta = 0;
1417 }
1418#endif /* FEATURE_WLAN_WAPI */
1419
1420 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
1421 "HDD register TL Sec_enabled= %d.", staDesc.ucProtectedFrame );
1422
Jeff Johnson295189b2012-06-20 16:38:30 -07001423 // UMA is Not ready yet, Xlation will be done by TL
1424 staDesc.ucSwFrameTXXlation = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07001425 staDesc.ucSwFrameRXXlation = 1;
1426 staDesc.ucAddRmvLLC = 1;
Shailender Karmuchia734f332013-04-19 14:02:48 -07001427 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "HDD register TL QoS_enabled=%d",
Jeff Johnson295189b2012-06-20 16:38:30 -07001428 staDesc.ucQosEnabled );
1429 // Initialize signatures and state
1430 staDesc.ucUcastSig = pRoamInfo->ucastSig;
1431 staDesc.ucBcastSig = pRoamInfo->bcastSig;
1432 staDesc.ucInitState = pRoamInfo->fAuthRequired ?
1433 WLANTL_STA_CONNECTED : WLANTL_STA_AUTHENTICATED;
Shailender Karmuchia734f332013-04-19 14:02:48 -07001434 // Register the Station with TL...
Tushnim Bhattacharyya39a8f182013-02-20 18:10:30 -08001435 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "%s: HDD register TL ucInitState=%d", __func__, staDesc.ucInitState );
Shailender Karmuchia734f332013-04-19 14:02:48 -07001436 vosStatus = WLANTL_RegisterSTAClient( pHddCtx->pvosContext,
1437 hdd_rx_packet_cbk,
1438 hdd_tx_complete_cbk,
Jeff Johnson295189b2012-06-20 16:38:30 -07001439 hdd_tx_fetch_packet_cbk, &staDesc,
1440 pBssDesc->rssi );
Shailender Karmuchia734f332013-04-19 14:02:48 -07001441
Jeff Johnson295189b2012-06-20 16:38:30 -07001442 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
1443 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07001444 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001445 "WLANTL_RegisterSTAClient() failed to register. Status= %d [0x%08X]",
Jeff Johnson295189b2012-06-20 16:38:30 -07001446 vosStatus, vosStatus );
Shailender Karmuchia734f332013-04-19 14:02:48 -07001447 return vosStatus;
1448 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001449
Sudhir Sattayappa Kohalli37620692013-08-05 14:02:26 -07001450 if ( cfg_param->dynSplitscan &&
1451 ( VOS_TIMER_STATE_RUNNING !=
1452 vos_timer_getCurrentState(&pHddCtx->tx_rx_trafficTmr)))
1453 {
1454 vos_timer_start(&pHddCtx->tx_rx_trafficTmr,
1455 cfg_param->trafficMntrTmrForSplitScan);
1456 }
1457
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05301458 // if (WPA), tell TL to go to 'connected' and after keys come to the driver,
1459 // then go to 'authenticated'. For all other authentication types
1460 // (those that donot require upper layer authentication) we can put
1461 // TL directly into 'authenticated' state.
Shailender Karmuchia734f332013-04-19 14:02:48 -07001462 if (staDesc.wSTAType != WLAN_STA_IBSS)
1463 VOS_ASSERT( fConnected );
1464
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05301465 if ( !pRoamInfo->fAuthRequired )
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07001466 {
1467 // Connections that do not need Upper layer auth, transition TL directly
1468 // to 'Authenticated' state.
1469 vosStatus = WLANTL_ChangeSTAState( pHddCtx->pvosContext, staDesc.ucSTAId,
1470 WLANTL_STA_AUTHENTICATED );
1471
1472 pHddStaCtx->conn_info.uIsAuthenticated = VOS_TRUE;
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05301473
1474 hdd_postTLPacketPendingInd(pAdapter, staDesc.ucSTAId);
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07001475 }
1476 else
1477 {
1478 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05301479 "ULA auth StaId= %d. Changing TL state to CONNECTED"
1480 "at Join time", pHddStaCtx->conn_info.staId[0] );
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07001481 vosStatus = WLANTL_ChangeSTAState( pHddCtx->pvosContext, staDesc.ucSTAId,
Gopichand Nakkala29149562013-05-10 21:43:41 +05301482 WLANTL_STA_CONNECTED );
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07001483 pHddStaCtx->conn_info.uIsAuthenticated = VOS_FALSE;
1484 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001485 return( vosStatus );
1486}
1487
Jeff Johnson295189b2012-06-20 16:38:30 -07001488static void hdd_SendReAssocEvent(struct net_device *dev, hdd_adapter_t *pAdapter,
1489 tCsrRoamInfo *pCsrRoamInfo, v_U8_t *reqRsnIe, tANI_U32 reqRsnLength)
1490{
1491 unsigned int len = 0;
1492 u8 *pFTAssocRsp = NULL;
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07001493 v_U8_t *rspRsnIe = kmalloc(IW_GENERIC_IE_MAX, GFP_KERNEL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001494 tANI_U32 rspRsnLength = 0;
1495 struct ieee80211_channel *chan;
1496
Agarwal Ashish51325b52014-06-16 16:50:49 +05301497 if (!rspRsnIe) {
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07001498 hddLog(LOGE, "%s: Unable to allocate RSN IE", __func__);
Madan Mohan Koyyalamudieeb56b12012-10-31 15:10:04 -07001499 return;
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07001500 }
1501
Agarwal Ashish51325b52014-06-16 16:50:49 +05301502 if (pCsrRoamInfo == NULL) {
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07001503 hddLog(LOGE, "%s: Invalid CSR roam info", __func__);
1504 goto done;
1505 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001506
Agarwal Ashish51325b52014-06-16 16:50:49 +05301507 if (pCsrRoamInfo->nAssocRspLength == 0) {
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07001508 hddLog(LOGE, "%s: Invalid assoc response length", __func__);
1509 goto done;
1510 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001511
1512 pFTAssocRsp = (u8 *)(pCsrRoamInfo->pbFrames + pCsrRoamInfo->nBeaconLength +
1513 pCsrRoamInfo->nAssocReqLength);
1514 if (pFTAssocRsp == NULL)
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07001515 goto done;
Jeff Johnson295189b2012-06-20 16:38:30 -07001516
1517 //pFTAssocRsp needs to point to the IEs
1518 pFTAssocRsp += FT_ASSOC_RSP_IES_OFFSET;
Arif Hussain6d2a3322013-11-17 19:50:10 -08001519 hddLog(LOG1, "%s: AssocRsp is now at %02x%02x", __func__,
Jeff Johnson295189b2012-06-20 16:38:30 -07001520 (unsigned int)pFTAssocRsp[0],
1521 (unsigned int)pFTAssocRsp[1]);
1522
1523 // Send the Assoc Resp, the supplicant needs this for initial Auth.
Madan Mohan Koyyalamudi1bed23d2012-11-13 10:59:48 -08001524 len = pCsrRoamInfo->nAssocRspLength - FT_ASSOC_RSP_IES_OFFSET;
Jeff Johnson295189b2012-06-20 16:38:30 -07001525 rspRsnLength = len;
Jeff Johnson295189b2012-06-20 16:38:30 -07001526 memcpy(rspRsnIe, pFTAssocRsp, len);
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07001527 memset(rspRsnIe + len, 0, IW_GENERIC_IE_MAX - len);
Jeff Johnson295189b2012-06-20 16:38:30 -07001528
1529 chan = ieee80211_get_channel(pAdapter->wdev.wiphy, (int) pCsrRoamInfo->pBssDesc->channelId);
1530 cfg80211_roamed(dev,chan,pCsrRoamInfo->bssid,
1531 reqRsnIe, reqRsnLength,
1532 rspRsnIe, rspRsnLength,GFP_KERNEL);
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07001533
1534done:
1535 kfree(rspRsnIe);
Jeff Johnson295189b2012-06-20 16:38:30 -07001536}
Jeff Johnson295189b2012-06-20 16:38:30 -07001537
Gopichand Nakkala3d295922013-05-07 16:19:14 +05301538void hdd_PerformRoamSetKeyComplete(hdd_adapter_t *pAdapter)
1539{
1540 eHalStatus halStatus = eHAL_STATUS_SUCCESS;
1541 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
1542 tCsrRoamInfo roamInfo;
1543 roamInfo.fAuthRequired = FALSE;
1544 vos_mem_copy(roamInfo.bssid,
1545 pHddStaCtx->roam_info.bssid,
1546 WNI_CFG_BSSID_LEN);
1547 vos_mem_copy(roamInfo.peerMac,
1548 pHddStaCtx->roam_info.peerMac,
1549 WNI_CFG_BSSID_LEN);
1550
1551 halStatus = hdd_RoamSetKeyCompleteHandler(pAdapter,
1552 &roamInfo,
1553 pHddStaCtx->roam_info.roamId,
1554 pHddStaCtx->roam_info.roamStatus,
1555 eCSR_ROAM_RESULT_AUTHENTICATED);
1556 if (halStatus != eHAL_STATUS_SUCCESS)
1557 {
1558 hddLog(LOGE, "%s: Set Key complete failure", __func__);
1559 }
1560 pHddStaCtx->roam_info.deferKeyComplete = FALSE;
1561}
1562
Shailender Karmuchia734f332013-04-19 14:02:48 -07001563static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
1564 tANI_U32 roamId, eRoamCmdStatus roamStatus,
Jeff Johnson295189b2012-06-20 16:38:30 -07001565 eCsrRoamResult roamResult )
1566{
1567 struct net_device *dev = pAdapter->dev;
1568 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
1569 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Sushant Kaushikba6764e2014-06-30 19:52:09 +05301570 hdd_adapter_t *pHostapdAdapter = NULL;
Girish Gowli257a7e62014-08-02 15:50:43 +05301571 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Madan Mohan Koyyalamudi2dd4c8d2012-11-08 14:44:14 -08001572 v_U8_t reqRsnIe[DOT11F_IE_RSN_MAX_LEN];
1573 tANI_U32 reqRsnLength = DOT11F_IE_RSN_MAX_LEN;
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08001574#if defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR) || defined (WLAN_FEATURE_VOWIFI_11R)
Jeff Johnson295189b2012-06-20 16:38:30 -07001575 int ft_carrier_on = FALSE;
1576#endif
1577 int status;
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301578 v_BOOL_t hddDisconInProgress = FALSE;
1579
1580 /* HDD has initiated disconnect, do not send connect result indication
1581 * to kernel as it will be handled by __cfg80211_disconnect.
1582 */
Agarwal Ashishc089cec2015-08-10 13:10:04 +05301583 if (((eConnectionState_Disconnecting == pHddStaCtx->conn_info.connState) ||
1584 (eConnectionState_NotConnected == pHddStaCtx->conn_info.connState)) &&
1585 ((eCSR_ROAM_RESULT_ASSOCIATED == roamResult) ||
1586 (eCSR_ROAM_ASSOCIATION_FAILURE == roamStatus)))
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301587 {
1588 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1589 FL(" Disconnect from HDD in progress "));
1590 hddDisconInProgress = TRUE;
1591 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07001592
Jeff Johnson295189b2012-06-20 16:38:30 -07001593 if ( eCSR_ROAM_RESULT_ASSOCIATED == roamResult )
1594 {
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301595 if ( !hddDisconInProgress )
1596 {
1597 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Abhishek Singhf4669da2014-05-26 15:07:49 +05301598 "%s: Set HDD connState to eConnectionState_Associated",
1599 __func__);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301600 hdd_connSetConnectionState( pHddStaCtx, eConnectionState_Associated );
1601 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001602
c_hpothu44ff4e02014-05-08 00:13:57 +05301603 pAdapter->maxRateFlags = pRoamInfo->maxRateFlags;
Jeff Johnson295189b2012-06-20 16:38:30 -07001604 // Save the connection info from CSR...
1605 hdd_connSaveConnectInfo( pAdapter, pRoamInfo, eCSR_BSS_TYPE_INFRASTRUCTURE );
Kapil Guptae6867482016-06-26 13:31:37 +05301606
1607#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
1608 if (sme_IsFeatureSupportedByFW(PER_BASED_ROAMING) &&
1609 (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) &&
1610 !hddDisconInProgress &&
1611 pHddCtx->cfg_ini && pHddCtx->cfg_ini->isPERRoamEnabled &&
1612 pHddCtx->cfg_ini->isPERRoamRxPathEnabled)
1613 sme_set_per_roam_rxconfig(pHddCtx->hHal,
1614 pHddStaCtx->conn_info.staId[0],
1615 pHddCtx->cfg_ini->rateDownThreshold,
1616 pHddCtx->cfg_ini->rateUpThreshold,
1617 pHddCtx->cfg_ini->PERroamTriggerPercent,
1618 pHddCtx->cfg_ini->PERroamRxPktsThreshold,
1619 pHddCtx->cfg_ini->waitPeriodForNextPERScan);
1620#endif
1621
Jeff Johnson295189b2012-06-20 16:38:30 -07001622#ifdef FEATURE_WLAN_WAPI
1623 if ( pRoamInfo->u.pConnectedProfile->AuthType == eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE ||
1624 pRoamInfo->u.pConnectedProfile->AuthType == eCSR_AUTH_TYPE_WAPI_WAI_PSK )
1625 {
1626 pAdapter->wapi_info.fIsWapiSta = 1;
1627 }
1628 else
1629 {
1630 pAdapter->wapi_info.fIsWapiSta = 0;
1631 }
1632#endif /* FEATURE_WLAN_WAPI */
1633
1634 // indicate 'connect' status to userspace
1635 hdd_SendAssociationEvent(dev,pRoamInfo);
1636
1637
Shailender Karmuchia734f332013-04-19 14:02:48 -07001638 // Initialize the Linkup event completion variable
Jeff Johnson295189b2012-06-20 16:38:30 -07001639 INIT_COMPLETION(pAdapter->linkup_event_var);
1640
1641 /*
1642 Sometimes Switching ON the Carrier is taking time to activate the device properly. Before allowing any
1643 packet to go up to the application, device activation has to be ensured for proper queue mapping by the
Shailender Karmuchia734f332013-04-19 14:02:48 -07001644 kernel. we have registered net device notifier for device change notification. With this we will come to
Jeff Johnson295189b2012-06-20 16:38:30 -07001645 know that the device is getting activated properly.
1646 */
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08001647#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Katya Nigamb130d572014-11-24 16:38:16 +05301648 if (pHddStaCtx->ft_carrier_on == FALSE && !hddDisconInProgress )
Jeff Johnson295189b2012-06-20 16:38:30 -07001649 {
1650#endif
Shailender Karmuchia734f332013-04-19 14:02:48 -07001651 // Enable Linkup Event Servicing which allows the net device notifier to set the linkup event variable
Jeff Johnson295189b2012-06-20 16:38:30 -07001652 pAdapter->isLinkUpSvcNeeded = TRUE;
1653
Shailender Karmuchia734f332013-04-19 14:02:48 -07001654 // Enable Linkup Event Servicing which allows the net device notifier to set the linkup event variable
Jeff Johnson295189b2012-06-20 16:38:30 -07001655 pAdapter->isLinkUpSvcNeeded = TRUE;
1656
1657 // Switch on the Carrier to activate the device
1658 netif_carrier_on(dev);
1659
1660 // Wait for the Link to up to ensure all the queues are set properly by the kernel
1661 status = wait_for_completion_interruptible_timeout(&pAdapter->linkup_event_var,
1662 msecs_to_jiffies(ASSOC_LINKUP_TIMEOUT));
Shailender Karmuchia734f332013-04-19 14:02:48 -07001663 if(!status)
Jeff Johnson295189b2012-06-20 16:38:30 -07001664 {
1665 hddLog(VOS_TRACE_LEVEL_WARN, "%s: Warning:ASSOC_LINKUP_TIMEOUT", __func__);
1666 }
1667
1668 // Disable Linkup Event Servicing - no more service required from the net device notifier call
1669 pAdapter->isLinkUpSvcNeeded = FALSE;
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08001670#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -07001671 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07001672 else {
Jeff Johnson295189b2012-06-20 16:38:30 -07001673 pHddStaCtx->ft_carrier_on = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001674 ft_carrier_on = TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001675 }
1676#endif
Sandeep Puligillad91dccb2014-06-18 11:51:48 +05301677 /* Check for STAID */
1678 if( (WLAN_MAX_STA_COUNT + 3) > pRoamInfo->staId )
1679 pHddCtx->sta_to_adapter[pRoamInfo->staId] = pAdapter;
1680 else
1681 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Wrong Staid: %d", __func__, pRoamInfo->staId);
Jeff Johnson295189b2012-06-20 16:38:30 -07001682
1683 //For reassoc, the station is already registered, all we need is to change the state
1684 //of the STA in TL.
1685 //If authentication is required (WPA/WPA2/DWEP), change TL to CONNECTED instead of AUTHENTICATED
Mukul Sharma5b2ff502014-11-06 14:43:50 +05301686 //pRoamInfo->fReassocReq will be set only for the reassoc to same ap
Jeff Johnson295189b2012-06-20 16:38:30 -07001687 if( !pRoamInfo->fReassocReq )
1688 {
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001689 struct cfg80211_bss *bss;
1690#ifdef WLAN_FEATURE_VOWIFI_11R
1691 u8 *pFTAssocRsp = NULL;
1692 unsigned int assocRsplen = 0;
1693 u8 *pFTAssocReq = NULL;
1694 unsigned int assocReqlen = 0;
1695 struct ieee80211_channel *chan;
1696#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001697 v_U8_t rspRsnIe[DOT11F_IE_RSN_MAX_LEN];
Jeff Johnson295189b2012-06-20 16:38:30 -07001698 tANI_U32 rspRsnLength = DOT11F_IE_RSN_MAX_LEN;
Jeff Johnson295189b2012-06-20 16:38:30 -07001699
1700 /* add bss_id to cfg80211 data base */
1701 bss = wlan_hdd_cfg80211_update_bss_db(pAdapter, pRoamInfo);
1702 if (NULL == bss)
1703 {
Abhishek Singh7ca68f32016-06-28 10:23:10 +05301704 hddLog(LOGE,
1705 FL("Not able to create BSS entry"));
Katya Nigam346d4e92014-09-02 16:16:12 +05301706 netif_carrier_off(dev);
Abhishek Singh7ca68f32016-06-28 10:23:10 +05301707 if (!hddDisconInProgress) {
1708 /*
1709 * Here driver was not able to update cfg80211 database
1710 * this can happen if connected channel is not valid,
1711 * i.e reg domain was changed during connection.
1712 * Queue disconnect for the session if disconnect is
1713 * not in progress.
1714 */
1715 hddLog(LOGE, FL("Disconnecting..."));
1716 sme_RoamDisconnect( WLAN_HDD_GET_HAL_CTX(pAdapter),
1717 pAdapter->sessionId,
1718 eCSR_DISCONNECT_REASON_UNSPECIFIED);
1719 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001720 return eHAL_STATUS_FAILURE;
1721 }
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001722#ifdef WLAN_FEATURE_VOWIFI_11R
1723 if(pRoamInfo->u.pConnectedProfile->AuthType == eCSR_AUTH_TYPE_FT_RSN ||
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001724 pRoamInfo->u.pConnectedProfile->AuthType == eCSR_AUTH_TYPE_FT_RSN_PSK )
Jeff Johnson295189b2012-06-20 16:38:30 -07001725 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001726
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001727 //Association Response
Shailender Karmuchia734f332013-04-19 14:02:48 -07001728 pFTAssocRsp = (u8 *)(pRoamInfo->pbFrames + pRoamInfo->nBeaconLength +
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001729 pRoamInfo->nAssocReqLength);
Shailender Karmuchia734f332013-04-19 14:02:48 -07001730 if (pFTAssocRsp != NULL)
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001731 {
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001732 // pFTAssocRsp needs to point to the IEs
1733 pFTAssocRsp += FT_ASSOC_RSP_IES_OFFSET;
1734 hddLog(LOG1, "%s: AssocRsp is now at %02x%02x", __func__,
1735 (unsigned int)pFTAssocRsp[0],
1736 (unsigned int)pFTAssocRsp[1]);
1737 assocRsplen = pRoamInfo->nAssocRspLength - FT_ASSOC_RSP_IES_OFFSET;
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001738 }
1739 else
1740 {
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001741 hddLog(LOGE, "%s:AssocRsp is NULL", __func__);
1742 assocRsplen = 0;
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001743 }
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001744
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001745 //Association Request
Shailender Karmuchia734f332013-04-19 14:02:48 -07001746 pFTAssocReq = (u8 *)(pRoamInfo->pbFrames +
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001747 pRoamInfo->nBeaconLength);
Shailender Karmuchia734f332013-04-19 14:02:48 -07001748 if (pFTAssocReq != NULL)
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001749 {
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001750 if(!ft_carrier_on)
1751 {
1752 // pFTAssocReq needs to point to the IEs
1753 pFTAssocReq += FT_ASSOC_REQ_IES_OFFSET;
1754 hddLog(LOG1, "%s: pFTAssocReq is now at %02x%02x", __func__,
1755 (unsigned int)pFTAssocReq[0],
1756 (unsigned int)pFTAssocReq[1]);
1757 assocReqlen = pRoamInfo->nAssocReqLength - FT_ASSOC_REQ_IES_OFFSET;
1758 }
1759 else
1760 {
1761 /* This should contain only the FTIEs */
1762 assocReqlen = pRoamInfo->nAssocReqLength;
1763 }
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001764 }
1765 else
1766 {
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001767 hddLog(LOGE, "%s:AssocReq is NULL", __func__);
1768 assocReqlen = 0;
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001769 }
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001770
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001771 if(ft_carrier_on)
1772 {
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301773 if ( !hddDisconInProgress )
1774 {
1775 hddLog(LOG1, "%s ft_carrier_on is %d, sending roamed "
Arif Hussain6d2a3322013-11-17 19:50:10 -08001776 "indication", __FUNCTION__, ft_carrier_on);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301777 chan = ieee80211_get_channel(pAdapter->wdev.wiphy,
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001778 (int)pRoamInfo->pBssDesc->channelId);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301779 hddLog(LOG1, "assocReqlen %d assocRsplen %d", assocReqlen,
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001780 assocRsplen);
Girish Gowlibf0e1ab2015-01-19 16:05:16 +05301781 if (pHddCtx->cfg_ini->gEnableRoamDelayStats)
1782 {
1783 vos_record_roam_event(e_HDD_SEND_REASSOC_RSP, NULL, 0);
1784 }
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301785 cfg80211_roamed(dev,chan, pRoamInfo->bssid,
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001786 pFTAssocReq, assocReqlen, pFTAssocRsp, assocRsplen,
1787 GFP_KERNEL);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301788 }
Gopichand Nakkala3d295922013-05-07 16:19:14 +05301789 if (sme_GetFTPTKState(WLAN_HDD_GET_HAL_CTX(pAdapter)))
1790 {
1791 sme_SetFTPTKState(WLAN_HDD_GET_HAL_CTX(pAdapter), FALSE);
1792 pRoamInfo->fAuthRequired = FALSE;
1793
1794 vos_mem_copy(pHddStaCtx->roam_info.bssid,
1795 pRoamInfo->bssid,
1796 HDD_MAC_ADDR_LEN);
1797 vos_mem_copy(pHddStaCtx->roam_info.peerMac,
1798 pRoamInfo->peerMac,
1799 HDD_MAC_ADDR_LEN);
1800 pHddStaCtx->roam_info.roamId = roamId;
1801 pHddStaCtx->roam_info.roamStatus = roamStatus;
1802 pHddStaCtx->roam_info.deferKeyComplete = TRUE;
1803 }
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001804 }
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301805 else if ( !hddDisconInProgress )
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001806 {
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001807 hddLog(LOG1, "%s ft_carrier_on is %d, sending connect "
Arif Hussain6d2a3322013-11-17 19:50:10 -08001808 "indication", __FUNCTION__, ft_carrier_on);
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001809 cfg80211_connect_result(dev, pRoamInfo->bssid,
1810 pFTAssocReq, assocReqlen,
1811 pFTAssocRsp, assocRsplen,
1812 WLAN_STATUS_SUCCESS,
1813 GFP_KERNEL);
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001814 }
1815 }
1816 else
1817#endif
1818 {
1819 /* wpa supplicant expecting WPA/RSN IE in connect result */
1820 csrRoamGetWpaRsnReqIE(WLAN_HDD_GET_HAL_CTX(pAdapter),
1821 pAdapter->sessionId,
1822 &reqRsnLength,
1823 reqRsnIe);
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001824
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001825 csrRoamGetWpaRsnRspIE(WLAN_HDD_GET_HAL_CTX(pAdapter),
1826 pAdapter->sessionId,
1827 &rspRsnLength,
1828 rspRsnIe);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301829 if ( !hddDisconInProgress )
1830 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08001831#if defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301832 if(ft_carrier_on)
Mukul Sharma84f27252014-07-14 18:11:42 +05301833 {
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301834 hdd_SendReAssocEvent(dev, pAdapter, pRoamInfo, reqRsnIe, reqRsnLength);
Girish Gowlibf0e1ab2015-01-19 16:05:16 +05301835 if (pHddCtx->cfg_ini->gEnableRoamDelayStats)
1836 {
1837 vos_record_roam_event(e_HDD_SEND_REASSOC_RSP, NULL, 0);
1838 }
Mukul Sharma84f27252014-07-14 18:11:42 +05301839 }
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301840 else
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08001841#endif /* FEATURE_WLAN_ESE */
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001842
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301843 {
1844 hddLog(VOS_TRACE_LEVEL_INFO,
Deepthi Gowri6649f6a2014-02-18 17:31:23 +05301845 "%s: sending connect indication to nl80211:"
1846 " for bssid " MAC_ADDRESS_STR
Abhishek Singhc0fccd22015-10-19 16:44:00 +05301847 " result:%d and Status:%d",
Deepthi Gowri6649f6a2014-02-18 17:31:23 +05301848 __func__, MAC_ADDR_ARRAY(pRoamInfo->bssid),
1849 roamResult, roamStatus);
1850
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301851 /* inform connect result to nl80211 */
1852 cfg80211_connect_result(dev, pRoamInfo->bssid,
Madan Mohan Koyyalamudif146b382012-11-06 18:53:10 -08001853 reqRsnIe, reqRsnLength,
1854 rspRsnIe, rspRsnLength,
1855 WLAN_STATUS_SUCCESS,
1856 GFP_KERNEL);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301857 }
Madan Mohan Koyyalamudiea773882012-11-02 13:37:21 -07001858 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001859 }
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301860 if ( !hddDisconInProgress )
1861 {
1862 cfg80211_put_bss(
Yue Maf49ba872013-08-19 12:04:25 -07001863#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0))
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301864 pHddCtx->wiphy,
Yue Maf49ba872013-08-19 12:04:25 -07001865#endif
1866 bss);
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301867 // Register the Station with TL after associated...
1868 vosStatus = hdd_roamRegisterSTA( pAdapter,
Jeff Johnson295189b2012-06-20 16:38:30 -07001869 pRoamInfo,
1870 pHddStaCtx->conn_info.staId[ 0 ],
1871 NULL,
1872 pRoamInfo->pBssDesc );
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301873 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001874 }
1875 else
1876 {
Madan Mohan Koyyalamudi2dd4c8d2012-11-08 14:44:14 -08001877 /* wpa supplicant expecting WPA/RSN IE in connect result */
1878 /* in case of reassociation also need to indicate it to supplicant */
1879 csrRoamGetWpaRsnReqIE(WLAN_HDD_GET_HAL_CTX(pAdapter),
1880 pAdapter->sessionId,
1881 &reqRsnLength,
1882 reqRsnIe);
1883
1884 hdd_SendReAssocEvent(dev, pAdapter, pRoamInfo, reqRsnIe, reqRsnLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07001885 //Reassoc successfully
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05301886 if( pRoamInfo->fAuthRequired )
1887 {
1888 vosStatus = WLANTL_ChangeSTAState( pHddCtx->pvosContext,
1889 pHddStaCtx->conn_info.staId[ 0 ],
1890 WLANTL_STA_CONNECTED );
1891 pHddStaCtx->conn_info.uIsAuthenticated = VOS_FALSE;
1892 }
1893 else
1894 {
1895 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1896 "%s: staId: %d Changing TL state to AUTHENTICATED",
1897 __func__, pHddStaCtx->conn_info.staId[ 0 ] );
1898 vosStatus = WLANTL_ChangeSTAState( pHddCtx->pvosContext,
1899 pHddStaCtx->conn_info.staId[ 0 ],
1900 WLANTL_STA_AUTHENTICATED );
1901 pHddStaCtx->conn_info.uIsAuthenticated = VOS_TRUE;
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05301902 hdd_postTLPacketPendingInd(pAdapter,
1903 pHddStaCtx->conn_info.staId[0]);
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05301904 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001905 }
1906
1907 if ( VOS_IS_STATUS_SUCCESS( vosStatus ) )
1908 {
1909 // perform any WMM-related association processing
1910 hdd_wmm_assoc(pAdapter, pRoamInfo, eCSR_BSS_TYPE_INFRASTRUCTURE);
1911 }
1912 else
1913 {
1914 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07001915 "Cannot register STA with TL. Failed with vosStatus = %d [%08X]",
Jeff Johnson295189b2012-06-20 16:38:30 -07001916 vosStatus, vosStatus );
1917 }
Chet Lanctot186b5732013-03-18 10:26:30 -07001918#ifdef WLAN_FEATURE_11W
1919 vos_mem_zero( &pAdapter->hdd_stats.hddPmfStats,
1920 sizeof(pAdapter->hdd_stats.hddPmfStats) );
1921#endif
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05301922
Jeff Johnson295189b2012-06-20 16:38:30 -07001923 // Start the Queue
Katya Nigamb130d572014-11-24 16:38:16 +05301924 if ( !hddDisconInProgress )
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05301925 {
1926 hddLog(VOS_TRACE_LEVEL_INFO, FL("Enabling queues"));
Katya Nigamb130d572014-11-24 16:38:16 +05301927 netif_tx_wake_all_queues(dev);
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05301928 }
Girish Gowlibf0e1ab2015-01-19 16:05:16 +05301929 if (pHddCtx->cfg_ini->gEnableRoamDelayStats)
1930 {
1931 vos_record_roam_event(e_HDD_ENABLE_TX_QUEUE, NULL, 0);
1932 }
Padma, Santhosh Kumar38cef182016-02-18 12:22:51 +05301933#ifdef FEATURE_WLAN_TDLS
1934 wlan_hdd_tdls_connection_callback(pAdapter);
1935#endif
Shailender Karmuchia734f332013-04-19 14:02:48 -07001936 }
1937 else
Jeff Johnson295189b2012-06-20 16:38:30 -07001938 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001939 hdd_context_t* pHddCtx = (hdd_context_t*)pAdapter->pHddCtx;
1940
1941 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Kiran Kumar Lokerec8550fa2013-04-15 22:23:00 -07001942 if (pRoamInfo)
Deepthi Gowric7591cc2015-12-28 15:43:17 +05301943 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1944 "wlan: connection failed with " MAC_ADDRESS_STR " result:%d and Status:%d",
1945 MAC_ADDR_ARRAY(pRoamInfo->bssid), roamResult, roamStatus);
Kiran Kumar Lokerec8550fa2013-04-15 22:23:00 -07001946 else
Deepthi Gowric7591cc2015-12-28 15:43:17 +05301947 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1948 "wlan: connection failed with " MAC_ADDRESS_STR " result:%d and Status:%d",
Arif Hussain24bafea2013-11-15 15:10:03 -08001949 MAC_ADDR_ARRAY(pWextState->req_bssId),
1950 roamResult, roamStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07001951
Sachin Ahuja674c5112015-10-14 13:16:49 +05301952 if (( eCSR_ROAM_ASSOCIATION_FAILURE == roamStatus) ||
1953 ((roamResult != eCSR_ROAM_RESULT_ASSOCIATED) &&
1954 (eCSR_ROAM_ASSOCIATION_COMPLETION == roamStatus)))
Abhishek Singh611295e2015-07-09 11:11:54 +05301955 wlan_hdd_get_frame_logs(pAdapter,
Siddharth Bhalda0d1622015-04-24 15:47:49 +05301956 WLAN_HDD_GET_FRAME_LOG_CMD_SEND_AND_CLEAR);
1957
Abhishek Singhf4669da2014-05-26 15:07:49 +05301958 /* Set connection state to eConnectionState_NotConnected only when CSR
1959 * has completed operation - with a ASSOCIATION_FAILURE status
1960 */
Abhishek Singha6cfaa42014-06-23 13:11:07 +05301961 if ( eCSR_ROAM_ASSOCIATION_FAILURE == roamStatus && !hddDisconInProgress )
Abhishek Singhf4669da2014-05-26 15:07:49 +05301962 {
1963 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1964 "%s: Set HDD connState to eConnectionState_NotConnected",
1965 __func__);
1966 hdd_connSetConnectionState( pHddStaCtx, eConnectionState_NotConnected);
1967 }
Agarwal Ashish51325b52014-06-16 16:50:49 +05301968 if((pHddCtx->concurrency_mode <= 1) &&
1969 (pHddCtx->no_of_open_sessions[WLAN_HDD_INFRA_STATION] <=1))
Jeff Johnson295189b2012-06-20 16:38:30 -07001970 {
1971 pHddCtx->isAmpAllowed = VOS_TRUE;
1972 }
1973
1974 //If the Device Mode is Station
1975 // and the P2P Client is Connected
1976 //Enable BMPS
Jeff Johnsone7245742012-09-05 17:12:55 -07001977
1978 // In case of JB, as Change-Iface may or maynot be called for p2p0
Shailender Karmuchia734f332013-04-19 14:02:48 -07001979 // Enable BMPS/IMPS in case P2P_CLIENT disconnected
Jeff Johnsone7245742012-09-05 17:12:55 -07001980 if(((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
1981 (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)) &&
Agarwal Ashish51325b52014-06-16 16:50:49 +05301982 (vos_concurrent_open_sessions_running()))
Jeff Johnson295189b2012-06-20 16:38:30 -07001983 {
1984 //Enable BMPS only of other Session is P2P Client
1985 hdd_context_t *pHddCtx = NULL;
1986 v_CONTEXT_t pVosContext = vos_get_global_context( VOS_MODULE_ID_HDD, NULL );
1987
1988 if (NULL != pVosContext)
1989 {
1990 pHddCtx = vos_get_context( VOS_MODULE_ID_HDD, pVosContext);
1991
1992 if(NULL != pHddCtx)
1993 {
Gopichand Nakkalaa2fe5b02013-06-06 16:32:28 +05301994 //Only P2P Client is there Enable Bmps back
Agarwal Ashish51325b52014-06-16 16:50:49 +05301995 if((0 == pHddCtx->no_of_open_sessions[VOS_STA_SAP_MODE]) &&
1996 (0 == pHddCtx->no_of_open_sessions[VOS_P2P_GO_MODE]))
Gopichand Nakkalaa2fe5b02013-06-06 16:32:28 +05301997 {
1998 if (pHddCtx->hdd_wlan_suspended)
Tushnim Bhattacharyya3a37def2013-02-24 11:11:15 -08001999 {
Gopichand Nakkalaa2fe5b02013-06-06 16:32:28 +05302000 hdd_set_pwrparams(pHddCtx);
Tushnim Bhattacharyya3a37def2013-02-24 11:11:15 -08002001 }
Gopichand Nakkalaa2fe5b02013-06-06 16:32:28 +05302002 hdd_enable_bmps_imps(pHddCtx);
2003 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002004 }
2005 }
2006 }
2007
James Zmudafbf5ffc2013-03-25 12:45:35 -07002008 /* CR465478: Only send up a connection failure result when CSR has
Varun Reddy Yeturuda7f0d52013-12-20 11:16:57 -08002009 * completed operation - with a ASSOCIATION_FAILURE status.*/
Abhishek Singha6cfaa42014-06-23 13:11:07 +05302010 if ( eCSR_ROAM_ASSOCIATION_FAILURE == roamStatus && !hddDisconInProgress )
Jeff Johnsone7245742012-09-05 17:12:55 -07002011 {
Masti, Narayanraddi575ccc72015-08-17 18:04:57 +05302012
2013 if (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT)
2014 {
2015 hddLog(LOG1,
2016 FL("Assoication Failure for P2P client and we are trying to re-enable TDLS"));
2017 wlan_hdd_tdls_reenable(pHddCtx);
2018 }
2019
Deepthi Gowri6649f6a2014-02-18 17:31:23 +05302020 if (pRoamInfo)
2021 hddLog(VOS_TRACE_LEVEL_ERROR,
2022 "%s: send connect failure to nl80211:"
2023 " for bssid " MAC_ADDRESS_STR
Abhishek Singhc0fccd22015-10-19 16:44:00 +05302024 " result:%d and Status:%d reasonCode %d" ,
Deepthi Gowri6649f6a2014-02-18 17:31:23 +05302025 __func__, MAC_ADDR_ARRAY(pRoamInfo->bssid),
Abhishek Singhc0fccd22015-10-19 16:44:00 +05302026 roamResult, roamStatus, pRoamInfo->reasonCode);
Deepthi Gowri6649f6a2014-02-18 17:31:23 +05302027 else
2028 hddLog(VOS_TRACE_LEVEL_ERROR,
2029 "%s: connect failed:"
2030 " for bssid " MAC_ADDRESS_STR
Abhishek Singhc0fccd22015-10-19 16:44:00 +05302031 " result:%d and Status:%d" ,
Deepthi Gowri6649f6a2014-02-18 17:31:23 +05302032 __func__, MAC_ADDR_ARRAY(pWextState->req_bssId),
2033 roamResult, roamStatus);
2034
James Zmudafbf5ffc2013-03-25 12:45:35 -07002035 /* inform association failure event to nl80211 */
2036 if ( eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL == roamResult )
2037 {
Kiran Kumar Lokerec8550fa2013-04-15 22:23:00 -07002038 if (pRoamInfo)
2039 cfg80211_connect_result ( dev, pRoamInfo->bssid,
2040 NULL, 0, NULL, 0,
2041 WLAN_STATUS_ASSOC_DENIED_UNSPEC,
2042 GFP_KERNEL );
2043 else
2044 cfg80211_connect_result ( dev, pWextState->req_bssId,
2045 NULL, 0, NULL, 0,
2046 WLAN_STATUS_ASSOC_DENIED_UNSPEC,
2047 GFP_KERNEL );
James Zmudafbf5ffc2013-03-25 12:45:35 -07002048 }
2049 else
2050 {
Gao Wu6ca73b32016-05-09 14:35:49 +08002051 if (pRoamInfo)
2052 cfg80211_connect_result ( dev, pRoamInfo->bssid,
2053 NULL, 0, NULL, 0,
2054 pRoamInfo->reasonCode ?
2055 pRoamInfo->reasonCode :
2056 WLAN_STATUS_UNSPECIFIED_FAILURE,
2057 GFP_KERNEL );
2058 else
2059 cfg80211_connect_result ( dev, pWextState->req_bssId,
2060 NULL, 0, NULL, 0,
2061 WLAN_STATUS_UNSPECIFIED_FAILURE,
2062 GFP_KERNEL );
James Zmudafbf5ffc2013-03-25 12:45:35 -07002063 }
Abhishek Singhc0fccd22015-10-19 16:44:00 +05302064 /*Clear the roam profile*/
2065 hdd_clearRoamProfileIe( pAdapter );
Jeff Johnsone7245742012-09-05 17:12:55 -07002066 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002067
Kumar Anand82c009f2014-05-29 00:29:42 -07002068 hdd_wmm_init( pAdapter );
Madan Mohan Koyyalamudiee255f12012-09-28 15:41:19 -07002069
c_hpothu24f40982014-04-18 18:00:36 +05302070 if (pRoamInfo)
2071 {
2072 WLANTL_AssocFailed(pRoamInfo->staId);
2073 }
Mihir Sheteb7337272014-04-11 15:53:08 +05302074
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05302075 hddLog(VOS_TRACE_LEVEL_INFO, FL("Disabling queues"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002076 netif_tx_disable(dev);
2077 netif_carrier_off(dev);
Shailender Karmuchia734f332013-04-19 14:02:48 -07002078
Jeff Johnson295189b2012-06-20 16:38:30 -07002079 }
2080
Sushant Kaushikbf584e92014-08-06 17:59:20 +05302081 if (eCSR_ROAM_RESULT_ASSOCIATED == roamResult)
Sushant Kaushikba6764e2014-06-30 19:52:09 +05302082 {
2083 pHostapdAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_SOFTAP);
2084 if (pHostapdAdapter != NULL)
2085 {
Sushant Kaushikbf584e92014-08-06 17:59:20 +05302086 /* Restart SAP if its operating channel is different
2087 * from AP channel.
2088 */
2089 if (pHostapdAdapter->sessionCtx.ap.operatingChannel !=
2090 (int)pRoamInfo->pBssDesc->channelId)
2091 {
2092 hddLog(VOS_TRACE_LEVEL_INFO,"Restart Sap as SAP channel is %d "
2093 "and STA channel is %d", pHostapdAdapter->sessionCtx.ap.operatingChannel,
2094 (int)pRoamInfo->pBssDesc->channelId);
Deepthi Gowric9c777d2014-12-10 16:17:11 +05302095 hdd_hostapd_stop(pHostapdAdapter->dev);
Sushant Kaushikbf584e92014-08-06 17:59:20 +05302096 }
Sushant Kaushikba6764e2014-06-30 19:52:09 +05302097 }
2098 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002099 return eHAL_STATUS_SUCCESS;
2100}
2101
2102/**============================================================================
2103 *
Jeff Johnson81c17882013-05-03 09:53:35 -07002104 @brief hdd_RoamIbssIndicationHandler() - Here we update the status of the
Jeff Johnson295189b2012-06-20 16:38:30 -07002105 Ibss when we receive information that we have started/joined an ibss session
Shailender Karmuchia734f332013-04-19 14:02:48 -07002106
Jeff Johnson295189b2012-06-20 16:38:30 -07002107 ===========================================================================*/
Jeff Johnson81c17882013-05-03 09:53:35 -07002108static void hdd_RoamIbssIndicationHandler( hdd_adapter_t *pAdapter,
2109 tCsrRoamInfo *pRoamInfo,
2110 tANI_U32 roamId,
2111 eRoamCmdStatus roamStatus,
2112 eCsrRoamResult roamResult )
Jeff Johnson295189b2012-06-20 16:38:30 -07002113{
Katya Nigam47528772015-02-11 12:24:49 +05302114 hdd_context_t *pHddCtx = (hdd_context_t*)pAdapter->pHddCtx;
2115 v_MACADDR_t broadcastMacAddr = VOS_MAC_ADDR_BROADCAST_INITIALIZER;
2116 struct cfg80211_bss *bss;
Abhishek Singhb25e8442015-06-23 14:28:05 +05302117 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Katya Nigam47528772015-02-11 12:24:49 +05302118
Jeff Johnson81c17882013-05-03 09:53:35 -07002119 hddLog(VOS_TRACE_LEVEL_INFO, "%s: %s: id %d, status %d, result %d",
2120 __func__, pAdapter->dev->name, roamId, roamStatus, roamResult);
2121
Jeff Johnson295189b2012-06-20 16:38:30 -07002122 switch( roamResult )
2123 {
2124 // both IBSS Started and IBSS Join should come in here.
2125 case eCSR_ROAM_RESULT_IBSS_STARTED:
2126 case eCSR_ROAM_RESULT_IBSS_JOIN_SUCCESS:
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07002127 case eCSR_ROAM_RESULT_IBSS_COALESCED:
Jeff Johnson295189b2012-06-20 16:38:30 -07002128 {
Jeff Johnson81c17882013-05-03 09:53:35 -07002129 if (NULL == pRoamInfo)
2130 {
2131 VOS_ASSERT(0);
2132 return;
2133 }
2134
2135 /* When IBSS Started comes from CSR, we need to move
2136 * connection state to IBSS Disconnected (meaning no peers
2137 * are in the IBSS).
2138 */
Abhishek Singhf4669da2014-05-26 15:07:49 +05302139 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2140 "%s: Set HDD connState to eConnectionState_IbssDisconnected",
2141 __func__);
Jeff Johnson81c17882013-05-03 09:53:35 -07002142 hdd_connSetConnectionState( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
2143 eConnectionState_IbssDisconnected );
Abhishek Singh1c21c4d2014-04-25 16:40:19 +05302144 /*notify wmm */
2145 hdd_wmm_connect(pAdapter, pRoamInfo, eCSR_BSS_TYPE_IBSS);
Shailender Karmuchia734f332013-04-19 14:02:48 -07002146 pHddCtx->sta_to_adapter[IBSS_BROADCAST_STAID] = pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07002147
Jeff Johnson81c17882013-05-03 09:53:35 -07002148 if (pRoamInfo->pBssDesc)
2149 {
Anand N Sunkadfec40682015-07-29 09:51:17 +05302150#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0))
2151 struct ieee80211_channel *chan;
2152 int chan_no;
2153 unsigned int freq;
2154#endif
Katya Nigam47528772015-02-11 12:24:49 +05302155 hdd_ibss_RegisterSTA (pAdapter, pRoamInfo,
2156 IBSS_BROADCAST_STAID,
2157 &broadcastMacAddr, pRoamInfo->pBssDesc);
Jeff Johnson81c17882013-05-03 09:53:35 -07002158
2159 /* we created the IBSS, notify supplicant */
2160 hddLog(VOS_TRACE_LEVEL_INFO, "%s: %s: created ibss "
2161 MAC_ADDRESS_STR,
2162 __func__, pAdapter->dev->name,
2163 MAC_ADDR_ARRAY(pRoamInfo->pBssDesc->bssId));
2164
2165 /* we must first give cfg80211 the BSS information */
2166 bss = wlan_hdd_cfg80211_update_bss_db(pAdapter, pRoamInfo);
2167 if (NULL == bss)
2168 {
2169 hddLog(VOS_TRACE_LEVEL_ERROR,
2170 "%s: %s: unable to create IBSS entry",
2171 __func__, pAdapter->dev->name);
2172 return;
2173 }
Abhishek Singh00b71972016-01-07 10:51:04 +05302174#ifdef WLAN_FEATURE_RMC
2175 netif_carrier_on(pAdapter->dev);
2176 hddLog(VOS_TRACE_LEVEL_INFO, FL("Enabling queues"));
2177 netif_tx_start_all_queues(pAdapter->dev);
2178#endif
Anand N Sunkadfec40682015-07-29 09:51:17 +05302179#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0))
2180 chan_no = pRoamInfo->pBssDesc->channelId;
Jeff Johnson81c17882013-05-03 09:53:35 -07002181
Anand N Sunkadfec40682015-07-29 09:51:17 +05302182 if (chan_no <= 14)
2183 freq = ieee80211_channel_to_frequency(chan_no,
2184 IEEE80211_BAND_2GHZ);
2185 else
2186 freq = ieee80211_channel_to_frequency(chan_no,
2187 IEEE80211_BAND_5GHZ);
2188
2189 chan = ieee80211_get_channel(pAdapter->wdev.wiphy, freq);
2190
2191 if (chan)
2192 cfg80211_ibss_joined(pAdapter->dev, bss->bssid,
2193 chan, GFP_KERNEL);
2194 else
2195 hddLog(LOGE, FL("%s: chanId: %d, can't find channel"),
2196 pAdapter->dev->name,
2197 (int)pRoamInfo->pBssDesc->channelId);
2198#else
Jeff Johnson81c17882013-05-03 09:53:35 -07002199 cfg80211_ibss_joined(pAdapter->dev, bss->bssid, GFP_KERNEL);
Anand N Sunkadfec40682015-07-29 09:51:17 +05302200#endif
Yue Maf49ba872013-08-19 12:04:25 -07002201 cfg80211_put_bss(
2202#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0))
2203 pHddCtx->wiphy,
2204#endif
2205 bss);
Jeff Johnson81c17882013-05-03 09:53:35 -07002206 }
Katya Nigam47528772015-02-11 12:24:49 +05302207 else
2208 {
2209 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2210 "%s: NULL Bss Desc",__func__);
2211 }
Abhishek Singhb25e8442015-06-23 14:28:05 +05302212
2213 /* Set Broadcast key again in case IBSS_COALESCED as DEL BSS,
2214 * in IBSS_COALESCED will remove the BC key.
2215 */
2216 if ((eCSR_ROAM_RESULT_IBSS_COALESCED == roamResult) &&
2217 ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY
2218 == pHddStaCtx->ibss_enc_key.encType
2219 ||eCSR_ENCRYPT_TYPE_WEP104_STATICKEY
2220 == pHddStaCtx->ibss_enc_key.encType
2221 ||eCSR_ENCRYPT_TYPE_TKIP == pHddStaCtx->ibss_enc_key.encType
2222 ||eCSR_ENCRYPT_TYPE_AES == pHddStaCtx->ibss_enc_key.encType ))
2223 {
2224 u8 grpmacaddr[WNI_CFG_BSSID_LEN] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
2225 VOS_STATUS vosStatus;
2226
2227 pHddStaCtx->ibss_enc_key.keyDirection = eSIR_TX_RX;
2228
2229 memcpy(&pHddStaCtx->ibss_enc_key.peerMac,
2230 grpmacaddr, WNI_CFG_BSSID_LEN);
2231 hddLog(VOS_TRACE_LEVEL_INFO,
2232 FL(" SET GTK in case of COALESCED"));
2233 vosStatus = sme_RoamSetKey( WLAN_HDD_GET_HAL_CTX(pAdapter),
2234 pAdapter->sessionId, &pHddStaCtx->ibss_enc_key, &roamId );
2235 if ( VOS_STATUS_SUCCESS != vosStatus )
2236 {
2237 hddLog(VOS_TRACE_LEVEL_ERROR,
2238 FL("sme_RoamSetKey failed, returned %d"),vosStatus);
2239 }
2240 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002241 break;
2242 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07002243
Jeff Johnson295189b2012-06-20 16:38:30 -07002244 case eCSR_ROAM_RESULT_IBSS_START_FAILED:
2245 {
Jeff Johnson81c17882013-05-03 09:53:35 -07002246 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: %s: unable to create IBSS",
2247 __func__, pAdapter->dev->name);
Jeff Johnson295189b2012-06-20 16:38:30 -07002248 break;
2249 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07002250
Jeff Johnson295189b2012-06-20 16:38:30 -07002251 default:
Jeff Johnson81c17882013-05-03 09:53:35 -07002252 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: %s: unexpected result %d",
2253 __func__, pAdapter->dev->name, (int)roamResult);
Jeff Johnson295189b2012-06-20 16:38:30 -07002254 break;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002255 }
2256
Jeff Johnson81c17882013-05-03 09:53:35 -07002257 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07002258}
2259
2260/**============================================================================
2261 *
2262 @brief roamSaveIbssStation() - Save the IBSS peer MAC address in the adapter.
2263 This information is passed to iwconfig later. The peer that joined
2264 last is passed as information to iwconfig.
Shailender Karmuchia734f332013-04-19 14:02:48 -07002265 If we add HDD_MAX_NUM_IBSS_STA or less STA we return success else we
Jeff Johnson295189b2012-06-20 16:38:30 -07002266 return FALSE.
Shailender Karmuchia734f332013-04-19 14:02:48 -07002267
Jeff Johnson295189b2012-06-20 16:38:30 -07002268 ===========================================================================*/
Nirav Shah7e3c8132015-06-22 23:51:42 +05302269static int roamSaveIbssStation(hdd_adapter_t *pAdapter, v_U8_t staId, v_MACADDR_t *peerMacAddress)
Jeff Johnson295189b2012-06-20 16:38:30 -07002270{
2271 int fSuccess = FALSE;
2272 int idx = 0;
Nirav Shah7e3c8132015-06-22 23:51:42 +05302273 VOS_STATUS status;
2274 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Shailender Karmuchia734f332013-04-19 14:02:48 -07002275
Jeff Johnson295189b2012-06-20 16:38:30 -07002276 for ( idx = 0; idx < HDD_MAX_NUM_IBSS_STA; idx++ )
2277 {
2278 if ( 0 == pHddStaCtx->conn_info.staId[ idx ] )
2279 {
2280 pHddStaCtx->conn_info.staId[ idx ] = staId;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002281
Jeff Johnson295189b2012-06-20 16:38:30 -07002282 vos_copy_macaddr( &pHddStaCtx->conn_info.peerMacAddress[ idx ], peerMacAddress );
Shailender Karmuchia734f332013-04-19 14:02:48 -07002283
Jeff Johnson295189b2012-06-20 16:38:30 -07002284 fSuccess = TRUE;
2285 break;
2286 }
2287 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07002288
Nirav Shah7e3c8132015-06-22 23:51:42 +05302289 status = hdd_sta_id_hash_add_entry(pAdapter, staId, peerMacAddress);
2290 if (status != VOS_STATUS_SUCCESS) {
2291 hddLog(VOS_TRACE_LEVEL_ERROR,
2292 FL("Not able to add staid hash %d"), staId);
2293 return FALSE;
2294 }
2295
2296 hddLog(VOS_TRACE_LEVEL_INFO,
2297 FL("New station added sta_id %d mac:"
2298 MAC_ADDRESS_STR), staId,
2299 MAC_ADDR_ARRAY(peerMacAddress->bytes));
2300
Shailender Karmuchia734f332013-04-19 14:02:48 -07002301 return( fSuccess );
Jeff Johnson295189b2012-06-20 16:38:30 -07002302}
2303/**============================================================================
2304 *
2305 @brief roamRemoveIbssStation() - Remove the IBSS peer MAC address in the adapter.
Shailender Karmuchia734f332013-04-19 14:02:48 -07002306 If we remove HDD_MAX_NUM_IBSS_STA or less STA we return success else we
Jeff Johnson295189b2012-06-20 16:38:30 -07002307 return FALSE.
Shailender Karmuchia734f332013-04-19 14:02:48 -07002308
Jeff Johnson295189b2012-06-20 16:38:30 -07002309 ===========================================================================*/
Ravi Joshicc57ed42013-10-12 16:31:25 -07002310static int roamRemoveIbssStation( hdd_adapter_t *pAdapter, v_U8_t staId )
Jeff Johnson295189b2012-06-20 16:38:30 -07002311{
2312 int fSuccess = FALSE;
2313 int idx = 0;
2314 v_U8_t valid_idx = 0;
2315 v_U8_t del_idx = 0;
Ravi Joshi8a934352013-09-25 16:46:58 -07002316 v_U8_t empty_slots = 0;
Ravi Joshicc57ed42013-10-12 16:31:25 -07002317 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Nirav Shah7e3c8132015-06-22 23:51:42 +05302318 VOS_STATUS status;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002319
Jeff Johnson295189b2012-06-20 16:38:30 -07002320 for ( idx = 0; idx < HDD_MAX_NUM_IBSS_STA; idx++ )
2321 {
2322 if ( staId == pHddStaCtx->conn_info.staId[ idx ] )
2323 {
2324 pHddStaCtx->conn_info.staId[ idx ] = 0;
Nirav Shah7e3c8132015-06-22 23:51:42 +05302325 status = hdd_sta_id_hash_remove_entry(pAdapter,
2326 staId, &pHddStaCtx->conn_info.peerMacAddress[idx]);
2327 if (status != VOS_STATUS_SUCCESS) {
2328 hddLog(VOS_TRACE_LEVEL_ERROR,
2329 FL("Not able to remove staid hash %d"), staId );
2330 fSuccess = FALSE;
2331 } else {
2332 hddLog(VOS_TRACE_LEVEL_INFO,
2333 FL("station removed sta_id %d mac:"
2334 MAC_ADDRESS_STR), staId,
2335 MAC_ADDR_ARRAY(pHddStaCtx->conn_info.peerMacAddress[idx].bytes));
Jeff Johnson295189b2012-06-20 16:38:30 -07002336
Nirav Shah7e3c8132015-06-22 23:51:42 +05302337 vos_zero_macaddr( &pHddStaCtx->conn_info.peerMacAddress[ idx ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002338
Nirav Shah7e3c8132015-06-22 23:51:42 +05302339 fSuccess = TRUE;
2340 // Note the deleted Index, if its 0 we need special handling
2341 del_idx = idx;
2342 empty_slots++;
2343 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002344 }
2345 else
2346 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07002347 if (pHddStaCtx->conn_info.staId[idx] != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07002348 {
2349 valid_idx = idx;
2350 }
Ravi Joshi8a934352013-09-25 16:46:58 -07002351 else
2352 {
2353 // Found an empty slot
2354 empty_slots++;
2355 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002356 }
2357 }
2358
Ravi Joshi8a934352013-09-25 16:46:58 -07002359 if (HDD_MAX_NUM_IBSS_STA == empty_slots)
2360 {
2361 // Last peer departed, set the IBSS state appropriately
2362 pHddStaCtx->conn_info.connState = eConnectionState_IbssDisconnected;
Ravi Joshicc57ed42013-10-12 16:31:25 -07002363 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Ravi Joshi8a934352013-09-25 16:46:58 -07002364 "Last IBSS Peer Departed!!!" );
2365 }
2366
Jeff Johnson295189b2012-06-20 16:38:30 -07002367 // Find next active staId, to have a valid sta trigger for TL.
2368 if (fSuccess == TRUE)
2369 {
2370 if (del_idx == 0)
2371 {
2372 if (pHddStaCtx->conn_info.staId[valid_idx] != 0)
2373 {
2374 pHddStaCtx->conn_info.staId[0] = pHddStaCtx->conn_info.staId[valid_idx];
2375 vos_copy_macaddr( &pHddStaCtx->conn_info.peerMacAddress[ 0 ],
2376 &pHddStaCtx->conn_info.peerMacAddress[ valid_idx ]);
2377
2378 pHddStaCtx->conn_info.staId[valid_idx] = 0;
2379 vos_zero_macaddr( &pHddStaCtx->conn_info.peerMacAddress[ valid_idx ] );
2380 }
2381 }
2382 }
2383 return( fSuccess );
2384}
2385
2386/**============================================================================
2387 *
Shailender Karmuchia734f332013-04-19 14:02:48 -07002388 @brief roamIbssConnectHandler() : We update the status of the IBSS to
Jeff Johnson295189b2012-06-20 16:38:30 -07002389 connected in this function.
Shailender Karmuchia734f332013-04-19 14:02:48 -07002390
Jeff Johnson295189b2012-06-20 16:38:30 -07002391 ===========================================================================*/
2392static eHalStatus roamIbssConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo )
2393{
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002394 struct cfg80211_bss *bss;
Abhishek Singhf4669da2014-05-26 15:07:49 +05302395 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2396 "%s: IBSS Connect Indication from SME!!! "
2397 "Set HDD connState to eConnectionState_IbssConnected",
2398 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002399 // Set the internal connection state to show 'IBSS Connected' (IBSS with a partner stations)...
2400 hdd_connSetConnectionState( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter), eConnectionState_IbssConnected );
2401
2402 // Save the connection info from CSR...
2403 hdd_connSaveConnectInfo( pAdapter, pRoamInfo, eCSR_BSS_TYPE_IBSS );
2404
2405 // Send the bssid address to the wext.
2406 hdd_SendAssociationEvent(pAdapter->dev, pRoamInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -07002407 /* add bss_id to cfg80211 data base */
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002408 bss = wlan_hdd_cfg80211_update_bss_db(pAdapter, pRoamInfo);
2409 if (NULL == bss)
2410 {
2411 hddLog(VOS_TRACE_LEVEL_ERROR,
2412 "%s: %s: unable to create IBSS entry",
2413 __func__, pAdapter->dev->name);
2414 return eHAL_STATUS_FAILURE;
2415 }
Yue Maf49ba872013-08-19 12:04:25 -07002416 cfg80211_put_bss(
2417#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0))
2418 WLAN_HDD_GET_CTX(pAdapter)->wiphy,
2419#endif
2420 bss);
Jeff Johnson295189b2012-06-20 16:38:30 -07002421
2422 return( eHAL_STATUS_SUCCESS );
2423}
2424/**============================================================================
2425 *
Mukul Sharmad2589a52014-04-23 21:06:25 +05302426 @brief hdd_ReConfigSuspendDataClearedDuringRoaming() - Reconfigure the
2427 suspend related data which was cleared during roaming in FWR.
2428
2429 ===========================================================================*/
2430static void hdd_ReConfigSuspendDataClearedDuringRoaming(hdd_context_t *pHddCtx)
2431{
2432 VOS_STATUS vstatus = VOS_STATUS_E_FAILURE;
2433 hdd_adapter_t *pAdapter;
2434 hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
2435 ENTER();
2436
2437 spin_lock(&pHddCtx->filter_lock);
2438 if (VOS_FALSE == pHddCtx->sus_res_mcastbcast_filter_valid)
2439 {
2440 pHddCtx->sus_res_mcastbcast_filter =
2441 pHddCtx->configuredMcastBcastFilter;
2442 pHddCtx->sus_res_mcastbcast_filter_valid = VOS_TRUE;
2443 hddLog(VOS_TRACE_LEVEL_INFO, FL("offload: callback to associated"));
2444 hddLog(VOS_TRACE_LEVEL_INFO,
2445 FL("saving configuredMcastBcastFilter = %d"),
2446 pHddCtx->configuredMcastBcastFilter);
2447 hddLog(VOS_TRACE_LEVEL_INFO,
2448 FL("offload: calling hdd_conf_mcastbcast_filter"));
2449 }
2450 spin_unlock(&pHddCtx->filter_lock);
2451
2452 hdd_conf_mcastbcast_filter(pHddCtx, TRUE);
2453 if(pHddCtx->hdd_mcastbcast_filter_set != TRUE)
2454 hddLog(VOS_TRACE_LEVEL_ERROR, FL("Not able to set mcast/bcast filter "));
2455
2456 vstatus = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
2457 //No need to configure GTK Offload from here because it might possible
2458 //cfg80211_set_rekey_data might not yet came, anyway GTK offload will
2459 //be handled as part of cfg80211_set_rekey_data processing.
2460 while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == vstatus )
2461 {
2462 pAdapter = pAdapterNode->pAdapter;
2463 if( pAdapter &&
2464 (( pAdapter->device_mode == WLAN_HDD_INFRA_STATION) ||
2465 (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT)))
2466 {
2467 if (pHddCtx->cfg_ini->fhostArpOffload)
2468 {
2469 //Configure ARPOFFLOAD
2470 vstatus = hdd_conf_arp_offload(pAdapter, TRUE);
2471 if (!VOS_IS_STATUS_SUCCESS(vstatus))
2472 {
2473 hddLog(VOS_TRACE_LEVEL_ERROR,
2474 FL("Failed to disable ARPOffload Feature %d"), vstatus);
2475 }
2476 }
2477#ifdef WLAN_NS_OFFLOAD
2478 //Configure NSOFFLOAD
2479 if (pHddCtx->cfg_ini->fhostNSOffload)
2480 {
2481 hdd_conf_ns_offload(pAdapter, TRUE);
2482 }
2483#endif
Mukul Sharma25e70c32014-05-22 12:50:24 +05302484#ifdef WLAN_FEATURE_PACKET_FILTERING
2485 /* During suspend, configure MC Addr list filter to the firmware
2486 * function takes care of checking necessary conditions before
2487 * configuring.
2488 */
2489 wlan_hdd_set_mc_addr_list(pAdapter, TRUE);
2490#endif
Mukul Sharmad2589a52014-04-23 21:06:25 +05302491 }
2492 vstatus = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
2493 pAdapterNode = pNext;
2494 }
2495 EXIT();
2496}
2497
2498/**============================================================================
2499 *
Jeff Johnson295189b2012-06-20 16:38:30 -07002500 @brief hdd_RoamSetKeyCompleteHandler() - Update the security parameters.
Shailender Karmuchia734f332013-04-19 14:02:48 -07002501
Jeff Johnson295189b2012-06-20 16:38:30 -07002502 ===========================================================================*/
Shailender Karmuchia734f332013-04-19 14:02:48 -07002503static eHalStatus hdd_RoamSetKeyCompleteHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
2504 tANI_U32 roamId, eRoamCmdStatus roamStatus,
Jeff Johnson295189b2012-06-20 16:38:30 -07002505 eCsrRoamResult roamResult )
2506{
2507 eCsrEncryptionType connectedCipherAlgo;
2508 v_BOOL_t fConnected = FALSE;
2509 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
2510 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Bhargav Shaha805ef22015-07-29 17:31:38 +05302511 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Jeff Johnson295189b2012-06-20 16:38:30 -07002512 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05302513 WLANTL_STAStateType prevTLState = WLANTL_STA_INIT;
Jeff Johnson295189b2012-06-20 16:38:30 -07002514 ENTER();
Srinivas Girigowda5a737f22013-06-28 15:21:48 -07002515
2516 if (NULL == pRoamInfo)
2517 {
2518 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "pRoamInfo is NULL");
2519 return eHAL_STATUS_FAILURE;
2520 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002521 // if ( WPA ), tell TL to go to 'authenticated' after the keys are set.
Shailender Karmuchia734f332013-04-19 14:02:48 -07002522 // then go to 'authenticated'. For all other authentication types (those that do
Jeff Johnson295189b2012-06-20 16:38:30 -07002523 // not require upper layer authentication) we can put TL directly into 'authenticated'
2524 // state.
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002525 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
2526 "Set Key completion roamStatus =%d roamResult=%d " MAC_ADDRESS_STR,
2527 roamStatus, roamResult, MAC_ADDR_ARRAY(pRoamInfo->peerMac));
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002528
Jeff Johnson295189b2012-06-20 16:38:30 -07002529 fConnected = hdd_connGetConnectedCipherAlgo( pHddStaCtx, &connectedCipherAlgo );
2530 if( fConnected )
2531 {
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002532 if ( WLAN_HDD_IBSS == pAdapter->device_mode )
2533 {
2534 v_U8_t staId;
2535
2536 v_MACADDR_t broadcastMacAddr = VOS_MAC_ADDR_BROADCAST_INITIALIZER;
2537
2538 if ( 0 == memcmp( pRoamInfo->peerMac,
2539 &broadcastMacAddr, VOS_MAC_ADDR_SIZE ) )
2540 {
2541 vosStatus = WLANTL_STAPtkInstalled( pHddCtx->pvosContext,
2542 IBSS_BROADCAST_STAID);
Abhishek Singhb25e8442015-06-23 14:28:05 +05302543 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
2544 "WLAN TL STA GTK Installed for STAID=%d", IBSS_BROADCAST_STAID);
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002545 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
2546 }
2547 else
2548 {
2549 vosStatus = hdd_Ibss_GetStaId(pHddStaCtx,
2550 (v_MACADDR_t*)pRoamInfo->peerMac,
2551 &staId);
2552 if ( VOS_STATUS_SUCCESS == vosStatus )
2553 {
2554 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
2555 "WLAN TL STA Ptk Installed for STAID=%d", staId);
2556 vosStatus = WLANTL_STAPtkInstalled( pHddCtx->pvosContext,
2557 staId);
2558 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
2559 }
2560 }
2561 }
2562 else
2563 {
Bhargav Shaha805ef22015-07-29 17:31:38 +05302564 WLANTL_GetSTAState(pHddCtx->pvosContext,
2565 pHddStaCtx->conn_info.staId[0],
2566 &prevTLState);
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05302567 // TODO: Considering getting a state machine in HDD later.
2568 // This routine is invoked twice. 1)set PTK 2)set GTK.
2569 // The folloing if statement will be TRUE when setting GTK.
2570 // At this time we don't handle the state in detail.
2571 // Related CR: 174048 - TL not in authenticated state
2572 if ( ( eCSR_ROAM_RESULT_AUTHENTICATED == roamResult ) &&
2573 (pRoamInfo != NULL) && !pRoamInfo->fAuthRequired )
2574 {
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05302575
2576 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED, "Key set "
2577 "for StaId=%d. Changing TL state to AUTHENTICATED from"
2578 " state:%d", pHddStaCtx->conn_info.staId[0], prevTLState);
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05302579
2580 // Connections that do not need Upper layer authentication,
2581 // transition TL to 'Authenticated' state after the keys are set.
2582 vosStatus = WLANTL_ChangeSTAState( pHddCtx->pvosContext,
2583 pHddStaCtx->conn_info.staId[ 0 ],
2584 WLANTL_STA_AUTHENTICATED );
2585
2586 pHddStaCtx->conn_info.uIsAuthenticated = VOS_TRUE;
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05302587
2588 if (WLANTL_STA_AUTHENTICATED != prevTLState)
2589 hdd_postTLPacketPendingInd(pAdapter,
2590 pHddStaCtx->conn_info.staId[0]);
Mukul Sharmad2589a52014-04-23 21:06:25 +05302591 //Need to call offload because when roaming happen at that time fwr
2592 //clean offload info as part of the DelBss
2593 // No need to configure offload if host was not suspended
2594 spin_lock(&pHddCtx->filter_lock);
2595 if(pHddCtx->hdd_wlan_suspended)
2596 {
2597 spin_unlock(&pHddCtx->filter_lock);
2598 hdd_ReConfigSuspendDataClearedDuringRoaming(pHddCtx);
2599 }
2600 else
2601 {
2602 spin_unlock(&pHddCtx->filter_lock);
2603 }
Girish Gowlibf0e1ab2015-01-19 16:05:16 +05302604 if (pHddCtx->cfg_ini->gEnableRoamDelayStats)
2605 {
2606 vos_record_roam_event(e_HDD_SET_GTK_RSP, NULL, 0);
2607 }
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05302608 }
2609 else
2610 {
2611 vosStatus = WLANTL_STAPtkInstalled( pHddCtx->pvosContext,
2612 pHddStaCtx->conn_info.staId[ 0 ]);
Bhargav Shaha805ef22015-07-29 17:31:38 +05302613
2614 /* In case of OSEN move TL to 'Authenticated' after PTK is set */
2615 if (pWextState->roamProfile.bOSENAssociation == VOS_TRUE)
2616 {
2617 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED, "PTK set"
2618 " for StaId=%d. Due to OSEN, Changing TL state to"
2619 "AUTHENTICATED from state:%d",
2620 pHddStaCtx->conn_info.staId[0], prevTLState);
2621
2622 vosStatus = WLANTL_ChangeSTAState( pHddCtx->pvosContext,
2623 pHddStaCtx->conn_info.staId[ 0 ],
2624 WLANTL_STA_AUTHENTICATED );
2625
2626 pHddStaCtx->conn_info.uIsAuthenticated = VOS_TRUE;
2627
2628 if (WLANTL_STA_AUTHENTICATED != prevTLState)
2629 hdd_postTLPacketPendingInd(pAdapter,
2630 pHddStaCtx->conn_info.staId[0]);
2631 }
2632
2633
2634
Girish Gowlibf0e1ab2015-01-19 16:05:16 +05302635 if (pHddCtx->cfg_ini->gEnableRoamDelayStats)
2636 {
2637 vos_record_roam_event(e_HDD_SET_PTK_RSP, (void *)pRoamInfo->peerMac, 6);
2638 }
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05302639 }
2640
2641 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002642 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002643 }
Gopichand Nakkalaecdebab2013-06-04 18:44:34 +05302644 else
2645 {
2646 // possible disassoc after issuing set key and waiting set key complete
2647 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
2648 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07002649
Jeff Johnson295189b2012-06-20 16:38:30 -07002650 EXIT();
2651 return( eHAL_STATUS_SUCCESS );
2652}
2653/**============================================================================
2654 *
2655 @brief hdd_RoamMicErrorIndicationHandler() - This function indicates the Mic failure to the supplicant.
2656 ===========================================================================*/
Shailender Karmuchia734f332013-04-19 14:02:48 -07002657static eHalStatus hdd_RoamMicErrorIndicationHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07002658 tANI_U32 roamId, eRoamCmdStatus roamStatus, eCsrRoamResult roamResult )
Shailender Karmuchia734f332013-04-19 14:02:48 -07002659{
Jeff Johnson295189b2012-06-20 16:38:30 -07002660 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
2661
2662 if( eConnectionState_Associated == pHddStaCtx->conn_info.connState &&
2663 TKIP_COUNTER_MEASURE_STOPED == pHddStaCtx->WextState.mTKIPCounterMeasures )
2664 {
2665 struct iw_michaelmicfailure msg;
2666 union iwreq_data wreq;
2667 memset(&msg, '\0', sizeof(msg));
2668 msg.src_addr.sa_family = ARPHRD_ETHER;
2669 memcpy(msg.src_addr.sa_data, pRoamInfo->u.pMICFailureInfo->taMacAddr, sizeof(pRoamInfo->u.pMICFailureInfo->taMacAddr));
Arif Hussain24bafea2013-11-15 15:10:03 -08002670 hddLog(LOG1, "MIC MAC " MAC_ADDRESS_STR,
2671 MAC_ADDR_ARRAY(msg.src_addr.sa_data));
Shailender Karmuchia734f332013-04-19 14:02:48 -07002672
Jeff Johnson295189b2012-06-20 16:38:30 -07002673 if(pRoamInfo->u.pMICFailureInfo->multicast == eSIR_TRUE)
2674 msg.flags = IW_MICFAILURE_GROUP;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002675 else
Jeff Johnson295189b2012-06-20 16:38:30 -07002676 msg.flags = IW_MICFAILURE_PAIRWISE;
2677 memset(&wreq, 0, sizeof(wreq));
2678 wreq.data.length = sizeof(msg);
2679 wireless_send_event(pAdapter->dev, IWEVMICHAELMICFAILURE, &wreq, (char *)&msg);
Jeff Johnson295189b2012-06-20 16:38:30 -07002680 /* inform mic failure to nl80211 */
Shailender Karmuchia734f332013-04-19 14:02:48 -07002681 cfg80211_michael_mic_failure(pAdapter->dev,
Jeff Johnson295189b2012-06-20 16:38:30 -07002682 pRoamInfo->u.pMICFailureInfo->taMacAddr,
2683 ((pRoamInfo->u.pMICFailureInfo->multicast == eSIR_TRUE) ?
2684 NL80211_KEYTYPE_GROUP :
2685 NL80211_KEYTYPE_PAIRWISE),
Shailender Karmuchia734f332013-04-19 14:02:48 -07002686 pRoamInfo->u.pMICFailureInfo->keyId,
2687 pRoamInfo->u.pMICFailureInfo->TSC,
Jeff Johnson295189b2012-06-20 16:38:30 -07002688 GFP_KERNEL);
Shailender Karmuchia734f332013-04-19 14:02:48 -07002689
Jeff Johnson295189b2012-06-20 16:38:30 -07002690 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07002691
Jeff Johnson295189b2012-06-20 16:38:30 -07002692 return( eHAL_STATUS_SUCCESS );
2693}
2694
2695/**============================================================================
2696 *
Shailender Karmuchia734f332013-04-19 14:02:48 -07002697 @brief roamRoamConnectStatusUpdateHandler() - The Ibss connection status is
Jeff Johnson295189b2012-06-20 16:38:30 -07002698 updated regularly here in this function.
Shailender Karmuchia734f332013-04-19 14:02:48 -07002699
Jeff Johnson295189b2012-06-20 16:38:30 -07002700 ===========================================================================*/
Shailender Karmuchia734f332013-04-19 14:02:48 -07002701static eHalStatus roamRoamConnectStatusUpdateHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
2702 tANI_U32 roamId, eRoamCmdStatus roamStatus,
Jeff Johnson295189b2012-06-20 16:38:30 -07002703 eCsrRoamResult roamResult )
2704{
2705 VOS_STATUS vosStatus;
2706
2707 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2708 switch( roamResult )
2709 {
2710 case eCSR_ROAM_RESULT_IBSS_NEW_PEER:
2711 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07002712 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07002713 struct station_info staInfo;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002714
Deepthi Gowric7591cc2015-12-28 15:43:17 +05302715 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2716 "IBSS New Peer indication from SME with peerMac " MAC_ADDRESS_STR " BSSID: " MAC_ADDRESS_STR " and stationID= %d",
Shailender Karmuchia734f332013-04-19 14:02:48 -07002717 MAC_ADDR_ARRAY(pRoamInfo->peerMac),
2718 MAC_ADDR_ARRAY(pHddStaCtx->conn_info.bssId),
Jeff Johnson295189b2012-06-20 16:38:30 -07002719 pRoamInfo->staId );
Shailender Karmuchia734f332013-04-19 14:02:48 -07002720
Jeff Johnson295189b2012-06-20 16:38:30 -07002721 pHddCtx->sta_to_adapter[pRoamInfo->staId] = pAdapter;
2722
Shailender Karmuchia734f332013-04-19 14:02:48 -07002723 pHddCtx->sta_to_adapter[IBSS_BROADCAST_STAID] = pAdapter;
2724 WLANTL_UpdateSTABssIdforIBSS(pHddCtx->pvosContext,
2725 IBSS_BROADCAST_STAID,pHddStaCtx->conn_info.bssId);
2726
2727 // Register the Station with TL for the new peer.
Katya Nigam47528772015-02-11 12:24:49 +05302728 vosStatus = hdd_ibss_RegisterSTA( pAdapter,
Jeff Johnson295189b2012-06-20 16:38:30 -07002729 pRoamInfo,
2730 pRoamInfo->staId,
2731 (v_MACADDR_t *)pRoamInfo->peerMac,
2732 pRoamInfo->pBssDesc );
2733 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
2734 {
2735 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07002736 "Cannot register STA with TL for IBSS. Failed with vosStatus = %d [%08X]",
Jeff Johnson295189b2012-06-20 16:38:30 -07002737 vosStatus, vosStatus );
2738 }
Abhishek Singhdecf1b62016-02-09 11:53:58 +05302739 if (!roamSaveIbssStation(pAdapter,
2740 pRoamInfo->staId,
2741 (v_MACADDR_t *)pRoamInfo->peerMac))
2742 {
2743 hddLog(LOGW, FL("Not Able to add sta in sta hash"));
2744 break;
2745 }
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07002746 pHddStaCtx->ibss_sta_generation++;
2747 memset(&staInfo, 0, sizeof(staInfo));
2748 staInfo.filled = 0;
2749 staInfo.generation = pHddStaCtx->ibss_sta_generation;
2750
2751 cfg80211_new_sta(pAdapter->dev,
2752 (const u8 *)pRoamInfo->peerMac,
2753 &staInfo, GFP_KERNEL);
Shailender Karmuchia734f332013-04-19 14:02:48 -07002754
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002755 if ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pHddStaCtx->ibss_enc_key.encType
2756 ||eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pHddStaCtx->ibss_enc_key.encType
2757 ||eCSR_ENCRYPT_TYPE_TKIP == pHddStaCtx->ibss_enc_key.encType
2758 ||eCSR_ENCRYPT_TYPE_AES == pHddStaCtx->ibss_enc_key.encType )
2759 {
2760 pHddStaCtx->ibss_enc_key.keyDirection = eSIR_TX_RX;
Abhishek Singhb25e8442015-06-23 14:28:05 +05302761
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002762 memcpy(&pHddStaCtx->ibss_enc_key.peerMac,
2763 pRoamInfo->peerMac, WNI_CFG_BSSID_LEN);
2764
2765 VOS_TRACE( VOS_MODULE_ID_HDD,
Arif Hussain6d2a3322013-11-17 19:50:10 -08002766 VOS_TRACE_LEVEL_INFO_HIGH, "New peer joined set PTK encType=%d",
Shailender Karmuchi642e9812013-05-30 14:34:49 -07002767 pHddStaCtx->ibss_enc_key.encType);
2768
2769 vosStatus = sme_RoamSetKey( WLAN_HDD_GET_HAL_CTX(pAdapter),
2770 pAdapter->sessionId, &pHddStaCtx->ibss_enc_key, &roamId );
2771
2772 if ( VOS_STATUS_SUCCESS != vosStatus )
2773 {
2774 hddLog(VOS_TRACE_LEVEL_ERROR,
2775 "%s: sme_RoamSetKey failed, returned %d",
2776 __func__, vosStatus);
2777 return VOS_STATUS_E_FAILURE;
2778 }
2779 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002780 netif_carrier_on(pAdapter->dev);
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05302781 hddLog(VOS_TRACE_LEVEL_INFO, FL("Enabling queues"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002782 netif_tx_start_all_queues(pAdapter->dev);
2783 break;
2784 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07002785
Jeff Johnson295189b2012-06-20 16:38:30 -07002786 case eCSR_ROAM_RESULT_IBSS_CONNECT:
2787 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07002788
Jeff Johnson295189b2012-06-20 16:38:30 -07002789 roamIbssConnectHandler( pAdapter, pRoamInfo );
Shailender Karmuchia734f332013-04-19 14:02:48 -07002790
Jeff Johnson295189b2012-06-20 16:38:30 -07002791 break;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002792 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002793 case eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED:
2794 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07002795 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Jeff Johnson295189b2012-06-20 16:38:30 -07002796
Ravi Joshicc57ed42013-10-12 16:31:25 -07002797 if ( !roamRemoveIbssStation(pAdapter, pRoamInfo->staId ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07002798 {
2799 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2800 "IBSS peer departed by cannot find peer in our registration table with TL" );
2801 }
2802
Deepthi Gowric7591cc2015-12-28 15:43:17 +05302803 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
2804 "IBSS Peer Departed from SME with peerMac " MAC_ADDRESS_STR " BSSID: " MAC_ADDRESS_STR " and stationID= %d",
Shailender Karmuchia734f332013-04-19 14:02:48 -07002805 MAC_ADDR_ARRAY(pRoamInfo->peerMac),
2806 MAC_ADDR_ARRAY(pHddStaCtx->conn_info.bssId),
2807 pRoamInfo->staId );
2808
Katya Nigam47528772015-02-11 12:24:49 +05302809 hdd_ibss_DeregisterSTA( pAdapter, pRoamInfo->staId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002810
2811 pHddCtx->sta_to_adapter[pRoamInfo->staId] = NULL;
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07002812 pHddStaCtx->ibss_sta_generation++;
Ravi Joshicc57ed42013-10-12 16:31:25 -07002813
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07002814 cfg80211_del_sta(pAdapter->dev,
2815 (const u8 *)&pRoamInfo->peerMac,
2816 GFP_KERNEL);
Jeff Johnson295189b2012-06-20 16:38:30 -07002817 break;
2818 }
2819 case eCSR_ROAM_RESULT_IBSS_INACTIVE:
2820 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07002821 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
2822 "Received eCSR_ROAM_RESULT_IBSS_INACTIVE from SME");
Jeff Johnson295189b2012-06-20 16:38:30 -07002823 // Stop only when we are inactive
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05302824 hddLog(VOS_TRACE_LEVEL_INFO, FL("Disabling queues"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002825 netif_tx_disable(pAdapter->dev);
2826 netif_carrier_off(pAdapter->dev);
Abhishek Singhf4669da2014-05-26 15:07:49 +05302827 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2828 "%s: Set HDD connState to eConnectionState_NotConnected",
2829 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002830 hdd_connSetConnectionState( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter), eConnectionState_NotConnected );
Shailender Karmuchia734f332013-04-19 14:02:48 -07002831
Jeff Johnson295189b2012-06-20 16:38:30 -07002832 // Send the bssid address to the wext.
2833 hdd_SendAssociationEvent(pAdapter->dev, pRoamInfo);
2834 // clean up data path
2835 hdd_disconnect_tx_rx(pAdapter);
2836 break;
2837 }
2838 default:
2839 break;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002840
Jeff Johnson295189b2012-06-20 16:38:30 -07002841 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07002842
Jeff Johnson295189b2012-06-20 16:38:30 -07002843 return( eHAL_STATUS_SUCCESS );
2844}
2845
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002846#ifdef FEATURE_WLAN_TDLS
2847/**============================================================================
2848 *
2849 @brief hdd_roamRegisterTDLSSTA() - Construct the staDesc and register with
2850 TL the new STA. This is called as part of ADD_STA in the TDLS setup
2851 Return: VOS_STATUS
Shailender Karmuchia734f332013-04-19 14:02:48 -07002852
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002853 ===========================================================================*/
Anand N Sunkad9bfc2622015-07-30 15:18:54 +05302854VOS_STATUS hdd_roamRegisterTDLSSTA(hdd_adapter_t *pAdapter,
2855#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
2856 const tANI_U8 *peerMac,
2857#else
2858 tANI_U8 *peerMac,
2859#endif
2860 tANI_U16 staId, tANI_U8 ucastSig)
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002861{
2862 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Shailender Karmuchia734f332013-04-19 14:02:48 -07002863 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pAdapter))->pvosContext;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002864 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
2865 WLAN_STADescType staDesc = {0};
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002866 eCsrEncryptionType connectedCipherAlgo = eCSR_ENCRYPT_TYPE_UNKNOWN;
2867 v_BOOL_t fConnected = FALSE;
Sudhir Sattayappa Kohalli37620692013-08-05 14:02:26 -07002868 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
2869 hdd_config_t *cfg_param = pHddCtx->cfg_ini;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002870
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002871 fConnected = hdd_connGetConnectedCipherAlgo( pHddStaCtx, &connectedCipherAlgo );
2872 if (!fConnected) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07002873 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002874 "%s not connected. ignored", __func__);
2875 return VOS_FALSE;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002876 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002877
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002878 /*
2879 * TDLS sta in BSS should be set as STA type TDLS and STA MAC should
2880 * be peer MAC, here we are wokrking on direct Link
2881 */
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002882 staDesc.ucSTAId = staId ;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002883
2884 staDesc.wSTAType = WLAN_STA_TDLS ;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002885
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002886 vos_mem_copy( staDesc.vSTAMACAddress.bytes, peerMac,
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002887 sizeof(tSirMacAddr) );
2888
2889 vos_mem_copy(staDesc.vBSSIDforIBSS.bytes, pHddStaCtx->conn_info.bssId,6 );
2890 vos_copy_macaddr( &staDesc.vSelfMACAddress, &pAdapter->macAddressCurrent );
2891
2892 /* set the QoS field appropriately ..*/
2893 (hdd_wmm_is_active(pAdapter)) ? (staDesc.ucQosEnabled = 1)
2894 : (staDesc.ucQosEnabled = 0) ;
2895
2896 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "HDD register \
Arif Hussain6d2a3322013-11-17 19:50:10 -08002897 TL QoS_enabled=%d", staDesc.ucQosEnabled );
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002898
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002899 staDesc.ucProtectedFrame = (connectedCipherAlgo != eCSR_ENCRYPT_TYPE_NONE) ;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002900
2901 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_MED,
Arif Hussain6d2a3322013-11-17 19:50:10 -08002902 "HDD register TL Sec_enabled= %d.", staDesc.ucProtectedFrame );
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002903
Shailender Karmuchia734f332013-04-19 14:02:48 -07002904 /*
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002905 * UMA is ready we inform TL to do frame translation.
2906 */
2907 staDesc.ucSwFrameTXXlation = 1;
2908 staDesc.ucSwFrameRXXlation = 1;
2909 staDesc.ucAddRmvLLC = 1;
2910
2911 /* Initialize signatures and state */
Hoonki Lee11f7dda2013-02-14 16:55:44 -08002912 staDesc.ucUcastSig = ucastSig ;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002913
2914 /* tdls Direct Link do not need bcastSig */
2915 staDesc.ucBcastSig = 0 ;
Shailender Karmuchia734f332013-04-19 14:02:48 -07002916
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002917#ifdef VOLANS_ENABLE_SW_REPLAY_CHECK
2918 if(staDesc.ucProtectedFrame)
2919 staDesc.ucIsReplayCheckValid = VOS_TRUE;
2920 else
2921 staDesc.ucIsReplayCheckValid = VOS_FALSE;
2922#endif
2923
Gopichand Nakkala471708b2013-06-04 20:03:01 +05302924 staDesc.ucInitState = WLANTL_STA_CONNECTED ;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002925
Shailender Karmuchia734f332013-04-19 14:02:48 -07002926 /* Register the Station with TL... */
2927 vosStatus = WLANTL_RegisterSTAClient( pVosContext,
2928 hdd_rx_packet_cbk,
2929 hdd_tx_complete_cbk,
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002930 hdd_tx_fetch_packet_cbk, &staDesc, 0 );
Shailender Karmuchia734f332013-04-19 14:02:48 -07002931
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002932 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
2933 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07002934 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07002935 "%s: WLANTL_RegisterSTAClient() failed to register. "
2936 "Status= %d [0x%08X]", __func__, vosStatus, vosStatus );
Shailender Karmuchia734f332013-04-19 14:02:48 -07002937 return vosStatus;
2938 }
2939
Sudhir Sattayappa Kohalli37620692013-08-05 14:02:26 -07002940 if ( cfg_param->dynSplitscan &&
2941 ( VOS_TIMER_STATE_RUNNING !=
2942 vos_timer_getCurrentState(&pHddCtx->tx_rx_trafficTmr)) )
2943 {
2944 vos_timer_start(&pHddCtx->tx_rx_trafficTmr,
2945 cfg_param->trafficMntrTmrForSplitScan);
2946 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002947 return( vosStatus );
2948}
2949
Masti, Narayanraddi1fb32a92015-06-29 13:14:06 +05302950VOS_STATUS hdd_roamDeregisterTDLSSTA( hdd_adapter_t *pAdapter, tANI_U8 staId )
Chauhan Rajeshb48f96d2013-01-24 21:00:15 -08002951{
2952 VOS_STATUS vosStatus;
2953 vosStatus = WLANTL_ClearSTAClient( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext, staId );
2954 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
2955 {
2956 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
2957 "%s: WLANTL_ClearSTAClient() failed to for staID %d. "
Jeff Johnson0299d0a2013-10-30 12:37:43 -07002958 "Status= %d [0x%08X]",
Chauhan Rajeshb48f96d2013-01-24 21:00:15 -08002959 __func__, staId, vosStatus, vosStatus );
2960 }
2961 return( vosStatus );
2962}
2963
2964
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002965/*
2966 * HDD interface between SME and TL to ensure TDLS client registration with
2967 * TL in case of new TDLS client is added and deregistration at the time
2968 * TDLS client is deleted.
2969 */
2970
Shailender Karmuchia734f332013-04-19 14:02:48 -07002971eHalStatus hdd_RoamTdlsStatusUpdateHandler(hdd_adapter_t *pAdapter,
2972 tCsrRoamInfo *pRoamInfo,
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002973 tANI_U32 roamId,
Shailender Karmuchia734f332013-04-19 14:02:48 -07002974 eRoamCmdStatus roamStatus,
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002975 eCsrRoamResult roamResult)
2976{
Gopichand Nakkala4327a152013-03-04 23:22:42 -08002977 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002978 eHalStatus status = eHAL_STATUS_FAILURE ;
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08002979 tANI_U8 staIdx;
Hoonki Lee1090c6a2013-01-16 17:40:54 -08002980
Kaushik, Sushant8489f472014-01-27 11:41:22 +05302981 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
Arif Hussain24bafea2013-11-15 15:10:03 -08002982 ("hdd_tdlsStatusUpdate: %s staIdx %d " MAC_ADDRESS_STR),
2983 roamResult == eCSR_ROAM_RESULT_ADD_TDLS_PEER ?
2984 "ADD_TDLS_PEER" :
2985 roamResult == eCSR_ROAM_RESULT_DELETE_TDLS_PEER ?
2986 "DEL_TDLS_PEER" :
2987 roamResult == eCSR_ROAM_RESULT_TEARDOWN_TDLS_PEER_IND ?
2988 "DEL_TDLS_PEER_IND" :
2989 roamResult == eCSR_ROAM_RESULT_DELETE_ALL_TDLS_PEER_IND ?
2990 "DEL_ALL_TDLS_PEER_IND" :
2991 roamResult == eCSR_ROAM_RESULT_UPDATE_TDLS_PEER ?
2992 "UPDATE_TDLS_PEER" :
2993 roamResult == eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP ?
Masti, Narayanraddi36c67622016-01-06 16:07:34 +05302994 "LINK_ESTABLISH_REQ_RSP" :
2995 roamResult == eCSR_ROAM_RESULT_CHANNEL_SWITCH_REQ_RSP ?
2996 "CHANNEL_SWITCH_REQ_RSP" : "UNKNOWN",
Arif Hussain24bafea2013-11-15 15:10:03 -08002997 pRoamInfo->staId, MAC_ADDR_ARRAY(pRoamInfo->peerMac));
Mohit Khanna698ba2a2012-12-04 15:08:18 -08002998 switch( roamResult )
2999 {
3000 case eCSR_ROAM_RESULT_ADD_TDLS_PEER:
3001 {
Lee Hoonkif987a0b2013-01-29 02:07:07 -08003002 if(eSIR_SME_SUCCESS != pRoamInfo->statusCode)
3003 {
Masti, Narayanraddi83dbfc22016-01-07 16:26:06 +05303004 hddTdlsPeer_t *curr_peer;
3005
Lee Hoonkif987a0b2013-01-29 02:07:07 -08003006 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003007 ("%s: Add Sta is failed. %d"),__func__, pRoamInfo->statusCode);
Ganesh Kondabattinif065c1f2015-08-05 23:05:23 +05303008 wlan_hdd_tdls_check_bmps(pAdapter);
Masti, Narayanraddi83dbfc22016-01-07 16:26:06 +05303009
3010 mutex_lock(&pHddCtx->tdls_lock);
3011 curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
3012 pRoamInfo->peerMac, FALSE);
3013 if (NULL != curr_peer)
3014 curr_peer->link_status = eTDLS_LINK_TEARING;
3015 else
3016 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3017 "%s %d curr_peer is Null", __func__,__LINE__);
3018 mutex_unlock(&pHddCtx->tdls_lock);
Lee Hoonkif987a0b2013-01-29 02:07:07 -08003019 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003020 else
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003021 {
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003022
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003023 /* check if there is available index for this new TDLS STA */
3024 for ( staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++ )
3025 {
3026 if (0 == pHddCtx->tdlsConnInfo[staIdx].staId )
3027 {
3028 pHddCtx->tdlsConnInfo[staIdx].sessionId = pRoamInfo->sessionId;
3029 pHddCtx->tdlsConnInfo[staIdx].staId = pRoamInfo->staId;
3030
3031 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Arif Hussain24bafea2013-11-15 15:10:03 -08003032 ("TDLS: STA IDX at %d is %d "
3033 "of mac " MAC_ADDRESS_STR),
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003034 staIdx, pHddCtx->tdlsConnInfo[staIdx].staId,
Arif Hussain24bafea2013-11-15 15:10:03 -08003035 MAC_ADDR_ARRAY(pRoamInfo->peerMac));
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003036
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003037 vos_copy_macaddr(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003038 (v_MACADDR_t *)pRoamInfo->peerMac) ;
3039 status = eHAL_STATUS_SUCCESS ;
3040 break ;
3041 }
3042 }
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003043 if (staIdx < HDD_MAX_NUM_TDLS_STA)
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003044 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003045 if (-1 == wlan_hdd_tdls_set_sta_id(pAdapter, pRoamInfo->peerMac, pRoamInfo->staId)) {
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003046 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3047 "wlan_hdd_tdls_set_sta_id() failed");
3048 return VOS_FALSE;
3049 }
3050
3051 (WLAN_HDD_GET_CTX(pAdapter))->sta_to_adapter[pRoamInfo->staId] = pAdapter;
Gopichand Nakkala471708b2013-06-04 20:03:01 +05303052 /* store the ucast signature , if required for further reference. */
3053
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003054 wlan_hdd_tdls_set_signature( pAdapter, pRoamInfo->peerMac, pRoamInfo->ucastSig );
Gopichand Nakkala471708b2013-06-04 20:03:01 +05303055 /* start TDLS client registration with TL */
3056 status = hdd_roamRegisterTDLSSTA( pAdapter,
3057 pRoamInfo->peerMac,
3058 pRoamInfo->staId,
3059 pRoamInfo->ucastSig);
Pradeep Reddy POTTETIa9991b62015-03-26 18:03:19 +05303060 wlan_hdd_tdls_increment_peer_count(pAdapter);
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003061 }
3062 else
3063 {
Gopichand Nakkalab977a972013-02-18 19:15:09 -08003064 status = eHAL_STATUS_FAILURE;
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003065 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Hoonki Lee66b75f32013-04-16 18:30:07 -07003066 "%s: no available slot in conn_info. staId %d cannot be stored", __func__, pRoamInfo->staId);
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003067 }
Gopichand Nakkalab977a972013-02-18 19:15:09 -08003068 pAdapter->tdlsAddStaStatus = status;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003069 }
Hoonki Lee11f7dda2013-02-14 16:55:44 -08003070 complete(&pAdapter->tdls_add_station_comp);
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003071 break ;
3072 }
Gopichand Nakkala681989c2013-03-06 22:27:48 -08003073 case eCSR_ROAM_RESULT_UPDATE_TDLS_PEER:
3074 {
3075 if (eSIR_SME_SUCCESS != pRoamInfo->statusCode)
3076 {
3077 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3078 "%s: Add Sta is failed. %d", __func__, pRoamInfo->statusCode);
3079 }
3080 /* store the ucast signature which will be used later when
3081 * registering to TL
3082 */
3083 pAdapter->tdlsAddStaStatus = pRoamInfo->statusCode;
3084 complete(&pAdapter->tdls_add_station_comp);
3085 break;
3086 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05303087 case eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP:
3088 {
3089 if (eSIR_SME_SUCCESS != pRoamInfo->statusCode)
3090 {
Masti, Narayanraddif10fd792015-12-15 15:01:01 +05303091 hddTdlsPeer_t *curr_peer;
3092
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05303093 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3094 "%s: Link Establish Request failed. %d", __func__, pRoamInfo->statusCode);
Masti, Narayanraddif10fd792015-12-15 15:01:01 +05303095
3096 mutex_lock(&pHddCtx->tdls_lock);
3097 curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
3098 pRoamInfo->peerMac, FALSE);
3099 if (curr_peer)
3100 curr_peer->link_status = eTDLS_LINK_TEARING;
3101 else
3102 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3103 "%s %d curr_peer is Null",__func__,__LINE__);
3104 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +05303105 }
3106 complete(&pAdapter->tdls_link_establish_req_comp);
3107 break;
3108 }
Masti, Narayanraddi36c67622016-01-06 16:07:34 +05303109 case eCSR_ROAM_RESULT_CHANNEL_SWITCH_REQ_RSP:
3110 {
3111 if (eSIR_SME_SUCCESS != pRoamInfo->statusCode)
3112 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3113 "%s: Channel switch request failed. %d", __func__,
3114 pRoamInfo->statusCode);
3115 else
3116 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3117 "%s: Channel switch request Success", __func__);
3118 break;
3119 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003120 case eCSR_ROAM_RESULT_DELETE_TDLS_PEER:
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003121 {
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003122 hddTdlsPeer_t *curr_peer;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003123 for ( staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++ )
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003124 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003125 if ((pHddCtx->tdlsConnInfo[staIdx].sessionId == pRoamInfo->sessionId) &&
3126 pRoamInfo->staId == pHddCtx->tdlsConnInfo[staIdx].staId)
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003127 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003128 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003129 ("HDD: del STA IDX = %x"), pRoamInfo->staId) ;
3130
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303131 mutex_lock(&pHddCtx->tdls_lock);
3132 curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
3133 pRoamInfo->peerMac, FALSE);
Agarwal Ashish9cd86382014-12-18 18:24:36 +05303134 if (NULL != curr_peer)
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003135 {
Agarwal Ashish9cd86382014-12-18 18:24:36 +05303136 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3137 " Current status for peer" MAC_ADDRESS_STR "is %d",
3138 MAC_ADDR_ARRAY(pRoamInfo->peerMac), curr_peer->link_status);
Pradeep Reddy POTTETIa9991b62015-03-26 18:03:19 +05303139 if (TDLS_IS_CONNECTED(curr_peer) ||
3140 (eTDLS_LINK_CONNECTING == curr_peer->link_status))
Agarwal Ashish9cd86382014-12-18 18:24:36 +05303141 {
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303142 mutex_unlock(&pHddCtx->tdls_lock);
Agarwal Ashish9cd86382014-12-18 18:24:36 +05303143 hdd_roamDeregisterTDLSSTA ( pAdapter, pRoamInfo->staId );
3144 }
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303145 else
3146 mutex_unlock(&pHddCtx->tdls_lock);
3147
Pradeep Reddy POTTETIa9991b62015-03-26 18:03:19 +05303148 wlan_hdd_tdls_decrement_peer_count(pAdapter);
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003149 }
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303150 else
3151 mutex_unlock(&pHddCtx->tdls_lock);
3152
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303153 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003154 wlan_hdd_tdls_reset_peer(pAdapter, pRoamInfo->peerMac);
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303155 mutex_unlock(&pHddCtx->tdls_lock);
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003156
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003157 pHddCtx->tdlsConnInfo[staIdx].staId = 0 ;
3158 pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
3159 vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003160 sizeof(v_MACADDR_t)) ;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003161 wlan_hdd_tdls_check_bmps(pAdapter);
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003162 status = eHAL_STATUS_SUCCESS ;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003163 break ;
3164 }
3165 }
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003166 complete(&pAdapter->tdls_del_station_comp);
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003167 }
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003168 break ;
Hoonki Leee6bfe942013-02-05 15:01:19 -08003169 case eCSR_ROAM_RESULT_TEARDOWN_TDLS_PEER_IND:
3170 {
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003171 hddTdlsPeer_t *curr_peer;
Hoonki Leee6bfe942013-02-05 15:01:19 -08003172 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3173 "%s: Sending teardown to supplicant with reason code %u",
3174 __func__, pRoamInfo->reasonCode);
3175
3176#ifdef CONFIG_TDLS_IMPLICIT
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303177 mutex_lock(&pHddCtx->tdls_lock);
3178 curr_peer = wlan_hdd_tdls_find_peer(pAdapter, pRoamInfo->peerMac,
3179 FALSE);
Gopichand Nakkalae7cbc5d2013-03-27 21:09:23 -07003180 wlan_hdd_tdls_indicate_teardown(pAdapter, curr_peer, pRoamInfo->reasonCode);
Abhishek Singh96568922016-01-05 15:28:12 +05303181 hdd_send_wlan_tdls_teardown_event(eTDLS_TEARDOWN_BSS_DISCONNECT,
3182 curr_peer->peerMac);
Masti, Narayanraddi6b93b472015-09-04 17:48:11 +05303183 mutex_unlock(&pHddCtx->tdls_lock);
Hoonki Leee6bfe942013-02-05 15:01:19 -08003184#endif
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003185 status = eHAL_STATUS_SUCCESS ;
3186 break ;
3187 }
3188 case eCSR_ROAM_RESULT_DELETE_ALL_TDLS_PEER_IND:
3189 {
3190 /* 0 staIdx is assigned to AP we dont want to touch that */
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003191 for ( staIdx = 0; staIdx < HDD_MAX_NUM_TDLS_STA; staIdx++ )
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003192 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003193 if ((pHddCtx->tdlsConnInfo[staIdx].sessionId == pRoamInfo->sessionId) &&
3194 pHddCtx->tdlsConnInfo[staIdx].staId)
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003195 {
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003196 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
Arif Hussain24bafea2013-11-15 15:10:03 -08003197 ("hdd_tdlsStatusUpdate: staIdx %d " MAC_ADDRESS_STR),
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003198 pHddCtx->tdlsConnInfo[staIdx].staId,
Arif Hussain24bafea2013-11-15 15:10:03 -08003199 MAC_ADDR_ARRAY(pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes));
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303200
3201 mutex_lock(&pHddCtx->tdls_lock);
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003202 wlan_hdd_tdls_reset_peer(pAdapter, pHddCtx->tdlsConnInfo[staIdx].peerMac.bytes);
Masti, Narayanraddi9e4f4082015-10-17 16:05:15 +05303203 mutex_unlock(&pHddCtx->tdls_lock);
3204
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003205 hdd_roamDeregisterTDLSSTA ( pAdapter, pHddCtx->tdlsConnInfo[staIdx].staId );
3206 wlan_hdd_tdls_decrement_peer_count(pAdapter);
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003207
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003208 vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003209 sizeof(v_MACADDR_t)) ;
Gopichand Nakkala4327a152013-03-04 23:22:42 -08003210 pHddCtx->tdlsConnInfo[staIdx].staId = 0 ;
3211 pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
Gopichand Nakkala2a0a1572013-02-10 21:39:16 -08003212
3213 status = eHAL_STATUS_SUCCESS ;
3214 }
3215 }
Gopichand Nakkala40ab2752013-04-04 20:11:36 +05303216 wlan_hdd_tdls_check_bmps(pAdapter);
Hoonki Leee6bfe942013-02-05 15:01:19 -08003217 break ;
3218 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003219 default:
3220 {
3221 break ;
3222 }
3223 }
3224
3225 return status ;
3226}
3227#endif
3228
Arun Khandavalli7eeb1592015-10-19 21:36:57 +05303229void iw_full_power_cbfn (void *pContext, eHalStatus status)
Srinivas Girigowda1c3f72e2013-12-18 16:07:00 -08003230{
3231 hdd_adapter_t *pAdapter = (hdd_adapter_t *)pContext;
3232 hdd_context_t *pHddCtx = NULL;
3233 int ret;
3234
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303235 ENTER();
3236
Srinivas Girigowda1c3f72e2013-12-18 16:07:00 -08003237 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
3238 {
3239 hddLog(VOS_TRACE_LEVEL_ERROR,
3240 "%s: Bad param, pAdapter [%p]",
3241 __func__, pAdapter);
3242 return;
3243 }
3244
3245 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3246 ret = wlan_hdd_validate_context(pHddCtx);
3247 if (0 != ret)
3248 {
Srinivas Girigowda1c3f72e2013-12-18 16:07:00 -08003249 return;
3250 }
3251
3252 if (pHddCtx->cfg_ini->fIsBmpsEnabled)
3253 {
3254 sme_RequestBmps(WLAN_HDD_GET_HAL_CTX(pAdapter), NULL, NULL);
3255 }
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05303256
3257 EXIT();
Srinivas Girigowda1c3f72e2013-12-18 16:07:00 -08003258}
3259
Shailender Karmuchia734f332013-04-19 14:02:48 -07003260eHalStatus hdd_smeRoamCallback( void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId,
Jeff Johnson295189b2012-06-20 16:38:30 -07003261 eRoamCmdStatus roamStatus, eCsrRoamResult roamResult )
3262{
3263 eHalStatus halStatus = eHAL_STATUS_SUCCESS;
3264 hdd_adapter_t *pAdapter = (hdd_adapter_t *)pContext;
Pratik Bhalgatec625f72012-11-22 17:17:38 +05303265 hdd_wext_state_t *pWextState = NULL;
3266 hdd_station_ctx_t *pHddStaCtx = NULL;
Madan Mohan Koyyalamudi2d8cc892012-09-18 16:24:34 -07003267 VOS_STATUS status = VOS_STATUS_SUCCESS;
Selvaraj, Sridhar59c50392016-06-09 17:08:05 +05303268 struct cfg80211_bss *bss_status;
Amar Singhal49fdfd52013-08-13 13:25:12 -07003269 hdd_context_t *pHddCtx = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003270
3271 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
Jeff Johnson0299d0a2013-10-30 12:37:43 -07003272 "CSR Callback: status= %d result= %d roamID=%d",
Shailender Karmuchia734f332013-04-19 14:02:48 -07003273 roamStatus, roamResult, roamId );
Jeff Johnson04dd8a82012-06-29 20:41:40 -07003274
3275 /*Sanity check*/
Pratik Bhalgatec625f72012-11-22 17:17:38 +05303276 if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
Jeff Johnson04dd8a82012-06-29 20:41:40 -07003277 {
3278 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
Pratik Bhalgatec625f72012-11-22 17:17:38 +05303279 "invalid adapter or adapter has invalid magic");
3280 return eHAL_STATUS_FAILURE;
3281 }
3282
3283 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
3284 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3285
3286 if ((NULL == pWextState) || (NULL == pHddStaCtx))
3287 {
3288 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3289 "invalid WEXT state or HDD station context");
Jeff Johnson04dd8a82012-06-29 20:41:40 -07003290 return eHAL_STATUS_FAILURE;
3291 }
3292
Konamki, Sreelakshmib9c45712015-07-29 11:48:19 +05303293 MTRACE(vos_trace(VOS_MODULE_ID_HDD, TRACE_CODE_HDD_RX_SME_MSG,
3294 pAdapter->sessionId, roamStatus));
Jeff Johnson295189b2012-06-20 16:38:30 -07003295 switch( roamStatus )
3296 {
3297 case eCSR_ROAM_SESSION_OPENED:
Sreelakshmi Konamki41d95e22015-08-28 12:51:32 +05303298 set_bit(SME_SESSION_OPENED, &pAdapter->event_flags);
3299 complete(&pAdapter->session_open_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003300 break;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003301
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003302#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
3303 /* We did pre-auth,then we attempted a 11r or ese reassoc.
Jeff Johnson295189b2012-06-20 16:38:30 -07003304 * reassoc failed due to failure, timeout, reject from ap
Shailender Karmuchia734f332013-04-19 14:02:48 -07003305 * in any case tell the OS, our carrier is off and mark
Jeff Johnson295189b2012-06-20 16:38:30 -07003306 * interface down */
3307 case eCSR_ROAM_FT_REASSOC_FAILED:
Agarwal Ashish971c2882013-10-30 20:11:12 +05303308 hddLog(LOGE, FL("Reassoc Failed with roamStatus: %d roamResult: %d SessionID: %d"),
3309 roamStatus, roamResult, pAdapter->sessionId);
c_hpothuef45bc32014-09-11 10:10:18 +05303310 sme_resetCoexEevent(WLAN_HDD_GET_HAL_CTX(pAdapter));
Jeff Johnson295189b2012-06-20 16:38:30 -07003311 halStatus = hdd_DisConnectHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
3312 /* Check if Mcast/Bcast Filters are set, if yes clear the filters here */
3313 if ((WLAN_HDD_GET_CTX(pAdapter))->hdd_mcastbcast_filter_set == TRUE) {
Jeff Johnson295189b2012-06-20 16:38:30 -07003314 (WLAN_HDD_GET_CTX(pAdapter))->hdd_mcastbcast_filter_set = FALSE;
3315 }
3316 pHddStaCtx->ft_carrier_on = FALSE;
Kanchanapally, Vidyullathad883c652014-05-09 21:17:04 +05303317 pHddStaCtx->hdd_ReassocScenario = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003318 break;
3319
3320 case eCSR_ROAM_FT_START:
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003321 // When we roam for EsE and 11r, we dont want the
Jeff Johnson295189b2012-06-20 16:38:30 -07003322 // OS to be informed that the link is down. So mark
Shailender Karmuchia734f332013-04-19 14:02:48 -07003323 // the link ready for ft_start. After this the
Jeff Johnson295189b2012-06-20 16:38:30 -07003324 // eCSR_ROAM_SHOULD_ROAM will be received.
3325 // Where in we will not mark the link down
3326 // Also we want to stop tx at this point when we will be
3327 // doing disassoc at this time. This saves 30-60 msec
Madan Mohan Koyyalamudi2d8cc892012-09-18 16:24:34 -07003328 // after reassoc.
Jeff Johnson295189b2012-06-20 16:38:30 -07003329 {
3330 struct net_device *dev = pAdapter->dev;
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05303331 hddLog(VOS_TRACE_LEVEL_INFO, FL("Disabling queues"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003332 netif_tx_disable(dev);
Girish Gowlibf0e1ab2015-01-19 16:05:16 +05303333 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3334 if (pHddCtx->cfg_ini->gEnableRoamDelayStats)
3335 {
3336 vos_record_roam_event(e_HDD_DISABLE_TX_QUEUE, NULL, 0);
3337 }
Madan Mohan Koyyalamudi2d8cc892012-09-18 16:24:34 -07003338 /*
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05303339 * Deregister this STA with TL, but do not flush the packets
3340 * for this STA from wmm_tx_queue. Since there is no valid STA
3341 * for these packets they will not be transmitted. Eventually
3342 * after the reassociation is successful, these packets will be
3343 * transmitted after registering STA with TL again. This ensures
3344 * that driver does not drop packets during roaming.
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003345 */
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05303346 status = WLANTL_ClearSTAClient(pHddCtx->pvosContext,
3347 pHddStaCtx->conn_info.staId[0]);
3348 if (!VOS_IS_STATUS_SUCCESS(status))
Madan Mohan Koyyalamudi2d8cc892012-09-18 16:24:34 -07003349 {
Kanchanapally, Vidyullathaed969c62015-02-18 11:39:11 +05303350 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3351 FL("WLANTL_ClearSTAClient failed for staID %d."
3352 "Status= %d [0x%x]"), pHddStaCtx->conn_info.staId[0],
3353 status, status);
Madan Mohan Koyyalamudi2d8cc892012-09-18 16:24:34 -07003354 halStatus = eHAL_STATUS_FAILURE;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07003355 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003356 }
3357 pHddStaCtx->ft_carrier_on = TRUE;
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003358 pHddStaCtx->hdd_ReassocScenario = VOS_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003359 break;
3360#endif
3361
3362 case eCSR_ROAM_SHOULD_ROAM:
3363 // Dont need to do anything
3364 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003365 struct net_device *dev = pAdapter->dev;
3366 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3367 // notify apps that we can't pass traffic anymore
Padma, Santhosh Kumar9dacb5c2014-12-17 19:22:56 +05303368 hddLog(VOS_TRACE_LEVEL_INFO, FL("Disabling queues"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003369 netif_tx_disable(dev);
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003370#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -07003371 if (pHddStaCtx->ft_carrier_on == FALSE)
3372 {
3373#endif
3374 netif_carrier_off(dev);
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003375#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -07003376 }
3377#endif
3378
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003379#if !(defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR))
Jeff Johnson295189b2012-06-20 16:38:30 -07003380 //We should clear all sta register with TL, for now, only one.
3381 status = hdd_roamDeregisterSTA( pAdapter, pHddStaCtx->conn_info.staId [0] );
3382 if ( !VOS_IS_STATUS_SUCCESS(status ) )
3383 {
3384 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
3385 FL("hdd_roamDeregisterSTA() failed to for staID %d. Status= %d [0x%x]"),
3386 pHddStaCtx->conn_info.staId[0], status, status );
Madan Mohan Koyyalamudi2d8cc892012-09-18 16:24:34 -07003387 halStatus = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003388 }
Madan Mohan Koyyalamudi2d8cc892012-09-18 16:24:34 -07003389#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003390 }
3391 break;
3392 case eCSR_ROAM_LOSTLINK:
3393 case eCSR_ROAM_DISASSOCIATED:
3394 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003395 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3396 "****eCSR_ROAM_DISASSOCIATED****");
c_hpothuef45bc32014-09-11 10:10:18 +05303397 sme_resetCoexEevent(WLAN_HDD_GET_HAL_CTX(pAdapter));
Jeff Johnson295189b2012-06-20 16:38:30 -07003398 halStatus = hdd_DisConnectHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
3399 /* Check if Mcast/Bcast Filters are set, if yes clear the filters here */
Amar Singhal49fdfd52013-08-13 13:25:12 -07003400 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3401 if (pHddCtx->hdd_mcastbcast_filter_set == TRUE)
madan mohan koyyalamudibfd9cef2013-07-01 18:39:37 +05303402 {
Amar Singhal49fdfd52013-08-13 13:25:12 -07003403 hdd_conf_mcastbcast_filter(pHddCtx, FALSE);
Amar Singhalf8ba2b82013-12-02 12:54:38 -08003404
3405 if (VOS_TRUE == pHddCtx->sus_res_mcastbcast_filter_valid) {
3406 pHddCtx->configuredMcastBcastFilter =
3407 pHddCtx->sus_res_mcastbcast_filter;
3408 pHddCtx->sus_res_mcastbcast_filter_valid = VOS_FALSE;
3409 }
madan mohan koyyalamudibfd9cef2013-07-01 18:39:37 +05303410
Amar Singhald53568e2013-09-26 11:03:45 -07003411 hddLog(VOS_TRACE_LEVEL_INFO,
3412 "offload: disassociation happening, restoring configuredMcastBcastFilter");
3413 hddLog(VOS_TRACE_LEVEL_INFO,"McastBcastFilter = %d",
3414 pHddCtx->configuredMcastBcastFilter);
3415 hddLog(VOS_TRACE_LEVEL_INFO,
3416 "offload: already called mcastbcast filter");
Jeff Johnson295189b2012-06-20 16:38:30 -07003417 (WLAN_HDD_GET_CTX(pAdapter))->hdd_mcastbcast_filter_set = FALSE;
3418 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07003419#ifdef WLAN_FEATURE_PACKET_FILTERING
madan mohan koyyalamudibfd9cef2013-07-01 18:39:37 +05303420 /* Call to clear any MC Addr List filter applied after
3421 * successful connection.
3422 */
3423 wlan_hdd_set_mc_addr_list(pAdapter, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003424#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003425 }
3426 break;
3427 case eCSR_ROAM_IBSS_LEAVE:
3428 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3429 "****eCSR_ROAM_IBSS_LEAVE****");
3430 halStatus = hdd_DisConnectHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
3431 break;
3432 case eCSR_ROAM_ASSOCIATION_COMPLETION:
3433 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3434 "****eCSR_ROAM_ASSOCIATION_COMPLETION****");
Abhishek Singh57a0bd92014-06-13 11:17:27 +05303435 // To Do - address probable memory leak with WEP encryption upon successful association
3436 if (eCSR_ROAM_RESULT_ASSOCIATED != roamResult)
Jeff Johnson295189b2012-06-20 16:38:30 -07003437 {
Abhishek Singh57a0bd92014-06-13 11:17:27 +05303438 //Clear saved connection information in HDD
3439 hdd_connRemoveConnectInfo( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) );
Jeff Johnson295189b2012-06-20 16:38:30 -07003440 }
Abhishek Singh57a0bd92014-06-13 11:17:27 +05303441 halStatus = hdd_AssociationCompletionHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
Jeff Johnson295189b2012-06-20 16:38:30 -07003442
3443 break;
3444 case eCSR_ROAM_ASSOCIATION_FAILURE:
Shailender Karmuchia734f332013-04-19 14:02:48 -07003445 halStatus = hdd_AssociationCompletionHandler( pAdapter,
Jeff Johnson295189b2012-06-20 16:38:30 -07003446 pRoamInfo, roamId, roamStatus, roamResult );
3447 break;
3448 case eCSR_ROAM_IBSS_IND:
Jeff Johnson81c17882013-05-03 09:53:35 -07003449 hdd_RoamIbssIndicationHandler( pAdapter, pRoamInfo, roamId,
3450 roamStatus, roamResult );
Jeff Johnson295189b2012-06-20 16:38:30 -07003451 break;
3452
3453 case eCSR_ROAM_CONNECT_STATUS_UPDATE:
3454 halStatus = roamRoamConnectStatusUpdateHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
Shailender Karmuchia734f332013-04-19 14:02:48 -07003455 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003456
3457 case eCSR_ROAM_MIC_ERROR_IND:
3458 halStatus = hdd_RoamMicErrorIndicationHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
3459 break;
Sachin Ahuja3d47fcd2015-08-28 16:02:06 +05303460 case eCSR_ROAM_LOST_LINK_PARAMS_IND:
3461 {
3462 /*
3463 * The RSSI will be subtracted from 100 as FW is sending the RSSI by
3464 * adding the 100 value.
3465 */
3466 pAdapter->rssi_on_disconnect = pRoamInfo->u.pLostLinkParams->rssi - 100;
3467 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3468 "%s : Rssi on Disconnect : %d",
3469 __func__, pAdapter->rssi_on_disconnect);
3470 break;
3471 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003472 case eCSR_ROAM_SET_KEY_COMPLETE:
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003473 {
3474 hdd_context_t* pHddCtx = (hdd_context_t*)pAdapter->pHddCtx;
3475
3476 if((pHddCtx) &&
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003477 (TRUE == pHddCtx->hdd_wlan_suspended) &&
Padma, Santhosh Kumarc3eca802016-02-17 19:58:28 +05303478 ((eCSR_ROAM_RESULT_NONE == roamResult)||
Padma, Santhosh Kumarbb75a142016-02-25 18:36:46 +05303479 (pRoamInfo && pRoamInfo->is11rAssoc)))
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003480 {
Srinivas Girigowdaeb03ee32013-07-16 11:48:41 -07003481 /* Send DTIM period to the FW; only if the wlan is already
3482 in suspend. This is the case with roaming (reassoc),
3483 DELETE_BSS_REQ zeroes out Modulated/Dynamic DTIM sent in
3484 previous suspend_wlan. Sending SET_POWER_PARAMS_REQ
3485 before the ENTER_BMPS_REQ ensures Listen Interval is
3486 regained back to LI * Modulated DTIM */
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003487 hdd_set_pwrparams(pHddCtx);
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003488
3489 /* At this point, device should not be in BMPS;
Srinivas Girigowdaeb03ee32013-07-16 11:48:41 -07003490 if due to unexpected scenario, if we are in BMPS,
3491 then trigger Exit and Enter BMPS to take DTIM period
3492 effective */
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003493 if (BMPS == pmcGetPmcState(pHddCtx->hHal))
3494 {
3495 hddLog( LOGE, FL("Not expected: device is already in BMPS mode, Exit & Enter BMPS again!"));
3496
Srinivas Girigowda1c3f72e2013-12-18 16:07:00 -08003497 sme_RequestFullPower(WLAN_HDD_GET_HAL_CTX(pAdapter),
3498 iw_full_power_cbfn, pAdapter,
3499 eSME_FULL_PWR_NEEDED_BY_HDD);
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003500 }
3501 }
Padma, Santhosh Kumara4c34572015-07-09 20:00:41 +05303502
3503 if ((pHddCtx) &&
Padma, Santhosh Kumar0a623eb2015-07-27 11:55:29 +05303504 (FULL_POWER == pmcGetPmcState(pHddCtx->hHal)) &&
3505 (VOS_TRUE == pHddStaCtx->hdd_ReassocScenario) &&
Padma, Santhosh Kumarc3eca802016-02-17 19:58:28 +05303506 ((eCSR_ROAM_RESULT_NONE == roamResult) ||
Padma, Santhosh Kumarbb75a142016-02-25 18:36:46 +05303507 (pRoamInfo && pRoamInfo->is11rAssoc)))
Padma, Santhosh Kumara4c34572015-07-09 20:00:41 +05303508 {
3509 hddLog( LOG1, FL("Device in full power."
3510 "Stop and start traffic timer for roaming"));
3511 pmcStopTrafficTimer(pHddCtx->hHal);
3512 if (pmcStartTrafficTimer(pHddCtx->hHal,
3513 TRAFFIC_TIMER_ROAMING) != eHAL_STATUS_SUCCESS)
3514 {
3515 hddLog(LOGP, FL("Cannot start traffic timer"));
3516 }
3517 }
3518
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003519 halStatus = hdd_RoamSetKeyCompleteHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
Padma, Santhosh Kumarc3eca802016-02-17 19:58:28 +05303520 if ((eCSR_ROAM_RESULT_NONE == roamResult) ||
Padma, Santhosh Kumarbb75a142016-02-25 18:36:46 +05303521 (pRoamInfo && pRoamInfo->is11rAssoc))
Padma, Santhosh Kumar0a623eb2015-07-27 11:55:29 +05303522 pHddStaCtx->hdd_ReassocScenario = FALSE;
Srinivas Girigowda66c05eb2013-07-14 13:06:01 -07003523 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003524 break;
3525#ifdef WLAN_FEATURE_VOWIFI_11R
3526 case eCSR_ROAM_FT_RESPONSE:
3527 hdd_SendFTEvent(pAdapter);
3528 break;
3529#endif
Madan Mohan Koyyalamudi1b4afb02012-10-22 15:25:16 -07003530#if defined(FEATURE_WLAN_LFR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
Jeff Johnson04dd8a82012-06-29 20:41:40 -07003531 case eCSR_ROAM_PMK_NOTIFY:
Shailender Karmuchia734f332013-04-19 14:02:48 -07003532 if (eCSR_AUTH_TYPE_RSN == pHddStaCtx->conn_info.authType)
Jeff Johnson43971f52012-07-17 12:26:56 -07003533 {
3534 /* Notify the supplicant of a new candidate */
3535 halStatus = wlan_hdd_cfg80211_pmksa_candidate_notify(pAdapter, pRoamInfo, 1, false);
3536 }
Jeff Johnson04dd8a82012-06-29 20:41:40 -07003537 break;
3538#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003539
Yue Maef608272013-04-08 23:09:17 -07003540#ifdef FEATURE_WLAN_LFR_METRICS
3541 case eCSR_ROAM_PREAUTH_INIT_NOTIFY:
3542 /* This event is to notify pre-auth initiation */
3543 if (VOS_STATUS_SUCCESS !=
3544 wlan_hdd_cfg80211_roam_metrics_preauth(pAdapter, pRoamInfo))
3545 {
3546 halStatus = eHAL_STATUS_FAILURE;
3547 }
3548 break;
3549 case eCSR_ROAM_PREAUTH_STATUS_SUCCESS:
3550 /* This event will notify pre-auth completion in case of success */
3551 if (VOS_STATUS_SUCCESS !=
3552 wlan_hdd_cfg80211_roam_metrics_preauth_status(pAdapter,
3553 pRoamInfo, 1))
3554 {
3555 halStatus = eHAL_STATUS_FAILURE;
3556 }
3557 break;
3558 case eCSR_ROAM_PREAUTH_STATUS_FAILURE:
3559 /* This event will notify pre-auth completion in case of failure. */
3560 if (VOS_STATUS_SUCCESS !=
3561 wlan_hdd_cfg80211_roam_metrics_preauth_status(pAdapter,
3562 pRoamInfo, 0))
3563 {
3564 halStatus = eHAL_STATUS_FAILURE;
3565 }
3566 break;
3567 case eCSR_ROAM_HANDOVER_SUCCESS:
3568 /* This event is to notify handover success.
3569 It will be only invoked on success */
3570 if (VOS_STATUS_SUCCESS !=
3571 wlan_hdd_cfg80211_roam_metrics_handover(pAdapter, pRoamInfo))
3572 {
3573 halStatus = eHAL_STATUS_FAILURE;
3574 }
3575 break;
3576#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003577 case eCSR_ROAM_REMAIN_CHAN_READY:
3578 hdd_remainChanReadyHandler( pAdapter );
3579 break;
3580 case eCSR_ROAM_SEND_ACTION_CNF:
3581 hdd_sendActionCnf( pAdapter,
3582 (roamResult == eCSR_ROAM_RESULT_NONE) ? TRUE : FALSE );
3583 break;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003584#ifdef FEATURE_WLAN_TDLS
Ng Chilamfc416462012-12-27 17:26:52 -08003585 case eCSR_ROAM_TDLS_STATUS_UPDATE:
Gopichand Nakkalab977a972013-02-18 19:15:09 -08003586 halStatus = hdd_RoamTdlsStatusUpdateHandler( pAdapter, pRoamInfo,
Ng Chilamfc416462012-12-27 17:26:52 -08003587 roamId, roamStatus, roamResult );
3588 break ;
Gopichand Nakkalab977a972013-02-18 19:15:09 -08003589 case eCSR_ROAM_RESULT_MGMT_TX_COMPLETE_IND:
3590 wlan_hdd_tdls_mgmt_completion_callback(pAdapter, pRoamInfo->reasonCode);
3591 break;
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003592#endif
Chet Lanctot186b5732013-03-18 10:26:30 -07003593#ifdef WLAN_FEATURE_11W
3594 case eCSR_ROAM_UNPROT_MGMT_FRAME_IND:
3595 hdd_indicateUnprotMgmtFrame(pAdapter, pRoamInfo->nFrameLength,
3596 pRoamInfo->pbFrames,
3597 pRoamInfo->frameType);
3598 break;
3599#endif
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003600#if defined(FEATURE_WLAN_ESE) && defined(FEATURE_WLAN_ESE_UPLOAD)
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07003601 case eCSR_ROAM_TSM_IE_IND:
3602 hdd_indicateTsmIe(pAdapter, pRoamInfo->tsmIe.tsid,
3603 pRoamInfo->tsmIe.state, pRoamInfo->tsmIe.msmt_interval);
3604 break;
3605
3606 case eCSR_ROAM_CCKM_PREAUTH_NOTIFY:
3607 {
3608 if (eCSR_AUTH_TYPE_CCKM_WPA == pHddStaCtx->conn_info.authType ||
3609 eCSR_AUTH_TYPE_CCKM_RSN == pHddStaCtx->conn_info.authType)
3610 {
3611 hdd_indicateCckmPreAuth(pAdapter, pRoamInfo);
3612 }
3613 break;
3614 }
3615
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003616 case eCSR_ROAM_ESE_ADJ_AP_REPORT_IND:
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07003617 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003618 hdd_indicateEseAdjApRepInd(pAdapter, pRoamInfo);
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07003619 break;
3620 }
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08003621
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003622 case eCSR_ROAM_ESE_BCN_REPORT_IND:
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08003623 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003624 hdd_indicateEseBcnReportInd(pAdapter, pRoamInfo);
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08003625 break;
3626 }
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003627#endif /* FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
Girish Gowlia95daca2015-02-04 20:31:31 +05303628 case eCSR_ROAM_UPDATE_MAX_RATE_IND:
3629 {
3630 pAdapter->maxRateFlags = roamResult;
3631 break;
3632 }
Selvaraj, Sridhar59c50392016-06-09 17:08:05 +05303633 case eCSR_ROAM_UPDATE_SCAN_RESULT:
3634 if (pRoamInfo && pRoamInfo->pBssDesc) {
3635 bss_status = wlan_hdd_cfg80211_inform_bss_frame(pAdapter,
3636 pRoamInfo->pBssDesc);
3637 if (bss_status)
3638 cfg80211_put_bss(
3639#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) || defined(WITH_BACKPORTS)
3640 (WLAN_HDD_GET_CTX(pAdapter))->wiphy,
3641#endif
3642 bss_status);
3643 else
3644 hddLog(LOG1, FL("UPDATE_SCAN_RESULT returned NULL"));
3645 }
3646 break;
Girish Gowlia95daca2015-02-04 20:31:31 +05303647 default:
Jeff Johnson295189b2012-06-20 16:38:30 -07003648 break;
3649 }
3650 return( halStatus );
3651}
Shailender Karmuchia734f332013-04-19 14:02:48 -07003652eCsrAuthType hdd_TranslateRSNToCsrAuthType( u_int8_t auth_suite[4])
Jeff Johnson295189b2012-06-20 16:38:30 -07003653{
3654 eCsrAuthType auth_type;
3655 // is the auth type supported?
Shailender Karmuchia734f332013-04-19 14:02:48 -07003656 if ( memcmp(auth_suite , ccpRSNOui01, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003657 {
3658 auth_type = eCSR_AUTH_TYPE_RSN;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003659 } else
3660 if (memcmp(auth_suite , ccpRSNOui02, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003661 {
3662 auth_type = eCSR_AUTH_TYPE_RSN_PSK;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003663 } else
Jeff Johnson295189b2012-06-20 16:38:30 -07003664#ifdef WLAN_FEATURE_VOWIFI_11R
Shailender Karmuchia734f332013-04-19 14:02:48 -07003665 if (memcmp(auth_suite , ccpRSNOui04, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003666 {
3667 // Check for 11r FT Authentication with PSK
3668 auth_type = eCSR_AUTH_TYPE_FT_RSN_PSK;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003669 } else
3670 if (memcmp(auth_suite , ccpRSNOui03, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003671 {
3672 // Check for 11R FT Authentication with 802.1X
3673 auth_type = eCSR_AUTH_TYPE_FT_RSN;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003674 } else
Jeff Johnson295189b2012-06-20 16:38:30 -07003675#endif
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003676#ifdef FEATURE_WLAN_ESE
Shailender Karmuchia734f332013-04-19 14:02:48 -07003677 if (memcmp(auth_suite , ccpRSNOui06, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003678 {
3679 auth_type = eCSR_AUTH_TYPE_CCKM_RSN;
3680 } else
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003681#endif /* FEATURE_WLAN_ESE */
Chet Lanctot186b5732013-03-18 10:26:30 -07003682#ifdef WLAN_FEATURE_11W
3683 if (memcmp(auth_suite , ccpRSNOui07, 4) == 0)
3684 {
3685 auth_type = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
3686 } else
Abhishek Singhae408032014-09-25 17:22:04 +05303687 if (memcmp(auth_suite , ccpRSNOui08, 4) == 0)
3688 {
3689 auth_type = eCSR_AUTH_TYPE_RSN_8021X_SHA256;
3690 } else
Chet Lanctot186b5732013-03-18 10:26:30 -07003691#endif
Shailender Karmuchia734f332013-04-19 14:02:48 -07003692 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003693 auth_type = eCSR_AUTH_TYPE_UNKNOWN;
3694 }
3695 return auth_type;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003696}
Jeff Johnson7dda7772013-02-27 08:36:13 -08003697
Shailender Karmuchia734f332013-04-19 14:02:48 -07003698eCsrAuthType
3699hdd_TranslateWPAToCsrAuthType(u_int8_t auth_suite[4])
Jeff Johnson295189b2012-06-20 16:38:30 -07003700{
3701 eCsrAuthType auth_type;
3702 // is the auth type supported?
Shailender Karmuchia734f332013-04-19 14:02:48 -07003703 if ( memcmp(auth_suite , ccpWpaOui01, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003704 {
3705 auth_type = eCSR_AUTH_TYPE_WPA;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003706 } else
3707 if (memcmp(auth_suite , ccpWpaOui02, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003708 {
3709 auth_type = eCSR_AUTH_TYPE_WPA_PSK;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003710 } else
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003711#ifdef FEATURE_WLAN_ESE
Shailender Karmuchia734f332013-04-19 14:02:48 -07003712 if (memcmp(auth_suite , ccpWpaOui06, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003713 {
3714 auth_type = eCSR_AUTH_TYPE_CCKM_WPA;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003715 } else
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003716#endif /* FEATURE_WLAN_ESE */
Shailender Karmuchia734f332013-04-19 14:02:48 -07003717 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003718 auth_type = eCSR_AUTH_TYPE_UNKNOWN;
3719 }
3720 hddLog(LOG1, FL("auth_type: %d"), auth_type);
3721 return auth_type;
3722}
Jeff Johnson7dda7772013-02-27 08:36:13 -08003723
Shailender Karmuchia734f332013-04-19 14:02:48 -07003724eCsrEncryptionType
Jeff Johnson295189b2012-06-20 16:38:30 -07003725hdd_TranslateRSNToCsrEncryptionType(u_int8_t cipher_suite[4])
Jeff Johnson295189b2012-06-20 16:38:30 -07003726{
3727 eCsrEncryptionType cipher_type;
3728 // is the cipher type supported?
Shailender Karmuchia734f332013-04-19 14:02:48 -07003729 if ( memcmp(cipher_suite , ccpRSNOui04, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003730 {
3731 cipher_type = eCSR_ENCRYPT_TYPE_AES;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003732 }
3733 else if (memcmp(cipher_suite , ccpRSNOui02, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003734 {
3735 cipher_type = eCSR_ENCRYPT_TYPE_TKIP;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003736 }
3737 else if (memcmp(cipher_suite , ccpRSNOui00, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003738 {
3739 cipher_type = eCSR_ENCRYPT_TYPE_NONE;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003740 }
3741 else if (memcmp(cipher_suite , ccpRSNOui01, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003742 {
3743 cipher_type = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003744 }
3745 else if (memcmp(cipher_suite , ccpRSNOui05, 4) == 0)
3746 {
3747 cipher_type = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
3748 }
3749 else
3750 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003751 cipher_type = eCSR_ENCRYPT_TYPE_FAILED;
3752 }
3753 hddLog(LOG1, FL("cipher_type: %d"), cipher_type);
3754 return cipher_type;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003755}
Jeff Johnson295189b2012-06-20 16:38:30 -07003756/* To find if the MAC address is NULL */
3757static tANI_U8 hdd_IsMACAddrNULL (tANI_U8 *macAddr, tANI_U8 length)
3758{
3759 int i;
3760 for (i = 0; i < length; i++)
3761 {
3762 if (0x00 != (macAddr[i]))
3763 {
3764 return FALSE;
3765 }
3766 }
3767 return TRUE;
3768} /****** end hdd_IsMACAddrNULL() ******/
Jeff Johnson7dda7772013-02-27 08:36:13 -08003769
Shailender Karmuchia734f332013-04-19 14:02:48 -07003770eCsrEncryptionType
Jeff Johnson295189b2012-06-20 16:38:30 -07003771hdd_TranslateWPAToCsrEncryptionType(u_int8_t cipher_suite[4])
Jeff Johnson295189b2012-06-20 16:38:30 -07003772{
3773 eCsrEncryptionType cipher_type;
3774 // is the cipher type supported?
Shailender Karmuchia734f332013-04-19 14:02:48 -07003775 if ( memcmp(cipher_suite , ccpWpaOui04, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003776 {
3777 cipher_type = eCSR_ENCRYPT_TYPE_AES;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003778 } else
3779 if (memcmp(cipher_suite , ccpWpaOui02, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003780 {
3781 cipher_type = eCSR_ENCRYPT_TYPE_TKIP;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003782 } else
3783 if (memcmp(cipher_suite , ccpWpaOui00, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003784 {
3785 cipher_type = eCSR_ENCRYPT_TYPE_NONE;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003786 } else
3787 if (memcmp(cipher_suite , ccpWpaOui01, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003788 {
3789 cipher_type = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003790 } else
3791 if (memcmp(cipher_suite , ccpWpaOui05, 4) == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003792 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07003793 cipher_type = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
3794 } else
3795 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003796 cipher_type = eCSR_ENCRYPT_TYPE_FAILED;
3797 }
3798 hddLog(LOG1, FL("cipher_type: %d"), cipher_type);
3799 return cipher_type;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003800}
Jeff Johnson295189b2012-06-20 16:38:30 -07003801
Shailender Karmuchia734f332013-04-19 14:02:48 -07003802static tANI_S32 hdd_ProcessGENIE(hdd_adapter_t *pAdapter,
3803 struct ether_addr *pBssid,
3804 eCsrEncryptionType *pEncryptType,
3805 eCsrEncryptionType *mcEncryptType,
3806 eCsrAuthType *pAuthType,
Chet Lanctot186b5732013-03-18 10:26:30 -07003807#ifdef WLAN_FEATURE_11W
3808 u_int8_t *pMfpRequired,
3809 u_int8_t *pMfpCapable,
3810#endif
Shailender Karmuchia734f332013-04-19 14:02:48 -07003811 u_int16_t gen_ie_len,
3812 u_int8_t *gen_ie)
Jeff Johnson295189b2012-06-20 16:38:30 -07003813{
3814 tHalHandle halHandle = WLAN_HDD_GET_HAL_CTX(pAdapter);
Shailender Karmuchia734f332013-04-19 14:02:48 -07003815 eHalStatus result;
3816 tDot11fIERSN dot11RSNIE;
3817 tDot11fIEWPA dot11WPAIE;
3818 tANI_U32 i;
3819 tANI_U8 *pRsnIe;
3820 tANI_U16 RSNIeLen;
Jeff Johnson295189b2012-06-20 16:38:30 -07003821 tPmkidCacheInfo PMKIDCache[4]; // Local transfer memory
Dhanashri Atre51981c62013-06-13 11:47:57 -07003822 v_BOOL_t updatePMKCache = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003823
3824 /* Clear struct of tDot11fIERSN and tDot11fIEWPA specifically setting present
3825 flag to 0 */
3826 memset( &dot11WPAIE, 0 , sizeof(tDot11fIEWPA) );
3827 memset( &dot11RSNIE, 0 , sizeof(tDot11fIERSN) );
3828
Jeff Johnson295189b2012-06-20 16:38:30 -07003829 // Type check
Shailender Karmuchia734f332013-04-19 14:02:48 -07003830 if ( gen_ie[0] == DOT11F_EID_RSN)
3831 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003832 // Validity checks
Shailender Karmuchia734f332013-04-19 14:02:48 -07003833 if ((gen_ie_len < DOT11F_IE_RSN_MIN_LEN ) ||
Jeff Johnson295189b2012-06-20 16:38:30 -07003834 (gen_ie_len > DOT11F_IE_RSN_MAX_LEN) )
3835 {
Arun Kumar Khandavalli138f3c12013-12-13 16:24:33 +05303836 hddLog(LOGE, "%s: Invalid DOT11F RSN IE length :%d\n",
3837 __func__, gen_ie_len);
Jeff Johnson295189b2012-06-20 16:38:30 -07003838 return -EINVAL;
3839 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07003840 // Skip past the EID byte and length byte
3841 pRsnIe = gen_ie + 2;
3842 RSNIeLen = gen_ie_len - 2;
3843 // Unpack the RSN IE
3844 dot11fUnpackIeRSN((tpAniSirGlobal) halHandle,
3845 pRsnIe,
3846 RSNIeLen,
Jeff Johnson295189b2012-06-20 16:38:30 -07003847 &dot11RSNIE);
Shailender Karmuchia734f332013-04-19 14:02:48 -07003848 // Copy out the encryption and authentication types
3849 hddLog(LOG1, FL("%s: pairwise cipher suite count: %d"),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003850 __func__, dot11RSNIE.pwise_cipher_suite_count );
Shailender Karmuchia734f332013-04-19 14:02:48 -07003851 hddLog(LOG1, FL("%s: authentication suite count: %d"),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003852 __func__, dot11RSNIE.akm_suite_count);
Shailender Karmuchia734f332013-04-19 14:02:48 -07003853 /*Here we have followed the apple base code,
Jeff Johnson295189b2012-06-20 16:38:30 -07003854 but probably I suspect we can do something different*/
3855 //dot11RSNIE.akm_suite_count
Shailender Karmuchia734f332013-04-19 14:02:48 -07003856 // Just translate the FIRST one
3857 *pAuthType = hdd_TranslateRSNToCsrAuthType(dot11RSNIE.akm_suites[0]);
3858 //dot11RSNIE.pwise_cipher_suite_count
3859 *pEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.pwise_cipher_suites[0]);
3860 //dot11RSNIE.gp_cipher_suite_count
3861 *mcEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.gp_cipher_suite);
Chet Lanctot186b5732013-03-18 10:26:30 -07003862#ifdef WLAN_FEATURE_11W
3863 *pMfpRequired = (dot11RSNIE.RSN_Cap[0] >> 6) & 0x1 ;
3864 *pMfpCapable = (dot11RSNIE.RSN_Cap[0] >> 7) & 0x1 ;
3865#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003866 // Set the PMKSA ID Cache for this interface
Shailender Karmuchia734f332013-04-19 14:02:48 -07003867 for (i=0; i<dot11RSNIE.pmkid_count; i++)
Jeff Johnson295189b2012-06-20 16:38:30 -07003868 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07003869 if ( pBssid == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07003870 {
Arun Kumar Khandavalli138f3c12013-12-13 16:24:33 +05303871 hddLog(LOGE, "%s: pBssid passed is NULL", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003872 break;
3873 }
Dhanashri Atre51981c62013-06-13 11:47:57 -07003874 if ( hdd_IsMACAddrNULL( (u_char *) pBssid->ether_addr_octet , 6))
Jeff Johnson295189b2012-06-20 16:38:30 -07003875 {
Arun Kumar Khandavalli138f3c12013-12-13 16:24:33 +05303876 hddLog(LOGE, "%s: Invalid MAC adrr", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003877 break;
3878 }
Dhanashri Atre51981c62013-06-13 11:47:57 -07003879 updatePMKCache = TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 // For right now, I assume setASSOCIATE() has passed in the bssid.
3881 vos_mem_copy(PMKIDCache[i].BSSID,
3882 pBssid, ETHER_ADDR_LEN);
3883 vos_mem_copy(PMKIDCache[i].PMKID,
3884 dot11RSNIE.pmkid[i],
3885 CSR_RSN_PMKID_SIZE);
3886 }
Dhanashri Atre51981c62013-06-13 11:47:57 -07003887
3888 if (updatePMKCache)
3889 {
3890 // Calling csrRoamSetPMKIDCache to configure the PMKIDs into the cache
Jeff Johnson0299d0a2013-10-30 12:37:43 -07003891 hddLog(LOG1, FL("%s: Calling csrRoamSetPMKIDCache with cache entry %d."),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003892 __func__, i );
Dhanashri Atre51981c62013-06-13 11:47:57 -07003893 // Finally set the PMKSA ID Cache in CSR
3894 result = sme_RoamSetPMKIDCache(halHandle,pAdapter->sessionId,
3895 PMKIDCache,
Kanchanapally, Vidyullatha2633ace2014-09-25 15:16:50 +05303896 dot11RSNIE.pmkid_count,
3897 FALSE);
Dhanashri Atre51981c62013-06-13 11:47:57 -07003898 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003899 }
3900 else if (gen_ie[0] == DOT11F_EID_WPA)
3901 {
3902 // Validity checks
3903 if ((gen_ie_len < DOT11F_IE_WPA_MIN_LEN ) ||
3904 (gen_ie_len > DOT11F_IE_WPA_MAX_LEN))
3905 {
Arun Kumar Khandavalli138f3c12013-12-13 16:24:33 +05303906 hddLog(LOGE, "%s: Invalid DOT11F WPA IE length :%d\n",
3907 __func__, gen_ie_len);
Jeff Johnson295189b2012-06-20 16:38:30 -07003908 return -EINVAL;
3909 }
3910 // Skip past the EID byte and length byte - and four byte WiFi OUI
Shailender Karmuchia734f332013-04-19 14:02:48 -07003911 pRsnIe = gen_ie + 2 + 4;
3912 RSNIeLen = gen_ie_len - (2 + 4);
3913 // Unpack the WPA IE
Jeff Johnson295189b2012-06-20 16:38:30 -07003914 dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
3915 pRsnIe,
3916 RSNIeLen,
3917 &dot11WPAIE);
3918 // Copy out the encryption and authentication types
3919 hddLog(LOG1, FL("%s: WPA unicast cipher suite count: %d"),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003920 __func__, dot11WPAIE.unicast_cipher_count );
Jeff Johnson295189b2012-06-20 16:38:30 -07003921 hddLog(LOG1, FL("%s: WPA authentication suite count: %d"),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003922 __func__, dot11WPAIE.auth_suite_count);
Jeff Johnson295189b2012-06-20 16:38:30 -07003923 //dot11WPAIE.auth_suite_count
3924 // Just translate the FIRST one
3925 *pAuthType = hdd_TranslateWPAToCsrAuthType(dot11WPAIE.auth_suites[0]);
3926 //dot11WPAIE.unicast_cipher_count
3927 *pEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.unicast_ciphers[0]);
3928 //dot11WPAIE.unicast_cipher_count
3929 *mcEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.multicast_cipher);
3930 }
3931 else
3932 {
3933 hddLog(LOGW, FL("gen_ie[0]: %d"), gen_ie[0]);
Shailender Karmuchia734f332013-04-19 14:02:48 -07003934 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003935 }
3936 return 0;
3937}
3938int hdd_SetGENIEToCsr( hdd_adapter_t *pAdapter, eCsrAuthType *RSNAuthType)
3939{
3940 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
3941 v_U32_t status = 0;
3942 eCsrEncryptionType RSNEncryptType;
3943 eCsrEncryptionType mcRSNEncryptType;
Chet Lanctot186b5732013-03-18 10:26:30 -07003944#ifdef WLAN_FEATURE_11W
Abhishek Singh4f6406d2015-10-07 13:43:52 +05303945 u_int8_t RSNMfpRequired = 0;
3946 u_int8_t RSNMfpCapable = 0;
Chet Lanctot186b5732013-03-18 10:26:30 -07003947#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003948 struct ether_addr bSsid; // MAC address of assoc peer
3949 // MAC address of assoc peer
3950 // But, this routine is only called when we are NOT associated.
3951 vos_mem_copy(bSsid.ether_addr_octet,
3952 pWextState->roamProfile.BSSIDs.bssid,
3953 sizeof(bSsid.ether_addr_octet));
3954 if (pWextState->WPARSNIE[0] == DOT11F_EID_RSN || pWextState->WPARSNIE[0] == DOT11F_EID_WPA)
3955 {
3956 //continue
Shailender Karmuchia734f332013-04-19 14:02:48 -07003957 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003958 else
3959 {
3960 return 0;
3961 }
3962 // The actual processing may eventually be more extensive than this.
3963 // Right now, just consume any PMKIDs that are sent in by the app.
3964 status = hdd_ProcessGENIE(pAdapter,
3965 &bSsid, // MAC address of assoc peer
3966 &RSNEncryptType,
3967 &mcRSNEncryptType,
3968 RSNAuthType,
Chet Lanctot186b5732013-03-18 10:26:30 -07003969#ifdef WLAN_FEATURE_11W
3970 &RSNMfpRequired,
3971 &RSNMfpCapable,
3972#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003973 pWextState->WPARSNIE[1]+2,
3974 pWextState->WPARSNIE);
3975 if (status == 0)
3976 {
3977 // Now copy over all the security attributes you have parsed out
3978 pWextState->roamProfile.EncryptionType.numEntries = 1;
3979 pWextState->roamProfile.mcEncryptionType.numEntries = 1;
Shailender Karmuchia734f332013-04-19 14:02:48 -07003980
Jeff Johnson295189b2012-06-20 16:38:30 -07003981 pWextState->roamProfile.EncryptionType.encryptionType[0] = RSNEncryptType; // Use the cipher type in the RSN IE
3982 pWextState->roamProfile.mcEncryptionType.encryptionType[0] = mcRSNEncryptType;
Chet Lanctot186b5732013-03-18 10:26:30 -07003983
Shailender Karmuchi642e9812013-05-30 14:34:49 -07003984 if ( (WLAN_HDD_IBSS == pAdapter->device_mode) &&
3985 ((eCSR_ENCRYPT_TYPE_AES == mcRSNEncryptType) ||
3986 (eCSR_ENCRYPT_TYPE_TKIP == mcRSNEncryptType)))
3987 {
3988 /*For wpa none supplicant sends the WPA IE with unicast cipher as
3989 eCSR_ENCRYPT_TYPE_NONE ,where as the multicast cipher as
3990 either AES/TKIP based on group cipher configuration
3991 mentioned in the wpa_supplicant.conf.*/
3992
3993 /*Set the unicast cipher same as multicast cipher*/
3994 pWextState->roamProfile.EncryptionType.encryptionType[0]
3995 = mcRSNEncryptType;
3996 }
3997
Chet Lanctot186b5732013-03-18 10:26:30 -07003998#ifdef WLAN_FEATURE_11W
Abhishek Singh4f6406d2015-10-07 13:43:52 +05303999 hddLog( LOG1, FL("RSNMfpRequired = %d, RSNMfpCapable = %d"),
4000 RSNMfpRequired, RSNMfpCapable);
Chet Lanctot186b5732013-03-18 10:26:30 -07004001 pWextState->roamProfile.MFPRequired = RSNMfpRequired;
4002 pWextState->roamProfile.MFPCapable = RSNMfpCapable;
4003#endif
Abhishek Singh4f6406d2015-10-07 13:43:52 +05304004 hddLog( LOG1,
4005 FL("CSR AuthType = %d, EncryptionType = %d mcEncryptionType = %d"),
4006 *RSNAuthType, RSNEncryptType, mcRSNEncryptType);
Jeff Johnson295189b2012-06-20 16:38:30 -07004007 }
4008 return 0;
4009}
4010int hdd_set_csr_auth_type ( hdd_adapter_t *pAdapter, eCsrAuthType RSNAuthType)
4011{
4012 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4013 tCsrRoamProfile* pRoamProfile = &(pWextState->roamProfile);
4014 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4015 ENTER();
Shailender Karmuchia734f332013-04-19 14:02:48 -07004016
Jeff Johnson295189b2012-06-20 16:38:30 -07004017 pRoamProfile->AuthType.numEntries = 1;
Arif Hussain6d2a3322013-11-17 19:50:10 -08004018 hddLog( LOG1, "%s: pHddStaCtx->conn_info.authType = %d", __func__, pHddStaCtx->conn_info.authType);
Shailender Karmuchia734f332013-04-19 14:02:48 -07004019
Jeff Johnson295189b2012-06-20 16:38:30 -07004020 switch( pHddStaCtx->conn_info.authType)
4021 {
4022 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004023#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07004024 case eCSR_AUTH_TYPE_CCKM_WPA:
4025 case eCSR_AUTH_TYPE_CCKM_RSN:
4026#endif
Shailender Karmuchia734f332013-04-19 14:02:48 -07004027 if (pWextState->wpaVersion & IW_AUTH_WPA_VERSION_DISABLED) {
4028
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM ;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004030 } else
Jeff Johnson295189b2012-06-20 16:38:30 -07004031 if (pWextState->wpaVersion & IW_AUTH_WPA_VERSION_WPA) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004032
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004033#ifdef FEATURE_WLAN_ESE
Shailender Karmuchia734f332013-04-19 14:02:48 -07004034 if ((RSNAuthType == eCSR_AUTH_TYPE_CCKM_WPA) &&
4035 ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)
4036 == IW_AUTH_KEY_MGMT_802_1X)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004037 hddLog( LOG1, "%s: set authType to CCKM WPA. AKM also 802.1X.", __func__);
Shailender Karmuchia734f332013-04-19 14:02:48 -07004038 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_CCKM_WPA;
4039 } else
4040 if ((RSNAuthType == eCSR_AUTH_TYPE_CCKM_WPA)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004041 hddLog( LOG1, "%s: Last chance to set authType to CCKM WPA.", __func__);
Shailender Karmuchia734f332013-04-19 14:02:48 -07004042 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_CCKM_WPA;
Jeff Johnson295189b2012-06-20 16:38:30 -07004043 } else
4044#endif
4045 if((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)
4046 == IW_AUTH_KEY_MGMT_802_1X) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004047 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_WPA;
4048 } else
Jeff Johnson295189b2012-06-20 16:38:30 -07004049 if ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_PSK)
4050 == IW_AUTH_KEY_MGMT_PSK) {
4051 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_WPA_PSK;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004052 } else {
Jeff Johnson295189b2012-06-20 16:38:30 -07004053 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_WPA_NONE;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004054 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004055 }
4056 if (pWextState->wpaVersion & IW_AUTH_WPA_VERSION_WPA2) {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004057#ifdef FEATURE_WLAN_ESE
Shailender Karmuchia734f332013-04-19 14:02:48 -07004058 if ((RSNAuthType == eCSR_AUTH_TYPE_CCKM_RSN) &&
4059 ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)
4060 == IW_AUTH_KEY_MGMT_802_1X)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004061 hddLog( LOG1, "%s: set authType to CCKM RSN. AKM also 802.1X.", __func__);
Shailender Karmuchia734f332013-04-19 14:02:48 -07004062 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_CCKM_RSN;
Jeff Johnson295189b2012-06-20 16:38:30 -07004063 } else
Shailender Karmuchia734f332013-04-19 14:02:48 -07004064 if ((RSNAuthType == eCSR_AUTH_TYPE_CCKM_RSN)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004065 hddLog( LOG1, "%s: Last chance to set authType to CCKM RSN.", __func__);
Shailender Karmuchia734f332013-04-19 14:02:48 -07004066 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_CCKM_RSN;
Jeff Johnson295189b2012-06-20 16:38:30 -07004067 } else
4068#endif
4069
4070#ifdef WLAN_FEATURE_VOWIFI_11R
Shailender Karmuchia734f332013-04-19 14:02:48 -07004071 if ((RSNAuthType == eCSR_AUTH_TYPE_FT_RSN) &&
4072 ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)
Jeff Johnson295189b2012-06-20 16:38:30 -07004073 == IW_AUTH_KEY_MGMT_802_1X)) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004074 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_FT_RSN;
Jeff Johnson43971f52012-07-17 12:26:56 -07004075 }else
Shailender Karmuchia734f332013-04-19 14:02:48 -07004076 if ((RSNAuthType == eCSR_AUTH_TYPE_FT_RSN_PSK) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004077 ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_PSK)
4078 == IW_AUTH_KEY_MGMT_PSK)) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004079 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_FT_RSN_PSK;
Jeff Johnson295189b2012-06-20 16:38:30 -07004080 } else
4081#endif
4082
Chet Lanctot186b5732013-03-18 10:26:30 -07004083#ifdef WLAN_FEATURE_11W
4084 if (RSNAuthType == eCSR_AUTH_TYPE_RSN_PSK_SHA256) {
4085 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
4086 } else
Abhishek Singhae408032014-09-25 17:22:04 +05304087 if (RSNAuthType == eCSR_AUTH_TYPE_RSN_8021X_SHA256) {
4088 pRoamProfile->AuthType.authType[0] =
4089 eCSR_AUTH_TYPE_RSN_8021X_SHA256;
4090 } else
Chet Lanctot186b5732013-03-18 10:26:30 -07004091#endif
4092
Shailender Karmuchia734f332013-04-19 14:02:48 -07004093 if( (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)
Jeff Johnson295189b2012-06-20 16:38:30 -07004094 == IW_AUTH_KEY_MGMT_802_1X) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004095 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_RSN;
4096 } else
Jeff Johnson295189b2012-06-20 16:38:30 -07004097 if ( (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_PSK)
4098 == IW_AUTH_KEY_MGMT_PSK) {
4099 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_RSN_PSK;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004100 } else {
Jeff Johnson295189b2012-06-20 16:38:30 -07004101 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_UNKNOWN;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004102 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004103 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004104 break;
4105
Jeff Johnson295189b2012-06-20 16:38:30 -07004106 case eCSR_AUTH_TYPE_SHARED_KEY:
Shailender Karmuchia734f332013-04-19 14:02:48 -07004107
4108 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_SHARED_KEY;
Jeff Johnson295189b2012-06-20 16:38:30 -07004109 break;
4110 default:
Shailender Karmuchia734f332013-04-19 14:02:48 -07004111
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004112#ifdef FEATURE_WLAN_ESE
Arif Hussain6d2a3322013-11-17 19:50:10 -08004113 hddLog( LOG1, "%s: In default, unknown auth type.", __func__);
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004114#endif /* FEATURE_WLAN_ESE */
Jeff Johnson295189b2012-06-20 16:38:30 -07004115 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_UNKNOWN;
4116 break;
4117 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004118
Jeff Johnson295189b2012-06-20 16:38:30 -07004119 hddLog( LOG1, "%s Set roam Authtype to %d",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004120 __func__, pWextState->roamProfile.AuthType.authType[0]);
Shailender Karmuchia734f332013-04-19 14:02:48 -07004121
Jeff Johnson295189b2012-06-20 16:38:30 -07004122 EXIT();
4123 return 0;
4124}
4125
4126/**---------------------------------------------------------------------------
Shailender Karmuchia734f332013-04-19 14:02:48 -07004127
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304128 \brief __iw_set_essid() -
Jeff Johnson295189b2012-06-20 16:38:30 -07004129 This function sets the ssid received from wpa_supplicant
Shailender Karmuchia734f332013-04-19 14:02:48 -07004130 to the CSR roam profile.
4131
Jeff Johnson295189b2012-06-20 16:38:30 -07004132 \param - dev - Pointer to the net device.
4133 - info - Pointer to the iw_request_info.
4134 - wrqu - Pointer to the iwreq_data.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004135 - extra - Pointer to the data.
Jeff Johnson295189b2012-06-20 16:38:30 -07004136 \return - 0 for success, non zero for failure
Shailender Karmuchia734f332013-04-19 14:02:48 -07004137
Jeff Johnson295189b2012-06-20 16:38:30 -07004138 --------------------------------------------------------------------------*/
4139
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304140int __iw_set_essid(struct net_device *dev,
4141 struct iw_request_info *info,
4142 union iwreq_data *wrqu, char *extra)
Jeff Johnson295189b2012-06-20 16:38:30 -07004143{
4144 v_U32_t status = 0;
4145 hdd_wext_state_t *pWextState;
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304146 hdd_adapter_t *pAdapter;
4147 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 v_U32_t roamId;
4149 tCsrRoamProfile *pRoamProfile;
4150 eMib_dot11DesiredBssType connectedBssType;
4151 eCsrAuthType RSNAuthType;
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304152 tHalHandle hHal;
4153 hdd_station_ctx_t *pHddStaCtx;
4154 int ret = 0;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004155
Jeff Johnson295189b2012-06-20 16:38:30 -07004156 ENTER();
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304157 pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4158 if (NULL == pAdapter)
Jeff Johnson295189b2012-06-20 16:38:30 -07004159 {
Agarwal Ashish971c2882013-10-30 20:11:12 +05304160 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304161 "%s: Adapter is NULL",__func__);
4162 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004163 }
4164
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304165 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4166 ret = wlan_hdd_validate_context(pHddCtx);
4167 if (0 != ret)
4168 {
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304169 return ret;
4170 }
4171
4172 hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
4173 if (NULL == hHal)
4174 {
4175 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4176 "%s: Hal Context is NULL",__func__);
4177 return -EINVAL;
4178 }
4179 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4180 if (NULL == pHddStaCtx)
4181 {
4182 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4183 "%s: STA Context is NULL",__func__);
4184 return -EINVAL;
4185 }
4186 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4187 if (NULL == pWextState)
4188 {
4189 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4190 "%s: pWextState is NULL",__func__);
4191 return -EINVAL;
4192 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004193 if(pWextState->mTKIPCounterMeasures == TKIP_COUNTER_MEASURE_STARTED) {
4194 hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "%s :Counter measure is in progress", __func__);
4195 return -EBUSY;
4196 }
4197 if( SIR_MAC_MAX_SSID_LENGTH < wrqu->essid.length )
4198 return -EINVAL;
4199 pRoamProfile = &pWextState->roamProfile;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004200 if (pRoamProfile)
Jeff Johnson295189b2012-06-20 16:38:30 -07004201 {
4202 if ( hdd_connGetConnectedBssType( pHddStaCtx, &connectedBssType ) ||
4203 ( eMib_dot11DesiredBssType_independent == pHddStaCtx->conn_info.connDot11DesiredBssType ))
4204 {
4205 VOS_STATUS vosStatus;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004206 // need to issue a disconnect to CSR.
Jeff Johnson295189b2012-06-20 16:38:30 -07004207 INIT_COMPLETION(pAdapter->disconnect_comp_var);
4208 vosStatus = sme_RoamDisconnect( hHal, pAdapter->sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED );
4209
4210 if(VOS_STATUS_SUCCESS == vosStatus)
4211 wait_for_completion_interruptible_timeout(&pAdapter->disconnect_comp_var,
4212 msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
4213 }
4214 }
4215 /** wpa_supplicant 0.8.x, wext driver uses */
Shailender Karmuchia734f332013-04-19 14:02:48 -07004216 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004217 {
4218 return -EINVAL;
4219 }
4220 /** wpa_supplicant 0.8.x, wext driver uses */
Shailender Karmuchia734f332013-04-19 14:02:48 -07004221 /** when cfg80211 defined, wpa_supplicant wext driver uses
4222 zero-length, null-string ssid for force disconnection.
4223 after disconnection (if previously connected) and cleaning ssid,
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 driver MUST return success */
4225 if ( 0 == wrqu->essid.length ) {
4226 return 0;
4227 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004228
4229 status = hdd_wmm_get_uapsd_mask(pAdapter,
4230 &pWextState->roamProfile.uapsd_mask);
4231 if (VOS_STATUS_SUCCESS != status)
4232 {
4233 pWextState->roamProfile.uapsd_mask = 0;
4234 }
4235 pWextState->roamProfile.SSIDs.numOfSSIDs = 1;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004236
Jeff Johnson295189b2012-06-20 16:38:30 -07004237 pWextState->roamProfile.SSIDs.SSIDList->SSID.length = wrqu->essid.length;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004238
4239 vos_mem_zero(pWextState->roamProfile.SSIDs.SSIDList->SSID.ssId, sizeof(pWextState->roamProfile.SSIDs.SSIDList->SSID.ssId));
Jeff Johnson295189b2012-06-20 16:38:30 -07004240 vos_mem_copy((void *)(pWextState->roamProfile.SSIDs.SSIDList->SSID.ssId), extra, wrqu->essid.length);
4241 if (IW_AUTH_WPA_VERSION_WPA == pWextState->wpaVersion ||
4242 IW_AUTH_WPA_VERSION_WPA2 == pWextState->wpaVersion ) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004243
Jeff Johnson295189b2012-06-20 16:38:30 -07004244 //set gen ie
4245 hdd_SetGENIEToCsr(pAdapter, &RSNAuthType);
4246
4247 //set auth
4248 hdd_set_csr_auth_type(pAdapter, RSNAuthType);
4249 }
4250#ifdef FEATURE_WLAN_WAPI
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004251 hddLog(LOG1, "%s: Setting WAPI AUTH Type and Encryption Mode values", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004252 if (pAdapter->wapi_info.nWapiMode)
4253 {
4254 switch (pAdapter->wapi_info.wapiAuthMode)
4255 {
4256 case WAPI_AUTH_MODE_PSK:
4257 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004258 hddLog(LOG1, "%s: WAPI AUTH TYPE: PSK: %d", __func__, pAdapter->wapi_info.wapiAuthMode);
Jeff Johnson295189b2012-06-20 16:38:30 -07004259 pRoamProfile->AuthType.numEntries = 1;
4260 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_WAPI_WAI_PSK;
4261 break;
4262 }
4263 case WAPI_AUTH_MODE_CERT:
4264 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004265 hddLog(LOG1, "%s: WAPI AUTH TYPE: CERT: %d", __func__, pAdapter->wapi_info.wapiAuthMode);
Jeff Johnson295189b2012-06-20 16:38:30 -07004266 pRoamProfile->AuthType.numEntries = 1;
4267 pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE;
4268 break;
4269 }
4270 } // End of switch
4271 if ( pAdapter->wapi_info.wapiAuthMode == WAPI_AUTH_MODE_PSK ||
4272 pAdapter->wapi_info.wapiAuthMode == WAPI_AUTH_MODE_CERT)
4273 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004274 hddLog(LOG1, "%s: WAPI PAIRWISE/GROUP ENCRYPTION: WPI", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004275 pRoamProfile->EncryptionType.numEntries = 1;
4276 pRoamProfile->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_WPI;
4277 pRoamProfile->mcEncryptionType.numEntries = 1;
4278 pRoamProfile->mcEncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_WPI;
4279 }
4280 }
4281#endif /* FEATURE_WLAN_WAPI */
4282 /* if previous genIE is not NULL, update AssocIE */
4283 if (0 != pWextState->genIE.length)
4284 {
4285 memset( &pWextState->assocAddIE, 0, sizeof(pWextState->assocAddIE) );
4286 memcpy( pWextState->assocAddIE.addIEdata, pWextState->genIE.addIEdata,
4287 pWextState->genIE.length);
4288 pWextState->assocAddIE.length = pWextState->genIE.length;
4289 pWextState->roamProfile.pAddIEAssoc = pWextState->assocAddIE.addIEdata;
4290 pWextState->roamProfile.nAddIEAssocLength = pWextState->assocAddIE.length;
4291
4292 /* clear previous genIE after use it */
4293 memset( &pWextState->genIE, 0, sizeof(pWextState->genIE) );
4294 }
4295
4296 /* assumes it is not WPS Association by default, except when pAddIEAssoc has WPS IE */
4297 pWextState->roamProfile.bWPSAssociation = FALSE;
4298
4299 if (NULL != wlan_hdd_get_wps_ie_ptr(pWextState->roamProfile.pAddIEAssoc,
4300 pWextState->roamProfile.nAddIEAssocLength))
4301 pWextState->roamProfile.bWPSAssociation = TRUE;
4302
4303
4304 // Disable auto BMPS entry by PMC until DHCP is done
4305 sme_SetDHCPTillPowerActiveFlag(WLAN_HDD_GET_HAL_CTX(pAdapter), TRUE);
4306
Shailender Karmuchia734f332013-04-19 14:02:48 -07004307 pWextState->roamProfile.csrPersona = pAdapter->device_mode;
Jeff Johnson295189b2012-06-20 16:38:30 -07004308 (WLAN_HDD_GET_CTX(pAdapter))->isAmpAllowed = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004309
Ravi Joshiaeb7d9e2013-05-02 12:28:14 -07004310 if ( eCSR_BSS_TYPE_START_IBSS == pRoamProfile->BSSType )
4311 {
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07004312 hdd_select_cbmode(pAdapter,
4313 (WLAN_HDD_GET_CTX(pAdapter))->cfg_ini->AdHocChannel5G);
4314 }
Agarwal Ashish40f9b872015-09-01 16:17:35 +05304315 /*
4316 * Change conn_state to connecting before sme_RoamConnect(),
4317 * because sme_RoamConnect() has a direct path to call
4318 * hdd_smeRoamCallback(), which will change the conn_state
4319 * If direct path, conn_state will be accordingly changed
4320 * to NotConnected or Associated by either
4321 * hdd_AssociationCompletionHandler() or hdd_DisConnectHandler()
4322 * in sme_RoamCallback()
4323 * if sme_RomConnect is to be queued,
4324 * Connecting state will remain until it is completed.
4325 *
4326 * If connection state is not changed,
4327 * connection state will remain in eConnectionState_NotConnected state.
4328 * In hdd_AssociationCompletionHandler, "hddDisconInProgress" is set to true
4329 * if conn state is eConnectionState_NotConnected.
4330 * If "hddDisconInProgress" is set to true then cfg80211 layer is not
4331 * informed of connect result indication which is an issue.
4332 */
4333 if (WLAN_HDD_INFRA_STATION == pAdapter->device_mode ||
4334 WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)
4335 {
4336 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4337 FL("Set HDD connState to eConnectionState_Connecting"));
4338 hdd_connSetConnectionState(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
4339 eConnectionState_Connecting);
4340 }
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07004341 status = sme_RoamConnect( hHal,pAdapter->sessionId,
4342 &(pWextState->roamProfile), &roamId);
Agarwal Ashish40f9b872015-09-01 16:17:35 +05304343
4344 if ((eHAL_STATUS_SUCCESS != status) &&
4345 (WLAN_HDD_INFRA_STATION == pAdapter->device_mode ||
4346 WLAN_HDD_P2P_CLIENT == pAdapter->device_mode))
4347 {
4348 hddLog(VOS_TRACE_LEVEL_ERROR,
4349 FL("sme_RoamConnect (session %d) failed with status %d. -> NotConnected"),
4350 pAdapter->sessionId, status);
4351 /* change back to NotAssociated */
4352 hdd_connSetConnectionState(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
4353 eConnectionState_NotConnected);
4354 }
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07004355 pRoamProfile->ChannelInfo.ChannelList = NULL;
4356 pRoamProfile->ChannelInfo.numOfChannels = 0;
Ravi Joshiaeb7d9e2013-05-02 12:28:14 -07004357
Shailender Karmuchi15cd0672013-05-15 19:50:04 -07004358 EXIT();
4359 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07004360}
Ravi Joshiaeb7d9e2013-05-02 12:28:14 -07004361
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304362int iw_set_essid(struct net_device *dev,
4363 struct iw_request_info *info,
4364 union iwreq_data *wrqu, char *extra)
4365{
4366 int ret;
4367
4368 vos_ssr_protect(__func__);
4369 ret = __iw_set_essid(dev, info, wrqu, extra);
4370 vos_ssr_unprotect(__func__);
4371
4372 return ret;
4373}
4374
Jeff Johnson295189b2012-06-20 16:38:30 -07004375/**---------------------------------------------------------------------------
Shailender Karmuchia734f332013-04-19 14:02:48 -07004376
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304377 \brief __iw_get_essid() -
Jeff Johnson295189b2012-06-20 16:38:30 -07004378 This function returns the essid to the wpa_supplicant.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004379
Jeff Johnson295189b2012-06-20 16:38:30 -07004380 \param - dev - Pointer to the net device.
4381 - info - Pointer to the iw_request_info.
4382 - wrqu - Pointer to the iwreq_data.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004383 - extra - Pointer to the data.
Jeff Johnson295189b2012-06-20 16:38:30 -07004384 \return - 0 for success, non zero for failure
Shailender Karmuchia734f332013-04-19 14:02:48 -07004385
Jeff Johnson295189b2012-06-20 16:38:30 -07004386 --------------------------------------------------------------------------*/
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304387int __iw_get_essid(struct net_device *dev,
4388 struct iw_request_info *info,
4389 struct iw_point *dwrq, char *extra)
Jeff Johnson295189b2012-06-20 16:38:30 -07004390{
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304391 hdd_adapter_t *pAdapter;
4392 hdd_context_t *pHddCtx;
4393 hdd_wext_state_t *wextBuf;
4394 hdd_station_ctx_t *pHddStaCtx;
4395 int ret = 0;
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304396
Jeff Johnson295189b2012-06-20 16:38:30 -07004397 ENTER();
4398
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304399 pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4400 if (NULL == pAdapter)
4401 {
4402 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4403 "%s: Adapter is NULL",__func__);
4404 return -EINVAL;
4405 }
4406
4407 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4408 ret = wlan_hdd_validate_context(pHddCtx);
4409 if (0 != ret)
4410 {
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304411 return ret;
4412 }
4413
4414 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4415 if (NULL == pHddStaCtx)
4416 {
4417 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4418 "%s: STA Context is NULL",__func__);
4419 return -EINVAL;
4420 }
4421
4422 wextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4423 if (NULL == wextBuf)
4424 {
4425 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4426 "%s: wextBuf is NULL",__func__);
4427 return -EINVAL;
4428 }
4429
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 if((pHddStaCtx->conn_info.connState == eConnectionState_Associated &&
4431 wextBuf->roamProfile.SSIDs.SSIDList->SSID.length > 0) ||
4432 ((pHddStaCtx->conn_info.connState == eConnectionState_IbssConnected ||
4433 pHddStaCtx->conn_info.connState == eConnectionState_IbssDisconnected) &&
4434 wextBuf->roamProfile.SSIDs.SSIDList->SSID.length > 0))
4435 {
4436 dwrq->length = pHddStaCtx->conn_info.SSID.SSID.length;
4437 memcpy(extra, pHddStaCtx->conn_info.SSID.SSID.ssId, dwrq->length);
4438 dwrq->flags = 1;
4439 } else {
4440 memset(extra, 0, dwrq->length);
4441 dwrq->length = 0;
4442 dwrq->flags = 0;
4443 }
4444 EXIT();
4445 return 0;
4446}
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304447
4448int iw_get_essid(struct net_device *dev,
4449 struct iw_request_info *info,
4450 struct iw_point *dwrq, char *extra)
4451{
4452 int ret;
4453
4454 vos_ssr_protect(__func__);
4455 ret = __iw_get_essid(dev, info, dwrq, extra);
4456 vos_ssr_unprotect(__func__);
4457
4458 return ret;
4459}
Jeff Johnson295189b2012-06-20 16:38:30 -07004460/**---------------------------------------------------------------------------
Shailender Karmuchia734f332013-04-19 14:02:48 -07004461
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304462 \brief __iw_set_auth() -
Jeff Johnson295189b2012-06-20 16:38:30 -07004463 This function sets the auth type received from the wpa_supplicant.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004464
Jeff Johnson295189b2012-06-20 16:38:30 -07004465 \param - dev - Pointer to the net device.
4466 - info - Pointer to the iw_request_info.
4467 - wrqu - Pointer to the iwreq_data.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004468 - extra - Pointer to the data.
Jeff Johnson295189b2012-06-20 16:38:30 -07004469 \return - 0 for success, non zero for failure
Shailender Karmuchia734f332013-04-19 14:02:48 -07004470
Jeff Johnson295189b2012-06-20 16:38:30 -07004471 --------------------------------------------------------------------------*/
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304472int __iw_set_auth(struct net_device *dev,struct iw_request_info *info,
4473 union iwreq_data *wrqu,char *extra)
Jeff Johnson295189b2012-06-20 16:38:30 -07004474{
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304475 hdd_adapter_t *pAdapter;
4476 hdd_context_t *pHddCtx;
4477 hdd_wext_state_t *pWextState;
4478 hdd_station_ctx_t *pHddStaCtx;
4479 tCsrRoamProfile *pRoamProfile;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004480 eCsrEncryptionType mcEncryptionType;
Jeff Johnson295189b2012-06-20 16:38:30 -07004481 eCsrEncryptionType ucEncryptionType;
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304482 int ret = 0;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004483
Jeff Johnson295189b2012-06-20 16:38:30 -07004484 ENTER();
Sameer Thalappil75ea31a2013-02-21 19:38:16 -08004485
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304486 pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4487 if (NULL == pAdapter)
Sameer Thalappil75ea31a2013-02-21 19:38:16 -08004488 {
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304489 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4490 "%s: Adapter is NULL",__func__);
4491 return -EINVAL;
Sameer Thalappil75ea31a2013-02-21 19:38:16 -08004492 }
4493
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304494 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4495 ret = wlan_hdd_validate_context(pHddCtx);
4496 if (0 != ret)
4497 {
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304498 return ret;
4499 }
4500
4501 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4502 if (NULL == pHddStaCtx)
4503 {
4504 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4505 "%s: STA Context is NULL",__func__);
4506 return -EINVAL;
4507 }
4508
4509 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4510 if (NULL == pWextState)
4511 {
4512 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4513 "%s: pWextState is NULL",__func__);
4514 return -EINVAL;
4515 }
4516
4517 pRoamProfile = &pWextState->roamProfile;
4518
Jeff Johnson295189b2012-06-20 16:38:30 -07004519 switch(wrqu->param.flags & IW_AUTH_INDEX)
4520 {
4521 case IW_AUTH_WPA_VERSION:
Shailender Karmuchia734f332013-04-19 14:02:48 -07004522
Jeff Johnson295189b2012-06-20 16:38:30 -07004523 pWextState->wpaVersion = wrqu->param.value;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004524
Jeff Johnson295189b2012-06-20 16:38:30 -07004525 break;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004526
Jeff Johnson295189b2012-06-20 16:38:30 -07004527 case IW_AUTH_CIPHER_PAIRWISE:
4528 {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004529 if(wrqu->param.value & IW_AUTH_CIPHER_NONE) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004530 ucEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004531 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004532 else if(wrqu->param.value & IW_AUTH_CIPHER_TKIP) {
4533 ucEncryptionType = eCSR_ENCRYPT_TYPE_TKIP;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004534 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004535 else if(wrqu->param.value & IW_AUTH_CIPHER_CCMP) {
4536 ucEncryptionType = eCSR_ENCRYPT_TYPE_AES;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004537 }
4538
Jeff Johnson295189b2012-06-20 16:38:30 -07004539 else if(wrqu->param.value & IW_AUTH_CIPHER_WEP40) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004540
4541 if( (IW_AUTH_KEY_MGMT_802_1X
4542 == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) )
Jeff Johnson295189b2012-06-20 16:38:30 -07004543 && (eCSR_AUTH_TYPE_OPEN_SYSTEM == pHddStaCtx->conn_info.authType) )
4544 /*Dynamic WEP key*/
Shailender Karmuchia734f332013-04-19 14:02:48 -07004545 ucEncryptionType = eCSR_ENCRYPT_TYPE_WEP40;
Jeff Johnson295189b2012-06-20 16:38:30 -07004546 else
4547 /*Static WEP key*/
Shailender Karmuchia734f332013-04-19 14:02:48 -07004548 ucEncryptionType = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
4549 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004550 else if(wrqu->param.value & IW_AUTH_CIPHER_WEP104) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004551
4552 if( ( IW_AUTH_KEY_MGMT_802_1X
4553 == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) )
Jeff Johnson295189b2012-06-20 16:38:30 -07004554 && (eCSR_AUTH_TYPE_OPEN_SYSTEM == pHddStaCtx->conn_info.authType))
4555 /*Dynamic WEP key*/
4556 ucEncryptionType = eCSR_ENCRYPT_TYPE_WEP104;
4557 else
4558 /*Static WEP key*/
4559 ucEncryptionType = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004560
Jeff Johnson295189b2012-06-20 16:38:30 -07004561 }
4562 else {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004563
Jeff Johnson295189b2012-06-20 16:38:30 -07004564 hddLog(LOGW, "%s value %d UNKNOWN IW_AUTH_CIPHER",
Shailender Karmuchia734f332013-04-19 14:02:48 -07004565 __func__, wrqu->param.value);
Jeff Johnson295189b2012-06-20 16:38:30 -07004566 return -EINVAL;
4567 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004568
Jeff Johnson295189b2012-06-20 16:38:30 -07004569 pRoamProfile->EncryptionType.numEntries = 1;
4570 pRoamProfile->EncryptionType.encryptionType[0] = ucEncryptionType;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004571 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004572 break;
4573 case IW_AUTH_CIPHER_GROUP:
Shailender Karmuchia734f332013-04-19 14:02:48 -07004574 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004575 if(wrqu->param.value & IW_AUTH_CIPHER_NONE) {
4576 mcEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
4577 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004578
Jeff Johnson295189b2012-06-20 16:38:30 -07004579 else if(wrqu->param.value & IW_AUTH_CIPHER_TKIP) {
4580 mcEncryptionType = eCSR_ENCRYPT_TYPE_TKIP;
4581 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004582
4583 else if(wrqu->param.value & IW_AUTH_CIPHER_CCMP) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004584 mcEncryptionType = eCSR_ENCRYPT_TYPE_AES;
4585 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004586
Jeff Johnson295189b2012-06-20 16:38:30 -07004587 else if(wrqu->param.value & IW_AUTH_CIPHER_WEP40) {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004588
4589 if( ( IW_AUTH_KEY_MGMT_802_1X
4590 == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X ))
4591 && (eCSR_AUTH_TYPE_OPEN_SYSTEM == pHddStaCtx->conn_info.authType))
4592
Jeff Johnson295189b2012-06-20 16:38:30 -07004593 mcEncryptionType = eCSR_ENCRYPT_TYPE_WEP40;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004594
4595 else
4596 mcEncryptionType = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
Jeff Johnson295189b2012-06-20 16:38:30 -07004597 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004598
4599 else if(wrqu->param.value & IW_AUTH_CIPHER_WEP104)
4600 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004601 /*Dynamic WEP keys won't work with shared keys*/
Shailender Karmuchia734f332013-04-19 14:02:48 -07004602 if( ( IW_AUTH_KEY_MGMT_802_1X
4603 == (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X))
Jeff Johnson295189b2012-06-20 16:38:30 -07004604 && (eCSR_AUTH_TYPE_OPEN_SYSTEM == pHddStaCtx->conn_info.authType))
4605 {
4606 mcEncryptionType = eCSR_ENCRYPT_TYPE_WEP104;
4607 }
4608 else
4609 {
4610 mcEncryptionType = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
4611 }
4612 }
4613 else {
Shailender Karmuchia734f332013-04-19 14:02:48 -07004614
Jeff Johnson295189b2012-06-20 16:38:30 -07004615 hddLog(LOGW, "%s value %d UNKNOWN IW_AUTH_CIPHER",
Shailender Karmuchia734f332013-04-19 14:02:48 -07004616 __func__, wrqu->param.value);
Jeff Johnson295189b2012-06-20 16:38:30 -07004617 return -EINVAL;
4618 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004619
Jeff Johnson295189b2012-06-20 16:38:30 -07004620 pRoamProfile->mcEncryptionType.numEntries = 1;
4621 pRoamProfile->mcEncryptionType.encryptionType[0] = mcEncryptionType;
4622 }
4623 break;
4624
4625 case IW_AUTH_80211_AUTH_ALG:
4626 {
4627 /*Save the auth algo here and set auth type to SME Roam profile
4628 in the iw_set_ap_address*/
Shailender Karmuchia734f332013-04-19 14:02:48 -07004629 if( wrqu->param.value & IW_AUTH_ALG_OPEN_SYSTEM)
Jeff Johnson295189b2012-06-20 16:38:30 -07004630 pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
Shailender Karmuchia734f332013-04-19 14:02:48 -07004631
Jeff Johnson295189b2012-06-20 16:38:30 -07004632 else if(wrqu->param.value & IW_AUTH_ALG_SHARED_KEY)
4633 pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_SHARED_KEY;
4634
4635 else if(wrqu->param.value & IW_AUTH_ALG_LEAP)
4636 /*Not supported*/
4637 pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4638 pWextState->roamProfile.AuthType.authType[0] = pHddStaCtx->conn_info.authType;
4639 }
4640 break;
4641
4642 case IW_AUTH_KEY_MGMT:
4643 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004644#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07004645#define IW_AUTH_KEY_MGMT_CCKM 8 /* Should be in linux/wireless.h */
4646 /*Check for CCKM AKM type */
4647 if ( wrqu->param.value & IW_AUTH_KEY_MGMT_CCKM) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004648 hddLog(VOS_TRACE_LEVEL_INFO,"%s: CCKM AKM Set %d",
4649 __func__, wrqu->param.value);
Shailender Karmuchia734f332013-04-19 14:02:48 -07004650 /* Set the CCKM bit in authKeyMgmt */
4651 /* Right now, this breaks all ref to authKeyMgmt because our
4652 * code doesn't realize it is a "bitfield"
Jeff Johnson295189b2012-06-20 16:38:30 -07004653 */
4654 pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_CCKM;
4655 /*Set the key management to 802.1X*/
4656 //pWextState->authKeyMgmt = IW_AUTH_KEY_MGMT_802_1X;
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004657 pWextState->isESEConnection = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004658 //This is test code. I need to actually KNOW whether this is an RSN Assoc or WPA.
4659 pWextState->collectedAuthType = eCSR_AUTH_TYPE_CCKM_RSN;
4660 } else if ( wrqu->param.value & IW_AUTH_KEY_MGMT_PSK) {
4661 /*Save the key management*/
4662 pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_PSK;
4663 //pWextState->authKeyMgmt = wrqu->param.value;
4664 //This is test code. I need to actually KNOW whether this is an RSN Assoc or WPA.
4665 pWextState->collectedAuthType = eCSR_AUTH_TYPE_RSN;
4666 } else if (!( wrqu->param.value & IW_AUTH_KEY_MGMT_802_1X)) {
4667 pWextState->collectedAuthType = eCSR_AUTH_TYPE_NONE; //eCSR_AUTH_TYPE_WPA_NONE
4668 /*Save the key management anyway*/
4669 pWextState->authKeyMgmt = wrqu->param.value;
4670 } else { // It must be IW_AUTH_KEY_MGMT_802_1X
4671 /*Save the key management*/
4672 pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X;
4673 //pWextState->authKeyMgmt = wrqu->param.value;
4674 //This is test code. I need to actually KNOW whether this is an RSN Assoc or WPA.
4675 pWextState->collectedAuthType = eCSR_AUTH_TYPE_RSN;
4676 }
4677#else
4678 /*Save the key management*/
4679 pWextState->authKeyMgmt = wrqu->param.value;
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004680#endif /* FEATURE_WLAN_ESE */
Jeff Johnson295189b2012-06-20 16:38:30 -07004681 }
4682 break;
4683
4684 case IW_AUTH_TKIP_COUNTERMEASURES:
4685 {
4686 if(wrqu->param.value) {
4687 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,
4688 "Counter Measure started %d", wrqu->param.value);
4689 pWextState->mTKIPCounterMeasures = TKIP_COUNTER_MEASURE_STARTED;
4690 }
4691 else {
4692 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,
4693 "Counter Measure stopped=%d", wrqu->param.value);
4694 pWextState->mTKIPCounterMeasures = TKIP_COUNTER_MEASURE_STOPED;
4695 }
4696 }
4697 break;
4698 case IW_AUTH_DROP_UNENCRYPTED:
4699 case IW_AUTH_WPA_ENABLED:
4700 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
4701 case IW_AUTH_ROAMING_CONTROL:
4702 case IW_AUTH_PRIVACY_INVOKED:
Shailender Karmuchia734f332013-04-19 14:02:48 -07004703
Jeff Johnson295189b2012-06-20 16:38:30 -07004704 default:
Shailender Karmuchia734f332013-04-19 14:02:48 -07004705
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004706 hddLog(LOGW, "%s called with unsupported auth type %d", __func__,
Jeff Johnson295189b2012-06-20 16:38:30 -07004707 wrqu->param.flags & IW_AUTH_INDEX);
4708 break;
4709 }
Shailender Karmuchia734f332013-04-19 14:02:48 -07004710
Jeff Johnson295189b2012-06-20 16:38:30 -07004711 EXIT();
4712 return 0;
4713}
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304714
4715int iw_set_auth(struct net_device *dev, struct iw_request_info *info,
4716 union iwreq_data *wrqu, char *extra)
4717{
4718 int ret;
4719
4720 vos_ssr_protect(__func__);
4721 ret = __iw_set_auth(dev, info, wrqu, extra);
4722 vos_ssr_unprotect(__func__);
4723
4724 return ret;
4725}
4726
Jeff Johnson295189b2012-06-20 16:38:30 -07004727/**---------------------------------------------------------------------------
Shailender Karmuchia734f332013-04-19 14:02:48 -07004728
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304729 \brief __iw_get_auth() -
Jeff Johnson295189b2012-06-20 16:38:30 -07004730 This function returns the auth type to the wpa_supplicant.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004731
Jeff Johnson295189b2012-06-20 16:38:30 -07004732 \param - dev - Pointer to the net device.
4733 - info - Pointer to the iw_request_info.
4734 - wrqu - Pointer to the iwreq_data.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004735 - extra - Pointer to the data.
Jeff Johnson295189b2012-06-20 16:38:30 -07004736 \return - 0 for success, non zero for failure
Shailender Karmuchia734f332013-04-19 14:02:48 -07004737
Jeff Johnson295189b2012-06-20 16:38:30 -07004738 --------------------------------------------------------------------------*/
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304739int __iw_get_auth(struct net_device *dev,struct iw_request_info *info,
4740 union iwreq_data *wrqu,char *extra)
Jeff Johnson295189b2012-06-20 16:38:30 -07004741{
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304742 hdd_adapter_t* pAdapter;
4743 hdd_wext_state_t *pWextState;
4744 tCsrRoamProfile *pRoamProfile;
4745 hdd_context_t *pHddCtx;
4746 int ret = 0;
4747
Jeff Johnson295189b2012-06-20 16:38:30 -07004748 ENTER();
Sameer Thalappil75ea31a2013-02-21 19:38:16 -08004749
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304750 pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4751 if (NULL == pAdapter)
Sameer Thalappil75ea31a2013-02-21 19:38:16 -08004752 {
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304753 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4754 "%s: Adapter is NULL",__func__);
4755 return -EINVAL;
Sameer Thalappil75ea31a2013-02-21 19:38:16 -08004756 }
4757
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304758 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4759 ret = wlan_hdd_validate_context(pHddCtx);
4760 if (0 != ret)
4761 {
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304762 return ret;
4763 }
4764
4765 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4766 if (NULL == pWextState)
4767 {
4768 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4769 "%s: pWextState is NULL",__func__);
4770 return -EINVAL;
4771 }
4772 pRoamProfile = &pWextState->roamProfile;
4773
Jeff Johnson295189b2012-06-20 16:38:30 -07004774 switch(pRoamProfile->negotiatedAuthType)
4775 {
4776 case eCSR_AUTH_TYPE_WPA_NONE:
4777 wrqu->param.flags = IW_AUTH_WPA_VERSION;
4778 wrqu->param.value = IW_AUTH_WPA_VERSION_DISABLED;
4779 break;
4780 case eCSR_AUTH_TYPE_WPA:
4781 wrqu->param.flags = IW_AUTH_WPA_VERSION;
4782 wrqu->param.value = IW_AUTH_WPA_VERSION_WPA;
4783 break;
4784#ifdef WLAN_FEATURE_VOWIFI_11R
4785 case eCSR_AUTH_TYPE_FT_RSN:
4786#endif
4787 case eCSR_AUTH_TYPE_RSN:
4788 wrqu->param.flags = IW_AUTH_WPA_VERSION;
4789 wrqu->param.value = IW_AUTH_WPA_VERSION_WPA2;
4790 break;
4791 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
4792 wrqu->param.value = IW_AUTH_ALG_OPEN_SYSTEM;
4793 break;
4794 case eCSR_AUTH_TYPE_SHARED_KEY:
4795 wrqu->param.value = IW_AUTH_ALG_SHARED_KEY;
4796 break;
4797 case eCSR_AUTH_TYPE_UNKNOWN:
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004798 hddLog(LOG1,"%s called with unknown auth type", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004799 wrqu->param.value = IW_AUTH_ALG_OPEN_SYSTEM;
4800 break;
4801 case eCSR_AUTH_TYPE_AUTOSWITCH:
4802 wrqu->param.value = IW_AUTH_ALG_OPEN_SYSTEM;
4803 break;
4804 case eCSR_AUTH_TYPE_WPA_PSK:
Agarwal Ashish971c2882013-10-30 20:11:12 +05304805 hddLog(LOG1,"%s called with WPA PSK auth type", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004806 wrqu->param.value = IW_AUTH_ALG_OPEN_SYSTEM;
4807 return -EIO;
4808#ifdef WLAN_FEATURE_VOWIFI_11R
4809 case eCSR_AUTH_TYPE_FT_RSN_PSK:
4810#endif
4811 case eCSR_AUTH_TYPE_RSN_PSK:
Chet Lanctot186b5732013-03-18 10:26:30 -07004812#ifdef WLAN_FEATURE_11W
4813 case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
Abhishek Singhae408032014-09-25 17:22:04 +05304814 case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
Chet Lanctot186b5732013-03-18 10:26:30 -07004815#endif
Agarwal Ashish971c2882013-10-30 20:11:12 +05304816 hddLog(LOG1,"%s called with RSN PSK auth type", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004817 wrqu->param.value = IW_AUTH_ALG_OPEN_SYSTEM;
4818 return -EIO;
4819 default:
Agarwal Ashish971c2882013-10-30 20:11:12 +05304820 hddLog(LOGE,"%s called with unknown auth type", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004821 wrqu->param.value = IW_AUTH_ALG_OPEN_SYSTEM;
4822 return -EIO;
4823 }
4824 if(((wrqu->param.flags & IW_AUTH_INDEX) == IW_AUTH_CIPHER_PAIRWISE))
4825 {
4826 switch(pRoamProfile->negotiatedUCEncryptionType)
4827 {
4828 case eCSR_ENCRYPT_TYPE_NONE:
4829 wrqu->param.value = IW_AUTH_CIPHER_NONE;
4830 break;
4831 case eCSR_ENCRYPT_TYPE_WEP40:
4832 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
4833 wrqu->param.value = IW_AUTH_CIPHER_WEP40;
4834 break;
4835 case eCSR_ENCRYPT_TYPE_TKIP:
4836 wrqu->param.value = IW_AUTH_CIPHER_TKIP;
4837 break;
4838 case eCSR_ENCRYPT_TYPE_WEP104:
4839 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
4840 wrqu->param.value = IW_AUTH_CIPHER_WEP104;
4841 break;
4842 case eCSR_ENCRYPT_TYPE_AES:
4843 wrqu->param.value = IW_AUTH_CIPHER_CCMP;
4844 break;
4845 default:
Agarwal Ashish971c2882013-10-30 20:11:12 +05304846 hddLog(LOG1, "%s called with unknown auth type %d ",
4847 __func__, pRoamProfile->negotiatedUCEncryptionType);
Jeff Johnson295189b2012-06-20 16:38:30 -07004848 return -EIO;
4849 }
4850 }
4851
Shailender Karmuchia734f332013-04-19 14:02:48 -07004852 if(((wrqu->param.flags & IW_AUTH_INDEX) == IW_AUTH_CIPHER_GROUP))
Jeff Johnson295189b2012-06-20 16:38:30 -07004853 {
4854 switch(pRoamProfile->negotiatedMCEncryptionType)
4855 {
4856 case eCSR_ENCRYPT_TYPE_NONE:
4857 wrqu->param.value = IW_AUTH_CIPHER_NONE;
4858 break;
4859 case eCSR_ENCRYPT_TYPE_WEP40:
4860 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
4861 wrqu->param.value = IW_AUTH_CIPHER_WEP40;
4862 break;
4863 case eCSR_ENCRYPT_TYPE_TKIP:
4864 wrqu->param.value = IW_AUTH_CIPHER_TKIP;
4865 break;
4866 case eCSR_ENCRYPT_TYPE_WEP104:
4867 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
4868 wrqu->param.value = IW_AUTH_CIPHER_WEP104;
4869 break;
4870 case eCSR_ENCRYPT_TYPE_AES:
4871 wrqu->param.value = IW_AUTH_CIPHER_CCMP;
4872 break;
4873 default:
Agarwal Ashish971c2882013-10-30 20:11:12 +05304874 hddLog(LOG1, "%s called with unknown auth type %d ",
4875 __func__, pRoamProfile->negotiatedMCEncryptionType);
Jeff Johnson295189b2012-06-20 16:38:30 -07004876 return -EIO;
4877 }
4878 }
4879
4880 hddLog(LOG1, "%s called with auth type %d",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004881 __func__, pRoamProfile->AuthType.authType[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07004882 EXIT();
4883 return 0;
4884}
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304885
4886int iw_get_auth(struct net_device *dev,struct iw_request_info *info,
4887 union iwreq_data *wrqu,char *extra)
4888{
4889 int ret;
4890
4891 vos_ssr_protect(__func__);
4892 ret = __iw_get_auth(dev, info, wrqu, extra);
4893 vos_ssr_unprotect(__func__);
4894
4895 return ret;
4896}
4897
Jeff Johnson295189b2012-06-20 16:38:30 -07004898/**---------------------------------------------------------------------------
Shailender Karmuchia734f332013-04-19 14:02:48 -07004899
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304900 \brief __iw_set_ap_address() -
Shailender Karmuchia734f332013-04-19 14:02:48 -07004901 This function calls the sme_RoamConnect function to associate
Jeff Johnson295189b2012-06-20 16:38:30 -07004902 to the AP with the specified BSSID received from the wpa_supplicant.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004903
Jeff Johnson295189b2012-06-20 16:38:30 -07004904 \param - dev - Pointer to the net device.
4905 - info - Pointer to the iw_request_info.
4906 - wrqu - Pointer to the iwreq_data.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004907 - extra - Pointer to the data.
Jeff Johnson295189b2012-06-20 16:38:30 -07004908 \return - 0 for success, non zero for failure
Shailender Karmuchia734f332013-04-19 14:02:48 -07004909
Jeff Johnson295189b2012-06-20 16:38:30 -07004910 --------------------------------------------------------------------------*/
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304911int __iw_set_ap_address(struct net_device *dev,
4912 struct iw_request_info *info,
4913 union iwreq_data *wrqu, char *extra)
Jeff Johnson295189b2012-06-20 16:38:30 -07004914{
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304915 hdd_station_ctx_t *pHddStaCtx;
4916 hdd_adapter_t *pAdapter;
4917 hdd_context_t *pHddCtx;
4918 v_U8_t *pMacAddress = NULL;
4919 int ret = 0;
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304920
Jeff Johnson295189b2012-06-20 16:38:30 -07004921 ENTER();
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304922
4923 pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4924 if (NULL == pAdapter)
4925 {
4926 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4927 "%s: Adapter is NULL", __func__);
4928 return -EINVAL;
4929 }
4930 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4931 ret = wlan_hdd_validate_context(pHddCtx);
4932 if (0 != ret)
4933 {
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304934 return ret;
4935 }
4936 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4937 if (NULL == pHddStaCtx)
4938 {
4939 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4940 "%s: pHddStaCtx is NULL", __func__);
4941 return -EINVAL;
4942 }
4943
Jeff Johnson295189b2012-06-20 16:38:30 -07004944 pMacAddress = (v_U8_t*) wrqu->ap_addr.sa_data;
Arif Hussain24bafea2013-11-15 15:10:03 -08004945 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s "MAC_ADDRESS_STR,
4946 __func__, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004947 vos_mem_copy( pHddStaCtx->conn_info.bssId, pMacAddress, sizeof( tCsrBssid ));
Shailender Karmuchia734f332013-04-19 14:02:48 -07004948
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304949 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07004950 return 0;
4951}
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304952
4953int iw_set_ap_address(struct net_device *dev,
4954 struct iw_request_info *info,
4955 union iwreq_data *wrqu, char *extra)
4956{
4957 int ret;
4958
4959 vos_ssr_protect(__func__);
4960 ret = __iw_set_ap_address(dev, info, wrqu, extra);
4961 vos_ssr_unprotect(__func__);
4962
4963 return ret;
4964}
4965
Jeff Johnson295189b2012-06-20 16:38:30 -07004966/**---------------------------------------------------------------------------
Shailender Karmuchia734f332013-04-19 14:02:48 -07004967
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304968 \brief __iw_get_ap_address() -
Jeff Johnson295189b2012-06-20 16:38:30 -07004969 This function returns the BSSID to the wpa_supplicant
4970 \param - dev - Pointer to the net device.
4971 - info - Pointer to the iw_request_info.
4972 - wrqu - Pointer to the iwreq_data.
Shailender Karmuchia734f332013-04-19 14:02:48 -07004973 - extra - Pointer to the data.
Jeff Johnson295189b2012-06-20 16:38:30 -07004974 \return - 0 for success, non zero for failure
Shailender Karmuchia734f332013-04-19 14:02:48 -07004975
Jeff Johnson295189b2012-06-20 16:38:30 -07004976 --------------------------------------------------------------------------*/
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304977int __iw_get_ap_address(struct net_device *dev,
4978 struct iw_request_info *info,
4979 union iwreq_data *wrqu, char *extra)
Jeff Johnson295189b2012-06-20 16:38:30 -07004980{
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304981 hdd_station_ctx_t *pHddStaCtx;
4982 hdd_adapter_t *pAdapter;
4983 hdd_context_t *pHddCtx;
4984 int ret = 0;
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304985
Jeff Johnson295189b2012-06-20 16:38:30 -07004986 ENTER();
4987
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304988 pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4989 if (NULL == pAdapter)
4990 {
4991 hddLog(VOS_TRACE_LEVEL_ERROR,
4992 "%s: Adapter is NULL", __func__);
4993 return -EINVAL;
4994 }
4995 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4996 ret = wlan_hdd_validate_context(pHddCtx);
4997 if (0 != ret)
4998 {
Mahesh A Saptasagar153c4662015-02-06 12:13:08 +05304999 return ret;
5000 }
5001 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
5002 if (NULL == pHddStaCtx)
5003 {
5004 hddLog(VOS_TRACE_LEVEL_ERROR,
5005 "%s: pHddStaCtx is NULL", __func__);
5006 return -EINVAL;
5007 }
5008
Jeff Johnson295189b2012-06-20 16:38:30 -07005009 if ((pHddStaCtx->conn_info.connState == eConnectionState_Associated) ||
5010 (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState))
5011 {
Jeff Johnson4416a782013-03-25 14:17:50 -07005012 memcpy(wrqu->ap_addr.sa_data,pHddStaCtx->conn_info.bssId,ETH_ALEN);
Jeff Johnson295189b2012-06-20 16:38:30 -07005013 }
5014 else
5015 {
5016 memset(wrqu->ap_addr.sa_data,0,sizeof(wrqu->ap_addr.sa_data));
5017 }
5018 EXIT();
5019 return 0;
5020}
Jeff Johnsond13512a2012-07-17 11:42:19 -07005021
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305022int iw_get_ap_address(struct net_device *dev,
5023 struct iw_request_info *info,
5024 union iwreq_data *wrqu, char *extra)
5025{
5026 int ret;
5027
5028 vos_ssr_protect(__func__);
5029 ret = __iw_get_ap_address(dev, info, wrqu, extra);
5030 vos_ssr_unprotect(__func__);
5031
5032 return ret;
5033}
5034
Chet Lanctot186b5732013-03-18 10:26:30 -07005035#ifdef WLAN_FEATURE_11W
5036/**---------------------------------------------------------------------------
5037
5038 \brief hdd_indicateUnprotMgmtFrame -
5039 This function forwards the unprotected management frame to the supplicant
5040 \param - pAdapter - Pointer to HDD adapter
5041 - nFrameLength - Length of the unprotected frame being passed
5042 - pbFrames - Pointer to the frame buffer
5043 - frameType - 802.11 frame type
5044 \return - nothing
5045
5046 --------------------------------------------------------------------------*/
5047void hdd_indicateUnprotMgmtFrame( hdd_adapter_t *pAdapter,
5048 tANI_U32 nFrameLength,
5049 tANI_U8* pbFrames,
5050 tANI_U8 frameType )
5051{
5052 tANI_U8 type = 0;
5053 tANI_U8 subType = 0;
5054
5055 hddLog(VOS_TRACE_LEVEL_INFO, "%s: Frame Type = %d Frame Length = %d",
5056 __func__, frameType, nFrameLength);
5057
5058 /* Sanity Checks */
5059 if (NULL == pAdapter)
5060 {
5061 hddLog( LOGE, FL("pAdapter is NULL"));
5062 return;
5063 }
5064
5065 if (NULL == pAdapter->dev)
5066 {
5067 hddLog( LOGE, FL("pAdapter->dev is NULL"));
5068 return;
5069 }
5070
5071 if (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)
5072 {
5073 hddLog( LOGE, FL("pAdapter has invalid magic"));
5074 return;
5075 }
5076
5077 if( !nFrameLength )
5078 {
5079 hddLog( LOGE, FL("Frame Length is Invalid ZERO"));
5080 return;
5081 }
5082
5083 if (NULL == pbFrames) {
5084 hddLog( LOGE, FL("pbFrames is NULL"));
5085 return;
5086 }
5087
5088 type = WLAN_HDD_GET_TYPE_FRM_FC(pbFrames[0]);
5089 subType = WLAN_HDD_GET_SUBTYPE_FRM_FC(pbFrames[0]);
5090
5091 /* Get pAdapter from Destination mac address of the frame */
5092 if (type == SIR_MAC_MGMT_FRAME && subType == SIR_MAC_MGMT_DISASSOC)
5093 {
Anand N Sunkade9adb1b2015-07-29 09:56:45 +05305094#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
5095 cfg80211_rx_unprot_mlme_mgmt(pAdapter->dev, pbFrames, nFrameLength);
5096#else
Chet Lanctot186b5732013-03-18 10:26:30 -07005097 cfg80211_send_unprot_disassoc(pAdapter->dev, pbFrames, nFrameLength);
Anand N Sunkade9adb1b2015-07-29 09:56:45 +05305098#endif
Chet Lanctot186b5732013-03-18 10:26:30 -07005099 pAdapter->hdd_stats.hddPmfStats.numUnprotDisassocRx++;
5100 }
5101 else if (type == SIR_MAC_MGMT_FRAME && subType == SIR_MAC_MGMT_DEAUTH)
5102 {
Anand N Sunkade9adb1b2015-07-29 09:56:45 +05305103#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
5104 cfg80211_rx_unprot_mlme_mgmt(pAdapter->dev, pbFrames, nFrameLength);
5105#else
Chet Lanctot186b5732013-03-18 10:26:30 -07005106 cfg80211_send_unprot_deauth(pAdapter->dev, pbFrames, nFrameLength);
Anand N Sunkade9adb1b2015-07-29 09:56:45 +05305107#endif
Chet Lanctot186b5732013-03-18 10:26:30 -07005108 pAdapter->hdd_stats.hddPmfStats.numUnprotDeauthRx++;
5109 }
5110 else
5111 {
5112 hddLog( LOGE, FL("Frame type %d and subtype %d are not valid"), type, subType);
5113 return;
5114 }
5115}
5116#endif
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005117
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005118#if defined (FEATURE_WLAN_ESE) && defined(FEATURE_WLAN_ESE_UPLOAD)
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005119void hdd_indicateTsmIe(hdd_adapter_t *pAdapter, tANI_U8 tid,
5120 tANI_U8 state,
5121 tANI_U16 measInterval )
5122{
5123 union iwreq_data wrqu;
5124 char buf[IW_CUSTOM_MAX + 1];
Varun Reddy Yeturudf0e7a72013-12-05 12:12:23 -08005125 int nBytes = 0;
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005126
5127 if (NULL == pAdapter)
5128 return;
5129
5130 // create the event
5131 memset(&wrqu, '\0', sizeof(wrqu));
5132 memset(buf, '\0', sizeof(buf));
5133
5134 hddLog(VOS_TRACE_LEVEL_INFO, "TSM Ind tid(%d) state(%d) MeasInt(%d)",
5135 tid, state, measInterval);
5136
Varun Reddy Yeturudf0e7a72013-12-05 12:12:23 -08005137 nBytes = snprintf(buf, IW_CUSTOM_MAX, "TSMIE=%d:%d:%d",tid,state,measInterval);
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005138
5139 wrqu.data.pointer = buf;
Varun Reddy Yeturudf0e7a72013-12-05 12:12:23 -08005140 wrqu.data.length = nBytes;
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005141 // send the event
5142 wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buf);
5143}
5144
5145void hdd_indicateCckmPreAuth(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo)
5146{
5147 union iwreq_data wrqu;
5148 char buf[IW_CUSTOM_MAX + 1];
5149 char *pos = buf;
5150 int nBytes = 0, freeBytes = IW_CUSTOM_MAX;
5151
5152 if ((NULL == pAdapter) || (NULL == pRoamInfo))
5153 return;
5154
5155 // create the event
5156 memset(&wrqu, '\0', sizeof(wrqu));
5157 memset(buf, '\0', sizeof(buf));
5158
5159 /* Timestamp0 is lower 32 bits and Timestamp1 is upper 32 bits */
Arun Kumar Khandavallie8768212014-02-17 16:43:34 +05305160 hddLog(VOS_TRACE_LEVEL_INFO, "CCXPREAUTHNOTIFY=%02x:%02x:%02x:%02x:%02x:%02x %u:%u",
5161 pRoamInfo->bssid[0], pRoamInfo->bssid[1], pRoamInfo->bssid[2],
5162 pRoamInfo->bssid[3], pRoamInfo->bssid[4], pRoamInfo->bssid[5],
5163 pRoamInfo->timestamp[0], pRoamInfo->timestamp[1]);
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005164
5165 nBytes = snprintf(pos, freeBytes, "CCXPREAUTHNOTIFY=");
5166 pos += nBytes;
5167 freeBytes -= nBytes;
5168
5169 vos_mem_copy(pos, pRoamInfo->bssid, WNI_CFG_BSSID_LEN);
5170 pos += WNI_CFG_BSSID_LEN;
5171 freeBytes -= WNI_CFG_BSSID_LEN;
5172
Varun Reddy Yeturudf0e7a72013-12-05 12:12:23 -08005173 nBytes = snprintf(pos, freeBytes, " %u:%u", pRoamInfo->timestamp[0], pRoamInfo->timestamp[1]);
5174 freeBytes -= nBytes;
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005175
5176 wrqu.data.pointer = buf;
Varun Reddy Yeturudf0e7a72013-12-05 12:12:23 -08005177 wrqu.data.length = (IW_CUSTOM_MAX - freeBytes);
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005178
5179 // send the event
5180 wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buf);
5181}
5182
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005183void hdd_indicateEseAdjApRepInd(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo)
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005184{
5185 union iwreq_data wrqu;
5186 char buf[IW_CUSTOM_MAX + 1];
Varun Reddy Yeturudf0e7a72013-12-05 12:12:23 -08005187 int nBytes = 0;
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005188
5189 if ((NULL == pAdapter) || (NULL == pRoamInfo))
5190 return;
5191
5192 // create the event
5193 memset(&wrqu, '\0', sizeof(wrqu));
5194 memset(buf, '\0', sizeof(buf));
5195
5196 hddLog(VOS_TRACE_LEVEL_INFO, "CCXADJAPREP=%u", pRoamInfo->tsmRoamDelay);
5197
Varun Reddy Yeturudf0e7a72013-12-05 12:12:23 -08005198 nBytes = snprintf(buf, IW_CUSTOM_MAX, "CCXADJAPREP=%u", pRoamInfo->tsmRoamDelay);
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005199
5200 wrqu.data.pointer = buf;
Varun Reddy Yeturudf0e7a72013-12-05 12:12:23 -08005201 wrqu.data.length = nBytes;
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005202
5203 // send the event
5204 wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buf);
5205}
5206
Srinivas Girigowda0c6d7fe2014-05-28 18:18:10 -07005207void hdd_indicateEseBcnReportNoResults(const hdd_adapter_t *pAdapter,
5208 const tANI_U16 measurementToken,
5209 const tANI_BOOLEAN flag,
5210 const tANI_U8 numBss)
5211{
5212 union iwreq_data wrqu;
5213 char buf[IW_CUSTOM_MAX];
5214 char *pos = buf;
5215 int nBytes = 0, freeBytes = IW_CUSTOM_MAX;
5216
5217 memset(&wrqu, '\0', sizeof(wrqu));
5218 memset(buf, '\0', sizeof(buf));
5219
5220 hddLog(VOS_TRACE_LEVEL_INFO, FL("CCXBCNREP=%d %d %d"), measurementToken, flag,
5221 numBss);
5222
5223 nBytes = snprintf(pos, freeBytes, "CCXBCNREP=%d %d %d", measurementToken,
5224 flag, numBss);
5225
5226 wrqu.data.pointer = buf;
5227 wrqu.data.length = nBytes;
5228 // send the event
5229 wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buf);
5230}
5231
5232
5233static void hdd_indicateEseBcnReportInd(const hdd_adapter_t *pAdapter,
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005234 const tCsrRoamInfo *pRoamInfo)
5235{
5236 union iwreq_data wrqu;
5237 char buf[IW_CUSTOM_MAX + 1];
5238 char *pos = buf;
5239 int nBytes = 0, freeBytes = IW_CUSTOM_MAX;
5240 tANI_U8 i = 0, len = 0;
5241 tANI_U8 tot_bcn_ieLen = 0; /* total size of the beacon report data */
5242 tANI_U8 lastSent = 0, sendBss = 0;
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005243 int bcnRepFieldSize = sizeof(pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[0].bcnReportFields);
5244 tANI_U8 ieLenByte = 1;
5245 /* CCXBCNREP=meas_tok<sp>flag<sp>no_of_bss<sp>tot_bcn_ie_len = 18 bytes */
5246#define ESEBCNREPHEADER_LEN (18)
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005247
5248 if ((NULL == pAdapter) || (NULL == pRoamInfo))
5249 return;
5250
5251 /* Custom event can pass maximum of 256 bytes of data,
5252 based on the IE len we need to identify how many BSS info can
5253 be filled in to custom event data */
5254 /*
5255 meas_tok<sp>flag<sp>no_of_bss<sp>tot_bcn_ie_len bcn_rep_data
5256 bcn_rep_data will have bcn_rep_fields,ie_len,ie without any spaces
5257 CCXBCNREP=meas_tok<sp>flag<sp>no_of_bss<sp>tot_bcn_ie_len = 18 bytes
5258 */
5259
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005260 if ((pRoamInfo->pEseBcnReportRsp->flag >> 1) && (!pRoamInfo->pEseBcnReportRsp->numBss))
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005261 {
5262 hddLog(VOS_TRACE_LEVEL_INFO, "Measurement Done but no scan results");
5263 /* If the measurement is none and no scan results found,
5264 indicate the supplicant about measurement done */
Srinivas Girigowda0c6d7fe2014-05-28 18:18:10 -07005265 hdd_indicateEseBcnReportNoResults(pAdapter,
5266 pRoamInfo->pEseBcnReportRsp->measurementToken,
5267 pRoamInfo->pEseBcnReportRsp->flag,
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005268 pRoamInfo->pEseBcnReportRsp->numBss);
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005269 }
5270 else
5271 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005272 while (lastSent < pRoamInfo->pEseBcnReportRsp->numBss)
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005273 {
5274 memset(&wrqu, '\0', sizeof(wrqu));
5275 memset(buf, '\0', sizeof(buf));
5276 tot_bcn_ieLen = 0;
5277 sendBss = 0;
5278 pos = buf;
5279 freeBytes = IW_CUSTOM_MAX;
5280
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005281 for (i = lastSent; i < pRoamInfo->pEseBcnReportRsp->numBss; i++)
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005282 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005283 len = bcnRepFieldSize + ieLenByte + pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i].ieLen;
5284 if ((len + tot_bcn_ieLen) > (IW_CUSTOM_MAX - ESEBCNREPHEADER_LEN))
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005285 {
5286 break;
5287 }
5288 tot_bcn_ieLen += len;
5289 sendBss++;
5290 hddLog(VOS_TRACE_LEVEL_INFO, "i(%d) sizeof bcnReportFields(%d)"
5291 "IeLength(%d) Length of Ie(%d) totLen(%d)",
5292 i, bcnRepFieldSize, 1,
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005293 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i].ieLen,
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005294 tot_bcn_ieLen);
5295 }
5296
5297 hddLog(VOS_TRACE_LEVEL_INFO, "Sending %d BSS Info", sendBss);
5298 hddLog(VOS_TRACE_LEVEL_INFO, "CCXBCNREP=%d %d %d %d",
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005299 pRoamInfo->pEseBcnReportRsp->measurementToken, pRoamInfo->pEseBcnReportRsp->flag,
5300 sendBss, tot_bcn_ieLen);
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005301
5302 nBytes = snprintf(pos, freeBytes, "CCXBCNREP=%d %d %d ",
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005303 pRoamInfo->pEseBcnReportRsp->measurementToken, pRoamInfo->pEseBcnReportRsp->flag,
5304 sendBss);
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005305 pos += nBytes;
5306 freeBytes -= nBytes;
5307
5308 /* Copy total Beacon report data length */
5309 vos_mem_copy(pos, (char*)&tot_bcn_ieLen, sizeof(tot_bcn_ieLen));
5310 pos += sizeof(tot_bcn_ieLen);
5311 freeBytes -= sizeof(tot_bcn_ieLen);
5312
5313 for (i = 0; i < sendBss; i++)
5314 {
5315 hddLog(VOS_TRACE_LEVEL_INFO, "ChanNum(%d) Spare(%d) MeasDuration(%d)"
Arun Kumar Khandavallie8768212014-02-17 16:43:34 +05305316 " PhyType(%d) RecvSigPower(%d) ParentTSF(%u)"
5317 " TargetTSF[0](%u) TargetTSF[1](%u) BeaconInterval(%u)"
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005318 " CapabilityInfo(%d) BSSID(%02X:%02X:%02X:%02X:%02X:%02X)",
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005319 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.ChanNum,
5320 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.Spare,
5321 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.MeasDuration,
5322 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.PhyType,
5323 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.RecvSigPower,
5324 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.ParentTsf,
5325 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.TargetTsf[0],
5326 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.TargetTsf[1],
5327 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.BcnInterval,
5328 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.CapabilityInfo,
5329 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.Bssid[0],
5330 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.Bssid[1],
5331 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.Bssid[2],
5332 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.Bssid[3],
5333 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.Bssid[4],
5334 pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields.Bssid[5]);
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005335
5336 /* bcn report fields are copied */
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005337 len = sizeof(pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields);
5338 vos_mem_copy(pos, (char*)&pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].bcnReportFields, len);
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005339 pos += len;
5340 freeBytes -= len;
5341
5342 /* Add 1 byte of ie len */
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005343 len = pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].ieLen;
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005344 vos_mem_copy(pos, (char*)&len, sizeof(len));
5345 pos += sizeof(len);
5346 freeBytes -= sizeof(len);
5347
5348 /* copy IE from scan results */
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005349 vos_mem_copy(pos, (char*)pRoamInfo->pEseBcnReportRsp->bcnRepBssInfo[i+lastSent].pBuf, len);
Srinivas Girigowda91ccbe82013-11-10 16:37:38 -08005350 pos += len;
5351 freeBytes -= len;
5352 }
5353
5354 wrqu.data.pointer = buf;
5355 wrqu.data.length = strlen(buf);
5356
5357 // send the event
5358 wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buf);
5359 lastSent += sendBss;
5360 }
5361 }
5362}
5363
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08005364#endif /* FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
Srinivas Girigowda5cecb202013-10-08 09:13:25 -07005365