blob: ac1493291ac008dd0c30c900776dc3503014ec5a [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08002 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21/*
Jeff Johnson32d95a32012-09-10 13:15:23 -070022 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -070023 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
42/**========================================================================
43
44 \file wlan_hdd_hostapd.c
45 \brief WLAN Host Device Driver implementation
46
47 Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
48
49 Qualcomm Confidential and Proprietary.
50
51 ========================================================================*/
52/**=========================================================================
53 EDIT HISTORY FOR FILE
54
55
56 This section contains comments describing changes made to the module.
57 Notice that changes are listed in reverse chronological order.
58
59 $Header:$ $DateTime: $ $Author: $
60
61
62 when who what, where, why
63 -------- --- --------------------------------------------------------
64 04/5/09 Shailender Created module.
65 06/03/10 js - Added support to hostapd driven deauth/disassoc/mic failure
66 ==========================================================================*/
67/*--------------------------------------------------------------------------
68 Include Files
69 ------------------------------------------------------------------------*/
70
71#include <linux/version.h>
72#include <linux/module.h>
73#include <linux/kernel.h>
74#include <linux/init.h>
75#include <linux/wireless.h>
76#include <linux/semaphore.h>
77#include <vos_api.h>
78#include <vos_sched.h>
79#include <linux/etherdevice.h>
80#include <wlan_hdd_includes.h>
81#include <qc_sap_ioctl.h>
82#include <wlan_hdd_hostapd.h>
83#include <sapApi.h>
84#include <sapInternal.h>
85#include <wlan_qct_tl.h>
86#include <wlan_hdd_softap_tx_rx.h>
87#include <wlan_hdd_main.h>
88#include <linux/netdevice.h>
89#include <linux/mmc/sdio_func.h>
90#include "wlan_nlink_common.h"
91#include "wlan_btc_svc.h"
92#include <bap_hdd_main.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070093#include "wlan_hdd_p2p.h"
Leo Chang614d2072013-08-22 14:59:44 -070094#include "cfgApi.h"
95#include "wniCfgAp.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070096
97#define IS_UP(_dev) \
98 (((_dev)->flags & (IFF_RUNNING|IFF_UP)) == (IFF_RUNNING|IFF_UP))
99#define IS_UP_AUTO(_ic) \
100 (IS_UP((_ic)->ic_dev) && (_ic)->ic_roaming == IEEE80211_ROAMING_AUTO)
101#define WE_WLAN_VERSION 1
102#define STATS_CONTEXT_MAGIC 0x53544154
Yathish Hanumapuradoddi Shivanna7b659402013-03-25 14:12:32 -0700103#define WE_GET_STA_INFO_SIZE 30
104/* WEXT limition: MAX allowed buf len for any *
105 * IW_PRIV_TYPE_CHAR is 2Kbytes *
106 */
107#define WE_SAP_MAX_STA_INFO 0x7FF
Jeff Johnson295189b2012-06-20 16:38:30 -0700108
109struct statsContext
110{
111 struct completion completion;
112 hdd_adapter_t *pAdapter;
113 unsigned int magic;
114};
115#define SAP_24GHZ_CH_COUNT (14)
Leo Chang614d2072013-08-22 14:59:44 -0700116
117#define SAP_MAX_GET_ASSOC_STAS_TIMEOUT 500
118/* Max possible supported rate count
119 * Legacy 14 + 11N MCS 8 + 11AC MCS 10 */
120#define SAP_MAX_SUPPORTED_RATE_COUNT 32
121#define SAP_LEGACY_RATE_MASK 0x007F
122#define SAP_GET_STAS_RATE_TIMEOUT 1000
123#define SAP_AC_MCS_MAP_MASK 0x03
124#define SAP_AC_MCS_MAP_OFFSET 7
125
126#define SAP_LEGACY_RATE_COUNT SIR_NUM_11B_RATES + SIR_NUM_11A_RATES
127#define SAP_11N_RATE_COUNT 8
128
129#define SAP_RATE_SUPPORT_MAP_LEGACY_MASK 0x0001
130#define SAP_RATE_SUPPORT_MAP_N_MASK 0x001E
131#define SAP_RATE_SUPPORT_MAP_AC_MASK 0x07E0
132
133#define SAP_MAX_24_CHANNEL_NUMBER 14
134#define SAP_GET_STAS_COOKIE 0xC000C1EE
135
136/* Temp put here, will locate correct location
137 * work on progress with UMAC */
138/* Should syn with FW definition */
139typedef enum
140{
141 WNI_CFG_FIXED_RATE_SAP_AUTO,
142 WNI_CFG_FIXED_RATE_11B_LONG_1_MBPS,
143 WNI_CFG_FIXED_RATE_11B_LONG_2_MBPS,
144 WNI_CFG_FIXED_RATE_11B_LONG_5_5_MBPS,
145 WNI_CFG_FIXED_RATE_11B_LONG_11_MBPS,
146 WNI_CFG_FIXED_RATE_11A_6_MBPS,
147 WNI_CFG_FIXED_RATE_11A_9_MBPS,
148 WNI_CFG_FIXED_RATE_11A_12_MBPS,
149 WNI_CFG_FIXED_RATE_11A_18_MBPS,
150 WNI_CFG_FIXED_RATE_11A_24_MBPS,
151 WNI_CFG_FIXED_RATE_11A_36_MBPS,
152 WNI_CFG_FIXED_RATE_11A_48_MBPS,
153 WNI_CFG_FIXED_RATE_11A_54_MBPS,
154 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_6_5_MBPS,
155 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_13_MBPS,
156 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_19_5_MBPS,
157 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_26_MBPS,
158 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_39_MBPS,
159 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_52_MBPS,
160 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_58_5_MBPS,
161 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_65_MBPS,
162 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_7_2_MBPS,
163 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_14_4_MBPS,
164 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_21_7_MBPS,
165 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_28_9_MBPS,
166 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_43_3_MBPS,
167 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_57_8_MBPS,
168 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_65_MBPS,
169 WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_72_2_MBPS,
170 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_13_5_MBPS,
171 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_27_MBPS, /* 30 */
172 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_40_5_MBPS,
173 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_54_MBPS,
174 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_81_MBPS,
175 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_108_MBPS,
176 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_121_5_MBPS,
177 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_135_MBPS,
178 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_15_MBPS,
179 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_30_MBPS,
180 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_45_MBPS,
181 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_60_MBPS,
182 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_90_MBPS,
183 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_120_MBPS,
184 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_135_MBPS,
185 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_150_MBPS,
186 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_GF_13_5_MBPS,
187 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_GF_27_MBPS,
188 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_GF_40_5_MBPS,
189 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_GF_54_MBPS,
190 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_GF_81_MBPS,
191 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_GF_108_MBPS,
192 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_GF_121_5_MBPS,
193 WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_GF_135_MBPS,
194 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_6_5MBPS,
195 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_13MBPS,
196 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_19_5MBPS,
197 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_26MBPS,
198 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_39MBPS,
199 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_52MBPS,
200 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_58_5MBPS,
201 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_65MBPS, /* 60 */
202 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_78MBPS,
203 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_NGI_86_5_MBPS,
204 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_SGI_21_667MBPS,
205 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_SGI_28_889MBPS,
206 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_SGI_43_333MBPS,
207 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_SGI_57_778MBPS,
208 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_SGI_65MBPS,
209 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_SGI_72_222MBPS,
210 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_SGI_86_667MBPS,
211 WNI_CFG_FIXED_RATE_VHT_SIMO_CB_SGI_96_1_MBPS,
212 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_13_5MBPS,
213 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_27MBPS,
214 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_40_5MBPS,
215 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_54MBPS,
216 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_81MBPS,
217 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_108MBPS,
218 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_121_5MBPS,
219 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_135MBPS,
220 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_RESERVED,
221 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_162MBPS,
222 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_180MBPS,
223 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_15MBPS,
224 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_30MBPS,
225 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_45MBPS,
226 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_60MBPS,
227 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_90MBPS,
228 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_120MBPS,
229 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_135MBPS,
230 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_150MBPS,
231 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_RESERVED, /* 90 */
232 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_180MBPS,
233 WNI_CFG_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_200MBPS,
234 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_29_25MBPS,
235 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_58_5MBPS,
236 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_87_75MBPS,
237 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_117MBPS,
238 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_175_5MBPS,
239 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_234MBPS,
240 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_263_25MBPS,
241 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_292_5MBPS,
242 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_RESERVED,
243 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_351MBPS,
244 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_390MBPS,
245 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_32_5MBPS,
246 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_65MBPS,
247 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_97_5MBPS,
248 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_130MBPS,
249 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_195MBPS,
250 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_260MBPS,
251 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_292_5MBPS,
252 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_325MBPS,
253 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_RESERVED,
254 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_390MBPS,
255 WNI_CFG_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_433_33MBPS,
256 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_6_5MBPS,
257 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_13MBPS,
258 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_19_5MBPS,
259 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_26MBPS,
260 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_39MBPS,
261 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_52MBPS, /* 120 */
262 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_58_5MBPS,
263 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_65MBPS,
264 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_78MBPS,
265 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_86_5_MBPS,
266 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_7_2222MBPS,
267 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_14_444MBPS,
268 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_21_667MBPS,
269 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_28_889MBPS,
270 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_43_333MBPS,
271 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_57_778MBPS,
272 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_65MBPS,
273 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_72_222MBPS,
274 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_86_667MBPS,
275 WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_96_1_MBPS,
276 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_13_5MBPS,
277 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_27MBPS,
278 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_40_5MBPS,
279 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_54MBPS,
280 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_81MBPS,
281 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_108MBPS,
282 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_121_5MBPS,
283 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_135MBPS,
284 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_RESERVED,
285 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_162MBPS,
286 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_180MBPS,
287 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_15MBPS,
288 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_30MBPS,
289 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_45MBPS,
290 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_60MBPS,
291 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_90MBPS, /* 150 */
292 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_120MBPS,
293 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_135MBPS,
294 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_150MBPS,
295 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_RESERVED,
296 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_180MBPS,
297 WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_200MBPS,
298 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_29_25MBPS,
299 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_58_5MBPS,
300 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_87_75MBPS,
301 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_117MBPS,
302 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_175_5MBPS,
303 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_234MBPS,
304 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_263_25MBPS,
305 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_292_5MBPS,
306 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_RESERVED,
307 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_351MBPS,
308 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_390MBPS,
309 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_32_5MBPS,
310 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_65MBPS,
311 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_97_5MBPS,
312 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_130MBPS,
313 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_195MBPS,
314 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_260MBPS,
315 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_292_5MBPS,
316 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_325MBPS,
317 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_RESERVED,
318 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_390MBPS,
319 WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_433_33MBPS,
320 WNI_CFG_FIXED_RATE_11A_DUP_6_MBPS,
321 WNI_CFG_FIXED_RATE_11A_DUP_9_MBPS, /* 180 */
322 WNI_CFG_FIXED_RATE_11A_DUP_12_MBPS,
323 WNI_CFG_FIXED_RATE_11A_DUP_18_MBPS,
324 WNI_CFG_FIXED_RATE_11A_DUP_24_MBPS,
325 WNI_CFG_FIXED_RATE_11A_DUP_36_MBPS,
326 WNI_CFG_FIXED_RATE_11A_DUP_48_MBPS,
327 WNI_CFG_FIXED_RATE_11A_DUP_54_MBPS,
328 WNI_CFG_FIXED_RATE_11A_80MHZ_DUP_6_MBPS,
329 WNI_CFG_FIXED_RATE_11A_80MHZDUP_9_MBPS,
330 WNI_CFG_FIXED_RATE_11A_80MHZ_DUP_12_MBPS,
331 WNI_CFG_FIXED_RATE_11A_80MHZ_DUP_18_MBPS,
332 WNI_CFG_FIXED_RATE_11A_80MHZ_DUP_24_MBPS,
333 WNI_CFG_FIXED_RATE_11A_80MHZ_DUP_36_MBPS,
334 WNI_CFG_FIXED_RATE_11A_80MHZ_DUP_48_MBPS,
335 WNI_CFG_FIXED_RATE_11A_80MHZ_DUP_54_MBPS,
336 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_6_5_MBPS,
337 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_13_MBPS,
338 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_19_5_MBPS,
339 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_26_MBPS,
340 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_39_MBPS,
341 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_52_MBPS,
342 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_58_5_MBPS,
343 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_65_MBPS,
344 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_SG_7_2_MBPS,
345 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_SG_14_4_MBPS,
346 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_SG_21_7_MBPS,
347 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_SG_28_9_MBPS,
348 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_SG_43_3_MBPS,
349 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_SG_57_8_MBPS,
350 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_SG_65_MBPS,
351 WNI_CFG_LDPC_FIXED_RATE_MCS_1NSS_MM_SG_72_2_MBPS, /* 210 */
352 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_13_5_MBPS,
353 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_27_MBPS,
354 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_40_5_MBPS,
355 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_54_MBPS,
356 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_81_MBPS,
357 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_108_MBPS,
358 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_121_5_MBPS,
359 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_135_MBPS,
360 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_15_MBPS,
361 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_30_MBPS,
362 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_45_MBPS,
363 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_60_MBPS,
364 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_90_MBPS,
365 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_120_MBPS,
366 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_135_MBPS,
367 WNI_CFG_LDPC_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_150_MBPS
368} eCfgFixedRateCfgType;
369
370/* Legacy IDX based rate table */
371typedef struct
372{
373 v_U16_t legacy_rate_index;
374 v_U32_t legacy_rate;
375} supported_legacy_rate_t;
376static const supported_legacy_rate_t legacy_rate[] =
377{
378/* IDX Rate, 100kbps */
379 {2, 10},
380 {4, 20},
381 {11, 55},
382 {12, 60},
383 {18, 90},
384 {24, 120},
385 {36, 180},
386 {48, 240},
387 {66, 330},
388 {72, 360},
389 {96, 480},
390 {108, 540}
391};
392
393/* 11N MCS based rate table */
394typedef struct
395{
396 v_U8_t mcs_index_11n;
397 v_U32_t rate_11n[4];
398} supported_11n_rate_t;
399static const supported_11n_rate_t mcs_rate_11n[] =
400{
401/* MCS L20 L40 S20 S40 */
402 {0, {65, 135, 72, 150}},
403 {1, {130, 270, 144, 300}},
404 {2, {195, 405, 217, 450}},
405 {3, {260, 540, 289, 600}},
406 {4, {390, 810, 433, 900}},
407 {5, {520, 1080, 578, 1200}},
408 {6, {585, 1215, 650, 1350}},
409 {7, {650, 1350, 722, 1500}}
410};
411
412/* 11AC MCS based rate table */
413typedef struct
414{
415 v_U8_t mcs_index_11ac;
416 v_U16_t cb80_rate_11ac[2];
417 v_U16_t cb40_rate_11ac[2];
418 v_U16_t cb20_rate_11ac[2];
419} supported_11ac_rate_t;
420static const supported_11ac_rate_t mcs_rate_11ac[] =
421{
422/* MCS L80 S80 L40 S40 L20 S40*/
423 {0, {293, 325}, {135, 150}, {65, 72}},
424 {1, {585, 650}, {270, 300}, {130, 144}},
425 {2, {878, 975}, {405, 450}, {195, 217}},
426 {3, {1170, 1300}, {540, 600}, {260, 289}},
427 {4, {1755, 1950}, {810, 900}, {390, 433}},
428 {5, {2340, 2600}, {1080, 1200}, {520, 578}},
429 {6, {2633, 2925}, {1215, 1350}, {585, 650}},
430 {7, {2925, 3250}, {1350, 1500}, {650, 722}},
431 {8, {3510, 3900}, {1620, 1800}, {780, 867}},
432 {9, {3900, 4333}, {1800, 2000}, {860, 867}}
433};
434
435typedef struct
436{
437 eCfgFixedRateCfgType eRateCfg;
438 v_U16_t rate;
439} rate_cfg_item_mapping_t;
440
441static rate_cfg_item_mapping_t legacy_rate_mapping[] =
442{
443 {WNI_CFG_FIXED_RATE_11B_LONG_1_MBPS, 10},
444 {WNI_CFG_FIXED_RATE_11B_LONG_2_MBPS, 20},
445 {WNI_CFG_FIXED_RATE_11B_LONG_5_5_MBPS, 55},
446 {WNI_CFG_FIXED_RATE_11B_LONG_11_MBPS, 110},
447 {WNI_CFG_FIXED_RATE_11A_6_MBPS, 60},
448 {WNI_CFG_FIXED_RATE_11A_9_MBPS, 90},
449 {WNI_CFG_FIXED_RATE_11A_12_MBPS, 120},
450 {WNI_CFG_FIXED_RATE_11A_18_MBPS, 180},
451 {WNI_CFG_FIXED_RATE_11A_24_MBPS, 240},
452 {WNI_CFG_FIXED_RATE_11A_36_MBPS, 360},
453 {WNI_CFG_FIXED_RATE_11A_48_MBPS, 480},
454 {WNI_CFG_FIXED_RATE_11A_54_MBPS, 540}
455};
456static rate_cfg_item_mapping_t n_l20_rate_mapping[] =
457{
458 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_6_5_MBPS, 65},
459 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_13_MBPS, 130},
460 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_19_5_MBPS, 195},
461 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_26_MBPS, 260},
462 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_39_MBPS, 390},
463 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_52_MBPS, 520},
464 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_58_5_MBPS, 585},
465 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_65_MBPS, 650}
466};
467static rate_cfg_item_mapping_t n_s20_rate_mapping[] =
468{
469 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_7_2_MBPS, 72},
470 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_14_4_MBPS, 144},
471 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_21_7_MBPS, 217},
472 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_28_9_MBPS, 289},
473 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_43_3_MBPS, 433},
474 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_57_8_MBPS, 578},
475 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_65_MBPS, 650},
476 {WNI_CFG_FIXED_RATE_MCS_1NSS_MM_SG_72_2_MBPS, 722}
477};
478static rate_cfg_item_mapping_t n_l40_rate_mapping[] =
479{
480 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_13_5_MBPS, 135},
481 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_27_MBPS, 270},
482 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_40_5_MBPS, 405},
483 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_54_MBPS, 540},
484 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_81_MBPS, 810},
485 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_108_MBPS, 1080},
486 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_121_5_MBPS, 1215},
487 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_135_MBPS, 1350}
488};
489static rate_cfg_item_mapping_t n_s40_rate_mapping[] =
490{
491 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_15_MBPS, 150},
492 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_30_MBPS, 300},
493 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_45_MBPS, 450},
494 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_60_MBPS, 600},
495 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_90_MBPS, 900},
496 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_120_MBPS, 1200},
497 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_135_MBPS, 1350},
498 {WNI_CFG_FIXED_RATE_MCS_40MHZ_1NSS_MM_SG_150_MBPS, 1500}
499};
500
501#ifdef WLAN_FEATURE_11AC
502static rate_cfg_item_mapping_t ac_l20_rate_mapping[] =
503{
504 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_6_5MBPS, 65},
505 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_13MBPS, 130},
506 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_19_5MBPS, 195},
507 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_26MBPS, 260},
508 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_39MBPS, 390},
509 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_52MBPS, 520},
510 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_58_5MBPS, 585},
511 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_65MBPS, 650},
512 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_78MBPS, 780},
513 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_NGI_86_5_MBPS, 865}
514};
515static rate_cfg_item_mapping_t ac_s20_rate_mapping[] =
516{
517 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_7_2222MBPS, 72},
518 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_14_444MBPS, 144},
519 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_21_667MBPS, 217},
520 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_28_889MBPS, 289},
521 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_43_333MBPS, 433},
522 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_57_778MBPS, 578},
523 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_65MBPS, 650},
524 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_72_222MBPS, 722},
525 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_86_667MBPS, 867},
526 {WNI_CFG_LDPC_FIXED_RATE_VHT_SIMO_CB_SGI_96_1_MBPS, 961}
527};
528static rate_cfg_item_mapping_t ac_l40_rate_mapping[] =
529{
530 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_13_5MBPS, 135},
531 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_27MBPS, 270},
532 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_40_5MBPS, 405},
533 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_54MBPS, 540},
534 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_81MBPS, 810},
535 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_108MBPS, 1080},
536 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_121_5MBPS, 1215},
537 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_135MBPS, 1350},
538 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_162MBPS, 1620},
539 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_NGI_180MBPS, 1800}
540};
541static rate_cfg_item_mapping_t ac_s40_rate_mapping[] =
542{
543 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_15MBPS, 150},
544 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_30MBPS, 300},
545 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_45MBPS, 450},
546 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_60MBPS, 600},
547 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_90MBPS, 900},
548 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_120MBPS, 1200},
549 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_135MBPS, 1350},
550 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_150MBPS, 1500},
551 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_180MBPS, 1800},
552 {WNI_CFG_LDPC_FIXED_RATE_VHT_40MHZ_SIMO_CB_SGI_200MBPS, 2000}
553};
554static rate_cfg_item_mapping_t ac_l80_rate_mapping[] =
555{
556 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_29_25MBPS, 293},
557 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_58_5MBPS, 585},
558 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_87_75MBPS, 878},
559 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_117MBPS, 1170},
560 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_175_5MBPS, 1755},
561 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_234MBPS, 2340},
562 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_263_25MBPS, 2633},
563 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_292_5MBPS, 2925},
564 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_351MBPS, 3510},
565 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_NGI_390MBPS, 3900}
566};
567static rate_cfg_item_mapping_t ac_s80_rate_mapping[] =
568{
569 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_32_5MBPS, 325},
570 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_65MBPS, 650},
571 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_97_5MBPS, 975},
572 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_130MBPS, 1300},
573 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_195MBPS, 1950},
574 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_260MBPS, 2600},
575 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_292_5MBPS, 2925},
576 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_325MBPS, 3250},
577 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_390MBPS, 3900},
578 {WNI_CFG_LDPC_FIXED_RATE_VHT_80MHZ_SIMO_CB_SGI_433_33MBPS, 4333}
579};
580#endif /* WLAN_FEATURE_11AC */
581
582typedef enum
583{
584 RATE_CFG_RATE_LEGACY,
585 RATE_CFG_RATE_11N_MCS_LGI_20,
586 RATE_CFG_RATE_11N_MCS_SGI_20,
587 RATE_CFG_RATE_11N_MCS_LGI_40,
588 RATE_CFG_RATE_11N_MCS_SGI_40,
589 RATE_CFG_RATE_11AC_MCS_LGI_20,
590 RATE_CFG_RATE_11AC_MCS_SGI_20,
591 RATE_CFG_RATE_11AC_MCS_LGI_40,
592 RATE_CFG_RATE_11AC_MCS_SGI_40,
593 RATE_CFG_RATE_11AC_MCS_LGI_80,
594 RATE_CFG_RATE_11AC_MCS_SGI_80
595} rate_cfg_supported_rate_t;
596
597typedef enum
598{
599 RATE_CFG_RATE_11AC_MAX_MCS_7,
600 RATE_CFG_RATE_11AC_MAX_MCS_8,
601 RATE_CFG_RATE_11AC_MAX_MCS_9
602} rate_cfg_11ac_max_mcs_t;
603
604typedef enum
605{
606 RATE_CFG_RATE_BW_20,
607 RATE_CFG_RATE_BW_40,
608 RATE_CFG_RATE_BW_80
609} rate_cfg_supported_bw_t;
610
611typedef enum
612{
613 RATE_CFG_RATE_GI_LONG,
614 RATE_CFG_RATE_GI_SHORT
615} rate_cfg_gi_t;
616
Jeff Johnson295189b2012-06-20 16:38:30 -0700617/*---------------------------------------------------------------------------
618 * Function definitions
619 *-------------------------------------------------------------------------*/
620/**---------------------------------------------------------------------------
621
622 \brief hdd_hostapd_open() - HDD Open function for hostapd interface
623
624 This is called in response to ifconfig up
625
626 \param - dev Pointer to net_device structure
627
628 \return - 0 for success non-zero for failure
629
630 --------------------------------------------------------------------------*/
631int hdd_hostapd_open (struct net_device *dev)
632{
633 ENTER();
634
635 //Turn ON carrier state
636 netif_carrier_on(dev);
637 //Enable all Tx queues
638 netif_tx_start_all_queues(dev);
639
640 EXIT();
641 return 0;
642}
643/**---------------------------------------------------------------------------
644
645 \brief hdd_hostapd_stop() - HDD stop function for hostapd interface
646
647 This is called in response to ifconfig down
648
649 \param - dev Pointer to net_device structure
650
651 \return - 0 for success non-zero for failure
652
653 --------------------------------------------------------------------------*/
654int hdd_hostapd_stop (struct net_device *dev)
655{
656 ENTER();
657
658 //Stop all tx queues
659 netif_tx_disable(dev);
660
661 //Turn OFF carrier state
662 netif_carrier_off(dev);
663
664 EXIT();
665 return 0;
666}
667/**---------------------------------------------------------------------------
668
669 \brief hdd_hostapd_uninit() - HDD uninit function
670
671 This is called during the netdev unregister to uninitialize all data
672associated with the device
673
674 \param - dev Pointer to net_device structure
675
676 \return - void
677
678 --------------------------------------------------------------------------*/
679static void hdd_hostapd_uninit (struct net_device *dev)
680{
681 hdd_adapter_t *pHostapdAdapter = netdev_priv(dev);
682
683 ENTER();
684
685 if (pHostapdAdapter && pHostapdAdapter->pHddCtx)
686 {
687 hdd_deinit_adapter(pHostapdAdapter->pHddCtx, pHostapdAdapter);
688
689 /* after uninit our adapter structure will no longer be valid */
690 pHostapdAdapter->dev = NULL;
691 }
692
693 EXIT();
694}
695
696
697/**============================================================================
698 @brief hdd_hostapd_hard_start_xmit() - Function registered with the Linux OS for
699 transmitting packets. There are 2 versions of this function. One that uses
700 locked queue and other that uses lockless queues. Both have been retained to
701 do some performance testing
702 @param skb : [in] pointer to OS packet (sk_buff)
703 @param dev : [in] pointer to Libra network device
704
705 @return : NET_XMIT_DROP if packets are dropped
706 : NET_XMIT_SUCCESS if packet is enqueued succesfully
707 ===========================================================================*/
708int hdd_hostapd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
709{
710 return 0;
711}
712int hdd_hostapd_change_mtu(struct net_device *dev, int new_mtu)
713{
714 return 0;
715}
716
717int hdd_hostapd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
718{
719 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
720 hdd_priv_data_t priv_data;
721 tANI_U8 *command = NULL;
722 int ret = 0;
723
724 if (NULL == pAdapter)
725 {
726 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700727 "%s: HDD adapter context is Null", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700728 ret = -ENODEV;
729 goto exit;
730 }
731
Jeff Johnsone7245742012-09-05 17:12:55 -0700732 if ((!ifr) || (!ifr->ifr_data))
Jeff Johnson295189b2012-06-20 16:38:30 -0700733 {
734 ret = -EINVAL;
735 goto exit;
736 }
737
738 if (copy_from_user(&priv_data, ifr->ifr_data, sizeof(hdd_priv_data_t)))
739 {
740 ret = -EFAULT;
741 goto exit;
742 }
743
744 command = kmalloc(priv_data.total_len, GFP_KERNEL);
745 if (!command)
746 {
747 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700748 "%s: failed to allocate memory\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700749 ret = -ENOMEM;
750 goto exit;
751 }
752
753 if (copy_from_user(command, priv_data.buf, priv_data.total_len))
754 {
755 ret = -EFAULT;
756 goto exit;
757 }
758
759 if ((SIOCDEVPRIVATE + 1) == cmd)
760 {
761 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
762 "***HOSTAPD*** : Received %s cmd from Wi-Fi GUI***", command);
763
Jeff Johnson295189b2012-06-20 16:38:30 -0700764 if(strncmp(command, "P2P_SET_NOA", 11) == 0 )
765 {
766 hdd_setP2pNoa(dev, command);
767 }
768 else if( strncmp(command, "P2P_SET_PS", 10) == 0 )
769 {
770 hdd_setP2pOpps(dev, command);
771 }
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700772
773 /*
774 command should be a string having format
775 SET_SAP_CHANNEL_LIST <num of channels> <the channels seperated by spaces>
776 */
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700777 if(strncmp(command, "SET_SAP_CHANNEL_LIST", 20) == 0)
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700778 {
779 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700780 " Received Command to Set Preferred Channels for SAP in %s", __func__);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700781
Mahesh Kumar Kalikot Veetil2aad8d82013-02-07 12:31:28 -0800782 ret = sapSetPreferredChannel(command);
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700783 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700784 }
785exit:
786 if (command)
787 {
788 kfree(command);
789 }
790 return ret;
791}
792
793/**---------------------------------------------------------------------------
794
795 \brief hdd_hostapd_set_mac_address() -
796 This function sets the user specified mac address using
797 the command ifconfig wlanX hw ether <mac adress>.
798
799 \param - dev - Pointer to the net device.
800 - addr - Pointer to the sockaddr.
801 \return - 0 for success, non zero for failure
802
803 --------------------------------------------------------------------------*/
804
805static int hdd_hostapd_set_mac_address(struct net_device *dev, void *addr)
806{
807 struct sockaddr *psta_mac_addr = addr;
808 ENTER();
809 memcpy(dev->dev_addr, psta_mac_addr->sa_data, ETH_ALEN);
810 EXIT();
811 return 0;
812}
813void hdd_hostapd_inactivity_timer_cb(v_PVOID_t usrDataForCallback)
814{
815 struct net_device *dev = (struct net_device *)usrDataForCallback;
816 v_BYTE_t we_custom_event[64];
817 union iwreq_data wrqu;
818#ifdef DISABLE_CONCURRENCY_AUTOSAVE
819 VOS_STATUS vos_status;
820 hdd_adapter_t *pHostapdAdapter;
821 hdd_ap_ctx_t *pHddApCtx;
822#endif /*DISABLE_CONCURRENCY_AUTOSAVE */
823
824 /* event_name space-delimiter driver_module_name */
825 /* Format of the event is "AUTO-SHUT.indication" " " "module_name" */
826 char * autoShutEvent = "AUTO-SHUT.indication" " " KBUILD_MODNAME;
827 int event_len = strlen(autoShutEvent) + 1; /* For the NULL at the end */
828
829 ENTER();
830
831#ifdef DISABLE_CONCURRENCY_AUTOSAVE
832 if (vos_concurrent_sessions_running())
833 {
834 /*
835 This timer routine is going to be called only when AP
836 persona is up.
837 If there are concurrent sessions running we do not want
838 to shut down the Bss.Instead we run the timer again so
839 that if Autosave is enabled next time and other session
840 was down only then we bring down AP
841 */
842 pHostapdAdapter = netdev_priv(dev);
843 pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
844 vos_status = vos_timer_start(
845 &pHddApCtx->hdd_ap_inactivity_timer,
846 (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff
847 * 1000);
848 if (!VOS_IS_STATUS_SUCCESS(vos_status))
849 {
850 hddLog(LOGE, FL("Failed to init AP inactivity timer"));
851 }
852 EXIT();
853 return;
854 }
855#endif /*DISABLE_CONCURRENCY_AUTOSAVE */
856 memset(&we_custom_event, '\0', sizeof(we_custom_event));
857 memcpy(&we_custom_event, autoShutEvent, event_len);
858
859 memset(&wrqu, 0, sizeof(wrqu));
860 wrqu.data.length = event_len;
861
862 hddLog(LOG1, FL("Shutting down AP interface due to inactivity"));
863 wireless_send_event(dev, IWEVCUSTOM, &wrqu, (char *)we_custom_event);
864
865 EXIT();
866}
867
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -0800868VOS_STATUS hdd_change_mcc_go_beacon_interval(hdd_adapter_t *pHostapdAdapter)
869{
870 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
871 ptSapContext pSapCtx = NULL;
872 eHalStatus halStatus = eHAL_STATUS_FAILURE;
873 v_PVOID_t hHal = NULL;
874
875 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
876 "%s: UPDATE Beacon Params", __func__);
877
878 if(VOS_STA_SAP_MODE == vos_get_conparam ( )){
879 pSapCtx = VOS_GET_SAP_CB(pVosContext);
880 if ( NULL == pSapCtx )
881 {
882 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
883 "%s: Invalid SAP pointer from pvosGCtx", __func__);
884 return VOS_STATUS_E_FAULT;
885 }
886
887 hHal = VOS_GET_HAL_CB(pSapCtx->pvosGCtx);
888 if ( NULL == hHal ){
889 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
890 "%s: Invalid HAL pointer from pvosGCtx", __func__);
891 return VOS_STATUS_E_FAULT;
892 }
893 halStatus = sme_ChangeMCCBeaconInterval(hHal, pSapCtx->sessionId);
894 if(halStatus == eHAL_STATUS_FAILURE ){
895 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
896 "%s: Failed to update Beacon Params", __func__);
897 return VOS_STATUS_E_FAILURE;
898 }
899 }
900 return VOS_STATUS_SUCCESS;
901}
902
903void hdd_clear_all_sta(hdd_adapter_t *pHostapdAdapter, v_PVOID_t usrDataForCallback)
904{
905 v_U8_t staId = 0;
906 struct net_device *dev;
907 dev = (struct net_device *)usrDataForCallback;
908
909 hddLog(LOGE, FL("Clearing all the STA entry....\n"));
910 for (staId = 0; staId < WLAN_MAX_STA_COUNT; staId++)
911 {
912 if ( pHostapdAdapter->aStaInfo[staId].isUsed &&
913 ( staId != (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uBCStaId))
914 {
915 //Disconnect all the stations
916 hdd_softap_sta_disassoc(pHostapdAdapter, &pHostapdAdapter->aStaInfo[staId].macAddrSTA.bytes[0]);
917 }
918 }
919}
920
921static int hdd_stop_p2p_link(hdd_adapter_t *pHostapdAdapter,v_PVOID_t usrDataForCallback)
922{
923 struct net_device *dev;
924 VOS_STATUS status = VOS_STATUS_SUCCESS;
925 dev = (struct net_device *)usrDataForCallback;
926 ENTER();
927 if(test_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags))
928 {
929 if ( VOS_STATUS_SUCCESS == (status = WLANSAP_StopBss((WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext) ) )
930 {
931 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, FL("Deleting P2P link!!!!!!"));
932 }
933 clear_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
934 }
935 EXIT();
936 return (status == VOS_STATUS_SUCCESS) ? 0 : -EBUSY;
937}
Jeff Johnson295189b2012-06-20 16:38:30 -0700938
939VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCallback)
940{
941 hdd_adapter_t *pHostapdAdapter;
942 hdd_ap_ctx_t *pHddApCtx;
943 hdd_hostapd_state_t *pHostapdState;
944 struct net_device *dev;
945 eSapHddEvent sapEvent;
946 union iwreq_data wrqu;
947 v_BYTE_t *we_custom_event_generic = NULL;
948 int we_event = 0;
949 int i = 0;
950 v_U8_t staId;
951 VOS_STATUS vos_status;
952 v_BOOL_t bWPSState;
953 v_BOOL_t bApActive = FALSE;
954 v_BOOL_t bAuthRequired = TRUE;
955 tpSap_AssocMacAddr pAssocStasArray = NULL;
956 char unknownSTAEvent[IW_CUSTOM_MAX+1];
957 char maxAssocExceededEvent[IW_CUSTOM_MAX+1];
958 v_BYTE_t we_custom_start_event[64];
959 char *startBssEvent;
Madan Mohan Koyyalamudi69fc3ad2012-11-28 16:04:56 -0800960 hdd_context_t *pHddCtx;
Madan Mohan Koyyalamudicd784992013-01-11 15:30:36 -0800961 hdd_scaninfo_t *pScanInfo = NULL;
Jeff Johnson5f12e902013-04-03 10:21:46 -0700962 struct iw_michaelmicfailure msg;
Jeff Johnson295189b2012-06-20 16:38:30 -0700963
964 dev = (struct net_device *)usrDataForCallback;
965 pHostapdAdapter = netdev_priv(dev);
Madan Mohan Koyyalamudie1b791f2013-07-24 12:53:33 +0530966
967 if ((NULL == pHostapdAdapter) ||
968 (WLAN_HDD_ADAPTER_MAGIC != pHostapdAdapter->magic))
969 {
970 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
971 "invalid adapter or adapter has invalid magic");
972 return eHAL_STATUS_FAILURE;
973 }
974
Jeff Johnson295189b2012-06-20 16:38:30 -0700975 pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
976 pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
977 sapEvent = pSapEvent->sapHddEventCode;
978 memset(&wrqu, '\0', sizeof(wrqu));
Madan Mohan Koyyalamudi69fc3ad2012-11-28 16:04:56 -0800979 pHddCtx = (hdd_context_t*)(pHostapdAdapter->pHddCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -0700980
981 switch(sapEvent)
982 {
983 case eSAP_START_BSS_EVENT :
984 hddLog(LOG1, FL("BSS configured status = %s, channel = %lu, bc sta Id = %d\n"),
985 pSapEvent->sapevt.sapStartBssCompleteEvent.status ? "eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS",
986 pSapEvent->sapevt.sapStartBssCompleteEvent.operatingChannel,
987 pSapEvent->sapevt.sapStartBssCompleteEvent.staId);
988
989 pHostapdState->vosStatus = pSapEvent->sapevt.sapStartBssCompleteEvent.status;
990 vos_status = vos_event_set(&pHostapdState->vosEvent);
991
992 if (!VOS_IS_STATUS_SUCCESS(vos_status) || pHostapdState->vosStatus)
993 {
994 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: startbss event failed!!\n"));
995 goto stopbss;
996 }
997 else
998 {
999 pHddApCtx->uBCStaId = pSapEvent->sapevt.sapStartBssCompleteEvent.staId;
1000 //@@@ need wep logic here to set privacy bit
1001 hdd_softap_Register_BC_STA(pHostapdAdapter, pHddApCtx->uPrivacy);
1002 }
1003
1004 if (0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff)
1005 {
1006 // AP Inactivity timer init and start
1007 vos_status = vos_timer_init( &pHddApCtx->hdd_ap_inactivity_timer, VOS_TIMER_TYPE_SW,
1008 hdd_hostapd_inactivity_timer_cb, (v_PVOID_t)dev );
1009 if (!VOS_IS_STATUS_SUCCESS(vos_status))
1010 hddLog(LOGE, FL("Failed to init AP inactivity timer\n"));
1011
1012 vos_status = vos_timer_start( &pHddApCtx->hdd_ap_inactivity_timer, (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff * 1000);
1013 if (!VOS_IS_STATUS_SUCCESS(vos_status))
1014 hddLog(LOGE, FL("Failed to init AP inactivity timer\n"));
1015
1016 }
1017 pHddApCtx->operatingChannel = pSapEvent->sapevt.sapStartBssCompleteEvent.operatingChannel;
1018 pHostapdState->bssState = BSS_START;
1019
1020 // Send current operating channel of SoftAP to BTC-ES
1021 send_btc_nlink_msg(WLAN_BTC_SOFTAP_BSS_START, 0);
1022
Jeff Johnson295189b2012-06-20 16:38:30 -07001023 //Check if there is any group key pending to set.
1024 if( pHddApCtx->groupKey.keyLength )
1025 {
Jeff Johnson43971f52012-07-17 12:26:56 -07001026 if( VOS_STATUS_SUCCESS != WLANSAP_SetKeySta(
Jeff Johnson295189b2012-06-20 16:38:30 -07001027 (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext,
1028 &pHddApCtx->groupKey ) )
1029 {
1030 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1031 "%s: WLANSAP_SetKeySta failed", __func__);
1032 }
1033 pHddApCtx->groupKey.keyLength = 0;
1034 }
1035 else if ( pHddApCtx->wepKey[0].keyLength )
1036 {
1037 int i=0;
1038 for ( i = 0; i < CSR_MAX_NUM_KEY; i++ )
1039 {
Jeff Johnson43971f52012-07-17 12:26:56 -07001040 if( VOS_STATUS_SUCCESS != WLANSAP_SetKeySta(
Jeff Johnson295189b2012-06-20 16:38:30 -07001041 (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext,
1042 &pHddApCtx->wepKey[i] ) )
1043 {
1044 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1045 "%s: WLANSAP_SetKeySta failed idx %d", __func__, i);
1046 }
1047 pHddApCtx->wepKey[i].keyLength = 0;
1048 }
1049 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001050 //Fill the params for sending IWEVCUSTOM Event with SOFTAP.enabled
1051 startBssEvent = "SOFTAP.enabled";
1052 memset(&we_custom_start_event, '\0', sizeof(we_custom_start_event));
1053 memcpy(&we_custom_start_event, startBssEvent, strlen(startBssEvent));
1054 memset(&wrqu, 0, sizeof(wrqu));
1055 wrqu.data.length = strlen(startBssEvent);
1056 we_event = IWEVCUSTOM;
1057 we_custom_event_generic = we_custom_start_event;
Sudhir Sattayappa Kohalli90e4c752013-03-21 14:25:04 -07001058 hdd_dump_concurrency_info(pHddCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -07001059 break; //Event will be sent after Switch-Case stmt
1060
1061 case eSAP_STOP_BSS_EVENT:
1062 hddLog(LOG1, FL("BSS stop status = %s\n"),pSapEvent->sapevt.sapStopBssCompleteEvent.status ?
1063 "eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
1064
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -07001065 //Free up Channel List incase if it is set
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07001066 sapCleanupChannelList();
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -07001067
Jeff Johnson295189b2012-06-20 16:38:30 -07001068 pHddApCtx->operatingChannel = 0; //Invalidate the channel info.
Jeff Johnson295189b2012-06-20 16:38:30 -07001069 goto stopbss;
1070 case eSAP_STA_SET_KEY_EVENT:
1071 //TODO: forward the message to hostapd once implementtation is done for now just print
1072 hddLog(LOG1, FL("SET Key: configured status = %s\n"),pSapEvent->sapevt.sapStationSetKeyCompleteEvent.status ?
1073 "eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
1074 return VOS_STATUS_SUCCESS;
1075 case eSAP_STA_DEL_KEY_EVENT:
1076 //TODO: forward the message to hostapd once implementtation is done for now just print
1077 hddLog(LOG1, FL("Event received %s\n"),"eSAP_STA_DEL_KEY_EVENT");
1078 return VOS_STATUS_SUCCESS;
1079 case eSAP_STA_MIC_FAILURE_EVENT:
1080 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001081 memset(&msg, '\0', sizeof(msg));
1082 msg.src_addr.sa_family = ARPHRD_ETHER;
Kumar Pavan0cf0cf22012-12-13 15:13:41 -08001083 memcpy(msg.src_addr.sa_data, &pSapEvent->sapevt.sapStationMICFailureEvent.staMac, sizeof(v_MACADDR_t));
Jeff Johnson295189b2012-06-20 16:38:30 -07001084 hddLog(LOG1, "MIC MAC "MAC_ADDRESS_STR"\n", MAC_ADDR_ARRAY(msg.src_addr.sa_data));
Jeff Johnson43971f52012-07-17 12:26:56 -07001085 if(pSapEvent->sapevt.sapStationMICFailureEvent.multicast == eSAP_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07001086 msg.flags = IW_MICFAILURE_GROUP;
1087 else
1088 msg.flags = IW_MICFAILURE_PAIRWISE;
1089 memset(&wrqu, 0, sizeof(wrqu));
1090 wrqu.data.length = sizeof(msg);
1091 we_event = IWEVMICHAELMICFAILURE;
1092 we_custom_event_generic = (v_BYTE_t *)&msg;
1093 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001094 /* inform mic failure to nl80211 */
1095 cfg80211_michael_mic_failure(dev,
1096 pSapEvent->sapevt.
1097 sapStationMICFailureEvent.staMac.bytes,
Jeff Johnson43971f52012-07-17 12:26:56 -07001098 ((pSapEvent->sapevt.sapStationMICFailureEvent.multicast == eSAP_TRUE) ?
Jeff Johnson295189b2012-06-20 16:38:30 -07001099 NL80211_KEYTYPE_GROUP :
1100 NL80211_KEYTYPE_PAIRWISE),
1101 pSapEvent->sapevt.sapStationMICFailureEvent.keyId,
1102 pSapEvent->sapevt.sapStationMICFailureEvent.TSC,
1103 GFP_KERNEL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001104 break;
1105
1106 case eSAP_STA_ASSOC_EVENT:
1107 case eSAP_STA_REASSOC_EVENT:
1108 wrqu.addr.sa_family = ARPHRD_ETHER;
1109 memcpy(wrqu.addr.sa_data, &pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staMac,
Kumar Pavan0cf0cf22012-12-13 15:13:41 -08001110 sizeof(v_MACADDR_t));
Jeff Johnson295189b2012-06-20 16:38:30 -07001111 hddLog(LOG1, " associated "MAC_ADDRESS_STR"\n", MAC_ADDR_ARRAY(wrqu.addr.sa_data));
1112 we_event = IWEVREGISTERED;
1113
1114 WLANSAP_Get_WPS_State((WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext, &bWPSState);
1115
1116 if ( (eCSR_ENCRYPT_TYPE_NONE == pHddApCtx->ucEncryptType) ||
1117 ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pHddApCtx->ucEncryptType ) ||
1118 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pHddApCtx->ucEncryptType ) )
1119 {
1120 bAuthRequired = FALSE;
1121 }
1122
1123 if (bAuthRequired || bWPSState == eANI_BOOLEAN_TRUE )
1124 {
1125 hdd_softap_RegisterSTA( pHostapdAdapter,
1126 TRUE,
1127 pHddApCtx->uPrivacy,
1128 pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staId,
1129 0,
1130 0,
1131 (v_MACADDR_t *)wrqu.addr.sa_data,
1132 pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.wmmEnabled);
1133 }
1134 else
1135 {
1136 hdd_softap_RegisterSTA( pHostapdAdapter,
1137 FALSE,
1138 pHddApCtx->uPrivacy,
1139 pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staId,
1140 0,
1141 0,
1142 (v_MACADDR_t *)wrqu.addr.sa_data,
1143 pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.wmmEnabled);
Amar Singhal6144c002013-05-03 16:11:42 -07001144 }
1145
Jeff Johnson295189b2012-06-20 16:38:30 -07001146 // Stop AP inactivity timer
1147 if (pHddApCtx->hdd_ap_inactivity_timer.state == VOS_TIMER_STATE_RUNNING)
1148 {
1149 vos_status = vos_timer_stop(&pHddApCtx->hdd_ap_inactivity_timer);
1150 if (!VOS_IS_STATUS_SUCCESS(vos_status))
1151 hddLog(LOGE, FL("Failed to start AP inactivity timer\n"));
1152 }
Sameer Thalappil50dc0092013-02-19 17:23:33 -08001153#ifdef WLAN_OPEN_SOURCE
Madan Mohan Koyyalamudi69fc3ad2012-11-28 16:04:56 -08001154 if (wake_lock_active(&pHddCtx->sap_wake_lock))
1155 {
1156 wake_unlock(&pHddCtx->sap_wake_lock);
1157 }
Amar Singhal6144c002013-05-03 16:11:42 -07001158 wake_lock_timeout(&pHddCtx->sap_wake_lock, msecs_to_jiffies(HDD_SAP_WAKE_LOCK_DURATION));
Sameer Thalappil50dc0092013-02-19 17:23:33 -08001159#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001160#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
1161 {
1162 struct station_info staInfo;
1163 v_U16_t iesLen = pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.iesLen;
1164
1165 memset(&staInfo, 0, sizeof(staInfo));
1166 if (iesLen <= MAX_ASSOC_IND_IE_LEN )
1167 {
1168 staInfo.assoc_req_ies =
1169 (const u8 *)&pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.ies[0];
1170 staInfo.assoc_req_ies_len = iesLen;
Madan Mohan Koyyalamudi1b4afb02012-10-22 15:25:16 -07001171#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,31))
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001172 staInfo.filled |= STATION_INFO_ASSOC_REQ_IES;
1173#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001174 cfg80211_new_sta(dev,
1175 (const u8 *)&pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staMac.bytes[0],
1176 &staInfo, GFP_KERNEL);
1177 }
1178 else
1179 {
1180 hddLog(LOGE, FL(" Assoc Ie length is too long \n"));
1181 }
1182 }
1183#endif
Madan Mohan Koyyalamudicd784992013-01-11 15:30:36 -08001184 pScanInfo = &pHddCtx->scan_info;
1185 // Lets do abort scan to ensure smooth authentication for client
1186 if ((pScanInfo != NULL) && pScanInfo->mScanPending)
1187 {
Madan Mohan Koyyalamudiff3a7152013-06-13 14:47:55 +05301188 hdd_abort_mac_scan(pHddCtx, pHostapdAdapter->sessionId);
Madan Mohan Koyyalamudicd784992013-01-11 15:30:36 -08001189 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001190
1191 break;
1192 case eSAP_STA_DISASSOC_EVENT:
1193 memcpy(wrqu.addr.sa_data, &pSapEvent->sapevt.sapStationDisassocCompleteEvent.staMac,
Kumar Pavan0cf0cf22012-12-13 15:13:41 -08001194 sizeof(v_MACADDR_t));
Jeff Johnson295189b2012-06-20 16:38:30 -07001195 hddLog(LOG1, " disassociated "MAC_ADDRESS_STR"\n", MAC_ADDR_ARRAY(wrqu.addr.sa_data));
1196 if (pSapEvent->sapevt.sapStationDisassocCompleteEvent.reason == eSAP_USR_INITATED_DISASSOC)
1197 hddLog(LOG1," User initiated disassociation");
1198 else
1199 hddLog(LOG1," MAC initiated disassociation");
1200 we_event = IWEVEXPIRED;
1201 vos_status = hdd_softap_GetStaId(pHostapdAdapter, &pSapEvent->sapevt.sapStationDisassocCompleteEvent.staMac, &staId);
1202 if (!VOS_IS_STATUS_SUCCESS(vos_status))
1203 {
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -07001204 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, FL("ERROR: HDD Failed to find sta id!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001205 return VOS_STATUS_E_FAILURE;
1206 }
1207 hdd_softap_DeregisterSTA(pHostapdAdapter, staId);
1208
1209 if (0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff)
1210 {
1211 spin_lock_bh( &pHostapdAdapter->staInfo_lock );
1212 // Start AP inactivity timer if no stations associated with it
1213 for (i = 0; i < WLAN_MAX_STA_COUNT; i++)
1214 {
1215 if (pHostapdAdapter->aStaInfo[i].isUsed && i != (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uBCStaId)
1216 {
1217 bApActive = TRUE;
1218 break;
1219 }
1220 }
1221 spin_unlock_bh( &pHostapdAdapter->staInfo_lock );
1222
1223 if (bApActive == FALSE)
1224 {
1225 if (pHddApCtx->hdd_ap_inactivity_timer.state == VOS_TIMER_STATE_STOPPED)
1226 {
1227 vos_status = vos_timer_start(&pHddApCtx->hdd_ap_inactivity_timer, (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff * 1000);
1228 if (!VOS_IS_STATUS_SUCCESS(vos_status))
1229 hddLog(LOGE, FL("Failed to init AP inactivity timer\n"));
1230 }
1231 else
1232 VOS_ASSERT(vos_timer_getCurrentState(&pHddApCtx->hdd_ap_inactivity_timer) == VOS_TIMER_STATE_STOPPED);
1233 }
1234 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001235#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
1236 cfg80211_del_sta(dev,
1237 (const u8 *)&pSapEvent->sapevt.sapStationDisassocCompleteEvent.staMac.bytes[0],
1238 GFP_KERNEL);
1239#endif
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08001240 //Update the beacon Interval if it is P2P GO
1241 hdd_change_mcc_go_beacon_interval(pHostapdAdapter);
Jeff Johnson295189b2012-06-20 16:38:30 -07001242 break;
1243 case eSAP_WPS_PBC_PROBE_REQ_EVENT:
1244 {
1245 static const char * message ="MLMEWPSPBCPROBEREQ.indication";
1246 union iwreq_data wreq;
1247
1248 down(&pHddApCtx->semWpsPBCOverlapInd);
1249 pHddApCtx->WPSPBCProbeReq.probeReqIELen = pSapEvent->sapevt.sapPBCProbeReqEvent.WPSPBCProbeReq.probeReqIELen;
1250
1251 vos_mem_copy(pHddApCtx->WPSPBCProbeReq.probeReqIE, pSapEvent->sapevt.sapPBCProbeReqEvent.WPSPBCProbeReq.probeReqIE,
1252 pHddApCtx->WPSPBCProbeReq.probeReqIELen);
1253
1254 vos_mem_copy(pHddApCtx->WPSPBCProbeReq.peerMacAddr, pSapEvent->sapevt.sapPBCProbeReqEvent.WPSPBCProbeReq.peerMacAddr, sizeof(v_MACADDR_t));
1255 hddLog(LOG1, "WPS PBC probe req "MAC_ADDRESS_STR"\n", MAC_ADDR_ARRAY(pHddApCtx->WPSPBCProbeReq.peerMacAddr));
1256 memset(&wreq, 0, sizeof(wreq));
1257 wreq.data.length = strlen(message); // This is length of message
1258 wireless_send_event(dev, IWEVCUSTOM, &wreq, (char *)message);
1259
1260 return VOS_STATUS_SUCCESS;
1261 }
1262 case eSAP_ASSOC_STA_CALLBACK_EVENT:
1263 pAssocStasArray = pSapEvent->sapevt.sapAssocStaListEvent.pAssocStas;
1264 if (pSapEvent->sapevt.sapAssocStaListEvent.noOfAssocSta != 0)
1265 { // List of associated stations
1266 for (i = 0; i < pSapEvent->sapevt.sapAssocStaListEvent.noOfAssocSta; i++)
1267 {
1268 hddLog(LOG1,"Associated Sta Num %d:assocId=%d, staId=%d, staMac="MAC_ADDRESS_STR,
1269 i+1,
1270 pAssocStasArray->assocId,
1271 pAssocStasArray->staId,
1272 MAC_ADDR_ARRAY(pAssocStasArray->staMac.bytes));
1273 pAssocStasArray++;
1274 }
1275 }
1276 vos_mem_free(pSapEvent->sapevt.sapAssocStaListEvent.pAssocStas);// Release caller allocated memory here
1277 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001278 case eSAP_INDICATE_MGMT_FRAME:
1279 hdd_indicateMgmtFrame( pHostapdAdapter,
1280 pSapEvent->sapevt.sapManagementFrameInfo.nFrameLength,
1281 pSapEvent->sapevt.sapManagementFrameInfo.pbFrames,
1282 pSapEvent->sapevt.sapManagementFrameInfo.frameType,
Chilam NG571c65a2013-01-19 12:27:36 +05301283 pSapEvent->sapevt.sapManagementFrameInfo.rxChan, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001284 return VOS_STATUS_SUCCESS;
1285 case eSAP_REMAIN_CHAN_READY:
1286 hdd_remainChanReadyHandler( pHostapdAdapter );
1287 return VOS_STATUS_SUCCESS;
1288 case eSAP_SEND_ACTION_CNF:
1289 hdd_sendActionCnf( pHostapdAdapter,
1290 ( eSAP_STATUS_SUCCESS ==
1291 pSapEvent->sapevt.sapActionCnf.actionSendSuccess ) ?
1292 TRUE : FALSE );
1293 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001294 case eSAP_UNKNOWN_STA_JOIN:
1295 snprintf(unknownSTAEvent, IW_CUSTOM_MAX, "JOIN_UNKNOWN_STA-%02x:%02x:%02x:%02x:%02x:%02x",
1296 pSapEvent->sapevt.sapUnknownSTAJoin.macaddr.bytes[0],
1297 pSapEvent->sapevt.sapUnknownSTAJoin.macaddr.bytes[1],
1298 pSapEvent->sapevt.sapUnknownSTAJoin.macaddr.bytes[2],
1299 pSapEvent->sapevt.sapUnknownSTAJoin.macaddr.bytes[3],
1300 pSapEvent->sapevt.sapUnknownSTAJoin.macaddr.bytes[4],
1301 pSapEvent->sapevt.sapUnknownSTAJoin.macaddr.bytes[5]);
1302 we_event = IWEVCUSTOM; /* Discovered a new node (AP mode). */
1303 wrqu.data.pointer = unknownSTAEvent;
1304 wrqu.data.length = strlen(unknownSTAEvent);
1305 we_custom_event_generic = (v_BYTE_t *)unknownSTAEvent;
1306 hddLog(LOG1,"%s\n", unknownSTAEvent);
1307 break;
1308
1309 case eSAP_MAX_ASSOC_EXCEEDED:
1310 snprintf(maxAssocExceededEvent, IW_CUSTOM_MAX, "Peer %02x:%02x:%02x:%02x:%02x:%02x denied"
1311 " assoc due to Maximum Mobile Hotspot connections reached. Please disconnect"
1312 " one or more devices to enable the new device connection",
1313 pSapEvent->sapevt.sapMaxAssocExceeded.macaddr.bytes[0],
1314 pSapEvent->sapevt.sapMaxAssocExceeded.macaddr.bytes[1],
1315 pSapEvent->sapevt.sapMaxAssocExceeded.macaddr.bytes[2],
1316 pSapEvent->sapevt.sapMaxAssocExceeded.macaddr.bytes[3],
1317 pSapEvent->sapevt.sapMaxAssocExceeded.macaddr.bytes[4],
1318 pSapEvent->sapevt.sapMaxAssocExceeded.macaddr.bytes[5]);
1319 we_event = IWEVCUSTOM; /* Discovered a new node (AP mode). */
1320 wrqu.data.pointer = maxAssocExceededEvent;
1321 wrqu.data.length = strlen(maxAssocExceededEvent);
1322 we_custom_event_generic = (v_BYTE_t *)maxAssocExceededEvent;
1323 hddLog(LOG1,"%s\n", maxAssocExceededEvent);
1324 break;
1325 case eSAP_STA_ASSOC_IND:
1326 return VOS_STATUS_SUCCESS;
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08001327
1328 case eSAP_DISCONNECT_ALL_P2P_CLIENT:
1329 hddLog(LOG1, FL(" Disconnecting all the P2P Clients....\n"));
1330 hdd_clear_all_sta(pHostapdAdapter, usrDataForCallback);
1331 return VOS_STATUS_SUCCESS;
1332
1333 case eSAP_MAC_TRIG_STOP_BSS_EVENT :
1334 hdd_stop_p2p_link(pHostapdAdapter, usrDataForCallback);
1335 return VOS_STATUS_SUCCESS;
1336
Jeff Johnson295189b2012-06-20 16:38:30 -07001337 default:
1338 hddLog(LOG1,"SAP message is not handled\n");
1339 goto stopbss;
1340 return VOS_STATUS_SUCCESS;
1341 }
1342 wireless_send_event(dev, we_event, &wrqu, (char *)we_custom_event_generic);
1343 return VOS_STATUS_SUCCESS;
1344
1345stopbss :
1346 {
1347 v_BYTE_t we_custom_event[64];
1348 char *stopBssEvent = "STOP-BSS.response";//17
1349 int event_len = strlen(stopBssEvent);
1350
1351 hddLog(LOG1, FL("BSS stop status = %s"),
1352 pSapEvent->sapevt.sapStopBssCompleteEvent.status ?
1353 "eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
1354
1355 /* Change the BSS state now since, as we are shutting things down,
1356 * we don't want interfaces to become re-enabled */
1357 pHostapdState->bssState = BSS_STOP;
1358
Gopichand Nakkalaf8fe15d2013-05-27 13:55:40 +05301359 if (0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff)
1360 {
1361 if (VOS_TIMER_STATE_RUNNING == pHddApCtx->hdd_ap_inactivity_timer.state)
1362 {
1363 vos_status = vos_timer_stop(&pHddApCtx->hdd_ap_inactivity_timer);
1364 if (!VOS_IS_STATUS_SUCCESS(vos_status))
1365 hddLog(LOGE, FL("Failed to stop AP inactivity timer"));
1366 }
1367
1368 vos_status = vos_timer_destroy(&pHddApCtx->hdd_ap_inactivity_timer);
1369 if (!VOS_IS_STATUS_SUCCESS(vos_status))
1370 hddLog(LOGE, FL("Failed to Destroy AP inactivity timer"));
1371 }
1372
Jeff Johnson295189b2012-06-20 16:38:30 -07001373 /* Stop the pkts from n/w stack as we are going to free all of
1374 * the TX WMM queues for all STAID's */
1375 hdd_hostapd_stop(dev);
1376
1377 /* reclaim all resources allocated to the BSS */
1378 hdd_softap_stop_bss(pHostapdAdapter);
1379
Amar Singhal37e6f052013-03-05 16:16:54 -08001380 /* once the event is set, structure dev/pHostapdAdapter should
1381 * not be touched since they are now subject to being deleted
1382 * by another thread */
1383 if (eSAP_STOP_BSS_EVENT == sapEvent)
1384 vos_event_set(&pHostapdState->vosEvent);
1385
Jeff Johnson295189b2012-06-20 16:38:30 -07001386 /* notify userspace that the BSS has stopped */
1387 memset(&we_custom_event, '\0', sizeof(we_custom_event));
1388 memcpy(&we_custom_event, stopBssEvent, event_len);
1389 memset(&wrqu, 0, sizeof(wrqu));
1390 wrqu.data.length = event_len;
1391 we_event = IWEVCUSTOM;
1392 we_custom_event_generic = we_custom_event;
1393 wireless_send_event(dev, we_event, &wrqu, (char *)we_custom_event_generic);
Sudhir Sattayappa Kohalli90e4c752013-03-21 14:25:04 -07001394 hdd_dump_concurrency_info(pHddCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -07001395 }
1396 return VOS_STATUS_SUCCESS;
1397}
1398int hdd_softap_unpackIE(
1399 tHalHandle halHandle,
1400 eCsrEncryptionType *pEncryptType,
1401 eCsrEncryptionType *mcEncryptType,
1402 eCsrAuthType *pAuthType,
1403 u_int16_t gen_ie_len,
1404 u_int8_t *gen_ie )
1405{
1406 tDot11fIERSN dot11RSNIE;
1407 tDot11fIEWPA dot11WPAIE;
1408
1409 tANI_U8 *pRsnIe;
1410 tANI_U16 RSNIeLen;
1411
1412 if (NULL == halHandle)
1413 {
1414 hddLog(LOGE, FL("Error haHandle returned NULL\n"));
1415 return -EINVAL;
1416 }
1417
1418 // Validity checks
1419 if ((gen_ie_len < VOS_MIN(DOT11F_IE_RSN_MIN_LEN, DOT11F_IE_WPA_MIN_LEN)) ||
1420 (gen_ie_len > VOS_MAX(DOT11F_IE_RSN_MAX_LEN, DOT11F_IE_WPA_MAX_LEN)) )
1421 return -EINVAL;
1422 // Type check
1423 if ( gen_ie[0] == DOT11F_EID_RSN)
1424 {
1425 // Validity checks
1426 if ((gen_ie_len < DOT11F_IE_RSN_MIN_LEN ) ||
1427 (gen_ie_len > DOT11F_IE_RSN_MAX_LEN) )
1428 {
1429 return VOS_STATUS_E_FAILURE;
1430 }
1431 // Skip past the EID byte and length byte
1432 pRsnIe = gen_ie + 2;
1433 RSNIeLen = gen_ie_len - 2;
1434 // Unpack the RSN IE
1435 memset(&dot11RSNIE, 0, sizeof(tDot11fIERSN));
1436 dot11fUnpackIeRSN((tpAniSirGlobal) halHandle,
1437 pRsnIe,
1438 RSNIeLen,
1439 &dot11RSNIE);
1440 // Copy out the encryption and authentication types
1441 hddLog(LOG1, FL("%s: pairwise cipher suite count: %d\n"),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001442 __func__, dot11RSNIE.pwise_cipher_suite_count );
Jeff Johnson295189b2012-06-20 16:38:30 -07001443 hddLog(LOG1, FL("%s: authentication suite count: %d\n"),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001444 __func__, dot11RSNIE.akm_suite_count);
Jeff Johnson295189b2012-06-20 16:38:30 -07001445 /*Here we have followed the apple base code,
1446 but probably I suspect we can do something different*/
1447 //dot11RSNIE.akm_suite_count
1448 // Just translate the FIRST one
1449 *pAuthType = hdd_TranslateRSNToCsrAuthType(dot11RSNIE.akm_suites[0]);
1450 //dot11RSNIE.pwise_cipher_suite_count
1451 *pEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.pwise_cipher_suites[0]);
1452 //dot11RSNIE.gp_cipher_suite_count
1453 *mcEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.gp_cipher_suite);
1454 // Set the PMKSA ID Cache for this interface
1455
1456 // Calling csrRoamSetPMKIDCache to configure the PMKIDs into the cache
1457 } else
1458 if (gen_ie[0] == DOT11F_EID_WPA)
1459 {
1460 // Validity checks
1461 if ((gen_ie_len < DOT11F_IE_WPA_MIN_LEN ) ||
1462 (gen_ie_len > DOT11F_IE_WPA_MAX_LEN))
1463 {
1464 return VOS_STATUS_E_FAILURE;
1465 }
1466 // Skip past the EID byte and length byte - and four byte WiFi OUI
1467 pRsnIe = gen_ie + 2 + 4;
1468 RSNIeLen = gen_ie_len - (2 + 4);
1469 // Unpack the WPA IE
1470 memset(&dot11WPAIE, 0, sizeof(tDot11fIEWPA));
1471 dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
1472 pRsnIe,
1473 RSNIeLen,
1474 &dot11WPAIE);
1475 // Copy out the encryption and authentication types
1476 hddLog(LOG1, FL("%s: WPA unicast cipher suite count: %d\n"),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001477 __func__, dot11WPAIE.unicast_cipher_count );
Jeff Johnson295189b2012-06-20 16:38:30 -07001478 hddLog(LOG1, FL("%s: WPA authentication suite count: %d\n"),
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001479 __func__, dot11WPAIE.auth_suite_count);
Jeff Johnson295189b2012-06-20 16:38:30 -07001480 //dot11WPAIE.auth_suite_count
1481 // Just translate the FIRST one
1482 *pAuthType = hdd_TranslateWPAToCsrAuthType(dot11WPAIE.auth_suites[0]);
1483 //dot11WPAIE.unicast_cipher_count
1484 *pEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.unicast_ciphers[0]);
1485 //dot11WPAIE.unicast_cipher_count
1486 *mcEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.multicast_cipher);
1487 }
1488 else
1489 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001490 hddLog(LOGW, FL("%s: gen_ie[0]: %d\n"), __func__, gen_ie[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001491 return VOS_STATUS_E_FAILURE;
1492 }
1493 return VOS_STATUS_SUCCESS;
1494}
Leo Chang614d2072013-08-22 14:59:44 -07001495
1496/**---------------------------------------------------------------------------
1497
1498 \brief hdd_hostapd_set_mc_rate_cb() -
1499
1500 This is called to notify associated stas information ready
1501
1502 \param - sapEvent Pointer to get associated stas event
1503 \param - apDriver SoftAP context
1504
1505 \return - none
1506
1507 --------------------------------------------------------------------------*/
1508void hdd_hostapd_set_mc_rate_cb
1509(
1510 tSap_Event *sapEvent,
1511 void *apDriver
1512)
1513{
1514 hdd_ap_ctx_t *apCtxt;
1515
1516 if ((NULL == apDriver) || (NULL == sapEvent))
1517 {
1518 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1519 "%s : Invalid arguments", __func__);
1520 return;
1521 }
1522
1523 apCtxt = (hdd_ap_ctx_t *)apDriver;
1524
1525 /* there is a race condition that exists between this callback function
1526 and the caller since the caller could time out either before or
1527 while this code is executing. we'll assume the timeout hasn't
1528 occurred, but we'll verify that right before complete our work */
1529 if (SAP_GET_STAS_COOKIE == apCtxt->getStasCookie)
1530 {
1531 vos_mem_copy((void *)&apCtxt->getStasEventBuffer,
1532 (void *)sapEvent,
1533 sizeof(tSap_Event));
1534 complete(&apCtxt->sap_get_associated_stas_complete);
1535 }
1536 else
1537 {
1538 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1539 "%s : Invalid cookie", __func__);
1540 }
1541 return;
1542}
1543
1544/**---------------------------------------------------------------------------
1545
1546 \brief hdd_hostapd_set_mc_rate_update
1547
1548 This is called to find rate and send cfg command to FW
1549
1550 \param - sapEvent Pointer to get associated stas event
1551 \param - pHostapdAdapter SoftAP Adapter Context
1552
1553 \return - int, 0 success
1554 negative fail
1555
1556 --------------------------------------------------------------------------*/
1557static int hdd_hostapd_set_mc_rate_update
1558(
1559 tSap_Event *sapEvent,
1560 hdd_adapter_t *pHostapdAdapter
1561)
1562{
1563 tHalHandle hHal;
1564 hdd_ap_ctx_t *apCtxt;
1565 tSap_AssocMacAddr *assocSta;
1566 rate_cfg_11ac_max_mcs_t supportedAcMaxMcs = RATE_CFG_RATE_11AC_MAX_MCS_7;
1567 rate_cfg_supported_bw_t bandWidth;
1568 rate_cfg_gi_t gi;
1569 rate_cfg_item_mapping_t *nMappingTable = NULL;
1570 rate_cfg_item_mapping_t *acMappingTable = NULL;
1571 v_U8_t stasLoop, ratesLoop;
1572 v_U8_t rateArrayOrder;
1573 v_U8_t mcsTable11n;
1574 v_U16_t targetCfgId = 0;
1575 v_U16_t targetCfgValue = 0;
1576 v_U16_t currentRate;
1577 v_U16_t combinedSupportMap = 0xFFFF;
1578 v_U16_t supportMap = 0x0000;
1579 v_U16_t supportedChannelCount = 0;
1580 v_U32_t legacyRates[SAP_LEGACY_RATE_COUNT];
1581 int rc = 0;
1582 tSirRetStatus cfdStat;
1583
1584 if ((NULL == pHostapdAdapter) || (NULL == sapEvent))
1585 {
1586 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1587 "%s : Invalid arguments", __func__);
1588 return -1;
1589 }
1590
1591 apCtxt = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
1592 hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
1593 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1594 "setMcRateCB NUM SAT %d, targetMCRate %d, current channel %d",
1595 sapEvent->sapevt.sapAssocStaListEvent.noOfAssocSta,
1596 apCtxt->targetMCRate,
1597 apCtxt->operatingChannel);
1598
1599 if (!sapEvent->sapevt.sapAssocStaListEvent.noOfAssocSta)
1600 {
1601 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1602 "Not connected any STA yet");
1603 return -1;
1604 }
1605
1606 for (stasLoop = 0;
1607 stasLoop < sapEvent->sapevt.sapAssocStaListEvent.noOfAssocSta;
1608 stasLoop++)
1609 {
Leo Chang473d4e92013-09-13 16:12:33 -07001610 vos_mem_zero((v_U8_t *)legacyRates, sizeof(legacyRates));
Leo Chang614d2072013-08-22 14:59:44 -07001611 rateArrayOrder = 0;
1612 mcsTable11n = 0;
1613 supportedChannelCount = 0;
1614 assocSta = sapEvent->sapevt.sapAssocStaListEvent.pAssocStas++;
1615 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1616 "ASSOSID %d, OPM %d, nBM %d, SGI40 %d, SGI20 %d, S40 %d",
1617 assocSta->assocId,
1618 assocSta->supportedRates.opRateMode,
1619 assocSta->supportedRates.aniEnhancedRateBitmap,
1620 assocSta->ShortGI40Mhz,
1621 assocSta->ShortGI20Mhz,
1622 assocSta->Support40Mhz);
1623
1624 /* Legacy Rate */
1625 for (ratesLoop = 0; ratesLoop < SIR_NUM_11B_RATES; ratesLoop++)
1626 {
1627 currentRate = assocSta->supportedRates.llbRates[ratesLoop] &
1628 SAP_LEGACY_RATE_MASK;
1629
1630 /* To fix KW error report */
1631 if (SAP_LEGACY_RATE_COUNT <= rateArrayOrder)
1632 {
1633 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1634 "%s, Invalid array Size, break", __func__);
1635 break;
1636 }
1637
1638 /* Make 100kbps order */
1639 legacyRates[rateArrayOrder] = (currentRate * 100) / 20;
1640 rateArrayOrder++;
1641 if (currentRate)
1642 {
1643 supportedChannelCount++;
1644 }
1645 }
1646 for (ratesLoop = 0; ratesLoop < SIR_NUM_11A_RATES; ratesLoop++)
1647 {
1648 currentRate = assocSta->supportedRates.llaRates[ratesLoop] &
1649 SAP_LEGACY_RATE_MASK;
1650 /* To fix KW error report */
1651 if (SAP_LEGACY_RATE_COUNT <= rateArrayOrder)
1652 {
1653 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1654 "%s, Invalid array Size, break", __func__);
1655 break;
1656 }
1657
1658 /* Make 100kbps order */
1659 legacyRates[rateArrayOrder] = (currentRate * 100) / 20;
1660 rateArrayOrder++;
1661 if (currentRate)
1662 {
1663 supportedChannelCount++;
1664 }
1665 }
1666 if (supportedChannelCount)
1667 {
1668 for (ratesLoop = 0; ratesLoop < SAP_LEGACY_RATE_COUNT; ratesLoop++)
1669 {
1670 if (legacyRates[ratesLoop] == apCtxt->targetMCRate)
1671 {
1672 supportMap |= (1 << RATE_CFG_RATE_LEGACY);
1673 break;
1674 }
1675 }
1676 }
1677
1678 /* 11N */
1679 if (eSTA_11n <= assocSta->supportedRates.opRateMode)
1680 {
1681 if (assocSta->Support40Mhz)
1682 {
1683 mcsTable11n |= 0x01;
1684 if (assocSta->ShortGI40Mhz)
1685 {
1686 mcsTable11n |= 0x02;
1687 supportMap |= (1 << RATE_CFG_RATE_11N_MCS_SGI_40);
1688 nMappingTable = n_s40_rate_mapping;
1689 }
1690 else
1691 {
1692 supportMap |= (1 << RATE_CFG_RATE_11N_MCS_LGI_40);
1693 nMappingTable = n_l40_rate_mapping;
1694 }
1695 }
1696 else
1697 {
1698 if (assocSta->ShortGI20Mhz)
1699 {
1700 mcsTable11n |= 0x02;
1701 supportMap |= (1 << RATE_CFG_RATE_11N_MCS_SGI_20);
1702 nMappingTable = n_s20_rate_mapping;
1703 }
1704 else
1705 {
1706 supportMap |= (1 << RATE_CFG_RATE_11N_MCS_LGI_20);
1707 nMappingTable = n_l20_rate_mapping;
1708 }
1709 }
1710 }
1711
1712#ifdef WLAN_FEATURE_11AC
1713 /* 11AC */
1714 if (eSTA_11ac <= assocSta->supportedRates.opRateMode)
1715 {
1716 /* Find supported MAX MCS */
1717 supportedAcMaxMcs = assocSta->supportedRates.vhtRxMCSMap &
1718 SAP_AC_MCS_MAP_MASK;
1719 supportedAcMaxMcs += SAP_AC_MCS_MAP_OFFSET;
1720 /* Find channel characteristics from MAX rate */
1721 if (mcs_rate_11ac[supportedAcMaxMcs].cb80_rate_11ac[0] ==
1722 assocSta->supportedRates.vhtRxHighestDataRate)
1723 {
1724 supportMap |= (1 << RATE_CFG_RATE_11AC_MCS_LGI_80);
1725 bandWidth = RATE_CFG_RATE_BW_80;
1726 gi = RATE_CFG_RATE_GI_LONG;
1727 acMappingTable = ac_l80_rate_mapping;
1728 }
1729 else if (mcs_rate_11ac[supportedAcMaxMcs].cb80_rate_11ac[1] ==
1730 assocSta->supportedRates.vhtRxHighestDataRate)
1731 {
1732 supportMap |= (1 << RATE_CFG_RATE_11AC_MCS_SGI_80);
1733 bandWidth = RATE_CFG_RATE_BW_80;
1734 gi = RATE_CFG_RATE_GI_SHORT;
1735 acMappingTable = ac_s80_rate_mapping;
1736 }
1737 else if (mcs_rate_11ac[supportedAcMaxMcs].cb40_rate_11ac[0] ==
1738 assocSta->supportedRates.vhtRxHighestDataRate)
1739 {
1740 supportMap |= (1 << RATE_CFG_RATE_11AC_MCS_LGI_40);
1741 bandWidth = RATE_CFG_RATE_BW_40;
1742 gi = RATE_CFG_RATE_GI_LONG;
1743 acMappingTable = ac_l40_rate_mapping;
1744 }
1745 else if (mcs_rate_11ac[supportedAcMaxMcs].cb40_rate_11ac[1] ==
1746 assocSta->supportedRates.vhtRxHighestDataRate)
1747 {
1748 supportMap |= (1 << RATE_CFG_RATE_11AC_MCS_SGI_40);
1749 bandWidth = RATE_CFG_RATE_BW_40;
1750 gi = RATE_CFG_RATE_GI_SHORT;
1751 acMappingTable = ac_s40_rate_mapping;
1752 }
1753 else if (mcs_rate_11ac[supportedAcMaxMcs].cb20_rate_11ac[0] ==
1754 assocSta->supportedRates.vhtRxHighestDataRate)
1755 {
1756 supportMap |= (1 << RATE_CFG_RATE_11AC_MCS_LGI_20);
1757 bandWidth = RATE_CFG_RATE_BW_20;
1758 gi = RATE_CFG_RATE_GI_LONG;
1759 acMappingTable = ac_l20_rate_mapping;
1760 }
1761 else if (mcs_rate_11ac[supportedAcMaxMcs].cb20_rate_11ac[1] ==
1762 assocSta->supportedRates.vhtRxHighestDataRate)
1763 {
1764 supportMap |= (1 << RATE_CFG_RATE_11AC_MCS_SGI_20);
1765 bandWidth = RATE_CFG_RATE_BW_20;
1766 gi = RATE_CFG_RATE_GI_SHORT;
1767 acMappingTable = ac_s20_rate_mapping;
1768 }
1769 }
1770#endif /* WLAN_FEATURE_11AC */
1771 combinedSupportMap &= supportMap;
1772 }
1773
1774 if ((!combinedSupportMap) &&
1775 (!sapEvent->sapevt.sapAssocStaListEvent.noOfAssocSta))
1776 {
1777 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1778 "%s, No Common supported rate, discard", __func__);
1779 return -1;
1780 }
1781
1782 /* Select target band */
1783 if (apCtxt->operatingChannel <=
1784 SAP_MAX_24_CHANNEL_NUMBER)
1785 {
1786 targetCfgId = WNI_CFG_FIXED_RATE_MULTICAST_24GHZ;
1787 }
1788 else
1789 {
1790 targetCfgId = WNI_CFG_FIXED_RATE_MULTICAST_5GHZ;
1791 }
1792
1793 /* First find from legacy */
1794 if (combinedSupportMap & SAP_RATE_SUPPORT_MAP_LEGACY_MASK)
1795 {
1796 for (ratesLoop = 0; ratesLoop < SAP_LEGACY_RATE_COUNT; ratesLoop++)
1797 {
1798 if (apCtxt->targetMCRate ==
1799 legacy_rate_mapping[ratesLoop].rate)
1800 {
1801 targetCfgValue = legacy_rate_mapping[ratesLoop].eRateCfg;
1802 break;
1803 }
1804 }
1805 }
1806
1807 /* If available same on 11N, update target rate */
1808 if ((combinedSupportMap & SAP_RATE_SUPPORT_MAP_N_MASK) &&
1809 (NULL != nMappingTable))
1810 {
1811 for (ratesLoop = 0; ratesLoop < SAP_11N_RATE_COUNT; ratesLoop++)
1812 {
1813 if (apCtxt->targetMCRate == nMappingTable[ratesLoop].rate)
1814 {
1815 targetCfgValue = nMappingTable[ratesLoop].eRateCfg;
1816 break;
1817 }
1818 }
1819 }
1820
1821#ifdef WLAN_FEATURE_11AC
1822 /* If available same on 11AC, update target rate */
1823 if ((combinedSupportMap & SAP_RATE_SUPPORT_MAP_AC_MASK) &&
1824 (NULL != acMappingTable))
1825 {
1826 for (ratesLoop = 0; ratesLoop < supportedAcMaxMcs; ratesLoop++)
1827 {
1828 if (apCtxt->targetMCRate == acMappingTable[ratesLoop].rate)
1829 {
1830 targetCfgValue = acMappingTable[ratesLoop].eRateCfg;
1831 break;
1832 }
1833 }
1834 }
1835#endif /* WLAN_FEATURE_11AC */
1836
1837 /* Finally send config to FW */
1838 if (targetCfgId && targetCfgValue)
1839 {
1840 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1841 "%s, Target Band %d, cfg value %d",
1842 __func__, targetCfgId, targetCfgValue);
1843 cfdStat = cfgSetInt((tpAniSirGlobal)hHal,
1844 targetCfgId,
1845 targetCfgValue);
1846 if (eSIR_SUCCESS != cfdStat)
1847 {
1848 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1849 "%s, CFG Fail %d",
1850 __func__, cfdStat);
1851 rc = -1;
1852 }
1853 }
1854
1855 return rc;
1856};
1857
1858/**---------------------------------------------------------------------------
1859
1860 \brief hdd_hostapd_set_mc_rate() -
1861
1862 This is called user application set forcefully MC rate
1863
1864 \param - pHostapdAdapter Pointer to adapter structure
1865 \param - targetRateHkbps MC rate to set, hundreds kbps order
1866
1867 \return - int, 0 success
1868 negative fail
1869
1870 --------------------------------------------------------------------------*/
1871int hdd_hostapd_set_mc_rate
1872(
1873 hdd_adapter_t *pHostapdAdapter,
1874 int targetRateHkbps
1875)
1876{
1877 tHalHandle hHal;
1878 hdd_ap_ctx_t *apCtxt;
1879 eHalStatus smeStatus;
1880 int rc;
1881
1882 if ((NULL == pHostapdAdapter) || (0 == targetRateHkbps))
1883 {
1884 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1885 "%s : Invalid arguments", __func__);
1886 return -1;
1887 }
1888
1889 apCtxt = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
1890 hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
1891 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1892 "hdd_hostapd_setMcRate %d", targetRateHkbps);
1893
1894 init_completion(&apCtxt->sap_get_associated_stas_complete);
1895
1896 apCtxt->getStasCookie = SAP_GET_STAS_COOKIE;
1897 apCtxt->targetMCRate = targetRateHkbps;
1898 apCtxt->getStasEventBuffer.sapevt.sapAssocStaListEvent.noOfAssocSta = 0;
1899 apCtxt->assocStasBuffer = (tSap_AssocMacAddr *)vos_mem_malloc(
1900 sizeof(tSap_AssocMacAddr) * HAL_NUM_ASSOC_STA);
1901 if (NULL == apCtxt->assocStasBuffer)
1902 {
1903 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1904 "%s : Buffer Alloc fail", __func__);
1905 return -1;
1906 }
1907 smeStatus = sme_RoamGetAssociatedStas(hHal,
1908 pHostapdAdapter->sessionId,
1909 VOS_MODULE_ID_HDD,
1910 (void *)apCtxt,
1911 hdd_hostapd_set_mc_rate_cb,
1912 (tANI_U8 *)apCtxt->assocStasBuffer);
1913 if (smeStatus)
1914 {
1915 apCtxt->getStasCookie = 0;
1916 vos_mem_free(apCtxt->assocStasBuffer);
1917 apCtxt->assocStasBuffer = NULL;
1918 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1919 "%s : SME Issue fail", __func__);
1920 return -1;
1921 }
1922
1923 /* Wait for completion */
1924 rc = wait_for_completion_interruptible_timeout(
1925 &apCtxt->sap_get_associated_stas_complete,
1926 msecs_to_jiffies(SAP_MAX_GET_ASSOC_STAS_TIMEOUT));
1927
1928 /* either we have a response or we timed out
1929 either way, first invalidate our cookie */
1930 apCtxt->getStasCookie = 0;
1931 if (0 >= rc)
1932 {
1933 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1934 "%s : Wait timeout or interrupted", __func__);
1935
1936 /* there is a race condition such that the callback
1937 function could be executing at the same time we are. of
1938 primary concern is if the callback function had already
1939 verified the "magic" but hasn't yet set the completion
1940 variable. Since the completion variable is on our
1941 stack, we'll delay just a bit to make sure the data is
1942 still valid if that is the case */
1943 vos_sleep(50);
1944 /* we'll now try to test memory */
1945 }
1946
1947 rc = hdd_hostapd_set_mc_rate_update(
1948 &apCtxt->getStasEventBuffer,
1949 pHostapdAdapter);
1950 vos_mem_free(apCtxt->assocStasBuffer);
1951 apCtxt->assocStasBuffer = NULL;
1952
1953 return rc;
1954}
1955
Jeff Johnson295189b2012-06-20 16:38:30 -07001956int
1957static iw_softap_setparam(struct net_device *dev,
1958 struct iw_request_info *info,
1959 union iwreq_data *wrqu, char *extra)
1960{
1961 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
1962 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
1963 int *value = (int *)extra;
1964 int sub_cmd = value[0];
1965 int set_value = value[1];
1966 eHalStatus status;
1967 int ret = 0; /* success */
1968 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
1969
1970 switch(sub_cmd)
1971 {
1972
1973 case QCSAP_PARAM_CLR_ACL:
Jeff Johnson43971f52012-07-17 12:26:56 -07001974 if ( VOS_STATUS_SUCCESS != WLANSAP_ClearACL( pVosContext ))
Jeff Johnson295189b2012-06-20 16:38:30 -07001975 {
1976 ret = -EIO;
1977 }
1978 break;
1979
1980 case QCSAP_PARAM_ACL_MODE:
1981 if ((eSAP_ALLOW_ALL < (eSapMacAddrACL)set_value) ||
1982 (eSAP_ACCEPT_UNLESS_DENIED > (eSapMacAddrACL)set_value))
1983 {
1984 hddLog(LOGE, FL("Invalid ACL Mode value %d"), set_value);
1985 ret = -EINVAL;
1986 }
1987 else
1988 {
1989 WLANSAP_SetMode(pVosContext, set_value);
1990 }
1991 break;
1992 case QCSAP_PARAM_MAX_ASSOC:
1993 if (WNI_CFG_ASSOC_STA_LIMIT_STAMIN > set_value)
1994 {
1995 hddLog(LOGE, FL("Invalid setMaxAssoc value %d"), set_value);
1996 ret = -EINVAL;
1997 }
1998 else
1999 {
2000 if (WNI_CFG_ASSOC_STA_LIMIT_STAMAX < set_value)
2001 {
2002 hddLog(LOGW, FL("setMaxAssoc value %d higher than max allowed %d."
2003 "Setting it to max allowed and continuing"),
2004 set_value, WNI_CFG_ASSOC_STA_LIMIT_STAMAX);
2005 set_value = WNI_CFG_ASSOC_STA_LIMIT_STAMAX;
2006 }
2007 status = ccmCfgSetInt(hHal, WNI_CFG_ASSOC_STA_LIMIT,
2008 set_value, NULL, eANI_BOOLEAN_FALSE);
2009 if ( status != eHAL_STATUS_SUCCESS )
2010 {
2011 hddLog(LOGE, FL("setMaxAssoc failure, status %d"),
2012 status);
2013 ret = -EIO;
2014 }
2015 }
2016 break;
2017
2018 case QCSAP_PARAM_HIDE_SSID:
2019 {
2020 eHalStatus status = eHAL_STATUS_SUCCESS;
2021 status = sme_HideSSID(hHal, pHostapdAdapter->sessionId, set_value);
2022 if(eHAL_STATUS_SUCCESS != status)
2023 {
2024 hddLog(VOS_TRACE_LEVEL_ERROR,
2025 "%s: QCSAP_PARAM_HIDE_SSID failed",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002026 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002027 return status;
2028 }
2029 break;
2030 }
2031
Leo Chang614d2072013-08-22 14:59:44 -07002032 case QCSAP_PARAM_SET_MC_RATE:
2033 {
2034 if (hdd_hostapd_set_mc_rate(pHostapdAdapter, set_value))
2035 {
2036 hddLog(VOS_TRACE_LEVEL_ERROR,
2037 "%s: SET_MC_RATE failed", __func__);
2038 }
2039 break;
2040 }
2041
Jeff Johnson295189b2012-06-20 16:38:30 -07002042 default:
2043 hddLog(LOGE, FL("Invalid setparam command %d value %d"),
2044 sub_cmd, set_value);
2045 ret = -EINVAL;
2046 break;
2047 }
2048
2049 return ret;
2050}
2051
2052
2053int
2054static iw_softap_getparam(struct net_device *dev,
2055 struct iw_request_info *info,
2056 union iwreq_data *wrqu, char *extra)
2057{
2058 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2059 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
2060 int *value = (int *)extra;
2061 int sub_cmd = value[0];
2062 eHalStatus status;
2063 int ret = 0; /* success */
2064 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
2065
2066 switch (sub_cmd)
2067 {
2068 case QCSAP_PARAM_MAX_ASSOC:
2069 status = ccmCfgGetInt(hHal, WNI_CFG_ASSOC_STA_LIMIT, (tANI_U32 *)value);
2070 if (eHAL_STATUS_SUCCESS != status)
2071 {
2072 ret = -EIO;
2073 }
2074 break;
2075
2076 case QCSAP_PARAM_CLR_ACL:
Jeff Johnson43971f52012-07-17 12:26:56 -07002077 if ( VOS_STATUS_SUCCESS != WLANSAP_ClearACL( pVosContext ))
Jeff Johnson295189b2012-06-20 16:38:30 -07002078 {
2079 ret = -EIO;
2080 }
2081 *value = 0;
2082 break;
2083
2084 case QCSAP_PARAM_MODULE_DOWN_IND:
2085 {
2086 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002087 "%s: sending WLAN_MODULE_DOWN_IND", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002088 send_btc_nlink_msg(WLAN_MODULE_DOWN_IND, 0);
2089#ifdef WLAN_BTAMP_FEATURE
2090 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002091 "%s: Take down AMP PAL", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002092 BSL_Deinit(vos_get_global_context(VOS_MODULE_ID_HDD, NULL));
2093#endif
2094 *value = 0;
2095 break;
Jeff Johnson43971f52012-07-17 12:26:56 -07002096 }
2097
2098 case QCSAP_PARAM_GET_WLAN_DBG:
2099 {
2100 vos_trace_display();
2101 *value = 0;
2102 break;
2103 }
2104
2105 case QCSAP_PARAM_AUTO_CHANNEL:
2106 {
2107 *value = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apAutoChannelSelection;
2108 break;
2109 }
2110
Jeff Johnson295189b2012-06-20 16:38:30 -07002111 default:
2112 hddLog(LOGE, FL("Invalid getparam command %d"), sub_cmd);
2113 ret = -EINVAL;
2114 break;
2115
2116 }
2117
2118 return ret;
2119}
2120
2121/* Usage:
2122 BLACK_LIST = 0
2123 WHITE_LIST = 1
2124 ADD MAC = 0
2125 REMOVE MAC = 1
2126
2127 mac addr will be accepted as a 6 octet mac address with each octet inputted in hex
2128 for e.g. 00:0a:f5:11:22:33 will be represented as 0x00 0x0a 0xf5 0x11 0x22 0x33
2129 while using this ioctl
2130
2131 Syntax:
2132 iwpriv softap.0 modify_acl
2133 <6 octet mac addr> <list type> <cmd type>
2134
2135 Examples:
2136 eg 1. to add a mac addr 00:0a:f5:89:89:90 to the black list
2137 iwpriv softap.0 modify_acl 0x00 0x0a 0xf5 0x89 0x89 0x90 0 0
2138 eg 2. to delete a mac addr 00:0a:f5:89:89:90 from white list
2139 iwpriv softap.0 modify_acl 0x00 0x0a 0xf5 0x89 0x89 0x90 1 1
2140*/
2141int iw_softap_modify_acl(struct net_device *dev, struct iw_request_info *info,
2142 union iwreq_data *wrqu, char *extra)
2143{
2144 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2145 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
2146 v_BYTE_t *value = (v_BYTE_t*)extra;
2147 v_U8_t pPeerStaMac[VOS_MAC_ADDR_SIZE];
2148 int listType, cmd, i;
2149 int ret = 0; /* success */
2150
2151 ENTER();
2152 for (i=0; i<VOS_MAC_ADDR_SIZE; i++)
2153 {
2154 pPeerStaMac[i] = *(value+i);
2155 }
2156 listType = (int)(*(value+i));
2157 i++;
2158 cmd = (int)(*(value+i));
2159
2160 hddLog(LOG1, "%s: SAP Modify ACL arg0 %02x:%02x:%02x:%02x:%02x:%02x arg1 %d arg2 %d\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002161 __func__, pPeerStaMac[0], pPeerStaMac[1], pPeerStaMac[2],
Jeff Johnson295189b2012-06-20 16:38:30 -07002162 pPeerStaMac[3], pPeerStaMac[4], pPeerStaMac[5], listType, cmd);
2163
2164 if (WLANSAP_ModifyACL(pVosContext, pPeerStaMac,(eSapACLType)listType,(eSapACLCmdType)cmd)
2165 != VOS_STATUS_SUCCESS)
2166 {
2167 hddLog(LOGE, FL("Modify ACL failed\n"));
2168 ret = -EIO;
2169 }
2170 EXIT();
2171 return ret;
2172}
2173
2174int
2175static iw_softap_getchannel(struct net_device *dev,
2176 struct iw_request_info *info,
2177 union iwreq_data *wrqu, char *extra)
2178{
2179 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2180
Jeff Johnson43971f52012-07-17 12:26:56 -07002181 int *value = (int *)extra;
Jeff Johnson295189b2012-06-20 16:38:30 -07002182
Jeff Johnson43971f52012-07-17 12:26:56 -07002183 *value = (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->operatingChannel;
Jeff Johnson295189b2012-06-20 16:38:30 -07002184 return 0;
2185}
2186
Jeff Johnsone7245742012-09-05 17:12:55 -07002187int
schang86c22c42013-03-13 18:41:24 -07002188static iw_softap_set_max_tx_power(struct net_device *dev,
Jeff Johnsone7245742012-09-05 17:12:55 -07002189 struct iw_request_info *info,
2190 union iwreq_data *wrqu, char *extra)
2191{
2192 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2193 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
schang86c22c42013-03-13 18:41:24 -07002194 int *value = (int *)extra;
Jeff Johnsone7245742012-09-05 17:12:55 -07002195 int set_value;
2196 tSirMacAddr bssid = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
2197 tSirMacAddr selfMac = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
2198
schang86c22c42013-03-13 18:41:24 -07002199 if (NULL == value)
Jeff Johnsone7245742012-09-05 17:12:55 -07002200 return -ENOMEM;
2201
Leo Changd37675a2013-08-01 13:19:45 -07002202 /* Assign correct slef MAC address */
2203 vos_mem_copy(bssid, pHostapdAdapter->macAddressCurrent.bytes,
2204 VOS_MAC_ADDR_SIZE);
2205 vos_mem_copy(selfMac, pHostapdAdapter->macAddressCurrent.bytes,
2206 VOS_MAC_ADDR_SIZE);
2207
schang86c22c42013-03-13 18:41:24 -07002208 set_value = value[0];
2209 if (eHAL_STATUS_SUCCESS != sme_SetMaxTxPower(hHal, bssid, selfMac, set_value))
2210 {
2211 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Setting maximum tx power failed",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002212 __func__);
schang86c22c42013-03-13 18:41:24 -07002213 return -EIO;
2214 }
2215
2216 return 0;
2217}
2218
2219int
Madan Mohan Koyyalamudia96f5442013-05-10 11:32:06 +05302220static iw_display_data_path_snapshot(struct net_device *dev,
2221 struct iw_request_info *info,
2222 union iwreq_data *wrqu, char *extra)
2223{
2224
2225 /* Function intitiating dumping states of
2226 * HDD(WMM Tx Queues)
2227 * TL State (with Per Client infor)
2228 * DXE Snapshot (Called at the end of TL Snapshot)
2229 */
2230 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2231 hddLog(LOGE, "%s: called for SAP",__func__);
2232 hdd_wmm_tx_snapshot(pHostapdAdapter);
2233 WLANTL_TLDebugMessage(VOS_TRUE);
2234 return 0;
2235}
2236
2237int
schang86c22c42013-03-13 18:41:24 -07002238static iw_softap_set_tx_power(struct net_device *dev,
2239 struct iw_request_info *info,
2240 union iwreq_data *wrqu, char *extra)
2241{
2242 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2243 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
2244 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
2245 int *value = (int *)extra;
2246 int set_value;
2247 ptSapContext pSapCtx = NULL;
2248
2249 if (NULL == value)
2250 return -ENOMEM;
2251
2252 pSapCtx = VOS_GET_SAP_CB(pVosContext);
2253 if (NULL == pSapCtx)
2254 {
2255 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2256 "%s: Invalid SAP pointer from pvosGCtx", __func__);
2257 return VOS_STATUS_E_FAULT;
Jeff Johnsone7245742012-09-05 17:12:55 -07002258 }
2259
2260 set_value = value[0];
schang86c22c42013-03-13 18:41:24 -07002261 if (eHAL_STATUS_SUCCESS != sme_SetTxPower(hHal, pSapCtx->sessionId, set_value))
Jeff Johnsone7245742012-09-05 17:12:55 -07002262 {
schang86c22c42013-03-13 18:41:24 -07002263 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Setting tx power failed",
Jeff Johnsone7245742012-09-05 17:12:55 -07002264 __func__);
2265 return -EIO;
2266 }
2267
2268 return 0;
2269}
2270
Jeff Johnson295189b2012-06-20 16:38:30 -07002271#define IS_BROADCAST_MAC(x) (((x[0] & x[1] & x[2] & x[3] & x[4] & x[5]) == 0xff) ? 1 : 0)
2272
2273int
2274static iw_softap_getassoc_stamacaddr(struct net_device *dev,
2275 struct iw_request_info *info,
2276 union iwreq_data *wrqu, char *extra)
2277{
2278 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2279 unsigned char *pmaclist;
2280 hdd_station_info_t *pStaInfo = pHostapdAdapter->aStaInfo;
2281 int cnt = 0, len;
2282
2283
2284 pmaclist = wrqu->data.pointer + sizeof(unsigned long int);
2285 len = wrqu->data.length;
2286
2287 spin_lock_bh( &pHostapdAdapter->staInfo_lock );
2288 while((cnt < WLAN_MAX_STA_COUNT) && (len > (sizeof(v_MACADDR_t)+1))) {
2289 if (TRUE == pStaInfo[cnt].isUsed) {
2290
2291 if(!IS_BROADCAST_MAC(pStaInfo[cnt].macAddrSTA.bytes)) {
2292 memcpy((void *)pmaclist, (void *)&(pStaInfo[cnt].macAddrSTA), sizeof(v_MACADDR_t));
2293 pmaclist += sizeof(v_MACADDR_t);
2294 len -= sizeof(v_MACADDR_t);
2295 }
2296 }
2297 cnt++;
2298 }
2299 spin_unlock_bh( &pHostapdAdapter->staInfo_lock );
2300
2301 *pmaclist = '\0';
2302
2303 wrqu->data.length -= len;
2304
2305 *(unsigned long int *)(wrqu->data.pointer) = wrqu->data.length;
2306
2307 return 0;
2308}
2309
2310/* Usage:
2311 mac addr will be accepted as a 6 octet mac address with each octet inputted in hex
2312 for e.g. 00:0a:f5:11:22:33 will be represented as 0x00 0x0a 0xf5 0x11 0x22 0x33
2313 while using this ioctl
2314
2315 Syntax:
2316 iwpriv softap.0 disassoc_sta <6 octet mac address>
2317
2318 e.g.
2319 disassociate sta with mac addr 00:0a:f5:11:22:33 from softap
2320 iwpriv softap.0 disassoc_sta 0x00 0x0a 0xf5 0x11 0x22 0x33
2321*/
2322
2323int
2324static iw_softap_disassoc_sta(struct net_device *dev,
2325 struct iw_request_info *info,
2326 union iwreq_data *wrqu, char *extra)
2327{
2328 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2329 v_U8_t *peerMacAddr;
2330
2331 ENTER();
Gopichand Nakkala252c9ef2013-02-27 17:01:23 +05302332 /* iwpriv tool or framework calls this ioctl with
2333 * data passed in extra (less than 16 octets);
Jeff Johnson295189b2012-06-20 16:38:30 -07002334 */
Gopichand Nakkala252c9ef2013-02-27 17:01:23 +05302335 peerMacAddr = (v_U8_t *)(extra);
Jeff Johnson295189b2012-06-20 16:38:30 -07002336
2337 hddLog(LOG1, "data %02x:%02x:%02x:%02x:%02x:%02x",
2338 peerMacAddr[0], peerMacAddr[1], peerMacAddr[2],
2339 peerMacAddr[3], peerMacAddr[4], peerMacAddr[5]);
2340 hdd_softap_sta_disassoc(pHostapdAdapter, peerMacAddr);
2341 EXIT();
2342 return 0;
2343}
2344
2345int
2346static iw_softap_ap_stats(struct net_device *dev,
2347 struct iw_request_info *info,
2348 union iwreq_data *wrqu, char *extra)
2349{
2350 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2351 WLANTL_TRANSFER_STA_TYPE statBuffer;
2352 char *pstatbuf;
2353 int len = wrqu->data.length;
2354 pstatbuf = wrqu->data.pointer;
2355
2356 WLANSAP_GetStatistics((WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext, &statBuffer, (v_BOOL_t)wrqu->data.flags);
2357
Sameer Thalappilb0a30232013-09-27 15:37:48 -07002358 len = scnprintf(pstatbuf, len,
Jeff Johnson295189b2012-06-20 16:38:30 -07002359 "RUF=%d RMF=%d RBF=%d "
2360 "RUB=%d RMB=%d RBB=%d "
2361 "TUF=%d TMF=%d TBF=%d "
2362 "TUB=%d TMB=%d TBB=%d",
2363 (int)statBuffer.rxUCFcnt, (int)statBuffer.rxMCFcnt, (int)statBuffer.rxBCFcnt,
2364 (int)statBuffer.rxUCBcnt, (int)statBuffer.rxMCBcnt, (int)statBuffer.rxBCBcnt,
2365 (int)statBuffer.txUCFcnt, (int)statBuffer.txMCFcnt, (int)statBuffer.txBCFcnt,
2366 (int)statBuffer.txUCBcnt, (int)statBuffer.txMCBcnt, (int)statBuffer.txBCBcnt
2367 );
2368
2369 wrqu->data.length -= len;
2370 return 0;
2371}
2372
2373int
2374static iw_softap_commit(struct net_device *dev,
2375 struct iw_request_info *info,
2376 union iwreq_data *wrqu, char *extra)
2377{
2378 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
2379 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2380 hdd_hostapd_state_t *pHostapdState;
2381 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
2382 tpWLAN_SAPEventCB pSapEventCallback;
2383 tsap_Config_t *pConfig;
2384 s_CommitConfig_t *pCommitConfig;
2385 struct qc_mac_acl_entry *acl_entry = NULL;
2386 v_SINT_t i = 0, num_mac = 0;
2387 v_U32_t status = 0;
2388 eCsrAuthType RSNAuthType;
2389 eCsrEncryptionType RSNEncryptType;
2390 eCsrEncryptionType mcRSNEncryptType;
2391
2392 pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
2393 pCommitConfig = (s_CommitConfig_t *)extra;
2394
2395 pConfig = kmalloc(sizeof(tsap_Config_t), GFP_KERNEL);
2396 if(NULL == pConfig) {
2397 hddLog(LOG1, "VOS unable to allocate memory\n");
2398 return -ENOMEM;
2399 }
2400 pConfig->beacon_int = pCommitConfig->beacon_int;
2401 pConfig->channel = pCommitConfig->channel;
2402
2403 /*Protection parameter to enable or disable*/
2404 pConfig->protEnabled = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apProtEnabled;
2405 pConfig->dtim_period = pCommitConfig->dtim_period;
2406 switch(pCommitConfig->hw_mode )
2407 {
2408 case eQC_DOT11_MODE_11A:
2409 pConfig->SapHw_mode = eSAP_DOT11_MODE_11a;
2410 break;
2411 case eQC_DOT11_MODE_11B:
2412 pConfig->SapHw_mode = eSAP_DOT11_MODE_11b;
2413 break;
2414 case eQC_DOT11_MODE_11G:
2415 pConfig->SapHw_mode = eSAP_DOT11_MODE_11g;
2416 break;
2417
2418 case eQC_DOT11_MODE_11N:
2419 pConfig->SapHw_mode = eSAP_DOT11_MODE_11n;
2420 break;
2421 case eQC_DOT11_MODE_11G_ONLY:
2422 pConfig->SapHw_mode = eSAP_DOT11_MODE_11g_ONLY;
2423 break;
2424 case eQC_DOT11_MODE_11N_ONLY:
2425 pConfig->SapHw_mode = eSAP_DOT11_MODE_11n_ONLY;
2426 break;
2427 default:
2428 pConfig->SapHw_mode = eSAP_DOT11_MODE_11n;
2429 break;
2430
2431 }
2432
2433 pConfig->ieee80211d = pCommitConfig->qcsap80211d;
2434 vos_mem_copy(pConfig->countryCode, pCommitConfig->countryCode, 3);
2435 if(pCommitConfig->authType == eQC_AUTH_TYPE_SHARED_KEY)
2436 pConfig->authType = eSAP_SHARED_KEY;
2437 else if(pCommitConfig->authType == eQC_AUTH_TYPE_OPEN_SYSTEM)
2438 pConfig->authType = eSAP_OPEN_SYSTEM;
2439 else
2440 pConfig->authType = eSAP_AUTO_SWITCH;
2441
2442 pConfig->privacy = pCommitConfig->privacy;
2443 (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uPrivacy = pCommitConfig->privacy;
2444 pConfig->wps_state = pCommitConfig->wps_state;
2445 pConfig->fwdWPSPBCProbeReq = 1; // Forward WPS PBC probe request frame up
2446 pConfig->RSNWPAReqIELength = pCommitConfig->RSNWPAReqIELength;
2447 if(pConfig->RSNWPAReqIELength){
2448 pConfig->pRSNWPAReqIE = &pCommitConfig->RSNWPAReqIE[0];
2449 if ((pConfig->pRSNWPAReqIE[0] == DOT11F_EID_RSN) || (pConfig->pRSNWPAReqIE[0] == DOT11F_EID_WPA)){
2450 // The actual processing may eventually be more extensive than this.
2451 // Right now, just consume any PMKIDs that are sent in by the app.
2452 status = hdd_softap_unpackIE(
Jeff Johnson295189b2012-06-20 16:38:30 -07002453 vos_get_context( VOS_MODULE_ID_PE, pVosContext),
Jeff Johnson295189b2012-06-20 16:38:30 -07002454 &RSNEncryptType,
2455 &mcRSNEncryptType,
2456 &RSNAuthType,
2457 pConfig->pRSNWPAReqIE[1]+2,
2458 pConfig->pRSNWPAReqIE );
2459
2460 if( VOS_STATUS_SUCCESS == status )
2461 {
2462 // Now copy over all the security attributes you have parsed out
2463 //TODO: Need to handle mixed mode
2464 pConfig->RSNEncryptType = RSNEncryptType; // Use the cipher type in the RSN IE
2465 pConfig->mcRSNEncryptType = mcRSNEncryptType;
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05302466 hddLog( LOG1, FL("CSR AuthType = %d, EncryptionType = %d mcEncryptionType = %d\n"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002467 RSNAuthType, RSNEncryptType, mcRSNEncryptType);
2468 }
2469 }
2470 }
2471 else
2472 {
2473 /* If no RSNIE, set encrypt type to NONE*/
2474 pConfig->RSNEncryptType = eCSR_ENCRYPT_TYPE_NONE;
2475 pConfig->mcRSNEncryptType = eCSR_ENCRYPT_TYPE_NONE;
2476 hddLog( LOG1, FL("EncryptionType = %d mcEncryptionType = %d\n"),
2477 pConfig->RSNEncryptType, pConfig->mcRSNEncryptType);
2478 }
2479
Chilam Ngc4244af2013-04-01 15:37:32 -07002480 if (pConfig->RSNWPAReqIELength > QCSAP_MAX_OPT_IE) {
2481 hddLog(LOGE, FL("RSNWPAReqIELength: %d too large"), pConfig->RSNWPAReqIELength);
2482 kfree(pConfig);
2483 return -EIO;
2484 }
2485
Jeff Johnson295189b2012-06-20 16:38:30 -07002486 pConfig->SSIDinfo.ssidHidden = pCommitConfig->SSIDinfo.ssidHidden;
2487 pConfig->SSIDinfo.ssid.length = pCommitConfig->SSIDinfo.ssid.length;
2488 vos_mem_copy(pConfig->SSIDinfo.ssid.ssId, pCommitConfig->SSIDinfo.ssid.ssId, pConfig->SSIDinfo.ssid.length);
2489 vos_mem_copy(pConfig->self_macaddr.bytes, pHostapdAdapter->macAddressCurrent.bytes, sizeof(v_MACADDR_t));
2490
2491 pConfig->SapMacaddr_acl = pCommitConfig->qc_macaddr_acl;
2492
2493 // ht_capab is not what the name conveys,this is used for protection bitmap
2494 pConfig->ht_capab = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apProtection;
2495
Gopichand Nakkalac005b7c2013-05-14 16:04:14 +05302496 if (pCommitConfig->num_accept_mac > MAX_ACL_MAC_ADDRESS)
2497 num_mac = pConfig->num_accept_mac = MAX_ACL_MAC_ADDRESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002498 else
2499 num_mac = pConfig->num_accept_mac = pCommitConfig->num_accept_mac;
2500 acl_entry = pCommitConfig->accept_mac;
2501 for (i = 0; i < num_mac; i++)
2502 {
2503 vos_mem_copy(&pConfig->accept_mac[i], acl_entry->addr, sizeof(v_MACADDR_t));
2504 acl_entry++;
2505 }
Gopichand Nakkalac005b7c2013-05-14 16:04:14 +05302506 if (pCommitConfig->num_deny_mac > MAX_ACL_MAC_ADDRESS)
2507 num_mac = pConfig->num_deny_mac = MAX_ACL_MAC_ADDRESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002508 else
2509 num_mac = pConfig->num_deny_mac = pCommitConfig->num_deny_mac;
2510 acl_entry = pCommitConfig->deny_mac;
2511 for (i = 0; i < num_mac; i++)
2512 {
2513 vos_mem_copy(&pConfig->deny_mac[i], acl_entry->addr, sizeof(v_MACADDR_t));
2514 acl_entry++;
2515 }
2516 //Uapsd Enabled Bit
2517 pConfig->UapsdEnable = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apUapsdEnabled;
2518 //Enable OBSS protection
2519 pConfig->obssProtEnabled = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apOBSSProtEnabled;
2520 (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->apDisableIntraBssFwd = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apDisableIntraBssFwd;
2521
2522 hddLog(LOGW, FL("SOftAP macaddress : "MAC_ADDRESS_STR"\n"), MAC_ADDR_ARRAY(pHostapdAdapter->macAddressCurrent.bytes));
2523 hddLog(LOGW,FL("ssid =%s\n"), pConfig->SSIDinfo.ssid.ssId);
2524 hddLog(LOGW,FL("beaconint=%d, channel=%d\n"), (int)pConfig->beacon_int, (int)pConfig->channel);
2525 hddLog(LOGW,FL("hw_mode=%x\n"), pConfig->SapHw_mode);
2526 hddLog(LOGW,FL("privacy=%d, authType=%d\n"), pConfig->privacy, pConfig->authType);
2527 hddLog(LOGW,FL("RSN/WPALen=%d, \n"),(int)pConfig->RSNWPAReqIELength);
2528 hddLog(LOGW,FL("Uapsd = %d\n"),pConfig->UapsdEnable);
2529 hddLog(LOGW,FL("ProtEnabled = %d, OBSSProtEnabled = %d\n"),pConfig->protEnabled, pConfig->obssProtEnabled);
2530 hddLog(LOGW,FL("DisableIntraBssFwd = %d\n"),(WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->apDisableIntraBssFwd);
2531
2532 pSapEventCallback = hdd_hostapd_SAPEventCB;
2533 pConfig->persona = pHostapdAdapter->device_mode;
2534 if(WLANSAP_StartBss(pVosContext, pSapEventCallback, pConfig,(v_PVOID_t)dev) != VOS_STATUS_SUCCESS)
2535 {
2536 hddLog(LOGE,FL("SAP Start Bss fail\n"));
2537 }
2538
2539 kfree(pConfig);
2540
2541 hddLog(LOG1, FL("Waiting for Scan to complete(auto mode) and BSS to start"));
2542 vos_status = vos_wait_single_event(&pHostapdState->vosEvent, 10000);
2543
2544 if (!VOS_IS_STATUS_SUCCESS(vos_status))
2545 {
2546 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos wait for single_event failed!!\n"));
2547 VOS_ASSERT(0);
2548 }
2549
2550 pHostapdState->bCommit = TRUE;
2551 if(pHostapdState->vosStatus)
2552 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002553 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002554 }
2555 else
2556 {
2557 set_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
2558 WLANSAP_Update_WpsIe ( pVosContext );
2559 return 0;
2560 }
2561}
2562static
2563int iw_softap_setmlme(struct net_device *dev,
2564 struct iw_request_info *info,
2565 union iwreq_data *wrqu, char *extra)
2566{
2567 struct sQcSapreq_mlme *pmlme;
2568 hdd_adapter_t *pHostapdAdapter = (hdd_adapter_t*)(netdev_priv(dev));
2569 v_MACADDR_t destAddress;
2570 pmlme = (struct sQcSapreq_mlme *)(wrqu->name);
2571 /* NOTE: this address is not valid incase of TKIP failure, since not filled */
2572 vos_mem_copy(&destAddress.bytes, pmlme->im_macaddr, sizeof(v_MACADDR_t));
2573 switch(pmlme->im_op)
2574 {
2575 case QCSAP_MLME_AUTHORIZE:
2576 hdd_softap_change_STA_state( pHostapdAdapter, &destAddress, WLANTL_STA_AUTHENTICATED);
2577 break;
2578 case QCSAP_MLME_ASSOC:
2579 //TODO:inform to TL after associating (not needed as we do in sapCallback)
2580 break;
2581 case QCSAP_MLME_UNAUTHORIZE:
2582 //TODO: send the disassoc to station
2583 //hdd_softap_change_STA_state( pHostapdAdapter, pmlme->im_macaddr, WLANTL_STA_AUTHENTICATED);
2584 break;
2585 case QCSAP_MLME_DISASSOC:
2586 hdd_softap_sta_disassoc(pHostapdAdapter,pmlme->im_macaddr);
2587 break;
2588 case QCSAP_MLME_DEAUTH:
2589 hdd_softap_sta_deauth(pHostapdAdapter,pmlme->im_macaddr);
2590 break;
2591 case QCSAP_MLME_MICFAILURE:
2592 hdd_softap_tkip_mic_fail_counter_measure(pHostapdAdapter,pmlme->im_reason);
2593 break;
2594 default:
2595 break;
2596 }
2597 return 0;
2598}
2599
2600static int iw_softap_set_channel_range(struct net_device *dev,
2601 struct iw_request_info *info,
2602 union iwreq_data *wrqu, char *extra)
2603{
2604 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2605 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
Madan Mohan Koyyalamudi543172b2012-12-05 16:40:18 -08002606 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pHostapdAdapter);
Jeff Johnson295189b2012-06-20 16:38:30 -07002607
2608 int *value = (int *)extra;
2609 int startChannel = value[0];
2610 int endChannel = value[1];
2611 int band = value[2];
Jeff Johnson43971f52012-07-17 12:26:56 -07002612 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07002613 int ret = 0; /* success */
2614
2615 status = WLANSAP_SetChannelRange(hHal,startChannel,endChannel,band);
2616 if(status != VOS_STATUS_SUCCESS)
2617 {
2618 hddLog( LOGE, FL("iw_softap_set_channel_range: startChannel = %d, endChannel = %d band = %d\n"),
2619 startChannel,endChannel, band);
2620 ret = -EINVAL;
2621 }
Gopichand Nakkalaf7e53c52013-01-07 14:52:52 -08002622
2623 pHddCtx->is_dynamic_channel_range_set = 1;
2624
Jeff Johnson295189b2012-06-20 16:38:30 -07002625 return ret;
2626}
2627
2628int iw_softap_get_channel_list(struct net_device *dev,
2629 struct iw_request_info *info,
2630 union iwreq_data *wrqu, char *extra)
2631{
2632 v_U32_t num_channels = 0;
2633 v_U8_t i = 0;
2634 v_U8_t bandStartChannel = RF_CHAN_1;
2635 v_U8_t bandEndChannel = RF_CHAN_165;
2636 v_U32_t temp_num_channels = 0;
2637 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2638 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
2639 v_REGDOMAIN_t domainIdCurrentSoftap;
Jeff Johnson295189b2012-06-20 16:38:30 -07002640 tpChannelListInfo channel_list = (tpChannelListInfo) extra;
Madan Mohan Koyyalamudibb7b43a2012-10-11 14:55:09 -07002641 eCsrBand curBand = eCSR_BAND_ALL;
2642
2643 if (eHAL_STATUS_SUCCESS != sme_GetFreqBand(hHal, &curBand))
2644 {
2645 hddLog(LOGE,FL("not able get the current frequency band\n"));
2646 return -EIO;
2647 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002648 wrqu->data.length = sizeof(tChannelListInfo);
2649 ENTER();
2650
Madan Mohan Koyyalamudibb7b43a2012-10-11 14:55:09 -07002651 if (eCSR_BAND_24 == curBand)
2652 {
2653 bandStartChannel = RF_CHAN_1;
2654 bandEndChannel = RF_CHAN_14;
2655 }
2656 else if (eCSR_BAND_5G == curBand)
2657 {
2658 bandStartChannel = RF_CHAN_36;
2659 bandEndChannel = RF_CHAN_165;
2660 }
2661
Gopichand Nakkala29d00192013-06-20 19:03:52 +05302662 hddLog(LOG1, FL("\n curBand = %d, bandStartChannel = %hu, "
2663 "bandEndChannel = %hu "), curBand,
Madan Mohan Koyyalamudibb7b43a2012-10-11 14:55:09 -07002664 bandStartChannel, bandEndChannel );
2665
Jeff Johnson295189b2012-06-20 16:38:30 -07002666 for( i = bandStartChannel; i <= bandEndChannel; i++ )
2667 {
2668 if( NV_CHANNEL_ENABLE == regChannels[i].enabled )
2669 {
2670 channel_list->channels[num_channels] = rfChannels[i].channelNum;
2671 num_channels++;
2672 }
2673 }
2674
2675 /* remove indoor channels if the domain is FCC, channels 36 - 48 */
2676
2677 temp_num_channels = num_channels;
2678
2679 if(eHAL_STATUS_SUCCESS != sme_getSoftApDomain(hHal,(v_REGDOMAIN_t *) &domainIdCurrentSoftap))
2680 {
2681 hddLog(LOG1,FL("Failed to get Domain ID, %d \n"),domainIdCurrentSoftap);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002682 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002683 }
2684
2685 if(REGDOMAIN_FCC == domainIdCurrentSoftap)
2686 {
2687 for(i = 0; i < temp_num_channels; i++)
2688 {
2689
2690 if((channel_list->channels[i] > 35) &&
2691 (channel_list->channels[i] < 49))
2692 {
2693 vos_mem_move(&channel_list->channels[i],
2694 &channel_list->channels[i+1],
2695 temp_num_channels - (i-1));
2696 num_channels--;
2697 temp_num_channels--;
2698 i--;
2699 }
2700 }
2701 }
2702
2703 hddLog(LOG1,FL(" number of channels %d\n"), num_channels);
2704
2705 if (num_channels > IW_MAX_FREQUENCIES)
2706 {
2707 num_channels = IW_MAX_FREQUENCIES;
2708 }
2709
2710 channel_list->num_channels = num_channels;
2711 EXIT();
2712
2713 return 0;
2714}
2715
2716static
2717int iw_get_genie(struct net_device *dev,
2718 struct iw_request_info *info,
2719 union iwreq_data *wrqu, char *extra)
2720{
2721 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2722 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
2723 eHalStatus status;
2724 v_U32_t length = DOT11F_IE_RSN_MAX_LEN;
2725 v_U8_t genIeBytes[DOT11F_IE_RSN_MAX_LEN];
2726 ENTER();
2727 hddLog(LOG1,FL("getGEN_IE ioctl\n"));
2728 // Actually retrieve the RSN IE from CSR. (We previously sent it down in the CSR Roam Profile.)
2729 status = WLANSap_getstationIE_information(pVosContext,
2730 &length,
2731 genIeBytes);
2732 wrqu->data.length = VOS_MIN((u_int16_t) length, DOT11F_IE_RSN_MAX_LEN);
2733 vos_mem_copy( wrqu->data.pointer, (v_VOID_t*)genIeBytes, wrqu->data.length);
2734
2735 hddLog(LOG1,FL(" RSN IE of %d bytes returned\n"), wrqu->data.length );
2736
2737
2738 EXIT();
2739 return 0;
2740}
2741static
2742int iw_get_WPSPBCProbeReqIEs(struct net_device *dev,
2743 struct iw_request_info *info,
2744 union iwreq_data *wrqu, char *extra)
2745{
2746 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2747 sQcSapreq_WPSPBCProbeReqIES_t *pWPSPBCProbeReqIEs;
2748 hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
2749 ENTER();
2750
2751 hddLog(LOG1,FL("get_WPSPBCProbeReqIEs ioctl\n"));
2752
2753 pWPSPBCProbeReqIEs = (sQcSapreq_WPSPBCProbeReqIES_t *)(wrqu->data.pointer);
2754 pWPSPBCProbeReqIEs->probeReqIELen = pHddApCtx->WPSPBCProbeReq.probeReqIELen;
2755 vos_mem_copy(pWPSPBCProbeReqIEs->probeReqIE, pHddApCtx->WPSPBCProbeReq.probeReqIE, pWPSPBCProbeReqIEs->probeReqIELen);
2756 vos_mem_copy(pWPSPBCProbeReqIEs->macaddr, pHddApCtx->WPSPBCProbeReq.peerMacAddr, sizeof(v_MACADDR_t));
2757 wrqu->data.length = 12 + pWPSPBCProbeReqIEs->probeReqIELen;
2758 hddLog(LOG1, FL("Macaddress : "MAC_ADDRESS_STR"\n"), MAC_ADDR_ARRAY(pWPSPBCProbeReqIEs->macaddr));
2759 up(&pHddApCtx->semWpsPBCOverlapInd);
2760 EXIT();
2761 return 0;
2762}
2763
2764/**---------------------------------------------------------------------------
2765
2766 \brief iw_set_auth_hostap() -
2767 This function sets the auth type received from the wpa_supplicant.
2768
2769 \param - dev - Pointer to the net device.
2770 - info - Pointer to the iw_request_info.
2771 - wrqu - Pointer to the iwreq_data.
2772 - extra - Pointer to the data.
2773 \return - 0 for success, non zero for failure
2774
2775 --------------------------------------------------------------------------*/
2776int iw_set_auth_hostap(struct net_device *dev,struct iw_request_info *info,
2777 union iwreq_data *wrqu,char *extra)
2778{
2779 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
2780 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
2781
2782 ENTER();
2783 switch(wrqu->param.flags & IW_AUTH_INDEX)
2784 {
2785 case IW_AUTH_TKIP_COUNTERMEASURES:
2786 {
2787 if(wrqu->param.value) {
2788 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,
2789 "Counter Measure started %d", wrqu->param.value);
2790 pWextState->mTKIPCounterMeasures = TKIP_COUNTER_MEASURE_STARTED;
2791 }
2792 else {
2793 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,
2794 "Counter Measure stopped=%d", wrqu->param.value);
2795 pWextState->mTKIPCounterMeasures = TKIP_COUNTER_MEASURE_STOPED;
2796 }
2797
2798 hdd_softap_tkip_mic_fail_counter_measure(pAdapter,
2799 wrqu->param.value);
2800 }
2801 break;
2802
2803 default:
2804
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002805 hddLog(LOGW, "%s called with unsupported auth type %d", __func__,
Jeff Johnson295189b2012-06-20 16:38:30 -07002806 wrqu->param.flags & IW_AUTH_INDEX);
2807 break;
2808 }
2809
2810 EXIT();
2811 return 0;
2812}
2813
2814static int iw_set_ap_encodeext(struct net_device *dev,
2815 struct iw_request_info *info,
2816 union iwreq_data *wrqu, char *extra)
2817{
2818 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
2819 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
2820 hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
Jeff Johnson43971f52012-07-17 12:26:56 -07002821 int retval = 0;
2822 VOS_STATUS vstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07002823 struct iw_encode_ext *ext = (struct iw_encode_ext*)extra;
2824 v_U8_t groupmacaddr[WNI_CFG_BSSID_LEN] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
2825 int key_index;
2826 struct iw_point *encoding = &wrqu->encoding;
2827 tCsrRoamSetKey setKey;
2828// tCsrRoamRemoveKey RemoveKey;
2829 int i;
Jeff Johnson43971f52012-07-17 12:26:56 -07002830
Jeff Johnson295189b2012-06-20 16:38:30 -07002831 ENTER();
2832
2833 key_index = encoding->flags & IW_ENCODE_INDEX;
2834
2835 if(key_index > 0) {
2836
2837 /*Convert from 1-based to 0-based keying*/
2838 key_index--;
2839 }
2840 if(!ext->key_len) {
2841#if 0
2842 /*Set the encrytion type to NONE*/
2843#if 0
2844 pRoamProfile->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
2845#endif
2846
2847 RemoveKey.keyId = key_index;
2848 if(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
2849 /*Key direction for group is RX only*/
2850 vos_mem_copy(RemoveKey.peerMac,groupmacaddr,WNI_CFG_BSSID_LEN);
2851 }
2852 else {
2853 vos_mem_copy(RemoveKey.peerMac,ext->addr.sa_data,WNI_CFG_BSSID_LEN);
2854 }
2855 switch(ext->alg)
2856 {
2857 case IW_ENCODE_ALG_NONE:
2858 RemoveKey.encType = eCSR_ENCRYPT_TYPE_NONE;
2859 break;
2860 case IW_ENCODE_ALG_WEP:
2861 RemoveKey.encType = (ext->key_len== 5) ? eCSR_ENCRYPT_TYPE_WEP40:eCSR_ENCRYPT_TYPE_WEP104;
2862 break;
2863 case IW_ENCODE_ALG_TKIP:
2864 RemoveKey.encType = eCSR_ENCRYPT_TYPE_TKIP;
Jeff Johnson43971f52012-07-17 12:26:56 -07002865 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002866 case IW_ENCODE_ALG_CCMP:
2867 RemoveKey.encType = eCSR_ENCRYPT_TYPE_AES;
2868 break;
2869 default:
2870 RemoveKey.encType = eCSR_ENCRYPT_TYPE_NONE;
2871 break;
2872 }
2873 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: Remove key cipher_alg:%d key_len%d *pEncryptionType :%d \n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002874 __func__,(int)ext->alg,(int)ext->key_len,RemoveKey.encType);
Jeff Johnson295189b2012-06-20 16:38:30 -07002875 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: Peer Mac = "MAC_ADDRESS_STR"\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002876 __func__, MAC_ADDR_ARRAY(RemoveKey.peerMac));
Jeff Johnson295189b2012-06-20 16:38:30 -07002877 );
Jeff Johnson43971f52012-07-17 12:26:56 -07002878 vstatus = WLANSAP_DelKeySta( pVosContext, &RemoveKey);
2879 if ( vstatus != VOS_STATUS_SUCCESS )
Jeff Johnson295189b2012-06-20 16:38:30 -07002880 {
2881 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "[%4d] WLANSAP_DeleteKeysSta returned ERROR status= %d",
Jeff Johnson43971f52012-07-17 12:26:56 -07002882 __LINE__, vstatus );
2883 retval = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002884 }
Jeff Johnson43971f52012-07-17 12:26:56 -07002885#endif
2886 return retval;
Jeff Johnson295189b2012-06-20 16:38:30 -07002887
Jeff Johnson43971f52012-07-17 12:26:56 -07002888 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002889
2890 vos_mem_zero(&setKey,sizeof(tCsrRoamSetKey));
2891
2892 setKey.keyId = key_index;
2893 setKey.keyLength = ext->key_len;
2894
2895 if(ext->key_len <= CSR_MAX_KEY_LEN) {
2896 vos_mem_copy(&setKey.Key[0],ext->key,ext->key_len);
2897 }
2898
2899 if(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
2900 /*Key direction for group is RX only*/
2901 setKey.keyDirection = eSIR_RX_ONLY;
2902 vos_mem_copy(setKey.peerMac,groupmacaddr,WNI_CFG_BSSID_LEN);
2903 }
2904 else {
2905
2906 setKey.keyDirection = eSIR_TX_RX;
2907 vos_mem_copy(setKey.peerMac,ext->addr.sa_data,WNI_CFG_BSSID_LEN);
2908 }
2909 if(ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)
2910 {
2911 setKey.keyDirection = eSIR_TX_DEFAULT;
2912 vos_mem_copy(setKey.peerMac,ext->addr.sa_data,WNI_CFG_BSSID_LEN);
2913 }
2914
2915 /*For supplicant pae role is zero*/
2916 setKey.paeRole = 0;
2917
2918 switch(ext->alg)
2919 {
2920 case IW_ENCODE_ALG_NONE:
2921 setKey.encType = eCSR_ENCRYPT_TYPE_NONE;
2922 break;
2923
2924 case IW_ENCODE_ALG_WEP:
2925 setKey.encType = (ext->key_len== 5) ? eCSR_ENCRYPT_TYPE_WEP40:eCSR_ENCRYPT_TYPE_WEP104;
2926 pHddApCtx->uPrivacy = 1;
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002927 hddLog(LOG1, "(%s) uPrivacy=%d", __func__, pHddApCtx->uPrivacy);
Jeff Johnson295189b2012-06-20 16:38:30 -07002928 break;
2929
2930 case IW_ENCODE_ALG_TKIP:
2931 {
2932 v_U8_t *pKey = &setKey.Key[0];
2933
2934 setKey.encType = eCSR_ENCRYPT_TYPE_TKIP;
2935
2936 vos_mem_zero(pKey, CSR_MAX_KEY_LEN);
2937
2938 /*Supplicant sends the 32bytes key in this order
2939
2940 |--------------|----------|----------|
2941 | Tk1 |TX-MIC | RX Mic |
2942 |--------------|----------|----------|
2943 <---16bytes---><--8bytes--><--8bytes-->
2944
2945 */
2946 /*Sme expects the 32 bytes key to be in the below order
2947
2948 |--------------|----------|----------|
2949 | Tk1 |RX-MIC | TX Mic |
2950 |--------------|----------|----------|
2951 <---16bytes---><--8bytes--><--8bytes-->
2952 */
2953 /* Copy the Temporal Key 1 (TK1) */
2954 vos_mem_copy(pKey,ext->key,16);
2955
2956 /*Copy the rx mic first*/
2957 vos_mem_copy(&pKey[16],&ext->key[24],8);
2958
2959 /*Copy the tx mic */
2960 vos_mem_copy(&pKey[24],&ext->key[16],8);
2961
2962 }
2963 break;
2964
2965 case IW_ENCODE_ALG_CCMP:
2966 setKey.encType = eCSR_ENCRYPT_TYPE_AES;
2967 break;
2968
2969 default:
2970 setKey.encType = eCSR_ENCRYPT_TYPE_NONE;
2971 break;
2972 }
2973
2974 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05302975 ("%s:EncryptionType:%d key_len:%d, KeyId:%d"), __func__, setKey.encType, setKey.keyLength,
Jeff Johnson295189b2012-06-20 16:38:30 -07002976 setKey.keyId);
2977 for(i=0; i< ext->key_len; i++)
2978 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2979 ("%02x"), setKey.Key[i]);
2980 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
2981 ("\n"));
Jeff Johnson43971f52012-07-17 12:26:56 -07002982
2983 vstatus = WLANSAP_SetKeySta( pVosContext, &setKey);
2984 if ( vstatus != VOS_STATUS_SUCCESS )
Jeff Johnson295189b2012-06-20 16:38:30 -07002985 {
2986 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson43971f52012-07-17 12:26:56 -07002987 "[%4d] WLANSAP_SetKeySta returned ERROR status= %d", __LINE__, vstatus );
2988 retval = -EINVAL;
2989 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002990
Jeff Johnson43971f52012-07-17 12:26:56 -07002991 return retval;
Jeff Johnson295189b2012-06-20 16:38:30 -07002992}
Jeff Johnson43971f52012-07-17 12:26:56 -07002993
2994
Jeff Johnson295189b2012-06-20 16:38:30 -07002995static int iw_set_ap_mlme(struct net_device *dev,
2996 struct iw_request_info *info,
2997 union iwreq_data *wrqu,
2998 char *extra)
2999{
3000#if 0
3001 hdd_adapter_t *pAdapter = (netdev_priv(dev));
3002 struct iw_mlme *mlme = (struct iw_mlme *)extra;
3003
3004 ENTER();
3005
3006 //reason_code is unused. By default it is set to eCSR_DISCONNECT_REASON_UNSPECIFIED
3007 switch (mlme->cmd) {
3008 case IW_MLME_DISASSOC:
3009 case IW_MLME_DEAUTH:
3010 hddLog(LOG1, "Station disassociate");
3011 if( pAdapter->conn_info.connState == eConnectionState_Associated )
3012 {
3013 eCsrRoamDisconnectReason reason = eCSR_DISCONNECT_REASON_UNSPECIFIED;
3014
3015 if( mlme->reason_code == HDD_REASON_MICHAEL_MIC_FAILURE )
3016 reason = eCSR_DISCONNECT_REASON_MIC_ERROR;
3017
3018 status = sme_RoamDisconnect( pAdapter->hHal,pAdapter->sessionId, reason);
3019
3020 //clear all the reason codes
3021 if (status != 0)
3022 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003023 hddLog(LOGE,"%s %d Command Disassociate/Deauthenticate : csrRoamDisconnect failure returned %d \n", __func__, (int)mlme->cmd, (int)status );
Jeff Johnson295189b2012-06-20 16:38:30 -07003024 }
3025
3026 netif_stop_queue(dev);
3027 netif_carrier_off(dev);
3028 }
3029 else
3030 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003031 hddLog(LOGE,"%s %d Command Disassociate/Deauthenticate called but station is not in associated state \n", __func__, (int)mlme->cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07003032 }
3033 default:
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003034 hddLog(LOGE,"%s %d Command should be Disassociate/Deauthenticate \n", __func__, (int)mlme->cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07003035 return -EINVAL;
3036 }//end of switch
3037 EXIT();
3038#endif
3039 return 0;
3040// return status;
3041}
3042
3043static int iw_get_ap_rts_threshold(struct net_device *dev,
3044 struct iw_request_info *info,
3045 union iwreq_data *wrqu, char *extra)
3046{
3047 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
3048 v_U32_t status = 0;
3049
3050 status = hdd_wlan_get_rts_threshold(pHostapdAdapter, wrqu);
3051
3052 return status;
3053}
3054
3055static int iw_get_ap_frag_threshold(struct net_device *dev,
3056 struct iw_request_info *info,
3057 union iwreq_data *wrqu, char *extra)
3058{
3059 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
3060 v_U32_t status = 0;
3061
3062 status = hdd_wlan_get_frag_threshold(pHostapdAdapter, wrqu);
3063
3064 return status;
3065}
3066
3067static int iw_get_ap_freq(struct net_device *dev, struct iw_request_info *info,
3068 struct iw_freq *fwrq, char *extra)
3069{
Jeff Johnsone7245742012-09-05 17:12:55 -07003070 v_U32_t status = FALSE, channel = 0, freq = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003071 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
3072 tHalHandle hHal;
3073 hdd_hostapd_state_t *pHostapdState;
Jeff Johnsone7245742012-09-05 17:12:55 -07003074 hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
Jeff Johnson295189b2012-06-20 16:38:30 -07003075
3076 ENTER();
3077
3078 if ((WLAN_HDD_GET_CTX(pHostapdAdapter))->isLogpInProgress) {
3079 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
3080 "%s:LOGP in Progress. Ignore!!!",__func__);
3081 return status;
3082 }
3083
3084 pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
3085 hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
3086
3087 if(pHostapdState->bssState == BSS_STOP )
3088 {
3089 if (ccmCfgGetInt(hHal, WNI_CFG_CURRENT_CHANNEL, &channel)
3090 != eHAL_STATUS_SUCCESS)
3091 {
3092 return -EIO;
3093 }
3094 else
3095 {
3096 status = hdd_wlan_get_freq(channel, &freq);
Jeff Johnsone7245742012-09-05 17:12:55 -07003097 if( TRUE == status)
3098 {
3099 /* Set Exponent parameter as 6 (MHZ) in struct iw_freq
3100 * iwlist & iwconfig command shows frequency into proper
3101 * format (2.412 GHz instead of 246.2 MHz)*/
3102 fwrq->m = freq;
3103 fwrq->e = MHZ;
3104 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003105 }
3106 }
3107 else
3108 {
3109 channel = pHddApCtx->operatingChannel;
3110 status = hdd_wlan_get_freq(channel, &freq);
Jeff Johnsone7245742012-09-05 17:12:55 -07003111 if( TRUE == status)
3112 {
3113 /* Set Exponent parameter as 6 (MHZ) in struct iw_freq
3114 * iwlist & iwconfig command shows frequency into proper
3115 * format (2.412 GHz instead of 246.2 MHz)*/
3116 fwrq->m = freq;
3117 fwrq->e = MHZ;
3118 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003119 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003120 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003121}
3122
Madan Mohan Koyyalamudi0c2ba1b2013-10-01 19:47:50 +05303123static int iw_get_mode(struct net_device *dev,
3124 struct iw_request_info *info,
3125 union iwreq_data *wrqu,
3126 char *extra)
3127{
3128 int status = 0;
3129
3130 wrqu->mode = IW_MODE_MASTER;
3131
3132 return status;
3133}
3134
Jeff Johnson295189b2012-06-20 16:38:30 -07003135static int iw_softap_setwpsie(struct net_device *dev,
3136 struct iw_request_info *info,
3137 union iwreq_data *wrqu,
3138 char *extra)
3139{
3140 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
3141 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
3142 hdd_hostapd_state_t *pHostapdState;
3143 eHalStatus halStatus= eHAL_STATUS_SUCCESS;
3144 u_int8_t *wps_genie = wrqu->data.pointer;
3145 u_int8_t *pos;
3146 tpSap_WPSIE pSap_WPSIe;
3147 u_int8_t WPSIeType;
3148 u_int16_t length;
3149 ENTER();
3150
3151 if(!wrqu->data.length)
3152 return 0;
3153
3154 pSap_WPSIe = vos_mem_malloc(sizeof(tSap_WPSIE));
3155 if (NULL == pSap_WPSIe)
3156 {
3157 hddLog(LOGE, "VOS unable to allocate memory\n");
3158 return -ENOMEM;
3159 }
3160 vos_mem_zero(pSap_WPSIe, sizeof(tSap_WPSIE));
3161
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003162 hddLog(LOG1,"%s WPS IE type[0x%X] IE[0x%X], LEN[%d]\n", __func__, wps_genie[0], wps_genie[1], wps_genie[2]);
Jeff Johnson295189b2012-06-20 16:38:30 -07003163 WPSIeType = wps_genie[0];
3164 if ( wps_genie[0] == eQC_WPS_BEACON_IE)
3165 {
3166 pSap_WPSIe->sapWPSIECode = eSAP_WPS_BEACON_IE;
3167 wps_genie = wps_genie + 1;
3168 switch ( wps_genie[0] )
3169 {
3170 case DOT11F_EID_WPA:
3171 if (wps_genie[1] < 2 + 4)
3172 {
3173 vos_mem_free(pSap_WPSIe);
3174 return -EINVAL;
3175 }
3176 else if (memcmp(&wps_genie[2], "\x00\x50\xf2\x04", 4) == 0)
3177 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003178 hddLog (LOG1, "%s Set WPS BEACON IE(len %d)",__func__, wps_genie[1]+2);
Jeff Johnson295189b2012-06-20 16:38:30 -07003179 pos = &wps_genie[6];
3180 while (((size_t)pos - (size_t)&wps_genie[6]) < (wps_genie[1] - 4) )
3181 {
3182 switch((u_int16_t)(*pos<<8) | *(pos+1))
3183 {
3184 case HDD_WPS_ELEM_VERSION:
3185 pos += 4;
3186 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.Version = *pos;
3187 hddLog(LOG1, "WPS version %d\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.Version);
3188 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_VER_PRESENT;
3189 pos += 1;
3190 break;
3191
3192 case HDD_WPS_ELEM_WPS_STATE:
3193 pos +=4;
3194 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.wpsState = *pos;
3195 hddLog(LOG1, "WPS State %d\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.wpsState);
3196 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_STATE_PRESENT;
3197 pos += 1;
3198 break;
3199 case HDD_WPS_ELEM_APSETUPLOCK:
3200 pos += 4;
3201 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.APSetupLocked = *pos;
3202 hddLog(LOG1, "AP setup lock %d\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.APSetupLocked);
3203 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_APSETUPLOCK_PRESENT;
3204 pos += 1;
3205 break;
3206 case HDD_WPS_ELEM_SELECTEDREGISTRA:
3207 pos += 4;
3208 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.SelectedRegistra = *pos;
3209 hddLog(LOG1, "Selected Registra %d\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.SelectedRegistra);
3210 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_SELECTEDREGISTRA_PRESENT;
3211 pos += 1;
3212 break;
3213 case HDD_WPS_ELEM_DEVICE_PASSWORD_ID:
3214 pos += 4;
3215 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.DevicePasswordID = (*pos<<8) | *(pos+1);
3216 hddLog(LOG1, "Password ID: %x\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.DevicePasswordID);
3217 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_DEVICEPASSWORDID_PRESENT;
3218 pos += 2;
3219 break;
3220 case HDD_WPS_ELEM_REGISTRA_CONF_METHODS:
3221 pos += 4;
3222 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.SelectedRegistraCfgMethod = (*pos<<8) | *(pos+1);
3223 hddLog(LOG1, "Select Registra Config Methods: %x\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.SelectedRegistraCfgMethod);
3224 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_SELECTEDREGISTRACFGMETHOD_PRESENT;
3225 pos += 2;
3226 break;
3227
3228 case HDD_WPS_ELEM_UUID_E:
3229 pos += 2;
3230 length = *pos<<8 | *(pos+1);
3231 pos += 2;
3232 vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSBeaconIE.UUID_E, pos, length);
3233 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_UUIDE_PRESENT;
3234 pos += length;
3235 break;
3236 case HDD_WPS_ELEM_RF_BANDS:
3237 pos += 4;
3238 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.RFBand = *pos;
3239 hddLog(LOG1, "RF band: %d\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.RFBand);
3240 pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_RF_BANDS_PRESENT;
3241 pos += 1;
3242 break;
3243
3244 default:
3245 hddLog (LOGW, "UNKNOWN TLV in WPS IE(%x)\n", (*pos<<8 | *(pos+1)));
3246 vos_mem_free(pSap_WPSIe);
3247 return -EINVAL;
3248 }
3249 }
3250 }
3251 else {
3252 hddLog (LOGE, "%s WPS IE Mismatch %X",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003253 __func__, wps_genie[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07003254 }
3255 break;
3256
3257 default:
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003258 hddLog (LOGE, "%s Set UNKNOWN IE %X",__func__, wps_genie[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07003259 vos_mem_free(pSap_WPSIe);
3260 return 0;
3261 }
3262 }
3263 else if( wps_genie[0] == eQC_WPS_PROBE_RSP_IE)
3264 {
3265 pSap_WPSIe->sapWPSIECode = eSAP_WPS_PROBE_RSP_IE;
3266 wps_genie = wps_genie + 1;
3267 switch ( wps_genie[0] )
3268 {
3269 case DOT11F_EID_WPA:
3270 if (wps_genie[1] < 2 + 4)
3271 {
3272 vos_mem_free(pSap_WPSIe);
3273 return -EINVAL;
3274 }
3275 else if (memcmp(&wps_genie[2], "\x00\x50\xf2\x04", 4) == 0)
3276 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003277 hddLog (LOG1, "%s Set WPS PROBE RSP IE(len %d)",__func__, wps_genie[1]+2);
Jeff Johnson295189b2012-06-20 16:38:30 -07003278 pos = &wps_genie[6];
3279 while (((size_t)pos - (size_t)&wps_genie[6]) < (wps_genie[1] - 4) )
3280 {
3281 switch((u_int16_t)(*pos<<8) | *(pos+1))
3282 {
3283 case HDD_WPS_ELEM_VERSION:
3284 pos += 4;
3285 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.Version = *pos;
3286 hddLog(LOG1, "WPS version %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.Version);
3287 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_VER_PRESENT;
3288 pos += 1;
3289 break;
3290
3291 case HDD_WPS_ELEM_WPS_STATE:
3292 pos +=4;
3293 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.wpsState = *pos;
3294 hddLog(LOG1, "WPS State %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.wpsState);
3295 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_STATE_PRESENT;
3296 pos += 1;
3297 break;
3298 case HDD_WPS_ELEM_APSETUPLOCK:
3299 pos += 4;
3300 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.APSetupLocked = *pos;
3301 hddLog(LOG1, "AP setup lock %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.APSetupLocked);
3302 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_APSETUPLOCK_PRESENT;
3303 pos += 1;
3304 break;
3305 case HDD_WPS_ELEM_SELECTEDREGISTRA:
3306 pos += 4;
3307 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistra = *pos;
3308 hddLog(LOG1, "Selected Registra %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistra);
3309 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_SELECTEDREGISTRA_PRESENT;
3310 pos += 1;
3311 break;
3312 case HDD_WPS_ELEM_DEVICE_PASSWORD_ID:
3313 pos += 4;
3314 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DevicePasswordID = (*pos<<8) | *(pos+1);
3315 hddLog(LOG1, "Password ID: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DevicePasswordID);
3316 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_DEVICEPASSWORDID_PRESENT;
3317 pos += 2;
3318 break;
3319 case HDD_WPS_ELEM_REGISTRA_CONF_METHODS:
3320 pos += 4;
3321 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistraCfgMethod = (*pos<<8) | *(pos+1);
3322 hddLog(LOG1, "Select Registra Config Methods: %x\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistraCfgMethod);
3323 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_SELECTEDREGISTRACFGMETHOD_PRESENT;
3324 pos += 2;
3325 break;
3326 case HDD_WPS_ELEM_RSP_TYPE:
3327 pos += 4;
3328 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.ResponseType = *pos;
3329 hddLog(LOG1, "Config Methods: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.ResponseType);
3330 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_RESPONSETYPE_PRESENT;
3331 pos += 1;
3332 break;
3333 case HDD_WPS_ELEM_UUID_E:
3334 pos += 2;
3335 length = *pos<<8 | *(pos+1);
3336 pos += 2;
3337 vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.UUID_E, pos, length);
3338 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_UUIDE_PRESENT;
3339 pos += length;
3340 break;
3341
3342 case HDD_WPS_ELEM_MANUFACTURER:
3343 pos += 2;
3344 length = *pos<<8 | *(pos+1);
3345 pos += 2;
3346 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.Manufacture.num_name = length;
3347 vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.Manufacture.name, pos, length);
3348 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_MANUFACTURE_PRESENT;
3349 pos += length;
3350 break;
3351
3352 case HDD_WPS_ELEM_MODEL_NAME:
3353 pos += 2;
3354 length = *pos<<8 | *(pos+1);
3355 pos += 2;
3356 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.ModelName.num_text = length;
3357 vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.ModelName.text, pos, length);
3358 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_MODELNAME_PRESENT;
3359 pos += length;
3360 break;
3361 case HDD_WPS_ELEM_MODEL_NUM:
3362 pos += 2;
3363 length = *pos<<8 | *(pos+1);
3364 pos += 2;
3365 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.ModelNumber.num_text = length;
3366 vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.ModelNumber.text, pos, length);
3367 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_MODELNUMBER_PRESENT;
3368 pos += length;
3369 break;
3370 case HDD_WPS_ELEM_SERIAL_NUM:
3371 pos += 2;
3372 length = *pos<<8 | *(pos+1);
3373 pos += 2;
3374 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SerialNumber.num_text = length;
3375 vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SerialNumber.text, pos, length);
3376 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_SERIALNUMBER_PRESENT;
3377 pos += length;
3378 break;
3379 case HDD_WPS_ELEM_PRIMARY_DEVICE_TYPE:
3380 pos += 4;
3381 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.PrimaryDeviceCategory = (*pos<<8 | *(pos+1));
3382 hddLog(LOG1, "primary dev category: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.PrimaryDeviceCategory);
3383 pos += 2;
3384
3385 vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.PrimaryDeviceOUI, pos, HDD_WPS_DEVICE_OUI_LEN);
3386 hddLog(LOG1, "primary dev oui: %02x, %02x, %02x, %02x\n", pos[0], pos[1], pos[2], pos[3]);
3387 pos += 4;
3388 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DeviceSubCategory = (*pos<<8 | *(pos+1));
3389 hddLog(LOG1, "primary dev sub category: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DeviceSubCategory);
3390 pos += 2;
3391 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_PRIMARYDEVICETYPE_PRESENT;
3392 break;
3393 case HDD_WPS_ELEM_DEVICE_NAME:
3394 pos += 2;
3395 length = *pos<<8 | *(pos+1);
3396 pos += 2;
3397 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DeviceName.num_text = length;
3398 vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DeviceName.text, pos, length);
3399 pos += length;
3400 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_DEVICENAME_PRESENT;
3401 break;
3402 case HDD_WPS_ELEM_CONFIG_METHODS:
3403 pos += 4;
3404 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.ConfigMethod = (*pos<<8) | *(pos+1);
3405 hddLog(LOG1, "Config Methods: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistraCfgMethod);
3406 pos += 2;
3407 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_CONFIGMETHODS_PRESENT;
3408 break;
3409
3410 case HDD_WPS_ELEM_RF_BANDS:
3411 pos += 4;
3412 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.RFBand = *pos;
3413 hddLog(LOG1, "RF band: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.RFBand);
3414 pos += 1;
3415 pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_RF_BANDS_PRESENT;
3416 break;
3417 } // switch
3418 }
3419 }
3420 else
3421 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003422 hddLog (LOGE, "%s WPS IE Mismatch %X",__func__, wps_genie[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07003423 }
3424
3425 } // switch
3426 }
3427 halStatus = WLANSAP_Set_WpsIe(pVosContext, pSap_WPSIe);
3428 pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
3429 if( pHostapdState->bCommit && WPSIeType == eQC_WPS_PROBE_RSP_IE)
3430 {
3431 //hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
3432 //v_CONTEXT_t pVosContext = pHostapdAdapter->pvosContext;
3433 WLANSAP_Update_WpsIe ( pVosContext );
3434 }
3435
3436 vos_mem_free(pSap_WPSIe);
3437 EXIT();
3438 return halStatus;
3439}
3440
3441static int iw_softap_stopbss(struct net_device *dev,
3442 struct iw_request_info *info,
3443 union iwreq_data *wrqu,
3444 char *extra)
3445{
3446 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
3447 VOS_STATUS status = VOS_STATUS_SUCCESS;
3448 ENTER();
3449 if(test_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags))
3450 {
3451 if ( VOS_STATUS_SUCCESS == (status = WLANSAP_StopBss((WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext) ) )
3452 {
3453 hdd_hostapd_state_t *pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
3454
3455 status = vos_wait_single_event(&pHostapdState->vosEvent, 10000);
3456
3457 if (!VOS_IS_STATUS_SUCCESS(status))
3458 {
3459 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3460 ("ERROR: HDD vos wait for single_event failed!!\n"));
3461 VOS_ASSERT(0);
3462 }
3463 }
3464 clear_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
3465 }
3466 EXIT();
3467 return (status == VOS_STATUS_SUCCESS) ? 0 : -EBUSY;
3468}
3469
3470static int iw_softap_version(struct net_device *dev,
3471 struct iw_request_info *info,
Jeff Johnson4824d4c2013-02-12 14:23:57 -08003472 union iwreq_data *wrqu,
Jeff Johnson295189b2012-06-20 16:38:30 -07003473 char *extra)
3474{
Jeff Johnson295189b2012-06-20 16:38:30 -07003475 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
Jeff Johnson4824d4c2013-02-12 14:23:57 -08003476
Jeff Johnson295189b2012-06-20 16:38:30 -07003477 ENTER();
Jeff Johnson4824d4c2013-02-12 14:23:57 -08003478 hdd_wlan_get_version(pHostapdAdapter, wrqu, extra);
Jeff Johnson295189b2012-06-20 16:38:30 -07003479 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07003480 return 0;
3481}
Gopichand Nakkala976e3252013-01-03 15:45:56 -08003482
Yathish Hanumapuradoddi Shivanna7b659402013-03-25 14:12:32 -07003483VOS_STATUS hdd_softap_get_sta_info(hdd_adapter_t *pAdapter, v_U8_t *pBuf, int buf_len)
Gopichand Nakkala976e3252013-01-03 15:45:56 -08003484{
3485 v_U8_t i;
Yathish Hanumapuradoddi Shivanna7b659402013-03-25 14:12:32 -07003486 int len = 0;
3487 const char sta_info_header[] = "staId staAddress\n";
3488
Sameer Thalappilb0a30232013-09-27 15:37:48 -07003489 len = scnprintf(pBuf, buf_len, sta_info_header);
Yathish Hanumapuradoddi Shivanna7b659402013-03-25 14:12:32 -07003490 pBuf += len;
3491 buf_len -= len;
Gopichand Nakkala976e3252013-01-03 15:45:56 -08003492
3493 for (i = 0; i < WLAN_MAX_STA_COUNT; i++)
3494 {
3495 if(pAdapter->aStaInfo[i].isUsed)
3496 {
Sameer Thalappilb0a30232013-09-27 15:37:48 -07003497 len = scnprintf(pBuf, buf_len, "%*d .%02x:%02x:%02x:%02x:%02x:%02x\n",
Yathish Hanumapuradoddi Shivanna7b659402013-03-25 14:12:32 -07003498 strlen("staId"),
Gopichand Nakkala976e3252013-01-03 15:45:56 -08003499 pAdapter->aStaInfo[i].ucSTAId,
3500 pAdapter->aStaInfo[i].macAddrSTA.bytes[0],
3501 pAdapter->aStaInfo[i].macAddrSTA.bytes[1],
3502 pAdapter->aStaInfo[i].macAddrSTA.bytes[2],
3503 pAdapter->aStaInfo[i].macAddrSTA.bytes[3],
3504 pAdapter->aStaInfo[i].macAddrSTA.bytes[4],
3505 pAdapter->aStaInfo[i].macAddrSTA.bytes[5]);
Yathish Hanumapuradoddi Shivanna7b659402013-03-25 14:12:32 -07003506 pBuf += len;
3507 buf_len -= len;
3508 }
3509 if(WE_GET_STA_INFO_SIZE > buf_len)
3510 {
3511 break;
Gopichand Nakkala976e3252013-01-03 15:45:56 -08003512 }
3513 }
3514 return VOS_STATUS_SUCCESS;
3515}
3516
3517static int iw_softap_get_sta_info(struct net_device *dev,
3518 struct iw_request_info *info,
3519 union iwreq_data *wrqu,
3520 char *extra)
3521{
3522 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
3523 VOS_STATUS status;
3524 ENTER();
Yathish Hanumapuradoddi Shivanna4171f7d2013-04-08 20:05:56 -07003525 status = hdd_softap_get_sta_info(pHostapdAdapter, extra, WE_SAP_MAX_STA_INFO);
Gopichand Nakkala976e3252013-01-03 15:45:56 -08003526 if ( !VOS_IS_STATUS_SUCCESS( status ) ) {
3527 hddLog(VOS_TRACE_LEVEL_ERROR, "%s Failed!!!\n",__func__);
3528 return -EINVAL;
3529 }
3530 wrqu->data.length = strlen(extra);
3531 EXIT();
3532 return 0;
3533}
3534
Jeff Johnson295189b2012-06-20 16:38:30 -07003535static int iw_set_ap_genie(struct net_device *dev,
3536 struct iw_request_info *info,
3537 union iwreq_data *wrqu,
3538 char *extra)
3539{
3540
3541 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
3542 v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
3543 eHalStatus halStatus= eHAL_STATUS_SUCCESS;
3544 u_int8_t *genie = wrqu->data.pointer;
3545
3546 ENTER();
3547
3548 if(!wrqu->data.length)
3549 {
3550 EXIT();
3551 return 0;
3552 }
3553
3554 switch (genie[0])
3555 {
3556 case DOT11F_EID_WPA:
3557 case DOT11F_EID_RSN:
3558 if((WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uPrivacy == 0)
3559 {
3560 hdd_softap_Deregister_BC_STA(pHostapdAdapter);
3561 hdd_softap_Register_BC_STA(pHostapdAdapter, 1);
3562 }
3563 (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uPrivacy = 1;
3564 halStatus = WLANSAP_Set_WPARSNIes(pVosContext, wrqu->data.pointer, wrqu->data.length);
3565 break;
3566
3567 default:
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003568 hddLog (LOGE, "%s Set UNKNOWN IE %X",__func__, genie[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07003569 halStatus = 0;
3570 }
3571
3572 EXIT();
3573 return halStatus;
3574}
3575
3576static VOS_STATUS wlan_hdd_get_classAstats_for_station(hdd_adapter_t *pAdapter, u8 staid)
3577{
3578 eHalStatus hstatus;
3579 long lrc;
3580 struct statsContext context;
3581
3582 if (NULL == pAdapter)
3583 {
3584 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Padapter is NULL", __func__);
3585 return VOS_STATUS_E_FAULT;
3586 }
3587
3588 init_completion(&context.completion);
3589 context.pAdapter = pAdapter;
3590 context.magic = STATS_CONTEXT_MAGIC;
3591 hstatus = sme_GetStatistics( WLAN_HDD_GET_HAL_CTX(pAdapter),
3592 eCSR_HDD,
3593 SME_GLOBAL_CLASSA_STATS,
3594 hdd_GetClassA_statisticsCB,
3595 0, // not periodic
3596 FALSE, //non-cached results
3597 staid,
3598 &context);
3599 if (eHAL_STATUS_SUCCESS != hstatus)
3600 {
3601 hddLog(VOS_TRACE_LEVEL_ERROR,
3602 "%s: Unable to retrieve statistics for link speed",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003603 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003604 }
3605 else
3606 {
3607 lrc = wait_for_completion_interruptible_timeout(&context.completion,
3608 msecs_to_jiffies(WLAN_WAIT_TIME_STATS));
3609 context.magic = 0;
3610 if (lrc <= 0)
3611 {
3612 hddLog(VOS_TRACE_LEVEL_ERROR,
3613 "%s: SME %s while retrieving link speed",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003614 __func__, (0 == lrc) ? "timeout" : "interrupt");
Jeff Johnson295189b2012-06-20 16:38:30 -07003615 msleep(50);
3616 }
3617 }
3618 return VOS_STATUS_SUCCESS;
3619}
3620
3621int iw_get_softap_linkspeed(struct net_device *dev,
3622 struct iw_request_info *info,
3623 union iwreq_data *wrqu,
3624 char *extra)
3625
3626{
3627 hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303628 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07003629 char *pLinkSpeed = (char*)extra;
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303630 v_U32_t link_speed;
Jeff Johnson295189b2012-06-20 16:38:30 -07003631 unsigned short staId;
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303632 int len = sizeof(v_U32_t)+1;
Jeff Johnson295189b2012-06-20 16:38:30 -07003633 v_BYTE_t macAddress[VOS_MAC_ADDR_SIZE];
3634 VOS_STATUS status;
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303635 int rc, valid;
3636
3637 pHddCtx = WLAN_HDD_GET_CTX(pHostapdAdapter);
3638
3639 valid = wlan_hdd_validate_context(pHddCtx);
3640
3641 if (0 != valid)
3642 {
3643 hddLog(VOS_TRACE_LEVEL_ERROR, FL("HDD context not valid"));
3644 return valid;
3645 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003646
Madan Mohan Koyyalamudie68989b2013-09-10 01:15:19 +05303647 hddLog(VOS_TRACE_LEVEL_INFO, "%s wrqu->data.length= %d\n", __func__, wrqu->data.length);
3648 status = hdd_string_to_hex ((char *)wrqu->data.pointer, wrqu->data.length, macAddress );
3649
3650 if (!VOS_IS_STATUS_SUCCESS(status ))
Jeff Johnson295189b2012-06-20 16:38:30 -07003651 {
Madan Mohan Koyyalamudie68989b2013-09-10 01:15:19 +05303652 hddLog(VOS_TRACE_LEVEL_ERROR, FL("String to Hex conversion Failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003653 }
3654
Madan Mohan Koyyalamudie68989b2013-09-10 01:15:19 +05303655 /* If no mac address is passed and/or its length is less than 18,
3656 * link speed for first connected client will be returned.
3657 */
3658 if (!VOS_IS_STATUS_SUCCESS(status ) || wrqu->data.length < 18)
3659 {
3660 status = hdd_softap_GetConnectedStaId(pHostapdAdapter, (void *)(&staId));
3661 }
3662 else
3663 {
3664 status = hdd_softap_GetStaId(pHostapdAdapter,
3665 (v_MACADDR_t *)macAddress, (void *)(&staId));
3666 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003667
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303668 if (!VOS_IS_STATUS_SUCCESS(status))
Jeff Johnson295189b2012-06-20 16:38:30 -07003669 {
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303670 hddLog(VOS_TRACE_LEVEL_ERROR, FL("ERROR: HDD Failed to find sta id!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003671 link_speed = 0;
3672 }
3673 else
3674 {
3675 status = wlan_hdd_get_classAstats_for_station(pHostapdAdapter , staId);
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303676
Jeff Johnson295189b2012-06-20 16:38:30 -07003677 if (!VOS_IS_STATUS_SUCCESS(status ))
3678 {
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303679 hddLog(VOS_TRACE_LEVEL_ERROR, FL("Unable to retrieve SME statistics"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003680 return -EINVAL;
3681 }
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303682
3683 WLANTL_GetSTALinkCapacity(pHddCtx->pvosContext,
3684 staId, &link_speed);
3685
3686 link_speed = link_speed / 10;
3687
3688 if (0 == link_speed)
3689 {
3690 /* The linkspeed returned by HAL is in units of 500kbps.
3691 * converting it to mbps.
3692 * This is required to support legacy firmware which does
3693 * not return link capacity.
3694 */
3695 link_speed =(int)pHostapdAdapter->hdd_stats.ClassA_stat.tx_rate/2;
3696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003697 }
3698
3699 wrqu->data.length = len;
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303700 rc = snprintf(pLinkSpeed, len, "%lu", link_speed);
3701
Jeff Johnson295189b2012-06-20 16:38:30 -07003702 if ((rc < 0) || (rc >= len))
3703 {
3704 // encoding or length error?
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303705 hddLog(VOS_TRACE_LEVEL_ERROR,FL( "Unable to encode link speed"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003706 return -EIO;
3707 }
3708
3709 return 0;
3710}
3711
3712static const iw_handler hostapd_handler[] =
3713{
3714 (iw_handler) NULL, /* SIOCSIWCOMMIT */
3715 (iw_handler) NULL, /* SIOCGIWNAME */
3716 (iw_handler) NULL, /* SIOCSIWNWID */
3717 (iw_handler) NULL, /* SIOCGIWNWID */
3718 (iw_handler) NULL, /* SIOCSIWFREQ */
3719 (iw_handler) iw_get_ap_freq, /* SIOCGIWFREQ */
3720 (iw_handler) NULL, /* SIOCSIWMODE */
Madan Mohan Koyyalamudi0c2ba1b2013-10-01 19:47:50 +05303721 (iw_handler) iw_get_mode, /* SIOCGIWMODE */
Jeff Johnson295189b2012-06-20 16:38:30 -07003722 (iw_handler) NULL, /* SIOCSIWSENS */
3723 (iw_handler) NULL, /* SIOCGIWSENS */
3724 (iw_handler) NULL, /* SIOCSIWRANGE */
3725 (iw_handler) NULL, /* SIOCGIWRANGE */
3726 (iw_handler) NULL, /* SIOCSIWPRIV */
3727 (iw_handler) NULL, /* SIOCGIWPRIV */
3728 (iw_handler) NULL, /* SIOCSIWSTATS */
3729 (iw_handler) NULL, /* SIOCGIWSTATS */
3730 (iw_handler) NULL, /* SIOCSIWSPY */
3731 (iw_handler) NULL, /* SIOCGIWSPY */
3732 (iw_handler) NULL, /* SIOCSIWTHRSPY */
3733 (iw_handler) NULL, /* SIOCGIWTHRSPY */
3734 (iw_handler) NULL, /* SIOCSIWAP */
3735 (iw_handler) NULL, /* SIOCGIWAP */
3736 (iw_handler) iw_set_ap_mlme, /* SIOCSIWMLME */
3737 (iw_handler) NULL, /* SIOCGIWAPLIST */
3738 (iw_handler) NULL, /* SIOCSIWSCAN */
3739 (iw_handler) NULL, /* SIOCGIWSCAN */
3740 (iw_handler) NULL, /* SIOCSIWESSID */
3741 (iw_handler) NULL, /* SIOCGIWESSID */
3742 (iw_handler) NULL, /* SIOCSIWNICKN */
3743 (iw_handler) NULL, /* SIOCGIWNICKN */
3744 (iw_handler) NULL, /* -- hole -- */
3745 (iw_handler) NULL, /* -- hole -- */
3746 (iw_handler) NULL, /* SIOCSIWRATE */
3747 (iw_handler) NULL, /* SIOCGIWRATE */
3748 (iw_handler) NULL, /* SIOCSIWRTS */
3749 (iw_handler) iw_get_ap_rts_threshold, /* SIOCGIWRTS */
3750 (iw_handler) NULL, /* SIOCSIWFRAG */
3751 (iw_handler) iw_get_ap_frag_threshold, /* SIOCGIWFRAG */
3752 (iw_handler) NULL, /* SIOCSIWTXPOW */
3753 (iw_handler) NULL, /* SIOCGIWTXPOW */
3754 (iw_handler) NULL, /* SIOCSIWRETRY */
3755 (iw_handler) NULL, /* SIOCGIWRETRY */
3756 (iw_handler) NULL, /* SIOCSIWENCODE */
3757 (iw_handler) NULL, /* SIOCGIWENCODE */
3758 (iw_handler) NULL, /* SIOCSIWPOWER */
3759 (iw_handler) NULL, /* SIOCGIWPOWER */
3760 (iw_handler) NULL, /* -- hole -- */
3761 (iw_handler) NULL, /* -- hole -- */
3762 (iw_handler) iw_set_ap_genie, /* SIOCSIWGENIE */
3763 (iw_handler) NULL, /* SIOCGIWGENIE */
3764 (iw_handler) iw_set_auth_hostap, /* SIOCSIWAUTH */
3765 (iw_handler) NULL, /* SIOCGIWAUTH */
3766 (iw_handler) iw_set_ap_encodeext, /* SIOCSIWENCODEEXT */
3767 (iw_handler) NULL, /* SIOCGIWENCODEEXT */
3768 (iw_handler) NULL, /* SIOCSIWPMKSA */
3769};
3770
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -08003771#define IW_PRIV_TYPE_OPTIE (IW_PRIV_TYPE_BYTE | QCSAP_MAX_OPT_IE)
Jeff Johnson295189b2012-06-20 16:38:30 -07003772#define IW_PRIV_TYPE_MLME \
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -08003773 (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_mlme))
Jeff Johnson295189b2012-06-20 16:38:30 -07003774
3775static const struct iw_priv_args hostapd_private_args[] = {
3776 { QCSAP_IOCTL_SETPARAM,
3777 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "setparam" },
3778 { QCSAP_IOCTL_SETPARAM,
3779 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "" },
3780 { QCSAP_PARAM_MAX_ASSOC,
3781 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setMaxAssoc" },
3782 { QCSAP_PARAM_HIDE_SSID,
3783 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "hideSSID" },
Leo Chang614d2072013-08-22 14:59:44 -07003784 { QCSAP_PARAM_SET_MC_RATE,
3785 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setMcRate" },
Jeff Johnson295189b2012-06-20 16:38:30 -07003786 { QCSAP_IOCTL_GETPARAM,
3787 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
3788 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam" },
3789 { QCSAP_IOCTL_GETPARAM, 0,
3790 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "" },
3791 { QCSAP_PARAM_MAX_ASSOC, 0,
3792 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getMaxAssoc" },
Jeff Johnson43971f52012-07-17 12:26:56 -07003793 { QCSAP_PARAM_GET_WLAN_DBG, 0,
3794 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getwlandbg" },
3795 { QCSAP_PARAM_AUTO_CHANNEL, 0,
3796 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getAutoChannel" },
Jeff Johnson295189b2012-06-20 16:38:30 -07003797 { QCSAP_PARAM_MODULE_DOWN_IND, 0,
3798 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "moduleDownInd" },
3799 { QCSAP_PARAM_CLR_ACL, 0,
3800 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "setClearAcl" },
3801 { QCSAP_PARAM_ACL_MODE,
3802 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setAclMode" },
3803 { QCSAP_IOCTL_COMMIT,
3804 IW_PRIV_TYPE_BYTE | sizeof(struct s_CommitConfig) | IW_PRIV_SIZE_FIXED, 0, "commit" },
3805 { QCSAP_IOCTL_SETMLME,
3806 IW_PRIV_TYPE_BYTE | sizeof(struct sQcSapreq_mlme)| IW_PRIV_SIZE_FIXED, 0, "setmlme" },
3807 { QCSAP_IOCTL_GET_STAWPAIE,
3808 IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 0, "get_staWPAIE" },
3809 { QCSAP_IOCTL_SETWPAIE,
3810 IW_PRIV_TYPE_BYTE | QCSAP_MAX_WSC_IE | IW_PRIV_SIZE_FIXED, 0, "setwpaie" },
3811 { QCSAP_IOCTL_STOPBSS,
3812 IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED, 0, "stopbss" },
3813 { QCSAP_IOCTL_VERSION, 0,
3814 IW_PRIV_TYPE_CHAR | QCSAP_MAX_WSC_IE, "version" },
Gopichand Nakkala976e3252013-01-03 15:45:56 -08003815 { QCSAP_IOCTL_GET_STA_INFO, 0,
3816 IW_PRIV_TYPE_CHAR | WE_SAP_MAX_STA_INFO, "get_sta_info" },
Jeff Johnson295189b2012-06-20 16:38:30 -07003817 { QCSAP_IOCTL_GET_WPS_PBC_PROBE_REQ_IES,
3818 IW_PRIV_TYPE_BYTE | sizeof(sQcSapreq_WPSPBCProbeReqIES_t) | IW_PRIV_SIZE_FIXED | 1, 0, "getProbeReqIEs" },
3819 { QCSAP_IOCTL_GET_CHANNEL, 0,
Jeff Johnson43971f52012-07-17 12:26:56 -07003820 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getchannel" },
Jeff Johnson295189b2012-06-20 16:38:30 -07003821 { QCSAP_IOCTL_ASSOC_STA_MACADDR, 0,
3822 IW_PRIV_TYPE_BYTE | /*((WLAN_MAX_STA_COUNT*6)+100)*/1 , "get_assoc_stamac" },
3823 { QCSAP_IOCTL_DISASSOC_STA,
3824 IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 6 , 0, "disassoc_sta" },
3825 { QCSAP_IOCTL_AP_STATS,
3826 IW_PRIV_TYPE_BYTE | QCSAP_MAX_WSC_IE, 0, "ap_stats" },
3827 { QCSAP_IOCTL_PRIV_GET_SOFTAP_LINK_SPEED,
3828 IW_PRIV_TYPE_CHAR | 18,
Gopichand Nakkala8a2b1442013-05-29 15:33:14 +05303829 IW_PRIV_TYPE_CHAR | 5, "getLinkSpeed" },
Jeff Johnson295189b2012-06-20 16:38:30 -07003830
3831 { QCSAP_IOCTL_PRIV_SET_THREE_INT_GET_NONE,
3832 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "" },
3833 /* handlers for sub-ioctl */
3834 { WE_SET_WLAN_DBG,
3835 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
3836 0,
3837 "setwlandbg" },
3838
3839 /* handlers for main ioctl */
3840 { QCSAP_IOCTL_PRIV_SET_VAR_INT_GET_NONE,
3841 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
3842 0,
3843 "" },
3844
3845 /* handlers for sub-ioctl */
3846 { WE_LOG_DUMP_CMD,
3847 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
3848 0,
3849 "dump" },
Jeff Johnson295189b2012-06-20 16:38:30 -07003850 { WE_P2P_NOA_CMD,
3851 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
3852 0,
3853 "SetP2pPs" },
Madan Mohan Koyyalamudid5f04ca2012-11-06 15:51:26 -08003854 /* handlers for sub ioctl */
3855 {
3856 WE_MCC_CONFIG_CREDENTIAL,
3857 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
3858 0,
3859 "setMccCrdnl" },
3860
3861 /* handlers for sub ioctl */
3862 {
3863 WE_MCC_CONFIG_PARAMS,
3864 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
3865 0,
3866 "setMccConfig" },
3867
Jeff Johnson295189b2012-06-20 16:38:30 -07003868 /* handlers for main ioctl */
3869 { QCSAP_IOCTL_MODIFY_ACL,
3870 IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 8,
3871 0,
3872 "modify_acl" },
3873
3874 /* handlers for main ioctl */
3875 { QCSAP_IOCTL_GET_CHANNEL_LIST,
3876 0,
3877 IW_PRIV_TYPE_BYTE | sizeof(tChannelListInfo),
3878 "getChannelList" },
3879
Jeff Johnsone7245742012-09-05 17:12:55 -07003880 /* handlers for main ioctl */
3881 { QCSAP_IOCTL_SET_TX_POWER,
3882 IW_PRIV_TYPE_INT| IW_PRIV_SIZE_FIXED | 1,
3883 0,
Madan Mohan Koyyalamudid12bf052012-11-27 19:07:55 +05303884 "setTxPower" },
schang86c22c42013-03-13 18:41:24 -07003885
3886 /* handlers for main ioctl */
3887 { QCSAP_IOCTL_SET_MAX_TX_POWER,
3888 IW_PRIV_TYPE_INT| IW_PRIV_SIZE_FIXED | 1,
3889 0,
3890 "setTxMaxPower" },
Madan Mohan Koyyalamudia96f5442013-05-10 11:32:06 +05303891 { QCSAP_IOCTL_DATAPATH_SNAP_SHOT,
3892 IW_PRIV_TYPE_NONE | IW_PRIV_TYPE_NONE, 0, "dataSnapshot" },
Jeff Johnson295189b2012-06-20 16:38:30 -07003893};
Jeff Johnsone7245742012-09-05 17:12:55 -07003894
Jeff Johnson295189b2012-06-20 16:38:30 -07003895static const iw_handler hostapd_private[] = {
3896 [QCSAP_IOCTL_SETPARAM - SIOCIWFIRSTPRIV] = iw_softap_setparam, //set priv ioctl
3897 [QCSAP_IOCTL_GETPARAM - SIOCIWFIRSTPRIV] = iw_softap_getparam, //get priv ioctl
3898 [QCSAP_IOCTL_COMMIT - SIOCIWFIRSTPRIV] = iw_softap_commit, //get priv ioctl
3899 [QCSAP_IOCTL_SETMLME - SIOCIWFIRSTPRIV] = iw_softap_setmlme,
3900 [QCSAP_IOCTL_GET_STAWPAIE - SIOCIWFIRSTPRIV] = iw_get_genie, //get station genIE
3901 [QCSAP_IOCTL_SETWPAIE - SIOCIWFIRSTPRIV] = iw_softap_setwpsie,
3902 [QCSAP_IOCTL_STOPBSS - SIOCIWFIRSTPRIV] = iw_softap_stopbss, // stop bss
3903 [QCSAP_IOCTL_VERSION - SIOCIWFIRSTPRIV] = iw_softap_version, // get driver version
3904 [QCSAP_IOCTL_GET_WPS_PBC_PROBE_REQ_IES - SIOCIWFIRSTPRIV] = iw_get_WPSPBCProbeReqIEs,
3905 [QCSAP_IOCTL_GET_CHANNEL - SIOCIWFIRSTPRIV] = iw_softap_getchannel,
3906 [QCSAP_IOCTL_ASSOC_STA_MACADDR - SIOCIWFIRSTPRIV] = iw_softap_getassoc_stamacaddr,
3907 [QCSAP_IOCTL_DISASSOC_STA - SIOCIWFIRSTPRIV] = iw_softap_disassoc_sta,
3908 [QCSAP_IOCTL_AP_STATS - SIOCIWFIRSTPRIV] = iw_softap_ap_stats,
3909 [QCSAP_IOCTL_PRIV_SET_THREE_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_set_three_ints_getnone,
3910 [QCSAP_IOCTL_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_set_var_ints_getnone,
3911 [QCSAP_IOCTL_SET_CHANNEL_RANGE - SIOCIWFIRSTPRIV] = iw_softap_set_channel_range,
3912 [QCSAP_IOCTL_MODIFY_ACL - SIOCIWFIRSTPRIV] = iw_softap_modify_acl,
3913 [QCSAP_IOCTL_GET_CHANNEL_LIST - SIOCIWFIRSTPRIV] = iw_softap_get_channel_list,
Gopichand Nakkala976e3252013-01-03 15:45:56 -08003914 [QCSAP_IOCTL_GET_STA_INFO - SIOCIWFIRSTPRIV] = iw_softap_get_sta_info,
Jeff Johnsone7245742012-09-05 17:12:55 -07003915 [QCSAP_IOCTL_PRIV_GET_SOFTAP_LINK_SPEED - SIOCIWFIRSTPRIV] = iw_get_softap_linkspeed,
3916 [QCSAP_IOCTL_SET_TX_POWER - SIOCIWFIRSTPRIV] = iw_softap_set_tx_power,
schang86c22c42013-03-13 18:41:24 -07003917 [QCSAP_IOCTL_SET_MAX_TX_POWER - SIOCIWFIRSTPRIV] = iw_softap_set_max_tx_power,
Madan Mohan Koyyalamudia96f5442013-05-10 11:32:06 +05303918 [QCSAP_IOCTL_DATAPATH_SNAP_SHOT - SIOCIWFIRSTPRIV] = iw_display_data_path_snapshot,
Jeff Johnson295189b2012-06-20 16:38:30 -07003919};
3920const struct iw_handler_def hostapd_handler_def = {
3921 .num_standard = sizeof(hostapd_handler) / sizeof(hostapd_handler[0]),
3922 .num_private = sizeof(hostapd_private) / sizeof(hostapd_private[0]),
3923 .num_private_args = sizeof(hostapd_private_args) / sizeof(hostapd_private_args[0]),
3924 .standard = (iw_handler *)hostapd_handler,
3925 .private = (iw_handler *)hostapd_private,
3926 .private_args = hostapd_private_args,
3927 .get_wireless_stats = NULL,
3928};
3929#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)
3930struct net_device_ops net_ops_struct = {
3931 .ndo_open = hdd_hostapd_open,
3932 .ndo_stop = hdd_hostapd_stop,
3933 .ndo_uninit = hdd_hostapd_uninit,
3934 .ndo_start_xmit = hdd_softap_hard_start_xmit,
3935 .ndo_tx_timeout = hdd_softap_tx_timeout,
3936 .ndo_get_stats = hdd_softap_stats,
3937 .ndo_set_mac_address = hdd_hostapd_set_mac_address,
3938 .ndo_do_ioctl = hdd_hostapd_ioctl,
3939 .ndo_change_mtu = hdd_hostapd_change_mtu,
3940 .ndo_select_queue = hdd_hostapd_select_queue,
3941 };
3942#endif
3943
3944int hdd_set_hostapd(hdd_adapter_t *pAdapter)
3945{
3946 return VOS_STATUS_SUCCESS;
3947}
3948
3949void hdd_set_ap_ops( struct net_device *pWlanHostapdDev )
3950{
3951#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)
3952 pWlanHostapdDev->netdev_ops = &net_ops_struct;
3953#else
3954 pWlanHostapdDev->open = hdd_hostapd_open;
3955 pWlanHostapdDev->stop = hdd_hostapd_stop;
3956 pWlanHostapdDev->uninit = hdd_hostapd_uninit;
3957 pWlanHostapdDev->hard_start_xmit = hdd_softap_hard_start_xmit;
3958 pWlanHostapdDev->tx_timeout = hdd_softap_tx_timeout;
3959 pWlanHostapdDev->get_stats = hdd_softap_stats;
3960 pWlanHostapdDev->set_mac_address = hdd_hostapd_set_mac_address;
3961 pWlanHostapdDev->do_ioctl = hdd_hostapd_ioctl;
3962#endif
3963}
3964
3965VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter )
3966{
3967 hdd_hostapd_state_t * phostapdBuf;
3968 struct net_device *dev = pAdapter->dev;
Kiran Kumar Lokere0ad5cd32013-06-25 11:26:22 -07003969 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
Jeff Johnson295189b2012-06-20 16:38:30 -07003970 VOS_STATUS status;
3971 ENTER();
3972 // Allocate the Wireless Extensions state structure
3973 phostapdBuf = WLAN_HDD_GET_HOSTAP_STATE_PTR( pAdapter );
3974
Kiran Kumar Lokere0ad5cd32013-06-25 11:26:22 -07003975 sme_SetCurrDeviceMode(pHddCtx->hHal, pAdapter->device_mode);
3976
Jeff Johnson295189b2012-06-20 16:38:30 -07003977 // Zero the memory. This zeros the profile structure.
3978 memset(phostapdBuf, 0,sizeof(hdd_hostapd_state_t));
3979
3980 // Set up the pointer to the Wireless Extensions state structure
3981 // NOP
3982 status = hdd_set_hostapd(pAdapter);
3983 if(!VOS_IS_STATUS_SUCCESS(status)) {
3984 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: hdd_set_hostapd failed!!\n"));
3985 return status;
3986 }
3987
3988 status = vos_event_init(&phostapdBuf->vosEvent);
3989 if (!VOS_IS_STATUS_SUCCESS(status))
3990 {
3991 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: Hostapd HDD vos event init failed!!\n"));
3992 return status;
3993 }
3994
3995 init_completion(&pAdapter->session_close_comp_var);
3996 init_completion(&pAdapter->session_open_comp_var);
3997
3998 sema_init(&(WLAN_HDD_GET_AP_CTX_PTR(pAdapter))->semWpsPBCOverlapInd, 1);
3999
4000 // Register as a wireless device
4001 dev->wireless_handlers = (struct iw_handler_def *)& hostapd_handler_def;
4002
4003 //Initialize the data path module
4004 status = hdd_softap_init_tx_rx(pAdapter);
4005 if ( !VOS_IS_STATUS_SUCCESS( status ))
4006 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004007 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: hdd_softap_init_tx_rx failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004008 }
Madan Mohan Koyyalamudi8c6dec82013-09-26 15:56:13 +05304009
4010 status = hdd_wmm_adapter_init( pAdapter );
4011 if (!VOS_IS_STATUS_SUCCESS(status))
4012 {
4013 hddLog(VOS_TRACE_LEVEL_ERROR,
4014 "hdd_wmm_adapter_init() failed with status code %08d [x%08lx]",
4015 status, status );
4016 goto error_wmm_init;
4017 }
4018
4019 set_bit(WMM_INIT_DONE, &pAdapter->event_flags);
4020
Jeff Johnson295189b2012-06-20 16:38:30 -07004021 wlan_hdd_set_monitor_tx_adapter( WLAN_HDD_GET_CTX(pAdapter), pAdapter );
Madan Mohan Koyyalamudi8c6dec82013-09-26 15:56:13 +05304022
4023 return status;
4024
4025error_wmm_init:
4026 hdd_softap_deinit_tx_rx( pAdapter );
Jeff Johnson295189b2012-06-20 16:38:30 -07004027 EXIT();
4028 return status;
4029}
4030
4031hdd_adapter_t* hdd_wlan_create_ap_dev( hdd_context_t *pHddCtx, tSirMacAddr macAddr, tANI_U8 *iface_name )
4032{
4033 struct net_device *pWlanHostapdDev = NULL;
4034 hdd_adapter_t *pHostapdAdapter = NULL;
4035 v_CONTEXT_t pVosContext= NULL;
4036
Jeff Johnson295189b2012-06-20 16:38:30 -07004037 pWlanHostapdDev = alloc_netdev_mq(sizeof(hdd_adapter_t), iface_name, ether_setup, NUM_TX_QUEUES);
Jeff Johnson295189b2012-06-20 16:38:30 -07004038
4039 if (pWlanHostapdDev != NULL)
4040 {
4041 pHostapdAdapter = netdev_priv(pWlanHostapdDev);
4042
4043 //Init the net_device structure
4044 ether_setup(pWlanHostapdDev);
4045
4046 //Initialize the adapter context to zeros.
4047 vos_mem_zero(pHostapdAdapter, sizeof( hdd_adapter_t ));
4048 pHostapdAdapter->dev = pWlanHostapdDev;
4049 pHostapdAdapter->pHddCtx = pHddCtx;
4050 pHostapdAdapter->magic = WLAN_HDD_ADAPTER_MAGIC;
4051
4052 //Get the Global VOSS context.
4053 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4054 //Save the adapter context in global context for future.
4055 ((VosContextType*)(pVosContext))->pHDDSoftAPContext = (v_VOID_t*)pHostapdAdapter;
4056
4057 //Init the net_device structure
4058 strlcpy(pWlanHostapdDev->name, (const char *)iface_name, IFNAMSIZ);
4059
4060 hdd_set_ap_ops( pHostapdAdapter->dev );
4061
4062 pWlanHostapdDev->tx_queue_len = NET_DEV_TX_QUEUE_LEN;
4063 pWlanHostapdDev->watchdog_timeo = HDD_TX_TIMEOUT;
4064 pWlanHostapdDev->mtu = HDD_DEFAULT_MTU;
4065
4066 vos_mem_copy(pWlanHostapdDev->dev_addr, (void *)macAddr,sizeof(tSirMacAddr));
4067 vos_mem_copy(pHostapdAdapter->macAddressCurrent.bytes, (void *)macAddr, sizeof(tSirMacAddr));
4068
4069 pWlanHostapdDev->destructor = free_netdev;
Jeff Johnson295189b2012-06-20 16:38:30 -07004070 pWlanHostapdDev->ieee80211_ptr = &pHostapdAdapter->wdev ;
4071 pHostapdAdapter->wdev.wiphy = pHddCtx->wiphy;
4072 pHostapdAdapter->wdev.netdev = pWlanHostapdDev;
4073 init_completion(&pHostapdAdapter->tx_action_cnf_event);
Jeff Johnson295189b2012-06-20 16:38:30 -07004074 init_completion(&pHostapdAdapter->cancel_rem_on_chan_var);
4075 init_completion(&pHostapdAdapter->rem_on_chan_ready_event);
4076#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
4077 init_completion(&pHostapdAdapter->offchannel_tx_event);
4078#endif
4079
Jeff Johnson295189b2012-06-20 16:38:30 -07004080 SET_NETDEV_DEV(pWlanHostapdDev, pHddCtx->parent_dev);
4081 }
4082 return pHostapdAdapter;
4083}
4084
4085VOS_STATUS hdd_register_hostapd( hdd_adapter_t *pAdapter, tANI_U8 rtnl_lock_held )
4086{
4087 struct net_device *dev = pAdapter->dev;
4088 VOS_STATUS status = VOS_STATUS_SUCCESS;
4089
4090 ENTER();
4091
4092 if( rtnl_lock_held )
4093 {
Madan Mohan Koyyalamudid8ac8662012-11-06 19:04:56 -08004094 if (strnchr(dev->name, strlen(dev->name), '%')) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004095 if( dev_alloc_name(dev, dev->name) < 0 )
4096 {
4097 hddLog(VOS_TRACE_LEVEL_FATAL, "%s:Failed:dev_alloc_name", __func__);
4098 return VOS_STATUS_E_FAILURE;
4099 }
4100 }
4101 if (register_netdevice(dev))
4102 {
4103 hddLog(VOS_TRACE_LEVEL_FATAL,
4104 "%s:Failed:register_netdevice", __func__);
4105 return VOS_STATUS_E_FAILURE;
4106 }
4107 }
4108 else
4109 {
4110 if (register_netdev(dev))
4111 {
4112 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed:register_netdev", __func__);
4113 return VOS_STATUS_E_FAILURE;
4114 }
4115 }
4116 set_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
4117
4118 EXIT();
4119 return status;
4120}
4121
4122VOS_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter)
4123{
4124 ENTER();
4125
4126 hdd_softap_deinit_tx_rx(pAdapter);
4127
4128 /* if we are being called during driver unload, then the dev has already
4129 been invalidated. if we are being called at other times, then we can
4130 detatch the wireless device handlers */
4131 if (pAdapter->dev)
4132 {
4133 pAdapter->dev->wireless_handlers = NULL;
4134 }
4135 EXIT();
4136 return 0;
4137}