blob: 52687fe9c68e44fffab94a8c4515c6bcdbce703d [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Abhishek Singhbad2b322016-10-21 11:22:33 +05302 * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
Kiet Lam0fb93dd2014-02-19 00:32:59 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
Chet Lanctot4c986162013-05-08 13:59:56 -070027
Jeff Johnson295189b2012-06-20 16:38:30 -070028/** ------------------------------------------------------------------------- *
29 ------------------------------------------------------------------------- *
30
31
32 \file csrUtil.c
33
34 Implementation supporting routines for CSR.
Jeff Johnson295189b2012-06-20 16:38:30 -070035 ========================================================================== */
36
Jeff Johnson295189b2012-06-20 16:38:30 -070037
Jeff Johnson295189b2012-06-20 16:38:30 -070038#include "aniGlobal.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070039
40#include "palApi.h"
41#include "csrSupport.h"
42#include "csrInsideApi.h"
43#include "smsDebug.h"
44#include "smeQosInternal.h"
Jeff Johnsone7245742012-09-05 17:12:55 -070045#include "wlan_qct_wda.h"
46
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080047#if defined(FEATURE_WLAN_ESE) && !defined(FEATURE_WLAN_ESE_UPLOAD)
Jeff Johnson295189b2012-06-20 16:38:30 -070048#include "vos_utils.h"
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080049#include "csrEse.h"
50#endif /* FEATURE_WLAN_ESE && !FEATURE_WLAN_ESE_UPLOAD*/
Jeff Johnson295189b2012-06-20 16:38:30 -070051tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ] = {
52 { 0x00, 0x50, 0xf2, 0x00 },
53 { 0x00, 0x50, 0xf2, 0x01 },
54 { 0x00, 0x50, 0xf2, 0x02 },
55 { 0x00, 0x50, 0xf2, 0x03 },
56 { 0x00, 0x50, 0xf2, 0x04 },
57 { 0x00, 0x50, 0xf2, 0x05 },
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080058#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -070059 { 0x00, 0x40, 0x96, 0x00 }, // CCKM
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080060#endif /* FEATURE_WLAN_ESE */
Jeff Johnson295189b2012-06-20 16:38:30 -070061};
62
63tANI_U8 csrRSNOui[][ CSR_RSN_OUI_SIZE ] = {
64 { 0x00, 0x0F, 0xAC, 0x00 }, // group cipher
65 { 0x00, 0x0F, 0xAC, 0x01 }, // WEP-40 or RSN
66 { 0x00, 0x0F, 0xAC, 0x02 }, // TKIP or RSN-PSK
67 { 0x00, 0x0F, 0xAC, 0x03 }, // Reserved
68 { 0x00, 0x0F, 0xAC, 0x04 }, // AES-CCMP
69 { 0x00, 0x0F, 0xAC, 0x05 }, // WEP-104
Chet Lanctot4c986162013-05-08 13:59:56 -070070 { 0x00, 0x40, 0x96, 0x00 }, // CCKM
Abhishek Singhae408032014-09-25 17:22:04 +053071 { 0x00, 0x0F, 0xAC, 0x06 }, // BIP (encryption type) or RSN-PSK-SHA256 (authentication type)
72 /* RSN-8021X-SHA256 (authentication type) */
73 { 0x00, 0x0F, 0xAC, 0x05 }
Jeff Johnson295189b2012-06-20 16:38:30 -070074};
75
76#ifdef FEATURE_WLAN_WAPI
Kaushik, Sushantfe230152014-04-08 14:37:47 +053077tANI_U8 csrWapiOui[CSR_WAPI_OUI_ROW_SIZE][ CSR_WAPI_OUI_SIZE ] = {
Jeff Johnson295189b2012-06-20 16:38:30 -070078 { 0x00, 0x14, 0x72, 0x00 }, // Reserved
79 { 0x00, 0x14, 0x72, 0x01 }, // WAI certificate or SMS4
80 { 0x00, 0x14, 0x72, 0x02 } // WAI PSK
81};
82#endif /* FEATURE_WLAN_WAPI */
83tANI_U8 csrWmeInfoOui[ CSR_WME_OUI_SIZE ] = { 0x00, 0x50, 0xf2, 0x02 };
84tANI_U8 csrWmeParmOui[ CSR_WME_OUI_SIZE ] = { 0x00, 0x50, 0xf2, 0x02 };
85
86static tCsrIELenInfo gCsrIELengthTable[] = {
87/* 000 */ { SIR_MAC_SSID_EID_MIN, SIR_MAC_SSID_EID_MAX },
88/* 001 */ { SIR_MAC_RATESET_EID_MIN, SIR_MAC_RATESET_EID_MAX },
89/* 002 */ { SIR_MAC_FH_PARAM_SET_EID_MIN, SIR_MAC_FH_PARAM_SET_EID_MAX },
90/* 003 */ { SIR_MAC_DS_PARAM_SET_EID_MIN, SIR_MAC_DS_PARAM_SET_EID_MAX },
91/* 004 */ { SIR_MAC_CF_PARAM_SET_EID_MIN, SIR_MAC_CF_PARAM_SET_EID_MAX },
92/* 005 */ { SIR_MAC_TIM_EID_MIN, SIR_MAC_TIM_EID_MAX },
93/* 006 */ { SIR_MAC_IBSS_PARAM_SET_EID_MIN, SIR_MAC_IBSS_PARAM_SET_EID_MAX },
94/* 007 */ { SIR_MAC_COUNTRY_EID_MIN, SIR_MAC_COUNTRY_EID_MAX },
95/* 008 */ { SIR_MAC_FH_PARAMS_EID_MIN, SIR_MAC_FH_PARAMS_EID_MAX },
96/* 009 */ { SIR_MAC_FH_PATTERN_EID_MIN, SIR_MAC_FH_PATTERN_EID_MAX },
97/* 010 */ { SIR_MAC_REQUEST_EID_MIN, SIR_MAC_REQUEST_EID_MAX },
98/* 011 */ { SIR_MAC_QBSS_LOAD_EID_MIN, SIR_MAC_QBSS_LOAD_EID_MAX },
99/* 012 */ { SIR_MAC_EDCA_PARAM_SET_EID_MIN, SIR_MAC_EDCA_PARAM_SET_EID_MAX },
100/* 013 */ { SIR_MAC_TSPEC_EID_MIN, SIR_MAC_TSPEC_EID_MAX },
101/* 014 */ { SIR_MAC_TCLAS_EID_MIN, SIR_MAC_TCLAS_EID_MAX },
102/* 015 */ { SIR_MAC_QOS_SCHEDULE_EID_MIN, SIR_MAC_QOS_SCHEDULE_EID_MAX },
103/* 016 */ { SIR_MAC_CHALLENGE_TEXT_EID_MIN, SIR_MAC_CHALLENGE_TEXT_EID_MAX },
104/* 017 */ { 0, 255 },
105/* 018 */ { 0, 255 },
106/* 019 */ { 0, 255 },
107/* 020 */ { 0, 255 },
108/* 021 */ { 0, 255 },
109/* 022 */ { 0, 255 },
110/* 023 */ { 0, 255 },
111/* 024 */ { 0, 255 },
112/* 025 */ { 0, 255 },
113/* 026 */ { 0, 255 },
114/* 027 */ { 0, 255 },
115/* 028 */ { 0, 255 },
116/* 029 */ { 0, 255 },
117/* 030 */ { 0, 255 },
118/* 031 */ { 0, 255 },
119/* 032 */ { SIR_MAC_PWR_CONSTRAINT_EID_MIN, SIR_MAC_PWR_CONSTRAINT_EID_MAX },
120/* 033 */ { SIR_MAC_PWR_CAPABILITY_EID_MIN, SIR_MAC_PWR_CAPABILITY_EID_MAX },
121/* 034 */ { SIR_MAC_TPC_REQ_EID_MIN, SIR_MAC_TPC_REQ_EID_MAX },
122/* 035 */ { SIR_MAC_TPC_RPT_EID_MIN, SIR_MAC_TPC_RPT_EID_MAX },
123/* 036 */ { SIR_MAC_SPRTD_CHNLS_EID_MIN, SIR_MAC_SPRTD_CHNLS_EID_MAX },
124/* 037 */ { SIR_MAC_CHNL_SWITCH_ANN_EID_MIN, SIR_MAC_CHNL_SWITCH_ANN_EID_MAX },
125/* 038 */ { SIR_MAC_MEAS_REQ_EID_MIN, SIR_MAC_MEAS_REQ_EID_MAX },
126/* 039 */ { SIR_MAC_MEAS_RPT_EID_MIN, SIR_MAC_MEAS_RPT_EID_MAX },
127/* 040 */ { SIR_MAC_QUIET_EID_MIN, SIR_MAC_QUIET_EID_MAX },
128/* 041 */ { SIR_MAC_IBSS_DFS_EID_MIN, SIR_MAC_IBSS_DFS_EID_MAX },
129/* 042 */ { SIR_MAC_ERP_INFO_EID_MIN, SIR_MAC_ERP_INFO_EID_MAX },
130/* 043 */ { SIR_MAC_TS_DELAY_EID_MIN, SIR_MAC_TS_DELAY_EID_MAX },
131/* 044 */ { SIR_MAC_TCLAS_PROC_EID_MIN, SIR_MAC_TCLAS_PROC_EID_MAX },
132/* 045 */ { SIR_MAC_QOS_ACTION_EID_MIN, SIR_MAC_QOS_ACTION_EID_MAX },
133/* 046 */ { SIR_MAC_QOS_CAPABILITY_EID_MIN, SIR_MAC_QOS_CAPABILITY_EID_MAX },
134/* 047 */ { 0, 255 },
135/* 048 */ { SIR_MAC_RSN_EID_MIN, SIR_MAC_RSN_EID_MAX },
136/* 049 */ { 0, 255 },
137/* 050 */ { SIR_MAC_EXTENDED_RATE_EID_MIN, SIR_MAC_EXTENDED_RATE_EID_MAX },
138/* 051 */ { 0, 255 },
139/* 052 */ { 0, 255 },
140/* 053 */ { 0, 255 },
141/* 054 */ { 0, 255 },
142/* 055 */ { 0, 255 },
143/* 056 */ { 0, 255 },
144/* 057 */ { 0, 255 },
145/* 058 */ { 0, 255 },
146/* 059 */ { 0, 255 },
147/* 060 */ { 0, 255 },
148/* 061 */ { 0, 255 },
149/* 062 */ { 0, 255 },
150/* 063 */ { 0, 255 },
151/* 064 */ { 0, 255 },
152/* 065 */ { 0, 255 },
153/* 066 */ { 0, 255 },
154/* 067 */ { 0, 255 },
155#ifdef FEATURE_WLAN_WAPI
156/* 068 */ { DOT11F_EID_WAPI, DOT11F_IE_WAPI_MAX_LEN },
157#else
158/* 068 */ { 0, 255 },
159#endif /* FEATURE_WLAN_WAPI */
160/* 069 */ { 0, 255 },
161/* 070 */ { 0, 255 },
162/* 071 */ { 0, 255 },
163/* 072 */ { 0, 255 },
164/* 073 */ { 0, 255 },
165/* 074 */ { 0, 255 },
166/* 075 */ { 0, 255 },
167/* 076 */ { 0, 255 },
168/* 077 */ { 0, 255 },
169/* 078 */ { 0, 255 },
170/* 079 */ { 0, 255 },
171/* 080 */ { 0, 255 },
172/* 081 */ { 0, 255 },
173/* 082 */ { 0, 255 },
174/* 083 */ { 0, 255 },
175/* 084 */ { 0, 255 },
176/* 085 */ { 0, 255 },
177/* 086 */ { 0, 255 },
178/* 087 */ { 0, 255 },
179/* 088 */ { 0, 255 },
180/* 089 */ { 0, 255 },
181/* 090 */ { 0, 255 },
182/* 091 */ { 0, 255 },
183/* 092 */ { 0, 255 },
184/* 093 */ { 0, 255 },
185/* 094 */ { 0, 255 },
186/* 095 */ { 0, 255 },
187/* 096 */ { 0, 255 },
188/* 097 */ { 0, 255 },
189/* 098 */ { 0, 255 },
190/* 099 */ { 0, 255 },
191/* 100 */ { 0, 255 },
192/* 101 */ { 0, 255 },
193/* 102 */ { 0, 255 },
194/* 103 */ { 0, 255 },
195/* 104 */ { 0, 255 },
196/* 105 */ { 0, 255 },
197/* 106 */ { 0, 255 },
198/* 107 */ { 0, 255 },
199/* 108 */ { 0, 255 },
200/* 109 */ { 0, 255 },
201/* 110 */ { 0, 255 },
202/* 111 */ { 0, 255 },
203/* 112 */ { 0, 255 },
204/* 113 */ { 0, 255 },
205/* 114 */ { 0, 255 },
206/* 115 */ { 0, 255 },
207/* 116 */ { 0, 255 },
208/* 117 */ { 0, 255 },
209/* 118 */ { 0, 255 },
210/* 119 */ { 0, 255 },
211/* 120 */ { 0, 255 },
212/* 121 */ { 0, 255 },
213/* 122 */ { 0, 255 },
214/* 123 */ { 0, 255 },
215/* 124 */ { 0, 255 },
216/* 125 */ { 0, 255 },
217/* 126 */ { 0, 255 },
218/* 127 */ { 0, 255 },
219/* 128 */ { 0, 255 },
220/* 129 */ { 0, 255 },
221/* 130 */ { 0, 255 },
222/* 131 */ { 0, 255 },
223/* 132 */ { 0, 255 },
224/* 133 */ { 0, 255 },
225/* 134 */ { 0, 255 },
226/* 135 */ { 0, 255 },
227/* 136 */ { 0, 255 },
228/* 137 */ { 0, 255 },
229/* 138 */ { 0, 255 },
230/* 139 */ { 0, 255 },
231/* 140 */ { 0, 255 },
232/* 141 */ { 0, 255 },
233/* 142 */ { 0, 255 },
234/* 143 */ { 0, 255 },
235/* 144 */ { 0, 255 },
236/* 145 */ { 0, 255 },
237/* 146 */ { 0, 255 },
238/* 147 */ { 0, 255 },
239/* 148 */ { 0, 255 },
240/* 149 */ { 0, 255 },
241/* 150 */ { 0, 255 },
242/* 151 */ { 0, 255 },
243/* 152 */ { 0, 255 },
244/* 153 */ { 0, 255 },
245/* 154 */ { 0, 255 },
246/* 155 */ { 0, 255 },
247/* 156 */ { 0, 255 },
248/* 157 */ { 0, 255 },
249/* 158 */ { 0, 255 },
250/* 159 */ { 0, 255 },
251/* 160 */ { 0, 255 },
252/* 161 */ { 0, 255 },
253/* 162 */ { 0, 255 },
254/* 163 */ { 0, 255 },
255/* 164 */ { 0, 255 },
256/* 165 */ { 0, 255 },
257/* 166 */ { 0, 255 },
258/* 167 */ { 0, 255 },
259/* 168 */ { 0, 255 },
260/* 169 */ { 0, 255 },
261/* 170 */ { 0, 255 },
262/* 171 */ { 0, 255 },
263/* 172 */ { 0, 255 },
264/* 173 */ { 0, 255 },
265/* 174 */ { 0, 255 },
266/* 175 */ { 0, 255 },
267/* 176 */ { 0, 255 },
268/* 177 */ { 0, 255 },
269/* 178 */ { 0, 255 },
270/* 179 */ { 0, 255 },
271/* 180 */ { 0, 255 },
272/* 181 */ { 0, 255 },
273/* 182 */ { 0, 255 },
274/* 183 */ { 0, 255 },
275/* 184 */ { 0, 255 },
276/* 185 */ { 0, 255 },
277/* 186 */ { 0, 255 },
278/* 187 */ { 0, 255 },
279/* 188 */ { 0, 255 },
280/* 189 */ { 0, 255 },
281/* 190 */ { 0, 255 },
282/* 191 */ { 0, 255 },
283/* 192 */ { 0, 255 },
284/* 193 */ { 0, 255 },
285/* 194 */ { 0, 255 },
286/* 195 */ { 0, 255 },
287/* 196 */ { 0, 255 },
288/* 197 */ { 0, 255 },
289/* 198 */ { 0, 255 },
290/* 199 */ { 0, 255 },
291/* 200 */ { 0, 255 },
292/* 201 */ { 0, 255 },
293/* 202 */ { 0, 255 },
294/* 203 */ { 0, 255 },
295/* 204 */ { 0, 255 },
296/* 205 */ { 0, 255 },
297/* 206 */ { 0, 255 },
298/* 207 */ { 0, 255 },
299/* 208 */ { 0, 255 },
300/* 209 */ { 0, 255 },
301/* 210 */ { 0, 255 },
302/* 211 */ { 0, 255 },
303/* 212 */ { 0, 255 },
304/* 213 */ { 0, 255 },
305/* 214 */ { 0, 255 },
306/* 215 */ { 0, 255 },
307/* 216 */ { 0, 255 },
308/* 217 */ { 0, 255 },
309/* 218 */ { 0, 255 },
310/* 219 */ { 0, 255 },
311/* 220 */ { 0, 255 },
312/* 221 */ { SIR_MAC_WPA_EID_MIN, SIR_MAC_WPA_EID_MAX },
313/* 222 */ { 0, 255 },
314/* 223 */ { 0, 255 },
315/* 224 */ { 0, 255 },
316/* 225 */ { 0, 255 },
317/* 226 */ { 0, 255 },
318/* 227 */ { 0, 255 },
319/* 228 */ { 0, 255 },
320/* 229 */ { 0, 255 },
321/* 230 */ { 0, 255 },
322/* 231 */ { 0, 255 },
323/* 232 */ { 0, 255 },
324/* 233 */ { 0, 255 },
325/* 234 */ { 0, 255 },
326/* 235 */ { 0, 255 },
327/* 236 */ { 0, 255 },
328/* 237 */ { 0, 255 },
329/* 238 */ { 0, 255 },
330/* 239 */ { 0, 255 },
331/* 240 */ { 0, 255 },
332/* 241 */ { 0, 255 },
333/* 242 */ { 0, 255 },
334/* 243 */ { 0, 255 },
335/* 244 */ { 0, 255 },
336/* 245 */ { 0, 255 },
337/* 246 */ { 0, 255 },
338/* 247 */ { 0, 255 },
339/* 248 */ { 0, 255 },
340/* 249 */ { 0, 255 },
341/* 250 */ { 0, 255 },
342/* 251 */ { 0, 255 },
343/* 252 */ { 0, 255 },
344/* 253 */ { 0, 255 },
345/* 254 */ { 0, 255 },
346/* 255 */ { SIR_MAC_ANI_WORKAROUND_EID_MIN, SIR_MAC_ANI_WORKAROUND_EID_MAX }
347};
348
349#if 0
350//Don't not insert entry into the table, put it to the end. If you have to insert, make sure it is also
351//reflected in eCsrCountryIndex
352static tCsrCountryInfo gCsrCountryInfo[eCSR_NUM_COUNTRY_INDEX] =
353{
354 {REG_DOMAIN_FCC, {'U', 'S', ' '}}, //USA/******The "US" MUST be at index 0*******/
355 {REG_DOMAIN_WORLD, {'A', 'D', ' '}}, //ANDORRA
356 {REG_DOMAIN_WORLD, {'A', 'E', ' '}}, //UAE
357 {REG_DOMAIN_WORLD, {'A', 'F', ' '}}, //AFGHANISTAN
358 {REG_DOMAIN_WORLD, {'A', 'G', ' '}}, //ANTIGUA AND BARBUDA
359 {REG_DOMAIN_WORLD, {'A', 'I', ' '}}, //ANGUILLA
360 {REG_DOMAIN_HI_5GHZ, {'A', 'L', ' '}}, //ALBANIA
361 {REG_DOMAIN_WORLD, {'A', 'M', ' '}}, //ARMENIA
362 {REG_DOMAIN_WORLD, {'A', 'N', ' '}}, //NETHERLANDS ANTILLES
363 {REG_DOMAIN_WORLD, {'A', 'O', ' '}}, //ANGOLA
364 {REG_DOMAIN_WORLD, {'A', 'Q', ' '}}, //ANTARCTICA
365 {REG_DOMAIN_HI_5GHZ, {'A', 'R', ' '}}, //ARGENTINA
366 {REG_DOMAIN_FCC, {'A', 'S', ' '}}, //AMERICAN SOMOA
367 {REG_DOMAIN_ETSI, {'A', 'T', ' '}}, //AUSTRIA
368 {REG_DOMAIN_ETSI, {'A', 'U', ' '}}, //AUSTRALIA
369 {REG_DOMAIN_WORLD, {'A', 'W', ' '}}, //ARUBA
370 {REG_DOMAIN_WORLD, {'A', 'X', ' '}}, //ALAND ISLANDS
371 {REG_DOMAIN_WORLD, {'A', 'Z', ' '}}, //AZERBAIJAN
372 {REG_DOMAIN_WORLD, {'B', 'A', ' '}}, //BOSNIA AND HERZEGOVINA
373 {REG_DOMAIN_WORLD, {'B', 'B', ' '}}, //BARBADOS
374 {REG_DOMAIN_WORLD, {'B', 'D', ' '}}, //BANGLADESH
375 {REG_DOMAIN_ETSI, {'B', 'E', ' '}}, //BELGIUM
376 {REG_DOMAIN_WORLD, {'B', 'F', ' '}}, //BURKINA FASO
377 {REG_DOMAIN_HI_5GHZ, {'B', 'G', ' '}}, //BULGARIA
378 {REG_DOMAIN_WORLD, {'B', 'H', ' '}}, //BAHRAIN
379 {REG_DOMAIN_WORLD, {'B', 'I', ' '}}, //BURUNDI
380 {REG_DOMAIN_WORLD, {'B', 'J', ' '}}, //BENIN
381 {REG_DOMAIN_WORLD, {'B', 'L', ' '}}, //SAINT BARTHELEMY
382 {REG_DOMAIN_ETSI, {'B', 'M', ' '}}, //BERMUDA
383 {REG_DOMAIN_WORLD, {'B', 'N', ' '}}, //BRUNEI DARUSSALAM
384 {REG_DOMAIN_WORLD, {'B', 'O', ' '}}, //BOLIVIA
385 {REG_DOMAIN_WORLD, {'B', 'R', ' '}}, //BRAZIL
386 {REG_DOMAIN_WORLD, {'B', 'S', ' '}}, //BAHAMAS
387 {REG_DOMAIN_WORLD, {'B', 'T', ' '}}, //BHUTAN
388 {REG_DOMAIN_WORLD, {'B', 'V', ' '}}, //BOUVET ISLAND
389 {REG_DOMAIN_WORLD, {'B', 'W', ' '}}, //BOTSWANA
390 {REG_DOMAIN_WORLD, {'B', 'Y', ' '}}, //BELARUS
391 {REG_DOMAIN_WORLD, {'B', 'Z', ' '}}, //BELIZE
392 {REG_DOMAIN_FCC, {'C', 'A', ' '}}, //CANADA
393 {REG_DOMAIN_WORLD, {'C', 'C', ' '}}, //COCOS (KEELING) ISLANDS
394 {REG_DOMAIN_WORLD, {'C', 'D', ' '}}, //CONGO, THE DEMOCRATIC REPUBLIC OF THE
395 {REG_DOMAIN_WORLD, {'C', 'F', ' '}}, //CENTRAL AFRICAN REPUBLIC
396 {REG_DOMAIN_WORLD, {'C', 'G', ' '}}, //CONGO
397 {REG_DOMAIN_ETSI, {'C', 'H', ' '}}, //SWITZERLAND
398 {REG_DOMAIN_WORLD, {'C', 'I', ' '}}, //COTE D'IVOIRE
399 {REG_DOMAIN_WORLD, {'C', 'K', ' '}}, //COOK ISLANDS
400 {REG_DOMAIN_WORLD, {'C', 'L', ' '}}, //CHILE
401 {REG_DOMAIN_WORLD, {'C', 'M', ' '}}, //CAMEROON
402 {REG_DOMAIN_HI_5GHZ, {'C', 'N', ' '}}, //CHINA
403 {REG_DOMAIN_WORLD, {'C', 'O', ' '}}, //COLOMBIA
404 {REG_DOMAIN_WORLD, {'C', 'R', ' '}}, //COSTA RICA
405 {REG_DOMAIN_WORLD, {'C', 'U', ' '}}, //CUBA
406 {REG_DOMAIN_WORLD, {'C', 'V', ' '}}, //CAPE VERDE
407 {REG_DOMAIN_WORLD, {'C', 'X', ' '}}, //CHRISTMAS ISLAND
408 {REG_DOMAIN_WORLD, {'C', 'Y', ' '}}, //CYPRUS
409 {REG_DOMAIN_HI_5GHZ, {'C', 'Z', ' '}}, //CZECH REPUBLIC
410 {REG_DOMAIN_ETSI, {'D', 'E', ' '}}, //GERMANY
411 {REG_DOMAIN_WORLD, {'D', 'J', ' '}}, //DJIBOUTI
412 {REG_DOMAIN_ETSI, {'D', 'K', ' '}}, //DENMARK
413 {REG_DOMAIN_WORLD, {'D', 'M', ' '}}, //DOMINICA
414 {REG_DOMAIN_WORLD, {'D', 'O', ' '}}, //DOMINICAN REPUBLIC
415 {REG_DOMAIN_WORLD, {'D', 'Z', ' '}}, //ALGERIA
416 {REG_DOMAIN_WORLD, {'E', 'C', ' '}}, //ECUADOR
417 {REG_DOMAIN_HI_5GHZ, {'E', 'E', ' '}}, //ESTONIA
418 {REG_DOMAIN_WORLD, {'E', 'G', ' '}}, //EGYPT
419 {REG_DOMAIN_WORLD, {'E', 'H', ' '}}, //WESTERN SAHARA
420 {REG_DOMAIN_WORLD, {'E', 'R', ' '}}, //ERITREA
421 {REG_DOMAIN_ETSI, {'E', 'S', ' '}}, //SPAIN
422 {REG_DOMAIN_WORLD, {'E', 'T', ' '}}, //ETHIOPIA
423 {REG_DOMAIN_WORLD, {'F', 'I', ' '}}, //FINLAND
424 {REG_DOMAIN_WORLD, {'F', 'J', ' '}}, //FIJI
425 {REG_DOMAIN_WORLD, {'F', 'K', ' '}}, //FALKLAND ISLANDS (MALVINAS)
426 {REG_DOMAIN_WORLD, {'F', 'M', ' '}}, //MICRONESIA, FEDERATED STATES OF
427 {REG_DOMAIN_WORLD, {'F', 'O', ' '}}, //FAROE ISLANDS
428 {REG_DOMAIN_ETSI, {'F', 'R', ' '}}, //FRANCE
429 {REG_DOMAIN_WORLD, {'G', 'A', ' '}}, //GABON
430 {REG_DOMAIN_ETSI, {'G', 'B', ' '}}, //UNITED KINGDOM
431 {REG_DOMAIN_WORLD, {'G', 'D', ' '}}, //GRENADA
432 {REG_DOMAIN_HI_5GHZ, {'G', 'E', ' '}}, //GEORGIA
433 {REG_DOMAIN_WORLD, {'G', 'F', ' '}}, //FRENCH GUIANA
434 {REG_DOMAIN_ETSI, {'G', 'G', ' '}}, //GUERNSEY
435 {REG_DOMAIN_WORLD, {'G', 'H', ' '}}, //GHANA
436 {REG_DOMAIN_WORLD, {'G', 'I', ' '}}, //GIBRALTAR
437 {REG_DOMAIN_WORLD, {'G', 'L', ' '}}, //GREENLAND
438 {REG_DOMAIN_WORLD, {'G', 'M', ' '}}, //GAMBIA
439 {REG_DOMAIN_WORLD, {'G', 'N', ' '}}, //GUINEA
440 {REG_DOMAIN_WORLD, {'G', 'P', ' '}}, //GUADELOUPE
441 {REG_DOMAIN_WORLD, {'G', 'Q', ' '}}, //EQUATORIAL GUINEA
442 {REG_DOMAIN_ETSI, {'G', 'R', ' '}}, //GREECE
443 {REG_DOMAIN_WORLD, {'G', 'S', ' '}}, //SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS
444 {REG_DOMAIN_WORLD, {'G', 'T', ' '}}, //GUATEMALA
445 {REG_DOMAIN_WORLD, {'G', 'U', ' '}}, //GUAM
446 {REG_DOMAIN_WORLD, {'G', 'W', ' '}}, //GUINEA-BISSAU
447 {REG_DOMAIN_WORLD, {'G', 'Y', ' '}}, //GUYANA
448 {REG_DOMAIN_WORLD, {'H', 'K', ' '}}, //HONGKONG
449 {REG_DOMAIN_WORLD, {'H', 'M', ' '}}, //HEARD ISLAND AND MCDONALD ISLANDS
450 {REG_DOMAIN_WORLD, {'H', 'N', ' '}}, //HONDURAS
451 {REG_DOMAIN_HI_5GHZ, {'H', 'R', ' '}}, //CROATIA
452 {REG_DOMAIN_WORLD, {'H', 'T', ' '}}, //HAITI
453 {REG_DOMAIN_HI_5GHZ, {'H', 'U', ' '}}, //HUNGARY
454 {REG_DOMAIN_APAC, {'I', 'D', ' '}}, //INDONESIA
455 {REG_DOMAIN_ETSI, {'I', 'E', ' '}}, //IRELAND
456 {REG_DOMAIN_WORLD, {'I', 'L', ' '}}, //ISREAL
457 {REG_DOMAIN_ETSI, {'I', 'M', ' '}}, //ISLE OF MAN
458 {REG_DOMAIN_WORLD, {'I', 'N', ' '}}, //INDIA
459 {REG_DOMAIN_ETSI, {'I', 'O', ' '}}, //BRITISH INDIAN OCEAN TERRITORY
460 {REG_DOMAIN_WORLD, {'I', 'Q', ' '}}, //IRAQ
461 {REG_DOMAIN_WORLD, {'I', 'R', ' '}}, //IRAN, ISLAMIC REPUBLIC OF
462 {REG_DOMAIN_WORLD, {'I', 'S', ' '}}, //ICELAND
463 {REG_DOMAIN_ETSI, {'I', 'T', ' '}}, //ITALY
464 {REG_DOMAIN_ETSI, {'J', 'E', ' '}}, //JERSEY
465 {REG_DOMAIN_WORLD, {'J', 'M', ' '}}, //JAMAICA
466 {REG_DOMAIN_WORLD, {'J', 'O', ' '}}, //JORDAN
467 {REG_DOMAIN_JAPAN, {'J', 'P', ' '}}, //JAPAN
468 {REG_DOMAIN_WORLD, {'K', 'E', ' '}}, //KENYA
469 {REG_DOMAIN_WORLD, {'K', 'G', ' '}}, //KYRGYZSTAN
470 {REG_DOMAIN_WORLD, {'K', 'H', ' '}}, //CAMBODIA
471 {REG_DOMAIN_WORLD, {'K', 'I', ' '}}, //KIRIBATI
472 {REG_DOMAIN_WORLD, {'K', 'M', ' '}}, //COMOROS
473 {REG_DOMAIN_WORLD, {'K', 'N', ' '}}, //SAINT KITTS AND NEVIS
474 {REG_DOMAIN_KOREA, {'K', 'P', ' '}}, //KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF
475 {REG_DOMAIN_KOREA, {'K', 'R', ' '}}, //KOREA, REPUBLIC OF
476 {REG_DOMAIN_WORLD, {'K', 'W', ' '}}, //KUWAIT
477 {REG_DOMAIN_WORLD, {'K', 'Y', ' '}}, //CAYMAN ISLANDS
478 {REG_DOMAIN_WORLD, {'K', 'Z', ' '}}, //KAZAKHSTAN
479 {REG_DOMAIN_WORLD, {'L', 'A', ' '}}, //LAO PEOPLE'S DEMOCRATIC REPUBLIC
480 {REG_DOMAIN_WORLD, {'L', 'B', ' '}}, //LEBANON
481 {REG_DOMAIN_WORLD, {'L', 'C', ' '}}, //SAINT LUCIA
482 {REG_DOMAIN_ETSI, {'L', 'I', ' '}}, //LIECHTENSTEIN
483 {REG_DOMAIN_WORLD, {'L', 'K', ' '}}, //SRI LANKA
484 {REG_DOMAIN_WORLD, {'L', 'R', ' '}}, //LIBERIA
485 {REG_DOMAIN_WORLD, {'L', 'S', ' '}}, //LESOTHO
486 {REG_DOMAIN_HI_5GHZ, {'L', 'T', ' '}}, //LITHUANIA
487 {REG_DOMAIN_ETSI, {'L', 'U', ' '}}, //LUXEMBOURG
488 {REG_DOMAIN_HI_5GHZ, {'L', 'V', ' '}}, //LATVIA
489 {REG_DOMAIN_WORLD, {'L', 'Y', ' '}}, //LIBYAN ARAB JAMAHIRIYA
490 {REG_DOMAIN_WORLD, {'M', 'A', ' '}}, //MOROCCO
491 {REG_DOMAIN_ETSI, {'M', 'C', ' '}}, //MONACO
492 {REG_DOMAIN_WORLD, {'M', 'D', ' '}}, //MOLDOVA, REPUBLIC OF
493 {REG_DOMAIN_WORLD, {'M', 'E', ' '}}, //MONTENEGRO
494 {REG_DOMAIN_WORLD, {'M', 'G', ' '}}, //MADAGASCAR
495 {REG_DOMAIN_WORLD, {'M', 'H', ' '}}, //MARSHALL ISLANDS
496 {REG_DOMAIN_WORLD, {'M', 'K', ' '}}, //MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF
497 {REG_DOMAIN_WORLD, {'M', 'L', ' '}}, //MALI
498 {REG_DOMAIN_WORLD, {'M', 'M', ' '}}, //MYANMAR
499 {REG_DOMAIN_HI_5GHZ, {'M', 'N', ' '}}, //MONGOLIA
500 {REG_DOMAIN_WORLD, {'M', 'O', ' '}}, //MACAO
501 {REG_DOMAIN_WORLD, {'M', 'P', ' '}}, //NORTHERN MARIANA ISLANDS
502 {REG_DOMAIN_WORLD, {'M', 'Q', ' '}}, //MARTINIQUE
503 {REG_DOMAIN_WORLD, {'M', 'R', ' '}}, //MAURITANIA
504 {REG_DOMAIN_WORLD, {'M', 'S', ' '}}, //MONTSERRAT
505 {REG_DOMAIN_WORLD, {'M', 'T', ' '}}, //MALTA
506 {REG_DOMAIN_WORLD, {'M', 'U', ' '}}, //MAURITIUS
507 {REG_DOMAIN_WORLD, {'M', 'V', ' '}}, //MALDIVES
508 {REG_DOMAIN_WORLD, {'M', 'W', ' '}}, //MALAWI
509 {REG_DOMAIN_WORLD, {'M', 'X', ' '}}, //MEXICO
510 {REG_DOMAIN_HI_5GHZ, {'M', 'Y', ' '}}, //MALAYSIA
511 {REG_DOMAIN_WORLD, {'M', 'Z', ' '}}, //MOZAMBIQUE
512 {REG_DOMAIN_WORLD, {'N', 'A', ' '}}, //NAMIBIA
513 {REG_DOMAIN_WORLD, {'N', 'C', ' '}}, //NEW CALEDONIA
514 {REG_DOMAIN_WORLD, {'N', 'E', ' '}}, //NIGER
515 {REG_DOMAIN_WORLD, {'N', 'F', ' '}}, //NORFOLD ISLAND
516 {REG_DOMAIN_WORLD, {'N', 'G', ' '}}, //NIGERIA
517 {REG_DOMAIN_WORLD, {'N', 'I', ' '}}, //NICARAGUA
518 {REG_DOMAIN_ETSI, {'N', 'L', ' '}}, //NETHERLANDS
519 {REG_DOMAIN_WORLD, {'N', 'O', ' '}}, //NORWAY
520 {REG_DOMAIN_WORLD, {'N', 'P', ' '}}, //NEPAL
521 {REG_DOMAIN_WORLD, {'N', 'R', ' '}}, //NAURU
522 {REG_DOMAIN_WORLD, {'N', 'U', ' '}}, //NIUE
523 {REG_DOMAIN_ETSI, {'N', 'Z', ' '}}, //NEW ZEALAND
524 {REG_DOMAIN_WORLD, {'O', 'M', ' '}}, //OMAN
525 {REG_DOMAIN_WORLD, {'P', 'A', ' '}}, //PANAMA
526 {REG_DOMAIN_WORLD, {'P', 'E', ' '}}, //PERU
527 {REG_DOMAIN_WORLD, {'P', 'F', ' '}}, //FRENCH POLYNESIA
528 {REG_DOMAIN_WORLD, {'P', 'G', ' '}}, //PAPUA NEW GUINEA
529 {REG_DOMAIN_WORLD, {'P', 'H', ' '}}, //PHILIPPINES
530 {REG_DOMAIN_WORLD, {'P', 'K', ' '}}, //PAKISTAN
531 {REG_DOMAIN_WORLD, {'P', 'L', ' '}}, //POLAND
532 {REG_DOMAIN_WORLD, {'P', 'M', ' '}}, //SAINT PIERRE AND MIQUELON
533 {REG_DOMAIN_WORLD, {'P', 'N', ' '}}, //PITCAIRN
534 {REG_DOMAIN_FCC, {'P', 'R', ' '}}, //PUERTO RICO
535 {REG_DOMAIN_WORLD, {'P', 'S', ' '}}, //PALESTINIAN TERRITORY, OCCUPIED
536 {REG_DOMAIN_ETSI, {'P', 'T', ' '}}, //PORTUGAL
537 {REG_DOMAIN_WORLD, {'P', 'W', ' '}}, //PALAU
538 {REG_DOMAIN_WORLD, {'P', 'Y', ' '}}, //PARAGUAY
539 {REG_DOMAIN_WORLD, {'Q', 'A', ' '}}, //QATAR
540 {REG_DOMAIN_WORLD, {'R', 'E', ' '}}, //REUNION
541 {REG_DOMAIN_HI_5GHZ, {'R', 'O', ' '}}, //ROMANIA
542 {REG_DOMAIN_HI_5GHZ, {'R', 'S', ' '}}, //SERBIA
543 {REG_DOMAIN_WORLD, {'R', 'U', ' '}}, //RUSSIA
544 {REG_DOMAIN_WORLD, {'R', 'W', ' '}}, //RWANDA
545 {REG_DOMAIN_WORLD, {'S', 'A', ' '}}, //SAUDI ARABIA
546 {REG_DOMAIN_WORLD, {'S', 'B', ' '}}, //SOLOMON ISLANDS
547 {REG_DOMAIN_ETSI, {'S', 'C', ' '}}, //SEYCHELLES
548 {REG_DOMAIN_WORLD, {'S', 'D', ' '}}, //SUDAN
549 {REG_DOMAIN_ETSI, {'S', 'E', ' '}}, //SWEDEN
550 {REG_DOMAIN_APAC, {'S', 'G', ' '}}, //SINGAPORE
551 {REG_DOMAIN_WORLD, {'S', 'H', ' '}}, //SAINT HELENA
552 {REG_DOMAIN_HI_5GHZ, {'S', 'I', ' '}}, //SLOVENNIA
553 {REG_DOMAIN_WORLD, {'S', 'J', ' '}}, //SVALBARD AND JAN MAYEN
554 {REG_DOMAIN_HI_5GHZ, {'S', 'K', ' '}}, //SLOVAKIA
555 {REG_DOMAIN_WORLD, {'S', 'L', ' '}}, //SIERRA LEONE
556 {REG_DOMAIN_WORLD, {'S', 'M', ' '}}, //SAN MARINO
557 {REG_DOMAIN_WORLD, {'S', 'N', ' '}}, //SENEGAL
558 {REG_DOMAIN_WORLD, {'S', 'O', ' '}}, //SOMALIA
559 {REG_DOMAIN_WORLD, {'S', 'R', ' '}}, //SURINAME
560 {REG_DOMAIN_WORLD, {'S', 'T', ' '}}, //SAO TOME AND PRINCIPE
561 {REG_DOMAIN_WORLD, {'S', 'V', ' '}}, //EL SALVADOR
562 {REG_DOMAIN_WORLD, {'S', 'Y', ' '}}, //SYRIAN ARAB REPUBLIC
563 {REG_DOMAIN_WORLD, {'S', 'Z', ' '}}, //SWAZILAND
564 {REG_DOMAIN_WORLD, {'T', 'C', ' '}}, //TURKS AND CAICOS ISLANDS
565 {REG_DOMAIN_WORLD, {'T', 'D', ' '}}, //CHAD
566 {REG_DOMAIN_WORLD, {'T', 'F', ' '}}, //FRENCH SOUTHERN TERRITORIES
567 {REG_DOMAIN_WORLD, {'T', 'G', ' '}}, //TOGO
568 {REG_DOMAIN_WORLD, {'T', 'H', ' '}}, //THAILAND
569 {REG_DOMAIN_WORLD, {'T', 'J', ' '}}, //TAJIKISTAN
570 {REG_DOMAIN_WORLD, {'T', 'K', ' '}}, //TOKELAU
571 {REG_DOMAIN_WORLD, {'T', 'L', ' '}}, //TIMOR-LESTE
572 {REG_DOMAIN_WORLD, {'T', 'M', ' '}}, //TURKMENISTAN
573 {REG_DOMAIN_WORLD, {'T', 'N', ' '}}, //TUNISIA
574 {REG_DOMAIN_WORLD, {'T', 'O', ' '}}, //TONGA
575 {REG_DOMAIN_WORLD, {'T', 'R', ' '}}, //TURKEY
576 {REG_DOMAIN_WORLD, {'T', 'T', ' '}}, //TRINIDAD AND TOBAGO
577 {REG_DOMAIN_WORLD, {'T', 'V', ' '}}, //TUVALU
578 {REG_DOMAIN_HI_5GHZ, {'T', 'W', ' '}}, //TAIWAN, PROVINCE OF CHINA
579 {REG_DOMAIN_WORLD, {'T', 'Z', ' '}}, //TANZANIA, UNITED REPUBLIC OF
580 {REG_DOMAIN_HI_5GHZ, {'U', 'A', ' '}}, //UKRAINE
581 {REG_DOMAIN_WORLD, {'U', 'G', ' '}}, //UGANDA
582 {REG_DOMAIN_FCC, {'U', 'M', ' '}}, //UNITED STATES MINOR OUTLYING ISLANDS
583 {REG_DOMAIN_WORLD, {'U', 'Y', ' '}}, //URUGUAY
584 {REG_DOMAIN_HI_5GHZ, {'U', 'Z', ' '}}, //UZBEKISTAN
585 {REG_DOMAIN_ETSI, {'V', 'A', ' '}}, //HOLY SEE (VATICAN CITY STATE)
586 {REG_DOMAIN_WORLD, {'V', 'C', ' '}}, //SAINT VINCENT AND THE GRENADINES
587 {REG_DOMAIN_HI_5GHZ, {'V', 'E', ' '}}, //VENEZUELA
588 {REG_DOMAIN_ETSI, {'V', 'G', ' '}}, //VIRGIN ISLANDS, BRITISH
589 {REG_DOMAIN_FCC, {'V', 'I', ' '}}, //VIRGIN ISLANDS, US
590 {REG_DOMAIN_WORLD, {'V', 'N', ' '}}, //VIET NAM
591 {REG_DOMAIN_WORLD, {'V', 'U', ' '}}, //VANUATU
592 {REG_DOMAIN_WORLD, {'W', 'F', ' '}}, //WALLIS AND FUTUNA
593 {REG_DOMAIN_WORLD, {'W', 'S', ' '}}, //SOMOA
594 {REG_DOMAIN_WORLD, {'Y', 'E', ' '}}, //YEMEN
595 {REG_DOMAIN_WORLD, {'Y', 'T', ' '}}, //MAYOTTE
596 {REG_DOMAIN_WORLD, {'Z', 'A', ' '}}, //SOUTH AFRICA
597 {REG_DOMAIN_WORLD, {'Z', 'M', ' '}}, //ZAMBIA
598 {REG_DOMAIN_WORLD, {'Z', 'W', ' '}}, //ZIMBABWE
599
600 {REG_DOMAIN_KOREA, {'K', '1', ' '}}, //Korea alternate 1
601 {REG_DOMAIN_KOREA, {'K', '2', ' '}}, //Korea alternate 2
602 {REG_DOMAIN_KOREA, {'K', '3', ' '}}, //Korea alternate 3
603 {REG_DOMAIN_KOREA, {'K', '4', ' '}}, //Korea alternate 4
604};
605
606
607//The channels listed here doesn't mean they are valid channels for certain domain. They are here only to present
608//whether they should be passive scanned.
609tCsrDomainChnInfo gCsrDomainChnInfo[NUM_REG_DOMAINS] =
610{
611 //REG_DOMAIN_FCC
612 {
613 REG_DOMAIN_FCC,
614 45, //Num channels
615 //Channels
616 {
617 //5GHz
618 //5180 - 5240
619 {36, eSIR_ACTIVE_SCAN},
620 {40, eSIR_ACTIVE_SCAN},
621 {44, eSIR_ACTIVE_SCAN},
622 {48, eSIR_ACTIVE_SCAN},
623 //5250 to 5350
624 {52, eSIR_PASSIVE_SCAN},
625 {56, eSIR_PASSIVE_SCAN},
626 {60, eSIR_PASSIVE_SCAN},
627 {64, eSIR_PASSIVE_SCAN},
628 //5470 to 5725
629 {100, eSIR_PASSIVE_SCAN},
630 {104, eSIR_PASSIVE_SCAN},
631 {108, eSIR_PASSIVE_SCAN},
632 {112, eSIR_PASSIVE_SCAN},
633 {116, eSIR_PASSIVE_SCAN},
634 {120, eSIR_PASSIVE_SCAN},
635 {124, eSIR_PASSIVE_SCAN},
636 {128, eSIR_PASSIVE_SCAN},
637 {132, eSIR_PASSIVE_SCAN},
638 {136, eSIR_PASSIVE_SCAN},
639 {140, eSIR_PASSIVE_SCAN},
640 //5745 - 5825
641 {149, eSIR_ACTIVE_SCAN},
642 {153, eSIR_ACTIVE_SCAN},
643 {157, eSIR_ACTIVE_SCAN},
644 {161, eSIR_ACTIVE_SCAN},
645 {165, eSIR_ACTIVE_SCAN},
646 //4.9GHz
647 //4920 - 5080
648 {240, eSIR_ACTIVE_SCAN},
649 {244, eSIR_ACTIVE_SCAN},
650 {248, eSIR_ACTIVE_SCAN},
651 {252, eSIR_ACTIVE_SCAN},
652 {208, eSIR_ACTIVE_SCAN},
653 {212, eSIR_ACTIVE_SCAN},
654 {216, eSIR_ACTIVE_SCAN},
655 //2,4GHz
656 {1, eSIR_ACTIVE_SCAN},
657 {2, eSIR_ACTIVE_SCAN},
658 {3, eSIR_ACTIVE_SCAN},
659 {4, eSIR_ACTIVE_SCAN},
660 {5, eSIR_ACTIVE_SCAN},
661 {6, eSIR_ACTIVE_SCAN},
662 {7, eSIR_ACTIVE_SCAN},
663 {8, eSIR_ACTIVE_SCAN},
664 {9, eSIR_ACTIVE_SCAN},
665 {10, eSIR_ACTIVE_SCAN},
666 {11, eSIR_ACTIVE_SCAN},
667 {12, eSIR_ACTIVE_SCAN},
668 {13, eSIR_ACTIVE_SCAN},
669 {14, eSIR_ACTIVE_SCAN},
670 }
671 },
672 //REG_DOMAIN_ETSI
673 {
674 REG_DOMAIN_ETSI,
675 45, //Num channels
676 //Channels
677 {
678 //5GHz
679 //5180 - 5240
680 {36, eSIR_ACTIVE_SCAN},
681 {40, eSIR_ACTIVE_SCAN},
682 {44, eSIR_ACTIVE_SCAN},
683 {48, eSIR_ACTIVE_SCAN},
684 //5250 to 5350
685 {52, eSIR_PASSIVE_SCAN},
686 {56, eSIR_PASSIVE_SCAN},
687 {60, eSIR_PASSIVE_SCAN},
688 {64, eSIR_PASSIVE_SCAN},
689 //5470 to 5725
690 {100, eSIR_PASSIVE_SCAN},
691 {104, eSIR_PASSIVE_SCAN},
692 {108, eSIR_PASSIVE_SCAN},
693 {112, eSIR_PASSIVE_SCAN},
694 {116, eSIR_PASSIVE_SCAN},
695 {120, eSIR_PASSIVE_SCAN},
696 {124, eSIR_PASSIVE_SCAN},
697 {128, eSIR_PASSIVE_SCAN},
698 {132, eSIR_PASSIVE_SCAN},
699 {136, eSIR_PASSIVE_SCAN},
700 {140, eSIR_PASSIVE_SCAN},
701 //5745 - 5825
702 {149, eSIR_ACTIVE_SCAN},
703 {153, eSIR_ACTIVE_SCAN},
704 {157, eSIR_ACTIVE_SCAN},
705 {161, eSIR_ACTIVE_SCAN},
706 {165, eSIR_ACTIVE_SCAN},
707 //4.9GHz
708 //4920 - 5080
709 {240, eSIR_ACTIVE_SCAN},
710 {244, eSIR_ACTIVE_SCAN},
711 {248, eSIR_ACTIVE_SCAN},
712 {252, eSIR_ACTIVE_SCAN},
713 {208, eSIR_ACTIVE_SCAN},
714 {212, eSIR_ACTIVE_SCAN},
715 {216, eSIR_ACTIVE_SCAN},
716 //2,4GHz
717 {1, eSIR_ACTIVE_SCAN},
718 {2, eSIR_ACTIVE_SCAN},
719 {3, eSIR_ACTIVE_SCAN},
720 {4, eSIR_ACTIVE_SCAN},
721 {5, eSIR_ACTIVE_SCAN},
722 {6, eSIR_ACTIVE_SCAN},
723 {7, eSIR_ACTIVE_SCAN},
724 {8, eSIR_ACTIVE_SCAN},
725 {9, eSIR_ACTIVE_SCAN},
726 {10, eSIR_ACTIVE_SCAN},
727 {11, eSIR_ACTIVE_SCAN},
728 {12, eSIR_ACTIVE_SCAN},
729 {13, eSIR_ACTIVE_SCAN},
730 {14, eSIR_ACTIVE_SCAN},
731 }
732 },
733 //REG_DOMAIN_JAPAN
734 {
735 REG_DOMAIN_JAPAN,
736 45, //Num channels
737 //Channels
738 {
739 //5GHz
740 //5180 - 5240
741 {36, eSIR_ACTIVE_SCAN},
742 {40, eSIR_ACTIVE_SCAN},
743 {44, eSIR_ACTIVE_SCAN},
744 {48, eSIR_ACTIVE_SCAN},
745 //5250 to 5350
746 {52, eSIR_PASSIVE_SCAN},
747 {56, eSIR_PASSIVE_SCAN},
748 {60, eSIR_PASSIVE_SCAN},
749 {64, eSIR_PASSIVE_SCAN},
750 //5470 to 5725
751 {100, eSIR_PASSIVE_SCAN},
752 {104, eSIR_PASSIVE_SCAN},
753 {108, eSIR_PASSIVE_SCAN},
754 {112, eSIR_PASSIVE_SCAN},
755 {116, eSIR_PASSIVE_SCAN},
756 {120, eSIR_PASSIVE_SCAN},
757 {124, eSIR_PASSIVE_SCAN},
758 {128, eSIR_PASSIVE_SCAN},
759 {132, eSIR_PASSIVE_SCAN},
760 {136, eSIR_PASSIVE_SCAN},
761 {140, eSIR_PASSIVE_SCAN},
762 //5745 - 5825
763 {149, eSIR_ACTIVE_SCAN},
764 {153, eSIR_ACTIVE_SCAN},
765 {157, eSIR_ACTIVE_SCAN},
766 {161, eSIR_ACTIVE_SCAN},
767 {165, eSIR_ACTIVE_SCAN},
768 //4.9GHz
769 //4920 - 5080
770 {240, eSIR_ACTIVE_SCAN},
771 {244, eSIR_ACTIVE_SCAN},
772 {248, eSIR_ACTIVE_SCAN},
773 {252, eSIR_ACTIVE_SCAN},
774 {208, eSIR_ACTIVE_SCAN},
775 {212, eSIR_ACTIVE_SCAN},
776 {216, eSIR_ACTIVE_SCAN},
777 //2,4GHz
778 {1, eSIR_ACTIVE_SCAN},
779 {2, eSIR_ACTIVE_SCAN},
780 {3, eSIR_ACTIVE_SCAN},
781 {4, eSIR_ACTIVE_SCAN},
782 {5, eSIR_ACTIVE_SCAN},
783 {6, eSIR_ACTIVE_SCAN},
784 {7, eSIR_ACTIVE_SCAN},
785 {8, eSIR_ACTIVE_SCAN},
786 {9, eSIR_ACTIVE_SCAN},
787 {10, eSIR_ACTIVE_SCAN},
788 {11, eSIR_ACTIVE_SCAN},
789 {12, eSIR_ACTIVE_SCAN},
790 {13, eSIR_ACTIVE_SCAN},
791 {14, eSIR_ACTIVE_SCAN},
792 }
793 },
794 //REG_DOMAIN_WORLD
795 {
796 REG_DOMAIN_WORLD,
797 45, //Num channels
798 //Channels
799 {
800 //5GHz
801 //5180 - 5240
802 {36, eSIR_ACTIVE_SCAN},
803 {40, eSIR_ACTIVE_SCAN},
804 {44, eSIR_ACTIVE_SCAN},
805 {48, eSIR_ACTIVE_SCAN},
806 //5250 to 5350
807 {52, eSIR_ACTIVE_SCAN},
808 {56, eSIR_ACTIVE_SCAN},
809 {60, eSIR_ACTIVE_SCAN},
810 {64, eSIR_ACTIVE_SCAN},
811 //5470 to 5725
812 {100, eSIR_ACTIVE_SCAN},
813 {104, eSIR_ACTIVE_SCAN},
814 {108, eSIR_ACTIVE_SCAN},
815 {112, eSIR_ACTIVE_SCAN},
816 {116, eSIR_ACTIVE_SCAN},
817 {120, eSIR_ACTIVE_SCAN},
818 {124, eSIR_ACTIVE_SCAN},
819 {128, eSIR_ACTIVE_SCAN},
820 {132, eSIR_ACTIVE_SCAN},
821 {136, eSIR_ACTIVE_SCAN},
822 {140, eSIR_ACTIVE_SCAN},
823 //5745 - 5825
824 {149, eSIR_ACTIVE_SCAN},
825 {153, eSIR_ACTIVE_SCAN},
826 {157, eSIR_ACTIVE_SCAN},
827 {161, eSIR_ACTIVE_SCAN},
828 {165, eSIR_ACTIVE_SCAN},
829 //4.9GHz
830 //4920 - 5080
831 {240, eSIR_ACTIVE_SCAN},
832 {244, eSIR_ACTIVE_SCAN},
833 {248, eSIR_ACTIVE_SCAN},
834 {252, eSIR_ACTIVE_SCAN},
835 {208, eSIR_ACTIVE_SCAN},
836 {212, eSIR_ACTIVE_SCAN},
837 {216, eSIR_ACTIVE_SCAN},
838 //2,4GHz
839 {1, eSIR_ACTIVE_SCAN},
840 {2, eSIR_ACTIVE_SCAN},
841 {3, eSIR_ACTIVE_SCAN},
842 {4, eSIR_ACTIVE_SCAN},
843 {5, eSIR_ACTIVE_SCAN},
844 {6, eSIR_ACTIVE_SCAN},
845 {7, eSIR_ACTIVE_SCAN},
846 {8, eSIR_ACTIVE_SCAN},
847 {9, eSIR_ACTIVE_SCAN},
848 {10, eSIR_ACTIVE_SCAN},
849 {11, eSIR_ACTIVE_SCAN},
850 {12, eSIR_ACTIVE_SCAN},
851 {13, eSIR_ACTIVE_SCAN},
852 {14, eSIR_ACTIVE_SCAN},
853 }
854 },
855 //REG_DOMAIN_N_AMER_EXC_FCC
856 {
857 REG_DOMAIN_N_AMER_EXC_FCC,
858 45, //Num channels
859 //Channels
860 {
861 //5GHz
862 //5180 - 5240
863 {36, eSIR_ACTIVE_SCAN},
864 {40, eSIR_ACTIVE_SCAN},
865 {44, eSIR_ACTIVE_SCAN},
866 {48, eSIR_ACTIVE_SCAN},
867 //5250 to 5350
868 {52, eSIR_PASSIVE_SCAN},
869 {56, eSIR_PASSIVE_SCAN},
870 {60, eSIR_PASSIVE_SCAN},
871 {64, eSIR_PASSIVE_SCAN},
872 //5470 to 5725
873 {100, eSIR_ACTIVE_SCAN},
874 {104, eSIR_ACTIVE_SCAN},
875 {108, eSIR_ACTIVE_SCAN},
876 {112, eSIR_ACTIVE_SCAN},
877 {116, eSIR_ACTIVE_SCAN},
878 {120, eSIR_ACTIVE_SCAN},
879 {124, eSIR_ACTIVE_SCAN},
880 {128, eSIR_ACTIVE_SCAN},
881 {132, eSIR_ACTIVE_SCAN},
882 {136, eSIR_ACTIVE_SCAN},
883 {140, eSIR_ACTIVE_SCAN},
884 //5745 - 5825
885 {149, eSIR_ACTIVE_SCAN},
886 {153, eSIR_ACTIVE_SCAN},
887 {157, eSIR_ACTIVE_SCAN},
888 {161, eSIR_ACTIVE_SCAN},
889 {165, eSIR_ACTIVE_SCAN},
890 //4.9GHz
891 //4920 - 5080
892 {240, eSIR_ACTIVE_SCAN},
893 {244, eSIR_ACTIVE_SCAN},
894 {248, eSIR_ACTIVE_SCAN},
895 {252, eSIR_ACTIVE_SCAN},
896 {208, eSIR_ACTIVE_SCAN},
897 {212, eSIR_ACTIVE_SCAN},
898 {216, eSIR_ACTIVE_SCAN},
899 //2,4GHz
900 {1, eSIR_ACTIVE_SCAN},
901 {2, eSIR_ACTIVE_SCAN},
902 {3, eSIR_ACTIVE_SCAN},
903 {4, eSIR_ACTIVE_SCAN},
904 {5, eSIR_ACTIVE_SCAN},
905 {6, eSIR_ACTIVE_SCAN},
906 {7, eSIR_ACTIVE_SCAN},
907 {8, eSIR_ACTIVE_SCAN},
908 {9, eSIR_ACTIVE_SCAN},
909 {10, eSIR_ACTIVE_SCAN},
910 {11, eSIR_ACTIVE_SCAN},
911 {12, eSIR_ACTIVE_SCAN},
912 {13, eSIR_ACTIVE_SCAN},
913 {14, eSIR_ACTIVE_SCAN},
914 }
915 },
916 //REG_DOMAIN_APAC
917 {
918 REG_DOMAIN_APAC,
919 45, //Num channels
920 //Channels
921 {
922 //5GHz
923 //5180 - 5240
924 {36, eSIR_ACTIVE_SCAN},
925 {40, eSIR_ACTIVE_SCAN},
926 {44, eSIR_ACTIVE_SCAN},
927 {48, eSIR_ACTIVE_SCAN},
928 //5250 to 5350
929 {52, eSIR_PASSIVE_SCAN},
930 {56, eSIR_PASSIVE_SCAN},
931 {60, eSIR_PASSIVE_SCAN},
932 {64, eSIR_PASSIVE_SCAN},
933 //5470 to 5725
934 {100, eSIR_ACTIVE_SCAN},
935 {104, eSIR_ACTIVE_SCAN},
936 {108, eSIR_ACTIVE_SCAN},
937 {112, eSIR_ACTIVE_SCAN},
938 {116, eSIR_ACTIVE_SCAN},
939 {120, eSIR_ACTIVE_SCAN},
940 {124, eSIR_ACTIVE_SCAN},
941 {128, eSIR_ACTIVE_SCAN},
942 {132, eSIR_ACTIVE_SCAN},
943 {136, eSIR_ACTIVE_SCAN},
944 {140, eSIR_ACTIVE_SCAN},
945 //5745 - 5825
946 {149, eSIR_ACTIVE_SCAN},
947 {153, eSIR_ACTIVE_SCAN},
948 {157, eSIR_ACTIVE_SCAN},
949 {161, eSIR_ACTIVE_SCAN},
950 {165, eSIR_ACTIVE_SCAN},
951 //4.9GHz
952 //4920 - 5080
953 {240, eSIR_ACTIVE_SCAN},
954 {244, eSIR_ACTIVE_SCAN},
955 {248, eSIR_ACTIVE_SCAN},
956 {252, eSIR_ACTIVE_SCAN},
957 {208, eSIR_ACTIVE_SCAN},
958 {212, eSIR_ACTIVE_SCAN},
959 {216, eSIR_ACTIVE_SCAN},
960 //2,4GHz
961 {1, eSIR_ACTIVE_SCAN},
962 {2, eSIR_ACTIVE_SCAN},
963 {3, eSIR_ACTIVE_SCAN},
964 {4, eSIR_ACTIVE_SCAN},
965 {5, eSIR_ACTIVE_SCAN},
966 {6, eSIR_ACTIVE_SCAN},
967 {7, eSIR_ACTIVE_SCAN},
968 {8, eSIR_ACTIVE_SCAN},
969 {9, eSIR_ACTIVE_SCAN},
970 {10, eSIR_ACTIVE_SCAN},
971 {11, eSIR_ACTIVE_SCAN},
972 {12, eSIR_ACTIVE_SCAN},
973 {13, eSIR_ACTIVE_SCAN},
974 {14, eSIR_ACTIVE_SCAN},
975 }
976 },
977 //REG_DOMAIN_KOREA
978 {
979 REG_DOMAIN_KOREA,
980 45, //Num channels
981 //Channels
982 {
983 //5GHz
984 //5180 - 5240
985 {36, eSIR_ACTIVE_SCAN},
986 {40, eSIR_ACTIVE_SCAN},
987 {44, eSIR_ACTIVE_SCAN},
988 {48, eSIR_ACTIVE_SCAN},
989 //5250 to 5350
990 {52, eSIR_PASSIVE_SCAN},
991 {56, eSIR_PASSIVE_SCAN},
992 {60, eSIR_PASSIVE_SCAN},
993 {64, eSIR_PASSIVE_SCAN},
994 //5470 to 5725
995 {100, eSIR_PASSIVE_SCAN},
996 {104, eSIR_PASSIVE_SCAN},
997 {108, eSIR_PASSIVE_SCAN},
998 {112, eSIR_PASSIVE_SCAN},
999 {116, eSIR_PASSIVE_SCAN},
1000 {120, eSIR_PASSIVE_SCAN},
1001 {124, eSIR_PASSIVE_SCAN},
1002 {128, eSIR_PASSIVE_SCAN},
1003 {132, eSIR_PASSIVE_SCAN},
1004 {136, eSIR_PASSIVE_SCAN},
1005 {140, eSIR_PASSIVE_SCAN},
1006 //5745 - 5825
1007 {149, eSIR_ACTIVE_SCAN},
1008 {153, eSIR_ACTIVE_SCAN},
1009 {157, eSIR_ACTIVE_SCAN},
1010 {161, eSIR_ACTIVE_SCAN},
1011 {165, eSIR_ACTIVE_SCAN},
1012 //4.9GHz
1013 //4920 - 5080
1014 {240, eSIR_ACTIVE_SCAN},
1015 {244, eSIR_ACTIVE_SCAN},
1016 {248, eSIR_ACTIVE_SCAN},
1017 {252, eSIR_ACTIVE_SCAN},
1018 {208, eSIR_ACTIVE_SCAN},
1019 {212, eSIR_ACTIVE_SCAN},
1020 {216, eSIR_ACTIVE_SCAN},
1021 //2,4GHz
1022 {1, eSIR_ACTIVE_SCAN},
1023 {2, eSIR_ACTIVE_SCAN},
1024 {3, eSIR_ACTIVE_SCAN},
1025 {4, eSIR_ACTIVE_SCAN},
1026 {5, eSIR_ACTIVE_SCAN},
1027 {6, eSIR_ACTIVE_SCAN},
1028 {7, eSIR_ACTIVE_SCAN},
1029 {8, eSIR_ACTIVE_SCAN},
1030 {9, eSIR_ACTIVE_SCAN},
1031 {10, eSIR_ACTIVE_SCAN},
1032 {11, eSIR_ACTIVE_SCAN},
1033 {12, eSIR_ACTIVE_SCAN},
1034 {13, eSIR_ACTIVE_SCAN},
1035 {14, eSIR_ACTIVE_SCAN},
1036 }
1037 },
1038 //REG_DOMAIN_HI_5GHZ
1039 {
1040 REG_DOMAIN_HI_5GHZ,
1041 45, //Num channels
1042 //Channels
1043 {
1044 //5GHz
1045 //5180 - 5240
1046 {36, eSIR_ACTIVE_SCAN},
1047 {40, eSIR_ACTIVE_SCAN},
1048 {44, eSIR_ACTIVE_SCAN},
1049 {48, eSIR_ACTIVE_SCAN},
1050 //5250 to 5350
1051 {52, eSIR_ACTIVE_SCAN},
1052 {56, eSIR_ACTIVE_SCAN},
1053 {60, eSIR_ACTIVE_SCAN},
1054 {64, eSIR_ACTIVE_SCAN},
1055 //5470 to 5725
1056 {100, eSIR_ACTIVE_SCAN},
1057 {104, eSIR_ACTIVE_SCAN},
1058 {108, eSIR_ACTIVE_SCAN},
1059 {112, eSIR_ACTIVE_SCAN},
1060 {116, eSIR_ACTIVE_SCAN},
1061 {120, eSIR_ACTIVE_SCAN},
1062 {124, eSIR_ACTIVE_SCAN},
1063 {128, eSIR_ACTIVE_SCAN},
1064 {132, eSIR_ACTIVE_SCAN},
1065 {136, eSIR_ACTIVE_SCAN},
1066 {140, eSIR_ACTIVE_SCAN},
1067 //5745 - 5825
1068 {149, eSIR_ACTIVE_SCAN},
1069 {153, eSIR_ACTIVE_SCAN},
1070 {157, eSIR_ACTIVE_SCAN},
1071 {161, eSIR_ACTIVE_SCAN},
1072 {165, eSIR_ACTIVE_SCAN},
1073 //4.9GHz
1074 //4920 - 5080
1075 {240, eSIR_ACTIVE_SCAN},
1076 {244, eSIR_ACTIVE_SCAN},
1077 {248, eSIR_ACTIVE_SCAN},
1078 {252, eSIR_ACTIVE_SCAN},
1079 {208, eSIR_ACTIVE_SCAN},
1080 {212, eSIR_ACTIVE_SCAN},
1081 {216, eSIR_ACTIVE_SCAN},
1082 //2,4GHz
1083 {1, eSIR_ACTIVE_SCAN},
1084 {2, eSIR_ACTIVE_SCAN},
1085 {3, eSIR_ACTIVE_SCAN},
1086 {4, eSIR_ACTIVE_SCAN},
1087 {5, eSIR_ACTIVE_SCAN},
1088 {6, eSIR_ACTIVE_SCAN},
1089 {7, eSIR_ACTIVE_SCAN},
1090 {8, eSIR_ACTIVE_SCAN},
1091 {9, eSIR_ACTIVE_SCAN},
1092 {10, eSIR_ACTIVE_SCAN},
1093 {11, eSIR_ACTIVE_SCAN},
1094 {12, eSIR_ACTIVE_SCAN},
1095 {13, eSIR_ACTIVE_SCAN},
1096 {14, eSIR_ACTIVE_SCAN},
1097 }
1098 },
1099 //REG_DOMAIN_NO_5GHZ
1100 {
1101 REG_DOMAIN_NO_5GHZ,
1102 45, //Num channels
1103 //Channels
1104 {
1105 //5GHz
1106 //5180 - 5240
1107 {36, eSIR_ACTIVE_SCAN},
1108 {40, eSIR_ACTIVE_SCAN},
1109 {44, eSIR_ACTIVE_SCAN},
1110 {48, eSIR_ACTIVE_SCAN},
1111 //5250 to 5350
1112 {52, eSIR_ACTIVE_SCAN},
1113 {56, eSIR_ACTIVE_SCAN},
1114 {60, eSIR_ACTIVE_SCAN},
1115 {64, eSIR_ACTIVE_SCAN},
1116 //5470 to 5725
1117 {100, eSIR_ACTIVE_SCAN},
1118 {104, eSIR_ACTIVE_SCAN},
1119 {108, eSIR_ACTIVE_SCAN},
1120 {112, eSIR_ACTIVE_SCAN},
1121 {116, eSIR_ACTIVE_SCAN},
1122 {120, eSIR_ACTIVE_SCAN},
1123 {124, eSIR_ACTIVE_SCAN},
1124 {128, eSIR_ACTIVE_SCAN},
1125 {132, eSIR_ACTIVE_SCAN},
1126 {136, eSIR_ACTIVE_SCAN},
1127 {140, eSIR_ACTIVE_SCAN},
1128 //5745 - 5825
1129 {149, eSIR_ACTIVE_SCAN},
1130 {153, eSIR_ACTIVE_SCAN},
1131 {157, eSIR_ACTIVE_SCAN},
1132 {161, eSIR_ACTIVE_SCAN},
1133 {165, eSIR_ACTIVE_SCAN},
1134 //4.9GHz
1135 //4920 - 5080
1136 {240, eSIR_ACTIVE_SCAN},
1137 {244, eSIR_ACTIVE_SCAN},
1138 {248, eSIR_ACTIVE_SCAN},
1139 {252, eSIR_ACTIVE_SCAN},
1140 {208, eSIR_ACTIVE_SCAN},
1141 {212, eSIR_ACTIVE_SCAN},
1142 {216, eSIR_ACTIVE_SCAN},
1143 //2,4GHz
1144 {1, eSIR_ACTIVE_SCAN},
1145 {2, eSIR_ACTIVE_SCAN},
1146 {3, eSIR_ACTIVE_SCAN},
1147 {4, eSIR_ACTIVE_SCAN},
1148 {5, eSIR_ACTIVE_SCAN},
1149 {6, eSIR_ACTIVE_SCAN},
1150 {7, eSIR_ACTIVE_SCAN},
1151 {8, eSIR_ACTIVE_SCAN},
1152 {9, eSIR_ACTIVE_SCAN},
1153 {10, eSIR_ACTIVE_SCAN},
1154 {11, eSIR_ACTIVE_SCAN},
1155 {12, eSIR_ACTIVE_SCAN},
1156 {13, eSIR_ACTIVE_SCAN},
1157 {14, eSIR_ACTIVE_SCAN},
1158 }
1159 },
1160};
1161#endif
1162
1163extern const tRfChannelProps rfChannels[NUM_RF_CHANNELS];
1164
Jeff Johnson295189b2012-06-20 16:38:30 -07001165////////////////////////////////////////////////////////////////////////
1166
1167/**
1168 * \var gPhyRatesSuppt
1169 *
1170 * \brief Rate support lookup table
1171 *
1172 *
1173 * This is a lookup table indexing rates & configuration parameters to
1174 * support. Given a rate (in unites of 0.5Mpbs) & three booleans (MIMO
1175 * Enabled, Channel Bonding Enabled, & Concatenation Enabled), one can
1176 * determine whether the given rate is supported by computing two
1177 * indices. The first maps the rate to table row as indicated below
1178 * (i.e. eHddSuppRate_6Mbps maps to row zero, eHddSuppRate_9Mbps to row
1179 * 1, and so on). Index two can be computed like so:
1180 *
1181 * \code
1182 idx2 = ( fEsf ? 0x4 : 0x0 ) |
1183 ( fCb ? 0x2 : 0x0 ) |
1184 ( fMimo ? 0x1 : 0x0 );
1185 * \endcode
1186 *
1187 *
1188 * Given that:
1189 *
1190 \code
1191 fSupported = gPhyRatesSuppt[idx1][idx2];
1192 \endcode
1193 *
1194 *
1195 * This table is based on the document "PHY Supported Rates.doc". This
1196 * table is permissive in that a rate is reflected as being supported
1197 * even when turning off an enabled feature would be required. For
1198 * instance, "PHY Supported Rates" lists 42Mpbs as unsupported when CB,
1199 * ESF, & MIMO are all on. However, if we turn off either of CB or
1200 * MIMO, it then becomes supported. Therefore, we mark it as supported
1201 * even in index 7 of this table.
1202 *
1203 *
1204 */
1205
1206static const tANI_BOOLEAN gPhyRatesSuppt[24][8] = {
1207
1208 // SSF SSF SSF SSF ESF ESF ESF ESF
1209 // SIMO MIMO SIMO MIMO SIMO MIMO SIMO MIMO
1210 // No CB No CB CB CB No CB No CB CB CB
1211 { TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, // 6Mbps
1212 { TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, // 9Mbps
1213 { TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, // 12Mbps
1214 { TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, // 18Mbps
1215 { FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE }, // 20Mbps
1216 { TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, // 24Mbps
1217 { TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, // 36Mbps
1218 { FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 40Mbps
1219 { FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 42Mbps
1220 { TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, // 48Mbps
1221 { TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, // 54Mbps
1222 { FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 72Mbps
1223 { FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 80Mbps
1224 { FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 84Mbps
1225 { FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 96Mbps
1226 { FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 108Mbps
1227 { FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 120Mbps
1228 { FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE }, // 126Mbps
1229 { FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, // 144Mbps
1230 { FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, // 160Mbps
1231 { FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, // 168Mbps
1232 { FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, // 192Mbps
1233 { FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, // 216Mbps
1234 { FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, // 240Mbps
1235
1236};
1237
1238#define CASE_RETURN_STR(n) case (n): return (#n)
1239
1240const char *
1241get_eRoamCmdStatus_str(eRoamCmdStatus val)
1242{
1243 switch (val)
1244 {
1245 CASE_RETURN_STR(eCSR_ROAM_CANCELLED);
Konamki, Sreelakshmib9c45712015-07-29 11:48:19 +05301246 CASE_RETURN_STR(eCSR_ROAM_FAILED);
Jeff Johnson295189b2012-06-20 16:38:30 -07001247 CASE_RETURN_STR(eCSR_ROAM_ROAMING_START);
1248 CASE_RETURN_STR(eCSR_ROAM_ROAMING_COMPLETION);
Konamki, Sreelakshmib9c45712015-07-29 11:48:19 +05301249 CASE_RETURN_STR(eCSR_ROAM_CONNECT_COMPLETION);
Jeff Johnson295189b2012-06-20 16:38:30 -07001250 CASE_RETURN_STR(eCSR_ROAM_ASSOCIATION_START);
1251 CASE_RETURN_STR(eCSR_ROAM_ASSOCIATION_COMPLETION);
1252 CASE_RETURN_STR(eCSR_ROAM_DISASSOCIATED);
1253 CASE_RETURN_STR(eCSR_ROAM_SHOULD_ROAM);
1254 CASE_RETURN_STR(eCSR_ROAM_SCAN_FOUND_NEW_BSS);
1255 CASE_RETURN_STR(eCSR_ROAM_LOSTLINK);
Konamki, Sreelakshmib9c45712015-07-29 11:48:19 +05301256 CASE_RETURN_STR(eCSR_ROAM_LOSTLINK_DETECTED);
1257 CASE_RETURN_STR(eCSR_ROAM_MIC_ERROR_IND);
1258 CASE_RETURN_STR(eCSR_ROAM_IBSS_IND);
1259 CASE_RETURN_STR(eCSR_ROAM_CONNECT_STATUS_UPDATE);
1260 CASE_RETURN_STR(eCSR_ROAM_GEN_INFO);
1261 CASE_RETURN_STR(eCSR_ROAM_SET_KEY_COMPLETE);
1262 CASE_RETURN_STR(eCSR_ROAM_REMOVE_KEY_COMPLETE);
1263 CASE_RETURN_STR(eCSR_ROAM_IBSS_LEAVE);
1264 CASE_RETURN_STR(eCSR_ROAM_WDS_IND);
1265 CASE_RETURN_STR(eCSR_ROAM_INFRA_IND);
1266 CASE_RETURN_STR(eCSR_ROAM_WPS_PBC_PROBE_REQ_IND);
1267#ifdef WLAN_FEATURE_VOWIFI_11R
1268 CASE_RETURN_STR(eCSR_ROAM_FT_RESPONSE);
1269#endif
1270 CASE_RETURN_STR(eCSR_ROAM_FT_START);
Konamki, Sreelakshmib9c45712015-07-29 11:48:19 +05301271 CASE_RETURN_STR(eCSR_ROAM_REMAIN_CHAN_READY);
1272 CASE_RETURN_STR(eCSR_ROAM_SEND_ACTION_CNF);
1273 CASE_RETURN_STR(eCSR_ROAM_SESSION_OPENED);
1274 CASE_RETURN_STR(eCSR_ROAM_FT_REASSOC_FAILED);
1275#ifdef FEATURE_WLAN_LFR
1276 CASE_RETURN_STR(eCSR_ROAM_PMK_NOTIFY);
1277#endif
1278#ifdef FEATURE_WLAN_LFR_METRICS
1279 CASE_RETURN_STR(eCSR_ROAM_PREAUTH_INIT_NOTIFY);
1280 CASE_RETURN_STR(eCSR_ROAM_PREAUTH_STATUS_SUCCESS);
1281 CASE_RETURN_STR(eCSR_ROAM_PREAUTH_STATUS_FAILURE);
1282 CASE_RETURN_STR(eCSR_ROAM_HANDOVER_SUCCESS);
1283#endif
1284#ifdef FEATURE_WLAN_TDLS
1285 CASE_RETURN_STR(eCSR_ROAM_TDLS_STATUS_UPDATE);
1286 CASE_RETURN_STR(eCSR_ROAM_RESULT_MGMT_TX_COMPLETE_IND);
1287#endif
1288 CASE_RETURN_STR(eCSR_ROAM_DISCONNECT_ALL_P2P_CLIENTS);
1289 CASE_RETURN_STR(eCSR_ROAM_SEND_P2P_STOP_BSS);
1290#ifdef WLAN_FEATURE_11W
1291 CASE_RETURN_STR(eCSR_ROAM_UNPROT_MGMT_FRAME_IND);
1292#endif
1293#ifdef WLAN_FEATURE_RMC
1294 CASE_RETURN_STR(eCSR_ROAM_IBSS_PEER_INFO_COMPLETE);
1295#endif
1296#ifdef WLAN_FEATURE_AP_HT40_24G
1297 CASE_RETURN_STR(eCSR_ROAM_2040_COEX_INFO_IND);
1298#endif
1299#if defined(FEATURE_WLAN_ESE) && defined(FEATURE_WLAN_ESE_UPLOAD)
1300 CASE_RETURN_STR(eCSR_ROAM_TSM_IE_IND);
1301 CASE_RETURN_STR(eCSR_ROAM_CCKM_PREAUTH_NOTIFY);
1302 CASE_RETURN_STR(eCSR_ROAM_ESE_ADJ_AP_REPORT_IND);
1303 CASE_RETURN_STR(eCSR_ROAM_ESE_BCN_REPORT_IND);
1304#endif /* FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
1305 CASE_RETURN_STR(eCSR_ROAM_UPDATE_MAX_RATE_IND);
Sachin Ahuja3d47fcd2015-08-28 16:02:06 +05301306 CASE_RETURN_STR(eCSR_ROAM_LOST_LINK_PARAMS_IND);
Jeff Johnson295189b2012-06-20 16:38:30 -07001307 default:
1308 return "unknown";
1309 }
1310}
1311
1312const char *
1313get_eCsrRoamResult_str(eCsrRoamResult val)
1314{
1315 switch (val)
1316 {
1317 CASE_RETURN_STR(eCSR_ROAM_RESULT_NONE);
1318 CASE_RETURN_STR(eCSR_ROAM_RESULT_FAILURE);
1319 CASE_RETURN_STR(eCSR_ROAM_RESULT_ASSOCIATED);
1320 CASE_RETURN_STR(eCSR_ROAM_RESULT_NOT_ASSOCIATED);
1321 CASE_RETURN_STR(eCSR_ROAM_RESULT_MIC_FAILURE);
1322 CASE_RETURN_STR(eCSR_ROAM_RESULT_FORCED);
1323 CASE_RETURN_STR(eCSR_ROAM_RESULT_DISASSOC_IND);
1324 CASE_RETURN_STR(eCSR_ROAM_RESULT_DEAUTH_IND);
1325 CASE_RETURN_STR(eCSR_ROAM_RESULT_CAP_CHANGED);
1326 CASE_RETURN_STR(eCSR_ROAM_RESULT_IBSS_CONNECT);
1327 CASE_RETURN_STR(eCSR_ROAM_RESULT_IBSS_INACTIVE);
1328 CASE_RETURN_STR(eCSR_ROAM_RESULT_IBSS_NEW_PEER);
1329 CASE_RETURN_STR(eCSR_ROAM_RESULT_IBSS_COALESCED);
1330 default:
1331 return "unknown";
1332 }
1333}
1334
1335
1336
1337tANI_BOOLEAN csrGetBssIdBssDesc( tHalHandle hHal, tSirBssDescription *pSirBssDesc, tCsrBssid *pBssId )
1338{
Kiet Lam64c1b492013-07-12 13:56:44 +05301339 vos_mem_copy(pBssId, &pSirBssDesc->bssId[ 0 ], sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07001340 return( TRUE );
1341}
1342
1343
1344tANI_BOOLEAN csrIsBssIdEqual( tHalHandle hHal, tSirBssDescription *pSirBssDesc1, tSirBssDescription *pSirBssDesc2 )
1345{
1346 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1347 tANI_BOOLEAN fEqual = FALSE;
1348 tCsrBssid bssId1;
1349 tCsrBssid bssId2;
1350
1351 do {
1352 if ( !pSirBssDesc1 ) break;
1353 if ( !pSirBssDesc2 ) break;
1354
1355 if ( !csrGetBssIdBssDesc( pMac, pSirBssDesc1, &bssId1 ) ) break;
1356 if ( !csrGetBssIdBssDesc( pMac, pSirBssDesc2, &bssId2 ) ) break;
1357
1358 //sirCompareMacAddr
1359 fEqual = csrIsMacAddressEqual(pMac, &bssId1, &bssId2);
1360
1361 } while( 0 );
1362
1363 return( fEqual );
1364}
1365
1366tANI_BOOLEAN csrIsConnStateConnectedIbss( tpAniSirGlobal pMac, tANI_U32 sessionId )
1367{
1368 return( eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED == pMac->roam.roamSession[sessionId].connectState );
1369}
1370
1371tANI_BOOLEAN csrIsConnStateDisconnectedIbss( tpAniSirGlobal pMac, tANI_U32 sessionId )
1372{
1373 return( eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED == pMac->roam.roamSession[sessionId].connectState );
1374}
1375
1376tANI_BOOLEAN csrIsConnStateConnectedInfra( tpAniSirGlobal pMac, tANI_U32 sessionId )
1377{
1378 return( eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED == pMac->roam.roamSession[sessionId].connectState );
1379}
1380
1381tANI_BOOLEAN csrIsConnStateConnected( tpAniSirGlobal pMac, tANI_U32 sessionId )
1382{
1383 if( csrIsConnStateConnectedIbss( pMac, sessionId ) || csrIsConnStateConnectedInfra( pMac, sessionId ) || csrIsConnStateConnectedWds( pMac, sessionId) )
1384 return TRUE;
1385 else
1386 return FALSE;
1387}
1388
1389tANI_BOOLEAN csrIsConnStateInfra( tpAniSirGlobal pMac, tANI_U32 sessionId )
1390{
1391 return( csrIsConnStateConnectedInfra( pMac, sessionId ) );
1392}
1393
1394tANI_BOOLEAN csrIsConnStateIbss( tpAniSirGlobal pMac, tANI_U32 sessionId )
1395{
1396 return( csrIsConnStateConnectedIbss( pMac, sessionId ) || csrIsConnStateDisconnectedIbss( pMac, sessionId ) );
1397}
1398
1399
1400tANI_BOOLEAN csrIsConnStateConnectedWds( tpAniSirGlobal pMac, tANI_U32 sessionId )
1401{
1402 return( eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED == pMac->roam.roamSession[sessionId].connectState );
1403}
1404
Jeff Johnson295189b2012-06-20 16:38:30 -07001405tANI_BOOLEAN csrIsConnStateConnectedInfraAp( tpAniSirGlobal pMac, tANI_U32 sessionId )
1406{
1407 return( (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED == pMac->roam.roamSession[sessionId].connectState) ||
1408 (eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED == pMac->roam.roamSession[sessionId].connectState ) );
1409}
Jeff Johnson295189b2012-06-20 16:38:30 -07001410
1411tANI_BOOLEAN csrIsConnStateDisconnectedWds( tpAniSirGlobal pMac, tANI_U32 sessionId )
1412{
1413 return( eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED == pMac->roam.roamSession[sessionId].connectState );
1414}
1415
1416tANI_BOOLEAN csrIsConnStateWds( tpAniSirGlobal pMac, tANI_U32 sessionId )
1417{
1418 return( csrIsConnStateConnectedWds( pMac, sessionId ) ||
1419 csrIsConnStateDisconnectedWds( pMac, sessionId ) );
1420}
1421
Jeff Johnsone7245742012-09-05 17:12:55 -07001422tANI_BOOLEAN csrIsConnStateAp( tpAniSirGlobal pMac, tANI_U32 sessionId )
1423{
1424 tCsrRoamSession *pSession;
1425 pSession = CSR_GET_SESSION(pMac, sessionId);
1426 if (!pSession)
1427 return eANI_BOOLEAN_FALSE;
1428 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
1429 {
1430 return eANI_BOOLEAN_TRUE;
1431 }
1432 return eANI_BOOLEAN_FALSE;
1433}
1434
Jeff Johnson295189b2012-06-20 16:38:30 -07001435tANI_BOOLEAN csrIsAnySessionInConnectState( tpAniSirGlobal pMac )
1436{
1437 tANI_U32 i;
1438 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1439
1440 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1441 {
Jeff Johnsone7245742012-09-05 17:12:55 -07001442 if( CSR_IS_SESSION_VALID( pMac, i ) &&
1443 ( csrIsConnStateInfra( pMac, i )
1444 || csrIsConnStateIbss( pMac, i )
1445 || csrIsConnStateAp( pMac, i) ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001446 {
1447 fRc = eANI_BOOLEAN_TRUE;
1448 break;
1449 }
1450 }
1451
1452 return ( fRc );
1453}
1454
1455tANI_S8 csrGetInfraSessionId( tpAniSirGlobal pMac )
1456{
1457 tANI_U8 i;
1458 tANI_S8 sessionid = -1;
1459
1460 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1461 {
1462 if( CSR_IS_SESSION_VALID( pMac, i ) && csrIsConnStateInfra( pMac, i ) )
1463 {
1464 sessionid = i;
1465 break;
1466 }
1467 }
1468
1469 return ( sessionid );
1470}
1471
1472tANI_U8 csrGetInfraOperationChannel( tpAniSirGlobal pMac, tANI_U8 sessionId)
1473{
1474 tANI_U8 channel;
1475
1476 if( CSR_IS_SESSION_VALID( pMac, sessionId ))
1477 {
1478 channel = pMac->roam.roamSession[sessionId].connectedProfile.operationChannel;
1479 }
1480 else
1481 {
1482 channel = 0;
1483 }
1484 return channel;
1485}
1486
Sushant Kaushik1d732562014-05-21 14:15:37 +05301487tANI_BOOLEAN csrIsSessionClientAndConnected(tpAniSirGlobal pMac, tANI_U8 sessionId)
1488{
1489 tCsrRoamSession *pSession = NULL;
1490 if ( CSR_IS_SESSION_VALID( pMac, sessionId) && csrIsConnStateInfra( pMac, sessionId))
1491 {
1492 pSession = CSR_GET_SESSION( pMac, sessionId);
Kaushik, Sushant79901762014-08-23 17:51:02 +05301493 if (NULL != pSession->pCurRoamProfile)
Sushant Kaushik1d732562014-05-21 14:15:37 +05301494 {
Kaushik, Sushant79901762014-08-23 17:51:02 +05301495 if ((pSession->pCurRoamProfile->csrPersona == VOS_STA_MODE) ||
1496 (pSession->pCurRoamProfile->csrPersona == VOS_P2P_CLIENT_MODE))
1497 {
1498 return TRUE;
1499 }
Sushant Kaushik1d732562014-05-21 14:15:37 +05301500 }
1501 }
1502 return FALSE;
1503}
Jeff Johnson295189b2012-06-20 16:38:30 -07001504//This routine will return operating channel on FIRST BSS that is active/operating to be used for concurrency mode.
1505//If other BSS is not up or not connected it will return 0
1506
1507tANI_U8 csrGetConcurrentOperationChannel( tpAniSirGlobal pMac )
1508{
1509 tCsrRoamSession *pSession = NULL;
1510 tANI_U8 i = 0;
1511
1512 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1513 {
1514 if( CSR_IS_SESSION_VALID( pMac, i ) )
1515 {
1516 pSession = CSR_GET_SESSION( pMac, i );
1517
1518 if (NULL != pSession->pCurRoamProfile)
1519 {
1520 if (
1521 (((pSession->pCurRoamProfile->csrPersona == VOS_STA_MODE) ||
1522 (pSession->pCurRoamProfile->csrPersona == VOS_P2P_CLIENT_MODE)) &&
1523 (pSession->connectState == eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED))
1524 ||
1525 (((pSession->pCurRoamProfile->csrPersona == VOS_P2P_GO_MODE) ||
1526 (pSession->pCurRoamProfile->csrPersona == VOS_STA_SAP_MODE)) &&
1527 (pSession->connectState != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED))
1528 )
1529 return (pSession->connectedProfile.operationChannel);
1530 }
1531
1532 }
1533 }
1534 return 0;
1535}
1536
1537tANI_BOOLEAN csrIsAllSessionDisconnected( tpAniSirGlobal pMac )
1538{
1539 tANI_U32 i;
1540 tANI_BOOLEAN fRc = eANI_BOOLEAN_TRUE;
1541
1542 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1543 {
1544 if( CSR_IS_SESSION_VALID( pMac, i ) && !csrIsConnStateDisconnected( pMac, i ) )
1545 {
1546 fRc = eANI_BOOLEAN_FALSE;
1547 break;
1548 }
1549 }
1550
1551 return ( fRc );
1552}
1553
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08001554tANI_BOOLEAN csrIsStaSessionConnected( tpAniSirGlobal pMac )
1555{
1556 tANI_U32 i;
1557 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1558 tCsrRoamSession *pSession = NULL;
1559 tANI_U32 countSta = 0;
1560
1561 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1562 {
1563 if( CSR_IS_SESSION_VALID( pMac, i ) && !csrIsConnStateDisconnected( pMac, i ) )
1564 {
1565 pSession = CSR_GET_SESSION( pMac, i );
1566
1567 if (NULL != pSession->pCurRoamProfile)
1568 {
1569 if (pSession->pCurRoamProfile->csrPersona == VOS_STA_MODE) {
1570 countSta++;
1571 }
1572 }
1573 }
1574 }
1575
1576 /* return TRUE if one of the following conditions is TRUE:
1577 * - more than one STA session connected
1578 */
1579 if ( countSta > 0) {
1580 fRc = eANI_BOOLEAN_TRUE;
1581 }
1582
1583 return( fRc );
1584}
1585
1586tANI_BOOLEAN csrIsP2pSessionConnected( tpAniSirGlobal pMac )
1587{
1588 tANI_U32 i;
1589 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1590 tCsrRoamSession *pSession = NULL;
1591 tANI_U32 countP2pCli = 0;
1592 tANI_U32 countP2pGo = 0;
Kalikinkar dhara96b4e7e2014-01-16 15:19:57 -08001593 tANI_U32 countSAP = 0;
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08001594
1595 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1596 {
1597 if( CSR_IS_SESSION_VALID( pMac, i ) && !csrIsConnStateDisconnected( pMac, i ) )
1598 {
1599 pSession = CSR_GET_SESSION( pMac, i );
1600
1601 if (NULL != pSession->pCurRoamProfile)
1602 {
1603 if (pSession->pCurRoamProfile->csrPersona == VOS_P2P_CLIENT_MODE) {
1604 countP2pCli++;
1605 }
1606
1607 if (pSession->pCurRoamProfile->csrPersona == VOS_P2P_GO_MODE) {
1608 countP2pGo++;
1609 }
Kalikinkar dhara96b4e7e2014-01-16 15:19:57 -08001610
1611 if (pSession->pCurRoamProfile->csrPersona == VOS_STA_SAP_MODE) {
1612 countSAP++;
1613 }
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08001614 }
1615 }
1616 }
1617
1618 /* return TRUE if one of the following conditions is TRUE:
1619 * - at least one P2P CLI session is connected
1620 * - at least one P2P GO session is connected
1621 */
Kalikinkar dhara96b4e7e2014-01-16 15:19:57 -08001622 if ( (countP2pCli > 0) || (countP2pGo > 0 ) || (countSAP > 0 ) ) {
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08001623 fRc = eANI_BOOLEAN_TRUE;
1624 }
1625
1626 return( fRc );
1627}
1628
Madan Mohan Koyyalamudid3d22592012-09-24 14:01:29 -07001629tANI_BOOLEAN csrIsAnySessionConnected( tpAniSirGlobal pMac )
1630{
1631 tANI_U32 i, count;
1632 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1633
1634 count = 0;
1635 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1636 {
1637 if( CSR_IS_SESSION_VALID( pMac, i ) && !csrIsConnStateDisconnected( pMac, i ) )
1638 {
1639 count++;
1640 }
1641 }
1642
1643 if (count > 0)
1644 {
1645 fRc = eANI_BOOLEAN_TRUE;
1646 }
1647 return( fRc );
1648}
Jeff Johnson295189b2012-06-20 16:38:30 -07001649
1650tANI_BOOLEAN csrIsInfraConnected( tpAniSirGlobal pMac )
1651{
1652 tANI_U32 i;
1653 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1654
1655 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1656 {
1657 if( CSR_IS_SESSION_VALID( pMac, i ) && csrIsConnStateConnectedInfra( pMac, i ) )
1658 {
1659 fRc = eANI_BOOLEAN_TRUE;
1660 break;
1661 }
1662 }
1663
1664 return ( fRc );
1665}
1666
1667tANI_BOOLEAN csrIsConcurrentInfraConnected( tpAniSirGlobal pMac )
1668{
1669 tANI_U32 i, noOfConnectedInfra = 0;
1670
1671 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1672
1673 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1674 {
1675 if( CSR_IS_SESSION_VALID( pMac, i ) && csrIsConnStateConnectedInfra( pMac, i ) )
1676 {
1677 ++noOfConnectedInfra;
1678 }
1679 }
1680
1681 // More than one Infra Sta Connected
1682 if(noOfConnectedInfra > 1)
1683 {
1684 fRc = eANI_BOOLEAN_TRUE;
1685 }
1686
1687 return ( fRc );
1688}
1689
1690tANI_BOOLEAN csrIsIBSSStarted( tpAniSirGlobal pMac )
1691{
1692 tANI_U32 i;
1693 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1694
1695 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1696 {
1697 if( CSR_IS_SESSION_VALID( pMac, i ) && csrIsConnStateIbss( pMac, i ) )
1698 {
1699 fRc = eANI_BOOLEAN_TRUE;
1700 break;
1701 }
1702 }
1703
1704 return ( fRc );
1705}
1706
1707
1708tANI_BOOLEAN csrIsBTAMPStarted( tpAniSirGlobal pMac )
1709{
1710 tANI_U32 i;
1711 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1712
1713 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
1714 {
1715 if( CSR_IS_SESSION_VALID( pMac, i ) && csrIsConnStateConnectedWds( pMac, i ) )
1716 {
1717 fRc = eANI_BOOLEAN_TRUE;
1718 break;
1719 }
1720 }
1721
1722 return ( fRc );
1723}
1724
Jeff Johnsone7245742012-09-05 17:12:55 -07001725tANI_BOOLEAN csrIsConcurrentSessionRunning( tpAniSirGlobal pMac )
1726{
1727 tANI_U32 sessionId, noOfCocurrentSession = 0;
1728 eCsrConnectState connectState;
1729
1730 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1731
1732 for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
1733 {
1734 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
1735 {
1736 connectState = pMac->roam.roamSession[sessionId].connectState;
1737 if( (eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED == connectState) ||
1738 (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED == connectState) ||
1739 (eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED == connectState) )
1740 {
1741 ++noOfCocurrentSession;
1742 }
1743 }
1744 }
1745
1746 // More than one session is Up and Running
1747 if(noOfCocurrentSession > 1)
1748 {
1749 fRc = eANI_BOOLEAN_TRUE;
1750 }
1751
1752 return ( fRc );
1753}
1754
Jeff Johnsone7245742012-09-05 17:12:55 -07001755tANI_BOOLEAN csrIsInfraApStarted( tpAniSirGlobal pMac )
1756{
1757 tANI_U32 sessionId;
1758 tANI_BOOLEAN fRc = eANI_BOOLEAN_FALSE;
1759
1760 for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
1761 {
1762 if( CSR_IS_SESSION_VALID( pMac, sessionId ) && (csrIsConnStateConnectedInfraAp(pMac, sessionId)) )
1763 {
1764 fRc = eANI_BOOLEAN_TRUE;
1765 break;
1766 }
1767 }
1768
1769 return ( fRc );
1770
1771}
Jeff Johnsone7245742012-09-05 17:12:55 -07001772
Jeff Johnson295189b2012-06-20 16:38:30 -07001773tANI_BOOLEAN csrIsBTAMP( tpAniSirGlobal pMac, tANI_U32 sessionId )
1774{
1775 return ( csrIsConnStateConnectedWds( pMac, sessionId ) );
1776}
1777
1778
1779tANI_BOOLEAN csrIsConnStateDisconnected(tpAniSirGlobal pMac, tANI_U32 sessionId)
1780{
1781 return (eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED == pMac->roam.roamSession[sessionId].connectState);
1782}
1783
Jeff Johnsone7245742012-09-05 17:12:55 -07001784tANI_BOOLEAN csrIsValidMcConcurrentSession(tpAniSirGlobal pMac, tANI_U32 sessionId,
1785 tSirBssDescription *pBssDesc)
Jeff Johnson295189b2012-06-20 16:38:30 -07001786{
1787 tCsrRoamSession *pSession = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -07001788 eAniBoolean status = eANI_BOOLEAN_FALSE;
1789
Jeff Johnson295189b2012-06-20 16:38:30 -07001790 //Check for MCC support
1791 if (!pMac->roam.configParam.fenableMCCMode)
1792 {
Jeff Johnsone7245742012-09-05 17:12:55 -07001793 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07001794 }
1795
Jeff Johnsone7245742012-09-05 17:12:55 -07001796 //Validate BeaconInterval
1797 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
1798 {
1799 pSession = CSR_GET_SESSION( pMac, sessionId );
1800 if (NULL != pSession->pCurRoamProfile)
1801 {
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07001802 if (csrIsconcurrentsessionValid (pMac, sessionId,
1803 pSession->pCurRoamProfile->csrPersona)
Jeff Johnsone7245742012-09-05 17:12:55 -07001804 == eHAL_STATUS_SUCCESS )
1805 {
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07001806 if (csrValidateMCCBeaconInterval( pMac, pBssDesc->channelId,
1807 &pBssDesc->beaconInterval, sessionId,
1808 pSession->pCurRoamProfile->csrPersona)
Jeff Johnsone7245742012-09-05 17:12:55 -07001809 != eHAL_STATUS_SUCCESS)
1810 {
1811 status = eANI_BOOLEAN_FALSE;
1812 }
1813 else
1814 {
1815 status = eANI_BOOLEAN_TRUE;
1816 }
1817 }
1818 else
1819 {
1820 status = eANI_BOOLEAN_FALSE;
1821 }
1822 }
1823 }
1824 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07001825}
1826
1827static tSirMacCapabilityInfo csrGetBssCapabilities( tSirBssDescription *pSirBssDesc )
1828{
1829 tSirMacCapabilityInfo dot11Caps;
1830
1831 //tSirMacCapabilityInfo is 16-bit
1832 pal_get_U16( (tANI_U8 *)&pSirBssDesc->capabilityInfo, (tANI_U16 *)&dot11Caps );
1833
1834 return( dot11Caps );
1835}
1836
1837tANI_BOOLEAN csrIsInfraBssDesc( tSirBssDescription *pSirBssDesc )
1838{
1839 tSirMacCapabilityInfo dot11Caps = csrGetBssCapabilities( pSirBssDesc );
1840
1841 return( (tANI_BOOLEAN)dot11Caps.ess );
1842}
1843
1844
1845tANI_BOOLEAN csrIsIbssBssDesc( tSirBssDescription *pSirBssDesc )
1846{
1847 tSirMacCapabilityInfo dot11Caps = csrGetBssCapabilities( pSirBssDesc );
1848
1849 return( (tANI_BOOLEAN)dot11Caps.ibss );
1850}
1851
1852tANI_BOOLEAN csrIsQoSBssDesc( tSirBssDescription *pSirBssDesc )
1853{
1854 tSirMacCapabilityInfo dot11Caps = csrGetBssCapabilities( pSirBssDesc );
1855
1856 return( (tANI_BOOLEAN)dot11Caps.qos );
1857}
1858
1859tANI_BOOLEAN csrIsPrivacy( tSirBssDescription *pSirBssDesc )
1860{
1861 tSirMacCapabilityInfo dot11Caps = csrGetBssCapabilities( pSirBssDesc );
1862
1863 return( (tANI_BOOLEAN)dot11Caps.privacy );
1864}
1865
1866
1867tANI_BOOLEAN csrIs11dSupported(tpAniSirGlobal pMac)
1868{
1869 return(pMac->roam.configParam.Is11dSupportEnabled);
1870}
1871
1872
1873tANI_BOOLEAN csrIs11hSupported(tpAniSirGlobal pMac)
1874{
1875 return(pMac->roam.configParam.Is11hSupportEnabled);
1876}
1877
1878
1879tANI_BOOLEAN csrIs11eSupported(tpAniSirGlobal pMac)
1880{
1881 return(pMac->roam.configParam.Is11eSupportEnabled);
1882}
1883
1884tANI_BOOLEAN csrIsMCCSupported ( tpAniSirGlobal pMac )
1885{
1886 return(pMac->roam.configParam.fenableMCCMode);
1887
1888}
1889
1890tANI_BOOLEAN csrIsWmmSupported(tpAniSirGlobal pMac)
1891{
1892 if(eCsrRoamWmmNoQos == pMac->roam.configParam.WMMSupportMode)
1893 {
1894 return eANI_BOOLEAN_FALSE;
1895 }
1896 else
1897 {
1898 return eANI_BOOLEAN_TRUE;
1899 }
1900}
1901
1902
1903
1904
1905//pIes is the IEs for pSirBssDesc2
1906tANI_BOOLEAN csrIsSsidEqual( tHalHandle hHal, tSirBssDescription *pSirBssDesc1,
1907 tSirBssDescription *pSirBssDesc2, tDot11fBeaconIEs *pIes2 )
1908{
1909 tANI_BOOLEAN fEqual = FALSE;
1910 tSirMacSSid Ssid1, Ssid2;
1911 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1912 tDot11fBeaconIEs *pIes1 = NULL;
1913 tDot11fBeaconIEs *pIesLocal = pIes2;
1914
1915 do {
1916 if( ( NULL == pSirBssDesc1 ) || ( NULL == pSirBssDesc2 ) ) break;
1917 if( !pIesLocal && !HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc2, &pIesLocal)) )
1918 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08001919 smsLog(pMac, LOGE, FL(" fail to parse IEs"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001920 break;
1921 }
1922 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc1, &pIes1)))
1923 {
1924 break;
1925 }
1926 if( ( !pIes1->SSID.present ) || ( !pIesLocal->SSID.present ) ) break;
1927 if ( pIes1->SSID.num_ssid != pIesLocal->SSID.num_ssid ) break;
Kiet Lam64c1b492013-07-12 13:56:44 +05301928 vos_mem_copy(Ssid1.ssId, pIes1->SSID.ssid, pIes1->SSID.num_ssid);
1929 vos_mem_copy(Ssid2.ssId, pIesLocal->SSID.ssid, pIesLocal->SSID.num_ssid);
Jeff Johnson295189b2012-06-20 16:38:30 -07001930
Kiet Lam64c1b492013-07-12 13:56:44 +05301931 fEqual = vos_mem_compare(Ssid1.ssId, Ssid2.ssId, pIesLocal->SSID.num_ssid);
Jeff Johnson295189b2012-06-20 16:38:30 -07001932
1933 } while( 0 );
1934 if(pIes1)
1935 {
Kiet Lam64c1b492013-07-12 13:56:44 +05301936 vos_mem_free(pIes1);
Jeff Johnson295189b2012-06-20 16:38:30 -07001937 }
1938 if( pIesLocal && !pIes2 )
1939 {
Kiet Lam64c1b492013-07-12 13:56:44 +05301940 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07001941 }
1942
1943 return( fEqual );
1944}
1945
1946tANI_BOOLEAN csrIsAniWmeSupported(tDot11fIEAirgo *pIeAirgo)
1947{
1948 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
1949
1950 if(pIeAirgo && pIeAirgo->present && pIeAirgo->PropCapability.present)
1951 {
1952 fRet = (tANI_BOOLEAN)(PROP_CAPABILITY_GET( WME, pIeAirgo->PropCapability.capability ));
1953 }
1954
1955 return fRet;
1956}
1957
1958
1959
1960
1961//pIes can be passed in as NULL if the caller doesn't have one prepared
1962tANI_BOOLEAN csrIsBssDescriptionWme( tHalHandle hHal, tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes )
1963{
1964 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1965 // Assume that WME is found...
1966 tANI_BOOLEAN fWme = TRUE;
1967 tDot11fBeaconIEs *pIesTemp = pIes;
1968
1969 do
1970 {
1971 if(pIesTemp == NULL)
1972 {
1973 if( !HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesTemp)) )
1974 {
1975 fWme = FALSE;
1976 break;
1977 }
1978 }
1979 // if the AirgoProprietary indicator is found, then WME is supported...
1980 if ( csrIsAniWmeSupported(&pIesTemp->Airgo) ) break;
1981 // if the Wme Info IE is found, then WME is supported...
1982 if ( CSR_IS_QOS_BSS(pIesTemp) ) break;
1983 // if none of these are found, then WME is NOT supported...
1984 fWme = FALSE;
1985 } while( 0 );
1986 if( !csrIsWmmSupported( pMac ) && fWme)
1987 {
1988 if( !pIesTemp->HTCaps.present )
1989 {
1990 fWme = FALSE;
1991 }
1992 }
1993 if( ( pIes == NULL ) && ( NULL != pIesTemp ) )
1994 {
1995 //we allocate memory here so free it before returning
Kiet Lam64c1b492013-07-12 13:56:44 +05301996 vos_mem_free(pIesTemp);
Jeff Johnson295189b2012-06-20 16:38:30 -07001997 }
1998
1999 return( fWme );
2000}
2001
2002tANI_BOOLEAN csrIsHcfEnabled( tDot11fIEAirgo *pIeAirgo )
2003{
2004 tANI_BOOLEAN fHcfSupported = FALSE;
2005
2006 fHcfSupported = ((tANI_BOOLEAN)(PROP_CAPABILITY_GET( WME, pIeAirgo->PropCapability.capability )) ||
2007 (pIeAirgo->present && pIeAirgo->HCF.present && pIeAirgo->HCF.enabled));
2008
2009 return( fHcfSupported );
2010}
2011
2012
2013eCsrMediaAccessType csrGetQoSFromBssDesc( tHalHandle hHal, tSirBssDescription *pSirBssDesc,
2014 tDot11fBeaconIEs *pIes )
2015{
2016 eCsrMediaAccessType qosType = eCSR_MEDIUM_ACCESS_DCF;
2017
Jeff Johnson295189b2012-06-20 16:38:30 -07002018 VOS_ASSERT( pIes != NULL );
Jeff Johnson295189b2012-06-20 16:38:30 -07002019
2020 do
2021 {
2022 // if we find WMM in the Bss Description, then we let this
2023 // override and use WMM.
2024 if ( csrIsBssDescriptionWme( hHal, pSirBssDesc, pIes ) )
2025 {
2026 qosType = eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP;
2027 }
2028 else
2029 {
2030 // if the QoS bit is on, then the AP is advertising 11E QoS...
2031 if ( csrIsQoSBssDesc( pSirBssDesc ) )
2032 {
2033 // which could be HCF or eDCF.
2034 if ( csrIsHcfEnabled( &pIes->Airgo ) )
2035 {
2036 qosType = eCSR_MEDIUM_ACCESS_11e_HCF;
2037 }
2038 else
2039 {
2040 qosType = eCSR_MEDIUM_ACCESS_11e_eDCF;
2041 }
2042 }
2043 else
2044 {
2045 qosType = eCSR_MEDIUM_ACCESS_DCF;
2046 }
2047 // scale back based on the types turned on for the adapter...
2048 if ( eCSR_MEDIUM_ACCESS_11e_eDCF == qosType && !csrIs11eSupported( hHal ) )
2049 {
2050 qosType = eCSR_MEDIUM_ACCESS_DCF;
2051 }
2052 }
2053
2054 } while(0);
2055
2056 return( qosType );
2057}
2058
2059
2060
2061
2062//Caller allocates memory for pIEStruct
2063eHalStatus csrParseBssDescriptionIEs(tHalHandle hHal, tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIEStruct)
2064{
2065 eHalStatus status = eHAL_STATUS_FAILURE;
2066 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
Abhishek Singhbad2b322016-10-21 11:22:33 +05302067 int ieLen = (int)GET_IE_LEN_IN_BSS(pBssDesc->length);
Jeff Johnson295189b2012-06-20 16:38:30 -07002068
2069 if(ieLen > 0 && pIEStruct)
2070 {
2071 if(!DOT11F_FAILED(dot11fUnpackBeaconIEs( pMac, (tANI_U8 *)pBssDesc->ieFields, ieLen, pIEStruct )))
2072 {
2073 status = eHAL_STATUS_SUCCESS;
2074 }
2075 }
2076
2077 return (status);
2078}
2079
2080
2081//This function will allocate memory for the parsed IEs to the caller. Caller must free the memory
2082//after it is done with the data only if this function succeeds
2083eHalStatus csrGetParsedBssDescriptionIEs(tHalHandle hHal, tSirBssDescription *pBssDesc, tDot11fBeaconIEs **ppIEStruct)
2084{
2085 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
2086 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
2087
2088 if(pBssDesc && ppIEStruct)
2089 {
Kiet Lam64c1b492013-07-12 13:56:44 +05302090 *ppIEStruct = vos_mem_malloc(sizeof(tDot11fBeaconIEs));
2091 if ( (*ppIEStruct) != NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07002092 {
Kiet Lam64c1b492013-07-12 13:56:44 +05302093 vos_mem_set((void *)*ppIEStruct, sizeof(tDot11fBeaconIEs), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002094 status = csrParseBssDescriptionIEs(hHal, pBssDesc, *ppIEStruct);
2095 if(!HAL_STATUS_SUCCESS(status))
2096 {
Kiet Lam64c1b492013-07-12 13:56:44 +05302097 vos_mem_free(*ppIEStruct);
Jeff Johnson295189b2012-06-20 16:38:30 -07002098 *ppIEStruct = NULL;
2099 }
2100 }
2101 else
2102 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002103 smsLog( pMac, LOGE, FL(" failed to allocate memory") );
Jeff Johnson295189b2012-06-20 16:38:30 -07002104 VOS_ASSERT( 0 );
Kiet Lam64c1b492013-07-12 13:56:44 +05302105 return eHAL_STATUS_FAILURE;
2106 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002107 }
2108
2109 return (status);
2110}
2111
Siddharth Bhal64246172015-02-27 01:04:37 +05302112eHalStatus csrProcessGetFrameLogCommand( tpAniSirGlobal pMac,
2113 tSmeCmd *pCommand )
2114{
2115 tAniGetFrameLogReq *pMsg;
2116 tANI_U16 msgLen;
2117 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07002118
Siddharth Bhal64246172015-02-27 01:04:37 +05302119 msgLen = sizeof(tAniGetFrameLogReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002120
Siddharth Bhal64246172015-02-27 01:04:37 +05302121 if ( NULL == pCommand )
2122 {
2123 smsLog( pMac, LOGE, FL("cannot process. cmd is null") );
2124 return eHAL_STATUS_FAILURE;
2125 }
2126
2127 pMsg = vos_mem_malloc(msgLen);
2128 if ( NULL == pMsg )
2129 {
2130 smsLog( pMac, LOGE, FL("fail to allocate memory") );
2131 return eHAL_STATUS_FAILURE;
2132 }
2133
2134 pMsg->msgType= pal_cpu_to_be16((tANI_U16)WDA_GET_FRAME_LOG_REQ);
2135 pMsg->msgLen= pal_cpu_to_be16(msgLen);
2136
Siddharth Bhal64246172015-02-27 01:04:37 +05302137 pMsg->getFrameLogCmdFlag = pCommand->u.getFramelogCmd.getFrameLogCmdFlag;
2138
2139 status = palSendMBMessage(pMac->hHdd, pMsg);
2140
2141 return( status );
2142}
Jeff Johnson295189b2012-06-20 16:38:30 -07002143
2144tANI_BOOLEAN csrIsNULLSSID( tANI_U8 *pBssSsid, tANI_U8 len )
2145{
2146 tANI_BOOLEAN fNullSsid = FALSE;
2147
2148 tANI_U32 SsidLength;
2149 tANI_U8 *pSsidStr;
2150
2151 do
2152 {
2153 if ( 0 == len )
2154 {
2155 fNullSsid = TRUE;
2156 break;
2157 }
2158
2159 //Consider 0 or space for hidden SSID
2160 if ( 0 == pBssSsid[0] )
2161 {
2162 fNullSsid = TRUE;
2163 break;
2164 }
2165
2166 SsidLength = len;
2167 pSsidStr = pBssSsid;
2168
2169 while ( SsidLength )
2170 {
2171 if( *pSsidStr )
2172 break;
2173
2174 pSsidStr++;
2175 SsidLength--;
2176 }
2177
2178 if( 0 == SsidLength )
2179 {
2180 fNullSsid = TRUE;
2181 break;
2182 }
2183 }
2184 while( 0 );
2185
2186 return fNullSsid;
2187}
2188
2189
2190tANI_U32 csrGetFragThresh( tHalHandle hHal )
2191{
2192 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
2193
2194 return pMac->roam.configParam.FragmentationThreshold;
2195}
2196
2197tANI_U32 csrGetRTSThresh( tHalHandle hHal )
2198{
2199 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
2200
2201 return pMac->roam.configParam.RTSThreshold;
2202}
2203
2204eCsrPhyMode csrTranslateToPhyModeFromBssDesc( tSirBssDescription *pSirBssDesc )
2205{
2206 eCsrPhyMode phyMode;
2207
2208 switch ( pSirBssDesc->nwType )
2209 {
2210 case eSIR_11A_NW_TYPE:
2211 phyMode = eCSR_DOT11_MODE_11a;
2212 break;
2213
2214 case eSIR_11B_NW_TYPE:
2215 phyMode = eCSR_DOT11_MODE_11b;
2216 break;
2217
2218 case eSIR_11G_NW_TYPE:
2219 phyMode = eCSR_DOT11_MODE_11g;
2220 break;
2221
2222 case eSIR_11N_NW_TYPE:
Jeff Johnson295189b2012-06-20 16:38:30 -07002223 phyMode = eCSR_DOT11_MODE_11n;
2224 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07002225#ifdef WLAN_FEATURE_11AC
2226 case eSIR_11AC_NW_TYPE:
2227 default:
2228 phyMode = eCSR_DOT11_MODE_11ac;
2229#else
2230 default:
2231 phyMode = eCSR_DOT11_MODE_11n;
2232#endif
2233 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002234 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002235 return( phyMode );
2236}
2237
2238
2239tANI_U32 csrTranslateToWNICfgDot11Mode(tpAniSirGlobal pMac, eCsrCfgDot11Mode csrDot11Mode)
2240{
2241 tANI_U32 ret;
2242
2243 switch(csrDot11Mode)
2244 {
2245 case eCSR_CFG_DOT11_MODE_AUTO:
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002246 smsLog(pMac, LOGW, FL(" Warning: sees eCSR_CFG_DOT11_MODE_AUTO "));
Jeff Johnson295189b2012-06-20 16:38:30 -07002247 //We cannot decide until now.
2248 if(pMac->roam.configParam.ProprietaryRatesEnabled)
2249 {
2250 ret = WNI_CFG_DOT11_MODE_TAURUS;
2251 }
2252 else
2253 {
Mukul Sharma45063942015-04-01 20:07:59 +05302254#ifdef WLAN_FEATURE_11AC
2255 if ( IS_FEATURE_SUPPORTED_BY_DRIVER(DOT11AC) &&
2256 IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
2257 ret = WNI_CFG_DOT11_MODE_11AC;
2258 else
2259 ret = WNI_CFG_DOT11_MODE_11N;
2260#else
2261 ret = WNI_CFG_DOT11_MODE_11N;
2262#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002263 }
2264 break;
2265 case eCSR_CFG_DOT11_MODE_TAURUS:
2266 ret = WNI_CFG_DOT11_MODE_TAURUS;
2267 break;
2268 case eCSR_CFG_DOT11_MODE_11A:
2269 ret = WNI_CFG_DOT11_MODE_11A;
2270 break;
2271 case eCSR_CFG_DOT11_MODE_11B:
2272 ret = WNI_CFG_DOT11_MODE_11B;
2273 break;
2274 case eCSR_CFG_DOT11_MODE_11G:
2275 ret = WNI_CFG_DOT11_MODE_11G;
2276 break;
2277 case eCSR_CFG_DOT11_MODE_11N:
2278 ret = WNI_CFG_DOT11_MODE_11N;
2279 break;
2280 case eCSR_CFG_DOT11_MODE_POLARIS:
2281 ret = WNI_CFG_DOT11_MODE_POLARIS;
2282 break;
2283 case eCSR_CFG_DOT11_MODE_TITAN:
2284 ret = WNI_CFG_DOT11_MODE_TITAN;
2285 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002286 case eCSR_CFG_DOT11_MODE_11G_ONLY:
Mukul Sharma45063942015-04-01 20:07:59 +05302287 ret = WNI_CFG_DOT11_MODE_11G_ONLY;
2288 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002289 case eCSR_CFG_DOT11_MODE_11N_ONLY:
Mukul Sharma45063942015-04-01 20:07:59 +05302290 ret = WNI_CFG_DOT11_MODE_11N_ONLY;
2291 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07002292
2293#ifdef WLAN_FEATURE_11AC
Mukul Sharma45063942015-04-01 20:07:59 +05302294 case eCSR_CFG_DOT11_MODE_11AC_ONLY:
2295 if ( IS_FEATURE_SUPPORTED_BY_DRIVER(DOT11AC) &&
2296 IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
2297 ret = WNI_CFG_DOT11_MODE_11AC_ONLY;
2298 else
2299 ret = WNI_CFG_DOT11_MODE_11N;
Jeff Johnsone7245742012-09-05 17:12:55 -07002300 break;
Mukul Sharma45063942015-04-01 20:07:59 +05302301 case eCSR_CFG_DOT11_MODE_11AC:
2302 if ( IS_FEATURE_SUPPORTED_BY_DRIVER(DOT11AC) &&
2303 IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
2304 ret = WNI_CFG_DOT11_MODE_11AC;
2305 else
2306 ret = WNI_CFG_DOT11_MODE_11N;
2307 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07002308#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002309 default:
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002310 smsLog(pMac, LOGW, FL("doesn't expect %d as csrDo11Mode"), csrDot11Mode);
Jeff Johnson295189b2012-06-20 16:38:30 -07002311 if(eCSR_BAND_24 == pMac->roam.configParam.eBand)
2312 {
2313 ret = WNI_CFG_DOT11_MODE_11G;
2314 }
2315 else
2316 {
2317 ret = WNI_CFG_DOT11_MODE_11A;
2318 }
2319 break;
2320 }
2321
2322 return (ret);
2323}
2324
2325
2326//This function should only return the super set of supported modes. 11n implies 11b/g/a/n.
2327eHalStatus csrGetPhyModeFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBSSDescription,
2328 eCsrPhyMode *pPhyMode, tDot11fBeaconIEs *pIes)
2329{
2330 eHalStatus status = eHAL_STATUS_SUCCESS;
2331 eCsrPhyMode phyMode = csrTranslateToPhyModeFromBssDesc(pBSSDescription);
2332
2333 if( pIes )
2334 {
2335 if(pIes->Airgo.present)
2336 {
2337 if(pIes->Airgo.PropCapability.present)
2338 {
2339 if( PROP_CAPABILITY_GET( TAURUS, pIes->Airgo.PropCapability.capability ))
2340 {
2341 phyMode = eCSR_DOT11_MODE_TAURUS;
2342 }
Krishna Kumaar Natarajan025a8602015-08-04 16:31:36 +05302343 }
2344 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002345 if(pIes->HTCaps.present && (eCSR_DOT11_MODE_TAURUS != phyMode))
2346 {
2347 phyMode = eCSR_DOT11_MODE_11n;
Jeff Johnsone7245742012-09-05 17:12:55 -07002348#ifdef WLAN_FEATURE_11AC
Kanchanapally, Vidyullatha3f3b6542015-08-21 14:38:49 +05302349 if (IS_BSS_VHT_CAPABLE(pIes->VHTCaps))
Krishna Kumaar Natarajan025a8602015-08-04 16:31:36 +05302350 {
2351 phyMode = eCSR_DOT11_MODE_11ac;
2352 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002353#endif
Krishna Kumaar Natarajan025a8602015-08-04 16:31:36 +05302354 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002355 *pPhyMode = phyMode;
2356 }
2357
2358 return (status);
2359
2360}
2361
2362
2363//This function returns the correct eCSR_CFG_DOT11_MODE is the two phyModes matches
2364//bssPhyMode is the mode derived from the BSS description
2365//f5GhzBand is derived from the channel id of BSS description
2366tANI_BOOLEAN csrGetPhyModeInUse( eCsrPhyMode phyModeIn, eCsrPhyMode bssPhyMode, tANI_BOOLEAN f5GhzBand,
2367 eCsrCfgDot11Mode *pCfgDot11ModeToUse )
2368{
2369 tANI_BOOLEAN fMatch = FALSE;
2370 eCsrCfgDot11Mode cfgDot11Mode;
2371
2372 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N; // to suppress compiler warning
2373
2374 switch( phyModeIn )
2375 {
2376 case eCSR_DOT11_MODE_abg: //11a or 11b or 11g
2377 if( f5GhzBand )
2378 {
2379 fMatch = TRUE;
2380 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2381 }
2382 else if( eCSR_DOT11_MODE_11b == bssPhyMode )
2383 {
2384 fMatch = TRUE;
2385 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2386 }
2387 else
2388 {
2389 fMatch = TRUE;
2390 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2391 }
2392 break;
2393
2394 case eCSR_DOT11_MODE_11a: //11a
2395 if( f5GhzBand )
2396 {
2397 fMatch = TRUE;
2398 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2399 }
2400 break;
2401
2402 case eCSR_DOT11_MODE_11a_ONLY: //11a
2403 if( eCSR_DOT11_MODE_11a == bssPhyMode )
2404 {
2405 fMatch = TRUE;
2406 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2407 }
2408 break;
2409
2410 case eCSR_DOT11_MODE_11g:
2411 if(!f5GhzBand)
2412 {
2413 if( eCSR_DOT11_MODE_11b == bssPhyMode )
2414 {
2415 fMatch = TRUE;
2416 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2417 }
2418 else
2419 {
2420 fMatch = TRUE;
2421 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2422 }
2423 }
2424 break;
2425
2426 case eCSR_DOT11_MODE_11g_ONLY:
2427 if( eCSR_DOT11_MODE_11g == bssPhyMode )
2428 {
2429 fMatch = TRUE;
2430 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2431 }
2432 break;
2433
2434 case eCSR_DOT11_MODE_11b:
2435 if( !f5GhzBand )
2436 {
2437 fMatch = TRUE;
2438 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2439 }
2440 break;
2441
2442 case eCSR_DOT11_MODE_11b_ONLY:
2443 if( eCSR_DOT11_MODE_11b == bssPhyMode )
2444 {
2445 fMatch = TRUE;
2446 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2447 }
2448 break;
2449
2450 case eCSR_DOT11_MODE_11n:
2451 fMatch = TRUE;
2452 switch(bssPhyMode)
2453 {
2454 case eCSR_DOT11_MODE_11g:
2455 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2456 break;
2457 case eCSR_DOT11_MODE_11b:
2458 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2459 break;
2460 case eCSR_DOT11_MODE_11a:
2461 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2462 break;
2463 case eCSR_DOT11_MODE_11n:
Jeff Johnsone7245742012-09-05 17:12:55 -07002464#ifdef WLAN_FEATURE_11AC
2465 case eCSR_DOT11_MODE_11ac:
2466#endif
2467 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
2468 break;
2469
Jeff Johnson295189b2012-06-20 16:38:30 -07002470 case eCSR_DOT11_MODE_TAURUS:
2471 default:
Jeff Johnsone7245742012-09-05 17:12:55 -07002472#ifdef WLAN_FEATURE_11AC
2473 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
2474#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002475 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
Jeff Johnsone7245742012-09-05 17:12:55 -07002476#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002477 break;
2478 }
2479 break;
2480
2481 case eCSR_DOT11_MODE_11n_ONLY:
2482 if((eCSR_DOT11_MODE_11n == bssPhyMode) || (eCSR_DOT11_MODE_TAURUS == bssPhyMode))
2483 {
2484 fMatch = TRUE;
2485 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
Jeff Johnsone7245742012-09-05 17:12:55 -07002486
2487 }
2488
2489 break;
2490#ifdef WLAN_FEATURE_11AC
2491 case eCSR_DOT11_MODE_11ac:
2492 fMatch = TRUE;
2493 switch(bssPhyMode)
2494 {
2495 case eCSR_DOT11_MODE_11g:
2496 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2497 break;
2498 case eCSR_DOT11_MODE_11b:
2499 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2500 break;
2501 case eCSR_DOT11_MODE_11a:
2502 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2503 break;
2504 case eCSR_DOT11_MODE_11n:
2505 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
2506 break;
2507 case eCSR_DOT11_MODE_11ac:
2508 case eCSR_DOT11_MODE_TAURUS:
2509 default:
2510 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
2511 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002512 }
2513 break;
2514
Jeff Johnsone7245742012-09-05 17:12:55 -07002515 case eCSR_DOT11_MODE_11ac_ONLY:
2516 if((eCSR_DOT11_MODE_11ac == bssPhyMode) || (eCSR_DOT11_MODE_TAURUS == bssPhyMode))
2517 {
2518 fMatch = TRUE;
2519 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
2520 }
2521 break;
2522#endif
2523
Jeff Johnson295189b2012-06-20 16:38:30 -07002524 case eCSR_DOT11_MODE_TAURUS:
2525 default:
2526 fMatch = TRUE;
2527 switch(bssPhyMode)
2528 {
2529 case eCSR_DOT11_MODE_11g:
2530 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2531 break;
2532 case eCSR_DOT11_MODE_11b:
2533 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2534 break;
2535 case eCSR_DOT11_MODE_11a:
2536 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2537 break;
2538 case eCSR_DOT11_MODE_11n:
2539 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
2540 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07002541#ifdef WLAN_FEATURE_11AC
2542 case eCSR_DOT11_MODE_11ac:
2543 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
2544 break;
2545#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002546 case eCSR_DOT11_MODE_TAURUS:
2547 default:
2548 cfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
2549 break;
2550 }
2551 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002552 }
2553
2554 if ( fMatch && pCfgDot11ModeToUse )
2555 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002556#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudief5dd972012-10-11 15:06:09 -07002557 if(cfgDot11Mode == eCSR_CFG_DOT11_MODE_11AC && (!IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)))
Jeff Johnsone7245742012-09-05 17:12:55 -07002558 {
2559 *pCfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
2560 }
2561 else
2562#endif
2563 {
2564 *pCfgDot11ModeToUse = cfgDot11Mode;
2565 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002566 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002567 return( fMatch );
2568}
2569
2570
2571//This function decides whether the one of the bit of phyMode is matching the mode in the BSS and allowed by the user
2572//setting, pMac->roam.configParam.uCfgDot11Mode. It returns the mode that fits the criteria.
2573tANI_BOOLEAN csrIsPhyModeMatch( tpAniSirGlobal pMac, tANI_U32 phyMode,
2574 tSirBssDescription *pSirBssDesc, tCsrRoamProfile *pProfile,
2575 eCsrCfgDot11Mode *pReturnCfgDot11Mode,
2576 tDot11fBeaconIEs *pIes)
2577{
2578 tANI_BOOLEAN fMatch = FALSE;
2579 eCsrPhyMode phyModeInBssDesc, phyMode2;
2580 eCsrCfgDot11Mode cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_TAURUS;
2581 tANI_U32 bitMask, loopCount;
2582
2583 if(HAL_STATUS_SUCCESS(csrGetPhyModeFromBss(pMac, pSirBssDesc, &phyModeInBssDesc, pIes )))
2584 {
2585 //In case some change change eCSR_DOT11_MODE_TAURUS to non-0
2586 if ( (0 == phyMode) || (eCSR_DOT11_MODE_AUTO & phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode))
2587 {
2588 //Taurus means anything
2589 if ( eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode )
2590 {
2591 phyMode = eCSR_DOT11_MODE_abg;
2592 }
2593 else if(eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode)
2594 {
2595 if(pMac->roam.configParam.ProprietaryRatesEnabled)
2596 {
2597 phyMode = eCSR_DOT11_MODE_TAURUS;
2598 }
2599 else
2600 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002601
2602#ifdef WLAN_FEATURE_11AC
2603 phyMode = eCSR_DOT11_MODE_11ac;
2604#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002605 phyMode = eCSR_DOT11_MODE_11n;
Jeff Johnsone7245742012-09-05 17:12:55 -07002606#endif
2607
Jeff Johnson295189b2012-06-20 16:38:30 -07002608 }
2609 }
2610 else
2611 {
2612 //user's pick
2613 phyMode = pMac->roam.configParam.phyMode;
2614 }
2615 }
2616 if ( (0 == phyMode) || (eCSR_DOT11_MODE_AUTO & phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode) )
2617 {
2618 if(0 != phyMode)
2619 {
2620 if(eCSR_DOT11_MODE_AUTO & phyMode)
2621 {
2622 phyMode2 = eCSR_DOT11_MODE_AUTO & phyMode;
2623 }
2624 else
2625 {
2626 phyMode2 = eCSR_DOT11_MODE_TAURUS & phyMode;
2627 }
2628 }
2629 else
2630 {
2631 phyMode2 = phyMode;
2632 }
2633 fMatch = csrGetPhyModeInUse( phyMode2, phyModeInBssDesc, CSR_IS_CHANNEL_5GHZ(pSirBssDesc->channelId),
2634 &cfgDot11ModeToUse );
2635 }
2636 else
2637 {
2638 bitMask = 1;
2639 loopCount = 0;
2640 while(loopCount < eCSR_NUM_PHY_MODE)
2641 {
2642 if(0 != ( phyMode2 = (phyMode & (bitMask << loopCount++)) ))
2643 {
2644 fMatch = csrGetPhyModeInUse( phyMode2, phyModeInBssDesc, CSR_IS_CHANNEL_5GHZ(pSirBssDesc->channelId),
2645 &cfgDot11ModeToUse );
2646 if(fMatch) break;
2647 }
2648 }
2649 }
2650 if ( fMatch && pReturnCfgDot11Mode )
2651 {
2652 if( pProfile )
2653 {
2654 /* IEEE 11n spec (8.4.3): HT STA shall eliminate TKIP as a
2655 * choice for the pairwise cipher suite if CCMP is advertised
2656 * by the AP or if the AP included an HT capabilities element
2657 * in its Beacons and Probe Response.
2658 */
2659 if( (!CSR_IS_11n_ALLOWED( pProfile->negotiatedUCEncryptionType )) &&
2660 ((eCSR_CFG_DOT11_MODE_11N == cfgDot11ModeToUse) ||
Jeff Johnsone7245742012-09-05 17:12:55 -07002661#ifdef WLAN_FEATURE_11AC
2662 (eCSR_CFG_DOT11_MODE_11AC == cfgDot11ModeToUse) ||
2663#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002664 (eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11ModeToUse)) )
2665 {
2666 //We cannot do 11n here
2667 if( !CSR_IS_CHANNEL_5GHZ(pSirBssDesc->channelId) )
2668 {
2669 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11G;
2670 }
2671 else
2672 {
2673 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11A;
2674 }
2675 }
2676 }
2677 *pReturnCfgDot11Mode = cfgDot11ModeToUse;
2678 }
2679 }
2680
2681 return( fMatch );
2682}
2683
2684
2685eCsrCfgDot11Mode csrFindBestPhyMode( tpAniSirGlobal pMac, tANI_U32 phyMode )
2686{
2687 eCsrCfgDot11Mode cfgDot11ModeToUse;
2688 eCsrBand eBand = pMac->roam.configParam.eBand;
2689
Jeff Johnsone7245742012-09-05 17:12:55 -07002690
Madan Mohan Koyyalamudi0dae8812013-07-15 19:22:49 +05302691 if ((0 == phyMode) ||
Jeff Johnsone7245742012-09-05 17:12:55 -07002692#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudi0dae8812013-07-15 19:22:49 +05302693 (eCSR_DOT11_MODE_11ac & phyMode) ||
Jeff Johnsone7245742012-09-05 17:12:55 -07002694#endif
Madan Mohan Koyyalamudi0dae8812013-07-15 19:22:49 +05302695 (eCSR_DOT11_MODE_AUTO & phyMode))
Jeff Johnson295189b2012-06-20 16:38:30 -07002696 {
Madan Mohan Koyyalamudi0dae8812013-07-15 19:22:49 +05302697#ifdef WLAN_FEATURE_11AC
2698 if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
2699 {
2700 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11AC;
2701 }
2702 else
2703#endif
2704 {
2705 /* Default to 11N mode if user has configured 11ac mode
2706 * and FW doesn't supports 11ac mode .
2707 */
2708 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
2709 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002710 }
2711 else
2712 {
2713 if( ( eCSR_DOT11_MODE_11n | eCSR_DOT11_MODE_11n_ONLY ) & phyMode )
2714 {
2715 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
2716 }
2717 else if ( eCSR_DOT11_MODE_abg & phyMode )
2718 {
2719 if( eCSR_BAND_24 != eBand )
2720 {
2721 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11A;
2722 }
2723 else
2724 {
2725 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11G;
2726 }
2727 }
2728 else if( ( eCSR_DOT11_MODE_11a | eCSR_DOT11_MODE_11a_ONLY ) & phyMode )
2729 {
2730 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11A;
2731 }
2732 else if( ( eCSR_DOT11_MODE_11g | eCSR_DOT11_MODE_11g_ONLY ) & phyMode )
2733 {
2734 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11G;
2735 }
2736 else
2737 {
2738 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11B;
2739 }
2740 }
2741
2742 return ( cfgDot11ModeToUse );
2743}
2744
2745
2746
2747
2748tANI_U32 csrGet11hPowerConstraint( tHalHandle hHal, tDot11fIEPowerConstraints *pPowerConstraint )
2749{
2750 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
2751 tANI_U32 localPowerConstraint = 0;
2752
2753 // check if .11h support is enabled, if not, the power constraint is 0.
2754 if(pMac->roam.configParam.Is11hSupportEnabled && pPowerConstraint->present)
2755 {
2756 localPowerConstraint = pPowerConstraint->localPowerConstraints;
2757 }
2758
2759 return( localPowerConstraint );
2760}
2761
2762
2763tANI_BOOLEAN csrIsProfileWpa( tCsrRoamProfile *pProfile )
2764{
2765 tANI_BOOLEAN fWpaProfile = FALSE;
2766
2767 switch ( pProfile->negotiatedAuthType )
2768 {
2769 case eCSR_AUTH_TYPE_WPA:
2770 case eCSR_AUTH_TYPE_WPA_PSK:
2771 case eCSR_AUTH_TYPE_WPA_NONE:
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08002772#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07002773 case eCSR_AUTH_TYPE_CCKM_WPA:
2774#endif
2775 fWpaProfile = TRUE;
2776 break;
2777
2778 default:
2779 fWpaProfile = FALSE;
2780 break;
2781 }
2782
2783 if ( fWpaProfile )
2784 {
2785 switch ( pProfile->negotiatedUCEncryptionType )
2786 {
2787 case eCSR_ENCRYPT_TYPE_WEP40:
2788 case eCSR_ENCRYPT_TYPE_WEP104:
2789 case eCSR_ENCRYPT_TYPE_TKIP:
2790 case eCSR_ENCRYPT_TYPE_AES:
2791 fWpaProfile = TRUE;
2792 break;
2793
2794 default:
2795 fWpaProfile = FALSE;
2796 break;
2797 }
2798 }
2799 return( fWpaProfile );
2800}
2801
2802tANI_BOOLEAN csrIsProfileRSN( tCsrRoamProfile *pProfile )
2803{
2804 tANI_BOOLEAN fRSNProfile = FALSE;
2805
2806 switch ( pProfile->negotiatedAuthType )
2807 {
2808 case eCSR_AUTH_TYPE_RSN:
2809 case eCSR_AUTH_TYPE_RSN_PSK:
2810#ifdef WLAN_FEATURE_VOWIFI_11R
2811 case eCSR_AUTH_TYPE_FT_RSN:
2812 case eCSR_AUTH_TYPE_FT_RSN_PSK:
2813#endif
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08002814#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07002815 case eCSR_AUTH_TYPE_CCKM_RSN:
2816#endif
Chet Lanctot186b5732013-03-18 10:26:30 -07002817#ifdef WLAN_FEATURE_11W
2818 case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
Abhishek Singhae408032014-09-25 17:22:04 +05302819 case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
Chet Lanctot186b5732013-03-18 10:26:30 -07002820#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002821 fRSNProfile = TRUE;
2822 break;
2823
2824 default:
2825 fRSNProfile = FALSE;
2826 break;
2827 }
2828
2829 if ( fRSNProfile )
2830 {
2831 switch ( pProfile->negotiatedUCEncryptionType )
2832 {
2833 // !!REVIEW - For WPA2, use of RSN IE mandates
2834 // use of AES as encryption. Here, we qualify
2835 // even if encryption type is WEP or TKIP
2836 case eCSR_ENCRYPT_TYPE_WEP40:
2837 case eCSR_ENCRYPT_TYPE_WEP104:
2838 case eCSR_ENCRYPT_TYPE_TKIP:
2839 case eCSR_ENCRYPT_TYPE_AES:
2840 fRSNProfile = TRUE;
2841 break;
2842
2843 default:
2844 fRSNProfile = FALSE;
2845 break;
2846 }
2847 }
2848 return( fRSNProfile );
2849}
2850
Jeff Johnsone7245742012-09-05 17:12:55 -07002851eHalStatus
2852csrIsconcurrentsessionValid(tpAniSirGlobal pMac,tANI_U32 cursessionId,
2853 tVOS_CON_MODE currBssPersona)
2854{
2855 tANI_U32 sessionId = 0;
2856
2857 for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
2858 {
2859 if (cursessionId != sessionId )
2860 {
2861 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
2862 {
2863 continue;
2864 }
2865
2866 switch (currBssPersona)
2867 {
2868 case VOS_STA_MODE:
Jeff Johnsone7245742012-09-05 17:12:55 -07002869 {
Agarwal Ashish4cfa1e52014-05-09 20:25:11 +05302870 smsLog(pMac, LOG4, FL(" Second session for persona %d"), currBssPersona);
Agarwal Ashishe16e1212014-05-15 14:51:36 +05302871 return eHAL_STATUS_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -07002872 }
2873 break;
2874
2875 case VOS_STA_SAP_MODE:
Gopichand Nakkala53fefcd2013-02-28 12:35:20 +05302876 if((pMac->roam.roamSession[sessionId].bssParams.bssPersona
2877 == VOS_STA_SAP_MODE)&&
Ravi Joshia96ceb42013-05-20 18:52:39 -07002878 (pMac->roam.roamSession[sessionId].connectState
2879 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED))
Jeff Johnsone7245742012-09-05 17:12:55 -07002880 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002881 smsLog(pMac, LOGE, FL(" ****SoftAP mode already exists ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002882 return eHAL_STATUS_FAILURE;
2883 }
Ravi Joshia96ceb42013-05-20 18:52:39 -07002884 else if( (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2885 == VOS_P2P_GO_MODE &&
2886 pMac->roam.roamSession[sessionId].connectState
2887 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED) ||
2888 (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2889 == VOS_IBSS_MODE &&
2890 pMac->roam.roamSession[sessionId].connectState
2891 != eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED))
Jeff Johnsone7245742012-09-05 17:12:55 -07002892 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002893 smsLog(pMac, LOGE, FL(" ****Cannot start Multiple Beaconing Role ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002894 return eHAL_STATUS_FAILURE;
2895 }
2896 break;
2897
2898 case VOS_P2P_CLIENT_MODE:
2899 if(pMac->roam.roamSession[sessionId].pCurRoamProfile &&
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07002900 (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07002901 == VOS_P2P_CLIENT_MODE)) //check for P2P client mode
2902 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002903 smsLog(pMac, LOGE, FL(" ****CLIENT mode already exists ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002904 return eHAL_STATUS_FAILURE;
2905 }
2906 break;
2907
2908 case VOS_P2P_GO_MODE:
Gopichand Nakkala53fefcd2013-02-28 12:35:20 +05302909 if((pMac->roam.roamSession[sessionId].bssParams.bssPersona
2910 == VOS_P2P_GO_MODE) &&
Ravi Joshia96ceb42013-05-20 18:52:39 -07002911 (pMac->roam.roamSession[sessionId].connectState
2912 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED))
Jeff Johnsone7245742012-09-05 17:12:55 -07002913 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002914 smsLog(pMac, LOGE, FL(" ****P2P GO mode already exists ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002915 return eHAL_STATUS_FAILURE;
2916 }
Ravi Joshia96ceb42013-05-20 18:52:39 -07002917 else if( (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2918 == VOS_STA_SAP_MODE &&
2919 pMac->roam.roamSession[sessionId].connectState
2920 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED) ||
2921 (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2922 == VOS_IBSS_MODE &&
2923 pMac->roam.roamSession[sessionId].connectState
2924 != eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED) )
Jeff Johnsone7245742012-09-05 17:12:55 -07002925 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002926 smsLog(pMac, LOGE, FL(" ****Cannot start Multiple Beaconing Role ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002927 return eHAL_STATUS_FAILURE;
2928 }
2929 break;
Ravi Joshia96ceb42013-05-20 18:52:39 -07002930 case VOS_IBSS_MODE:
2931 if((pMac->roam.roamSession[sessionId].bssParams.bssPersona
2932 == VOS_IBSS_MODE) &&
2933 (pMac->roam.roamSession[sessionId].connectState
2934 != eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED))
2935 {
2936 smsLog(pMac, LOGE, FL(" ****IBSS mode already exists ****"));
2937 return eHAL_STATUS_FAILURE;
2938 }
2939 else if( (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2940 == VOS_P2P_GO_MODE ||
2941 pMac->roam.roamSession[sessionId].bssParams.bssPersona
2942 == VOS_STA_SAP_MODE) &&
2943 pMac->roam.roamSession[sessionId].connectState
2944 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED)
2945 {
2946 smsLog(pMac, LOGE, FL(" ****Cannot start Multiple Beaconing Role ****"));
2947 return eHAL_STATUS_FAILURE;
2948 }
2949 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07002950 default :
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002951 smsLog(pMac, LOGE, FL("***Persona not handled = %d*****"),currBssPersona);
Jeff Johnsone7245742012-09-05 17:12:55 -07002952 break;
2953 }
2954 }
2955 }
2956 return eHAL_STATUS_SUCCESS;
2957
2958}
2959
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08002960eHalStatus csrUpdateMCCp2pBeaconInterval(tpAniSirGlobal pMac)
Jeff Johnsone7245742012-09-05 17:12:55 -07002961{
2962 tANI_U32 sessionId = 0;
2963
2964 //If MCC is not supported just break and return SUCCESS
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08002965 if ( !pMac->roam.configParam.fenableMCCMode){
2966 return eHAL_STATUS_FAILURE;
2967 }
2968
2969 for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
2970 {
2971 /* If GO in MCC support different beacon interval,
2972 * change the BI of the P2P-GO */
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07002973 if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2974 == VOS_P2P_GO_MODE)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08002975 {
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07002976 /* Handle different BI scneario based on the configuration set.
2977 * If Config is set to 0x02 then Disconnect all the P2P clients
2978 * associated. If config is set to 0x04 then update the BI
2979 * without disconnecting all the clients
2980 */
2981 if ((pMac->roam.configParam.fAllowMCCGODiffBI == 0x04) &&
2982 (pMac->roam.roamSession[sessionId].bssParams.updatebeaconInterval))
2983 {
2984 return csrSendChngMCCBeaconInterval( pMac, sessionId);
2985 }
2986 //If the configuration of fAllowMCCGODiffBI is set to other than 0x04
2987 else if ( pMac->roam.roamSession[sessionId].bssParams.updatebeaconInterval)
2988 {
2989 return csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_DISCONNECT_ALL_P2P_CLIENTS, eCSR_ROAM_RESULT_NONE);
2990 }
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08002991 }
2992 }
2993 return eHAL_STATUS_FAILURE;
2994}
2995
2996tANI_U16 csrCalculateMCCBeaconInterval(tpAniSirGlobal pMac, tANI_U16 sta_bi, tANI_U16 go_gbi)
2997{
2998 tANI_U8 num_beacons = 0;
2999 tANI_U8 is_multiple = 0;
3000 tANI_U16 go_cbi = 0;
3001 tANI_U16 go_fbi = 0;
3002 tANI_U16 sta_cbi = 0;
3003
3004 //If GO's given beacon Interval is less than 100
3005 if(go_gbi < 100)
3006 go_cbi = 100;
3007 //if GO's given beacon Interval is greater than or equal to 100
3008 else
3009 go_cbi = 100 + (go_gbi % 100);
3010
AnjaneeDevi Kapparapu4b043912014-02-18 13:22:35 +05303011 if ( sta_bi == 0 )
3012 {
3013 /* There is possibility to receive zero as value.
3014 Which will cause divide by zero. Hence initialise with 100
3015 */
3016 sta_bi = 100;
3017 smsLog(pMac, LOGW,
3018 FL("sta_bi 2nd parameter is zero, initialise to %d"), sta_bi);
3019 }
3020
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003021 // check, if either one is multiple of another
3022 if (sta_bi > go_cbi)
3023 {
3024 is_multiple = !(sta_bi % go_cbi);
3025 }
3026 else
3027 {
3028 is_multiple = !(go_cbi % sta_bi);
3029 }
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08003030 // if it is multiple, then accept GO's beacon interval range [100,199] as it is
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003031 if (is_multiple)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003032 {
3033 return go_cbi;
3034 }
3035 //else , if it is not multiple, then then check for number of beacons to be
3036 //inserted based on sta BI
3037 num_beacons = sta_bi / 100;
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003038 if (num_beacons)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003039 {
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08003040 // GO's final beacon interval will be aligned to sta beacon interval, but
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003041 //in the range of [100, 199].
3042 sta_cbi = sta_bi / num_beacons;
3043 go_fbi = sta_cbi;
3044 }
3045 else
3046 {
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08003047 // if STA beacon interval is less than 100, use GO's change bacon interval
3048 //instead of updating to STA's beacon interval.
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003049 go_fbi = go_cbi;
3050 }
3051 return go_fbi;
3052}
3053
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003054eHalStatus csrValidateMCCBeaconInterval(tpAniSirGlobal pMac, tANI_U8 channelId,
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003055 tANI_U16 *beaconInterval, tANI_U32 cursessionId,
3056 tVOS_CON_MODE currBssPersona)
3057{
3058 tANI_U32 sessionId = 0;
3059 tANI_U16 new_beaconInterval = 0;
3060
3061 //If MCC is not supported just break
3062 if (!pMac->roam.configParam.fenableMCCMode){
Jeff Johnsone7245742012-09-05 17:12:55 -07003063 return eHAL_STATUS_FAILURE;
3064 }
3065
3066 for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
3067 {
3068 if (cursessionId != sessionId )
3069 {
3070 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
3071 {
3072 continue;
3073 }
3074
3075 switch (currBssPersona)
3076 {
3077 case VOS_STA_MODE:
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003078 if (pMac->roam.roamSession[sessionId].pCurRoamProfile &&
3079 (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003080 == VOS_P2P_CLIENT_MODE)) //check for P2P client mode
3081 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003082 smsLog(pMac, LOG1, FL(" Beacon Interval Validation not required for STA/CLIENT"));
Jeff Johnsone7245742012-09-05 17:12:55 -07003083 }
3084 //IF SAP has started and STA wants to connect on different channel MCC should
3085 //MCC should not be enabled so making it false to enforce on same channel
3086 else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
3087 == VOS_STA_SAP_MODE)
3088 {
3089 if (pMac->roam.roamSession[sessionId].bssParams.operationChn
3090 != channelId )
3091 {
Agarwal Ashish4cfa1e52014-05-09 20:25:11 +05303092 smsLog(pMac, LOGE, FL("*** MCC with SAP+STA sessions ****"));
3093 return eHAL_STATUS_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -07003094 }
3095 }
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003096 else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003097 == VOS_P2P_GO_MODE) //Check for P2P go scenario
3098 {
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003099 /* if GO in MCC support different beacon interval,
3100 * change the BI of the P2P-GO */
3101 if ((pMac->roam.roamSession[sessionId].bssParams.operationChn
Jeff Johnsone7245742012-09-05 17:12:55 -07003102 != channelId ) &&
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003103 (pMac->roam.roamSession[sessionId].bssParams.beaconInterval
Jeff Johnsone7245742012-09-05 17:12:55 -07003104 != *beaconInterval))
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003105 {
3106 /* if GO in MCC support different beacon interval, return success */
3107 if ( pMac->roam.configParam.fAllowMCCGODiffBI == 0x01)
3108 {
3109 return eHAL_STATUS_SUCCESS;
3110 }
3111 // Send only Broadcast disassoc and update beaconInterval
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003112 //If configuration is set to 0x04 then dont
3113 // disconnect all the station
3114 else if ((pMac->roam.configParam.fAllowMCCGODiffBI == 0x02) ||
3115 (pMac->roam.configParam.fAllowMCCGODiffBI == 0x04))
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003116 {
3117 //Check to pass the right beacon Interval
3118 new_beaconInterval = csrCalculateMCCBeaconInterval(pMac, *beaconInterval,
3119 pMac->roam.roamSession[sessionId].bssParams.beaconInterval);
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003120 smsLog(pMac, LOG1, FL(" Peer AP BI : %d, new Beacon Interval: %d"),*beaconInterval,new_beaconInterval );
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003121 //Update the becon Interval
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003122 if (new_beaconInterval != pMac->roam.roamSession[sessionId].bssParams.beaconInterval)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003123 {
3124 //Update the beaconInterval now
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003125 smsLog(pMac, LOGE, FL(" Beacon Interval got changed config used: %d\n"),
3126 pMac->roam.configParam.fAllowMCCGODiffBI);
3127
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003128 pMac->roam.roamSession[sessionId].bssParams.beaconInterval = new_beaconInterval;
3129 pMac->roam.roamSession[sessionId].bssParams.updatebeaconInterval = eANI_BOOLEAN_TRUE;
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003130 return csrUpdateMCCp2pBeaconInterval(pMac);
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003131 }
3132 return eHAL_STATUS_SUCCESS;
3133 }
3134 //Disconnect the P2P session
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003135 else if (pMac->roam.configParam.fAllowMCCGODiffBI == 0x03)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003136 {
3137 pMac->roam.roamSession[sessionId].bssParams.updatebeaconInterval = eANI_BOOLEAN_FALSE;
3138 return csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_SEND_P2P_STOP_BSS, eCSR_ROAM_RESULT_NONE);
3139 }
3140 else
3141 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003142 smsLog(pMac, LOGE, FL("BeaconInterval is different cannot connect to preferred AP..."));
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003143 return eHAL_STATUS_FAILURE;
3144 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003145 }
3146 }
3147 break;
3148
3149 case VOS_P2P_CLIENT_MODE:
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003150 if (pMac->roam.roamSession[sessionId].pCurRoamProfile &&
3151 (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003152 == VOS_STA_MODE)) //check for P2P client mode
3153 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003154 smsLog(pMac, LOG1, FL(" Ignore Beacon Interval Validation..."));
Jeff Johnsone7245742012-09-05 17:12:55 -07003155 }
3156 //IF SAP has started and STA wants to connect on different channel MCC should
3157 //MCC should not be enabled so making it false to enforce on same channel
3158 else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
3159 == VOS_STA_SAP_MODE)
3160 {
3161 if (pMac->roam.roamSession[sessionId].bssParams.operationChn
3162 != channelId )
3163 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003164 smsLog(pMac, LOGE, FL("***MCC is not enabled for SAP + CLIENT****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07003165 return eHAL_STATUS_FAILURE;
3166 }
3167 }
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003168 else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003169 == VOS_P2P_GO_MODE) //Check for P2P go scenario
3170 {
3171 if ((pMac->roam.roamSession[sessionId].bssParams.operationChn
3172 != channelId ) &&
3173 (pMac->roam.roamSession[sessionId].bssParams.beaconInterval
3174 != *beaconInterval))
3175 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003176 smsLog(pMac, LOGE, FL("BeaconInterval is different cannot connect to P2P_GO network ..."));
Jeff Johnsone7245742012-09-05 17:12:55 -07003177 return eHAL_STATUS_FAILURE;
3178 }
3179 }
3180 break;
3181
3182 case VOS_P2P_GO_MODE :
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003183 {
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003184 if (pMac->roam.roamSession[sessionId].pCurRoamProfile &&
3185 ((pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003186 == VOS_P2P_CLIENT_MODE) ||
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003187 (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003188 == VOS_STA_MODE))) //check for P2P_client scenario
3189 {
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003190 if ((pMac->roam.roamSession[sessionId].connectedProfile.operationChannel
Jeff Johnsone7245742012-09-05 17:12:55 -07003191 == 0 )&&
3192 (pMac->roam.roamSession[sessionId].connectedProfile.beaconInterval
3193 == 0))
3194 {
3195 continue;
3196 }
3197
AnjaneeDevi Kapparapu4b043912014-02-18 13:22:35 +05303198 //Assert if connected profile beacon internal is ZERO
3199 if(!pMac->roam.roamSession[sessionId].\
3200 connectedProfile.beaconInterval)
3201 {
3202 smsLog( pMac, LOGE, FL(" Connected profile "
3203 "beacon interval is zero") );
3204 }
3205
Jeff Johnsone7245742012-09-05 17:12:55 -07003206
3207 if (csrIsConnStateConnectedInfra(pMac, sessionId) &&
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003208 (pMac->roam.roamSession[sessionId].connectedProfile.operationChannel
Jeff Johnsone7245742012-09-05 17:12:55 -07003209 != channelId ) &&
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003210 (pMac->roam.roamSession[sessionId].connectedProfile.beaconInterval
Jeff Johnsone7245742012-09-05 17:12:55 -07003211 != *beaconInterval))
3212 {
3213 /*
3214 * Updated beaconInterval should be used only when we are starting a new BSS
3215 * not incase of client or STA case
3216 */
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003217 //Calculate beacon Interval for P2P-GO incase of MCC
3218 new_beaconInterval = csrCalculateMCCBeaconInterval(pMac,
Chet Lanctot4c986162013-05-08 13:59:56 -07003219 pMac->roam.roamSession[sessionId].bssParams.beaconInterval,
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003220 *beaconInterval );
3221 if(*beaconInterval != new_beaconInterval)
3222 *beaconInterval = new_beaconInterval;
Jeff Johnsone7245742012-09-05 17:12:55 -07003223 return eHAL_STATUS_SUCCESS;
3224 }
3225 }
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003226 }
3227 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07003228
3229 default :
Agarwal Ashishe3cca2a2013-07-21 03:01:48 +05303230 smsLog(pMac, LOGE, FL(" Persona not supported : %d"),currBssPersona);
Jeff Johnsone7245742012-09-05 17:12:55 -07003231 return eHAL_STATUS_FAILURE;
3232 }
3233 }
3234 }
3235
3236 return eHAL_STATUS_SUCCESS;
3237}
Jeff Johnson295189b2012-06-20 16:38:30 -07003238
3239#ifdef WLAN_FEATURE_VOWIFI_11R
3240/* Function to return TRUE if the authtype is 11r */
Madan Mohan Koyyalamudi5e32b962012-11-28 16:07:55 -08003241tANI_BOOLEAN csrIsAuthType11r( eCsrAuthType AuthType, tANI_U8 mdiePresent)
Jeff Johnson295189b2012-06-20 16:38:30 -07003242{
3243 switch ( AuthType )
3244 {
Madan Mohan Koyyalamudi5e32b962012-11-28 16:07:55 -08003245 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3246 if(mdiePresent)
3247 return TRUE;
3248 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003249 case eCSR_AUTH_TYPE_FT_RSN_PSK:
3250 case eCSR_AUTH_TYPE_FT_RSN:
3251 return TRUE;
3252 break;
3253 default:
3254 break;
3255 }
3256 return FALSE;
3257}
3258
3259/* Function to return TRUE if the profile is 11r */
3260tANI_BOOLEAN csrIsProfile11r( tCsrRoamProfile *pProfile )
3261{
Madan Mohan Koyyalamudi5e32b962012-11-28 16:07:55 -08003262 return csrIsAuthType11r( pProfile->negotiatedAuthType, pProfile->MDID.mdiePresent );
Jeff Johnson295189b2012-06-20 16:38:30 -07003263}
3264
3265#endif
3266
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003267#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07003268
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003269/* Function to return TRUE if the authtype is ESE */
3270tANI_BOOLEAN csrIsAuthTypeESE( eCsrAuthType AuthType )
Jeff Johnson295189b2012-06-20 16:38:30 -07003271{
3272 switch ( AuthType )
3273 {
3274 case eCSR_AUTH_TYPE_CCKM_WPA:
3275 case eCSR_AUTH_TYPE_CCKM_RSN:
3276 return TRUE;
3277 break;
3278 default:
3279 break;
3280 }
3281 return FALSE;
3282}
3283
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003284/* Function to return TRUE if the profile is ESE */
3285tANI_BOOLEAN csrIsProfileESE( tCsrRoamProfile *pProfile )
Jeff Johnson295189b2012-06-20 16:38:30 -07003286{
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003287 return (csrIsAuthTypeESE( pProfile->negotiatedAuthType ));
Jeff Johnson295189b2012-06-20 16:38:30 -07003288}
3289
3290#endif
3291
3292#ifdef FEATURE_WLAN_WAPI
3293tANI_BOOLEAN csrIsProfileWapi( tCsrRoamProfile *pProfile )
3294{
3295 tANI_BOOLEAN fWapiProfile = FALSE;
3296
3297 switch ( pProfile->negotiatedAuthType )
3298 {
3299 case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
3300 case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
3301 fWapiProfile = TRUE;
3302 break;
3303
3304 default:
3305 fWapiProfile = FALSE;
3306 break;
3307 }
3308
3309 if ( fWapiProfile )
3310 {
3311 switch ( pProfile->negotiatedUCEncryptionType )
3312 {
3313 case eCSR_ENCRYPT_TYPE_WPI:
3314 fWapiProfile = TRUE;
3315 break;
3316
3317 default:
3318 fWapiProfile = FALSE;
3319 break;
3320 }
3321 }
3322 return( fWapiProfile );
3323}
3324
3325static tANI_BOOLEAN csrIsWapiOuiEqual( tpAniSirGlobal pMac, tANI_U8 *Oui1, tANI_U8 *Oui2 )
3326{
Kiet Lam64c1b492013-07-12 13:56:44 +05303327 return (vos_mem_compare(Oui1, Oui2, CSR_WAPI_OUI_SIZE));
Jeff Johnson295189b2012-06-20 16:38:30 -07003328}
3329
3330static tANI_BOOLEAN csrIsWapiOuiMatch( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WAPI_OUI_SIZE],
3331 tANI_U8 cAllCyphers,
3332 tANI_U8 Cypher[],
3333 tANI_U8 Oui[] )
3334{
3335 tANI_BOOLEAN fYes = FALSE;
3336 tANI_U8 idx;
3337
3338 for ( idx = 0; idx < cAllCyphers; idx++ )
3339 {
3340 if ( csrIsWapiOuiEqual( pMac, AllCyphers[ idx ], Cypher ) )
3341 {
3342 fYes = TRUE;
3343 break;
3344 }
3345 }
3346
3347 if ( fYes && Oui )
3348 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303349 vos_mem_copy(Oui, AllCyphers[ idx ], CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003350 }
3351
3352 return( fYes );
3353}
3354#endif /* FEATURE_WLAN_WAPI */
3355
3356static tANI_BOOLEAN csrIsWpaOuiEqual( tpAniSirGlobal pMac, tANI_U8 *Oui1, tANI_U8 *Oui2 )
3357{
Kiet Lam64c1b492013-07-12 13:56:44 +05303358 return(vos_mem_compare(Oui1, Oui2, CSR_WPA_OUI_SIZE));
Jeff Johnson295189b2012-06-20 16:38:30 -07003359}
3360
3361static tANI_BOOLEAN csrIsOuiMatch( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3362 tANI_U8 cAllCyphers,
3363 tANI_U8 Cypher[],
3364 tANI_U8 Oui[] )
3365{
3366 tANI_BOOLEAN fYes = FALSE;
3367 tANI_U8 idx;
3368
3369 for ( idx = 0; idx < cAllCyphers; idx++ )
3370 {
3371 if ( csrIsWpaOuiEqual( pMac, AllCyphers[ idx ], Cypher ) )
3372 {
3373 fYes = TRUE;
3374 break;
3375 }
3376 }
3377
3378 if ( fYes && Oui )
3379 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303380 vos_mem_copy(Oui, AllCyphers[ idx ], CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003381 }
3382
3383 return( fYes );
3384}
3385
3386static tANI_BOOLEAN csrMatchRSNOUIIndex( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3387 tANI_U8 cAllCyphers, tANI_U8 ouiIndex,
3388 tANI_U8 Oui[] )
3389{
3390 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui[ouiIndex], Oui ) );
3391
3392}
3393
3394#ifdef FEATURE_WLAN_WAPI
3395static tANI_BOOLEAN csrMatchWapiOUIIndex( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WAPI_OUI_SIZE],
3396 tANI_U8 cAllCyphers, tANI_U8 ouiIndex,
3397 tANI_U8 Oui[] )
3398{
Kaushik, Sushantfe230152014-04-08 14:37:47 +05303399 if (ouiIndex < CSR_WAPI_OUI_ROW_SIZE)// since csrWapiOui row size is 3 .
3400 return( csrIsWapiOuiMatch( pMac, AllCyphers, cAllCyphers,
3401 csrWapiOui[ouiIndex], Oui ) );
3402 else
3403 return FALSE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003404
3405}
3406#endif /* FEATURE_WLAN_WAPI */
3407
3408static tANI_BOOLEAN csrMatchWPAOUIIndex( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3409 tANI_U8 cAllCyphers, tANI_U8 ouiIndex,
3410 tANI_U8 Oui[] )
3411{
3412 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui[ouiIndex], Oui ) );
3413
3414}
3415
3416#if 0
3417static tANI_BOOLEAN csrIsRSNUnicastNone( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3418 tANI_U8 cAllCyphers,
3419 tANI_U8 Oui[] )
3420{
3421 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui00, Oui ) );
3422}
3423
3424static tANI_BOOLEAN csrIsRSNMulticastWep( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3425 tANI_U8 cAllCyphers,
3426 tANI_U8 Oui[] )
3427{
3428 tANI_BOOLEAN fYes = FALSE;
3429
3430 // Check Wep 104 first, if fails, then check Wep40.
3431 fYes = csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui05, Oui );
3432
3433 if ( !fYes )
3434 {
3435 // if not Wep-104, check Wep-40
3436 fYes = csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui01, Oui );
3437 }
3438
3439 return( fYes );
3440}
3441
3442
3443static tANI_BOOLEAN csrIsRSNUnicastTkip( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3444 tANI_U8 cAllCyphers,
3445 tANI_U8 Oui[] )
3446{
3447 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui02, Oui ) );
3448}
3449
3450
3451static tANI_BOOLEAN csrIsRSNMulticastTkip( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3452 tANI_U8 cAllCyphers,
3453 tANI_U8 Oui[] )
3454{
3455 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui02, Oui ) );
3456}
3457
3458static tANI_BOOLEAN csrIsRSNUnicastAes( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3459 tANI_U8 cAllCyphers,
3460 tANI_U8 Oui[] )
3461{
3462 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui04, Oui ) );
3463}
3464
3465static tANI_BOOLEAN csrIsRSNMulticastAes( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3466 tANI_U8 cAllCyphers,
3467 tANI_U8 Oui[] )
3468{
3469 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui04, Oui ) );
3470}
3471#endif
3472#ifdef FEATURE_WLAN_WAPI
3473static tANI_BOOLEAN csrIsAuthWapiCert( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WAPI_OUI_SIZE],
3474 tANI_U8 cAllSuites,
3475 tANI_U8 Oui[] )
3476{
3477 return( csrIsWapiOuiMatch( pMac, AllSuites, cAllSuites, csrWapiOui[1], Oui ) );
3478}
3479static tANI_BOOLEAN csrIsAuthWapiPsk( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WAPI_OUI_SIZE],
3480 tANI_U8 cAllSuites,
3481 tANI_U8 Oui[] )
3482{
3483 return( csrIsWapiOuiMatch( pMac, AllSuites, cAllSuites, csrWapiOui[2], Oui ) );
3484}
3485#endif /* FEATURE_WLAN_WAPI */
3486
3487#ifdef WLAN_FEATURE_VOWIFI_11R
3488
3489/*
3490 * Function for 11R FT Authentication. We match the FT Authentication Cipher suite
3491 * here. This matches for FT Auth with the 802.1X exchange.
3492 *
3493 */
3494static tANI_BOOLEAN csrIsFTAuthRSN( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3495 tANI_U8 cAllSuites,
3496 tANI_U8 Oui[] )
3497{
3498 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[03], Oui ) );
3499}
3500
3501/*
3502 * Function for 11R FT Authentication. We match the FT Authentication Cipher suite
3503 * here. This matches for FT Auth with the PSK.
3504 *
3505 */
3506static tANI_BOOLEAN csrIsFTAuthRSNPsk( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3507 tANI_U8 cAllSuites,
3508 tANI_U8 Oui[] )
3509{
3510 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[04], Oui ) );
3511}
3512
3513#endif
3514
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003515#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07003516
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003517/*
3518 * Function for ESE CCKM AKM Authentication. We match the CCKM AKM Authentication Key Management suite
Jeff Johnson295189b2012-06-20 16:38:30 -07003519 * here. This matches for CCKM AKM Auth with the 802.1X exchange.
3520 *
3521 */
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003522static tANI_BOOLEAN csrIsEseCckmAuthRSN( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
Jeff Johnson295189b2012-06-20 16:38:30 -07003523 tANI_U8 cAllSuites,
3524 tANI_U8 Oui[] )
3525{
3526 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[06], Oui ) );
3527}
3528
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003529static tANI_BOOLEAN csrIsEseCckmAuthWpa( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
Jeff Johnson295189b2012-06-20 16:38:30 -07003530 tANI_U8 cAllSuites,
3531 tANI_U8 Oui[] )
3532{
3533 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrWpaOui[06], Oui ) );
3534}
3535
3536#endif
3537
3538static tANI_BOOLEAN csrIsAuthRSN( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3539 tANI_U8 cAllSuites,
3540 tANI_U8 Oui[] )
3541{
Jeff Johnson295189b2012-06-20 16:38:30 -07003542 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[01], Oui ) );
Jeff Johnson295189b2012-06-20 16:38:30 -07003543}
3544static tANI_BOOLEAN csrIsAuthRSNPsk( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3545 tANI_U8 cAllSuites,
3546 tANI_U8 Oui[] )
3547{
Jeff Johnson295189b2012-06-20 16:38:30 -07003548 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[02], Oui ) );
Jeff Johnson295189b2012-06-20 16:38:30 -07003549}
3550
Chet Lanctot186b5732013-03-18 10:26:30 -07003551#ifdef WLAN_FEATURE_11W
3552static tANI_BOOLEAN csrIsAuthRSNPskSha256( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3553 tANI_U8 cAllSuites,
3554 tANI_U8 Oui[] )
3555{
Chet Lanctot4c986162013-05-08 13:59:56 -07003556 return csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[07], Oui );
Chet Lanctot186b5732013-03-18 10:26:30 -07003557}
Abhishek Singhae408032014-09-25 17:22:04 +05303558static tANI_BOOLEAN csrIsAuthRSN8021xSha256(tpAniSirGlobal pMac,
3559 tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3560 tANI_U8 cAllSuites,
3561 tANI_U8 Oui[] )
3562{
3563 return csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[8], Oui );
3564}
Chet Lanctot186b5732013-03-18 10:26:30 -07003565#endif
3566
Jeff Johnson295189b2012-06-20 16:38:30 -07003567static tANI_BOOLEAN csrIsAuthWpa( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
3568 tANI_U8 cAllSuites,
3569 tANI_U8 Oui[] )
3570{
3571 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrWpaOui[01], Oui ) );
3572}
3573
3574#ifdef NOT_CURRENTLY_USED
3575static tANI_BOOLEAN csrIsAuth802_1x( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
3576 tANI_U8 cAllSuites,
3577 tANI_U8 Oui[] )
3578{
3579 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrWpaOui[00], Oui ) );
3580}
3581#endif // NOT_CURRENTLY_USED
3582
3583static tANI_BOOLEAN csrIsAuthWpaPsk( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
3584 tANI_U8 cAllSuites,
3585 tANI_U8 Oui[] )
3586{
3587 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrWpaOui[02], Oui ) );
3588}
3589#if 0
3590static tANI_BOOLEAN csrIsUnicastNone( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3591 tANI_U8 cAllCyphers,
3592 tANI_U8 Oui[] )
3593{
3594 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui00, Oui ) );
3595}
3596
3597static tANI_BOOLEAN csrIsUnicastTkip( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3598 tANI_U8 cAllCyphers,
3599 tANI_U8 Oui[] )
3600{
3601 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui02, Oui ) );
3602}
3603
3604static tANI_BOOLEAN csrIsUnicastAes( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3605 tANI_U8 cAllCyphers,
3606 tANI_U8 Oui[] )
3607{
3608 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui04, Oui ) );
3609}
3610
3611
3612static tANI_BOOLEAN csrIsMulticastWep( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3613 tANI_U8 cAllCyphers,
3614 tANI_U8 Oui[] )
3615{
3616 tANI_BOOLEAN fYes = FALSE;
3617
3618 // Check Wep 104 first, if fails, then check Wep40.
3619 fYes = csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui05, Oui );
3620
3621 if ( !fYes )
3622 {
3623 // if not Wep-104, check Wep-40
3624 fYes = csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui01, Oui );
3625 }
3626
3627 return( fYes );
3628}
3629
3630
3631static tANI_BOOLEAN csrIsMulticastTkip( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3632 tANI_U8 cAllCyphers,
3633 tANI_U8 Oui[] )
3634{
3635 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui02, Oui ) );
3636}
3637
3638
3639static tANI_BOOLEAN csrIsMulticastAes( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3640 tANI_U8 cAllCyphers,
3641 tANI_U8 Oui[] )
3642{
3643 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui04, Oui ) );
3644}
3645
3646#endif
3647
3648tANI_U8 csrGetOUIIndexFromCipher( eCsrEncryptionType enType )
3649{
3650 tANI_U8 OUIIndex;
3651
3652 switch ( enType )
3653 {
3654 case eCSR_ENCRYPT_TYPE_WEP40:
3655 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
3656 OUIIndex = CSR_OUI_WEP40_OR_1X_INDEX;
3657 break;
3658 case eCSR_ENCRYPT_TYPE_WEP104:
3659 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
3660 OUIIndex = CSR_OUI_WEP104_INDEX;
3661 break;
3662 case eCSR_ENCRYPT_TYPE_TKIP:
3663 OUIIndex = CSR_OUI_TKIP_OR_PSK_INDEX;
3664 break;
3665 case eCSR_ENCRYPT_TYPE_AES:
3666 OUIIndex = CSR_OUI_AES_INDEX;
3667 break;
3668 case eCSR_ENCRYPT_TYPE_NONE:
3669 OUIIndex = CSR_OUI_USE_GROUP_CIPHER_INDEX;
3670 break;
3671#ifdef FEATURE_WLAN_WAPI
3672 case eCSR_ENCRYPT_TYPE_WPI:
3673 OUIIndex = CSR_OUI_WAPI_WAI_CERT_OR_SMS4_INDEX;
3674 break;
3675#endif /* FEATURE_WLAN_WAPI */
3676 default: //HOWTO handle this?
3677 OUIIndex = CSR_OUI_RESERVED_INDEX;
3678 break;
3679 }//switch
3680
3681 return OUIIndex;
3682}
3683
3684tANI_BOOLEAN csrGetRSNInformation( tHalHandle hHal, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pMCEncryption,
3685 tDot11fIERSN *pRSNIe,
3686 tANI_U8 *UnicastCypher,
3687 tANI_U8 *MulticastCypher,
3688 tANI_U8 *AuthSuite,
3689 tCsrRSNCapabilities *Capabilities,
3690 eCsrAuthType *pNegotiatedAuthtype,
3691 eCsrEncryptionType *pNegotiatedMCCipher )
3692{
3693 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
3694 tANI_BOOLEAN fAcceptableCyphers = FALSE;
3695 tANI_U8 cUnicastCyphers = 0;
3696 tANI_U8 cMulticastCyphers = 0;
3697 tANI_U8 cAuthSuites = 0, i;
3698 tANI_U8 Unicast[ CSR_RSN_OUI_SIZE ];
3699 tANI_U8 Multicast[ CSR_RSN_OUI_SIZE ];
3700 tANI_U8 AuthSuites[ CSR_RSN_MAX_AUTH_SUITES ][ CSR_RSN_OUI_SIZE ];
3701 tANI_U8 Authentication[ CSR_RSN_OUI_SIZE ];
3702 tANI_U8 MulticastCyphers[ CSR_RSN_MAX_MULTICAST_CYPHERS ][ CSR_RSN_OUI_SIZE ];
3703 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
3704
3705 do{
3706 if ( pRSNIe->present )
3707 {
3708 cMulticastCyphers++;
Kiet Lam64c1b492013-07-12 13:56:44 +05303709 vos_mem_copy(MulticastCyphers, pRSNIe->gp_cipher_suite, CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003710 cUnicastCyphers = (tANI_U8)(pRSNIe->pwise_cipher_suite_count);
3711 cAuthSuites = (tANI_U8)(pRSNIe->akm_suite_count);
3712 for(i = 0; i < cAuthSuites && i < CSR_RSN_MAX_AUTH_SUITES; i++)
3713 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303714 vos_mem_copy((void *)&AuthSuites[i],
3715 (void *)&pRSNIe->akm_suites[i],
3716 CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003717 }
3718
3719 //Check - Is requested Unicast Cipher supported by the BSS.
3720 fAcceptableCyphers = csrMatchRSNOUIIndex( pMac, pRSNIe->pwise_cipher_suites, cUnicastCyphers,
3721 csrGetOUIIndexFromCipher( enType ), Unicast );
3722
3723 if( !fAcceptableCyphers ) break;
3724
3725
3726 //Unicast is supported. Pick the first matching Group cipher, if any.
3727 for( i = 0 ; i < pMCEncryption->numEntries ; i++ )
3728 {
3729 fAcceptableCyphers = csrMatchRSNOUIIndex( pMac, MulticastCyphers, cMulticastCyphers,
3730 csrGetOUIIndexFromCipher( pMCEncryption->encryptionType[i] ), Multicast );
3731 if(fAcceptableCyphers)
3732 {
3733 break;
3734 }
3735 }
3736 if( !fAcceptableCyphers ) break;
3737
3738 if( pNegotiatedMCCipher )
3739 *pNegotiatedMCCipher = pMCEncryption->encryptionType[i];
3740
3741 /* Initializing with FALSE as it has TRUE value already */
3742 fAcceptableCyphers = FALSE;
3743 for (i = 0 ; i < pAuthType->numEntries; i++)
3744 {
3745 //Ciphers are supported, Match authentication algorithm and pick first matching authtype.
3746 #ifdef WLAN_FEATURE_VOWIFI_11R
3747 /* Changed the AKM suites according to order of preference */
3748 if ( csrIsFTAuthRSN( pMac, AuthSuites, cAuthSuites, Authentication ) )
3749 {
3750 if (eCSR_AUTH_TYPE_FT_RSN == pAuthType->authType[i])
3751 negAuthType = eCSR_AUTH_TYPE_FT_RSN;
3752 }
3753 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsFTAuthRSNPsk( pMac, AuthSuites, cAuthSuites, Authentication ) )
3754 {
3755 if (eCSR_AUTH_TYPE_FT_RSN_PSK == pAuthType->authType[i])
3756 negAuthType = eCSR_AUTH_TYPE_FT_RSN_PSK;
3757 }
3758#endif
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003759#ifdef FEATURE_WLAN_ESE
3760 /* ESE only supports 802.1X. No PSK. */
3761 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsEseCckmAuthRSN( pMac, AuthSuites, cAuthSuites, Authentication ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07003762 {
3763 if (eCSR_AUTH_TYPE_CCKM_RSN == pAuthType->authType[i])
3764 negAuthType = eCSR_AUTH_TYPE_CCKM_RSN;
3765 }
3766#endif
3767 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthRSN( pMac, AuthSuites, cAuthSuites, Authentication ) )
3768 {
3769 if (eCSR_AUTH_TYPE_RSN == pAuthType->authType[i])
3770 negAuthType = eCSR_AUTH_TYPE_RSN;
3771 }
3772 if ((negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthRSNPsk( pMac, AuthSuites, cAuthSuites, Authentication ) )
3773 {
3774 if (eCSR_AUTH_TYPE_RSN_PSK == pAuthType->authType[i])
3775 negAuthType = eCSR_AUTH_TYPE_RSN_PSK;
3776 }
Chet Lanctot186b5732013-03-18 10:26:30 -07003777#ifdef WLAN_FEATURE_11W
3778 if ((negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthRSNPskSha256( pMac, AuthSuites, cAuthSuites, Authentication ) )
3779 {
3780 if (eCSR_AUTH_TYPE_RSN_PSK_SHA256 == pAuthType->authType[i])
3781 negAuthType = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
3782 }
Abhishek Singhae408032014-09-25 17:22:04 +05303783 if ((negAuthType == eCSR_AUTH_TYPE_UNKNOWN) &&
3784 csrIsAuthRSN8021xSha256(pMac, AuthSuites,
3785 cAuthSuites, Authentication)) {
3786 if (eCSR_AUTH_TYPE_RSN_8021X_SHA256 ==
3787 pAuthType->authType[i])
3788 negAuthType = eCSR_AUTH_TYPE_RSN_8021X_SHA256;
3789 }
Chet Lanctot186b5732013-03-18 10:26:30 -07003790#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003791
3792 // The 1st auth type in the APs RSN IE, to match stations connecting
3793 // profiles auth type will cause us to exit this loop
3794 // This is added as some APs advertise multiple akms in the RSN IE.
3795 if (eCSR_AUTH_TYPE_UNKNOWN != negAuthType)
3796 {
3797 fAcceptableCyphers = TRUE;
3798 break;
3799 }
3800 } // for
3801 }
3802
3803 }while (0);
3804
3805 if ( fAcceptableCyphers )
3806 {
3807 if ( MulticastCypher )
3808 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303809 vos_mem_copy(MulticastCypher, Multicast, CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003810 }
3811
3812 if ( UnicastCypher )
3813 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303814 vos_mem_copy(UnicastCypher, Unicast, CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003815 }
3816
3817 if ( AuthSuite )
3818 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303819 vos_mem_copy(AuthSuite, Authentication, CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003820 }
3821
3822 if ( pNegotiatedAuthtype )
3823 {
3824 *pNegotiatedAuthtype = negAuthType;
3825 }
3826 if ( Capabilities )
3827 {
Venkata Prathyusha Kuntupalliea7098e2013-01-31 16:08:13 -08003828 Capabilities->PreAuthSupported = (pRSNIe->RSN_Cap[0] >> 0) & 0x1 ; // Bit 0 PreAuthentication
3829 Capabilities->NoPairwise = (pRSNIe->RSN_Cap[0] >> 1) & 0x1 ; // Bit 1 No Pairwise
3830 Capabilities->PTKSAReplayCounter = (pRSNIe->RSN_Cap[0] >> 2) & 0x3 ; // Bit 2, 3 PTKSA Replay Counter
Chet Lanctot186b5732013-03-18 10:26:30 -07003831 Capabilities->GTKSAReplayCounter = (pRSNIe->RSN_Cap[0] >> 4) & 0x3 ; // Bit 4, 5 GTKSA Replay Counter
Abhishek Singhf53e89d2015-06-18 12:30:00 +05303832#ifdef WLAN_FEATURE_11W
Chet Lanctot186b5732013-03-18 10:26:30 -07003833 Capabilities->MFPRequired = (pRSNIe->RSN_Cap[0] >> 6) & 0x1 ; // Bit 6 MFPR
3834 Capabilities->MFPCapable = (pRSNIe->RSN_Cap[0] >> 7) & 0x1 ; // Bit 7 MFPC
Abhishek Singhf53e89d2015-06-18 12:30:00 +05303835#else
3836 Capabilities->MFPRequired = 0 ; // Bit 6 MFPR
3837 Capabilities->MFPCapable = 0 ; // Bit 7 MFPC
3838#endif
3839
Chet Lanctot186b5732013-03-18 10:26:30 -07003840 Capabilities->Reserved = pRSNIe->RSN_Cap[1] & 0xff ; // remaining reserved
Jeff Johnson295189b2012-06-20 16:38:30 -07003841 }
3842 }
3843 return( fAcceptableCyphers );
3844}
3845
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05303846#ifdef WLAN_FEATURE_11W
3847/* ---------------------------------------------------------------------------
3848 \fn csrIsPMFCapabilitiesInRSNMatch
Jeff Johnson295189b2012-06-20 16:38:30 -07003849
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05303850 \brief this function is to match our current capabilities with the AP
3851 to which we are expecting make the connection.
3852
3853 \param hHal - HAL Pointer
3854 pFilterMFPEnabled - given by supplicant to us to specify what kind
3855 of connection supplicant is expecting to make
3856 if it is enabled then make PMF connection.
3857 if it is disabled then make normal connection.
3858 pFilterMFPRequired - given by supplicant based on our configuration
3859 if it is 1 then we will require mandatory
3860 PMF connection and if it is 0 then we PMF
3861 connection is optional.
3862 pFilterMFPCapable - given by supplicant based on our configuration
3863 if it 1 then we are PMF capable and if it 0
3864 then we are not PMF capable.
3865 pRSNIe - RSNIe from Beacon/probe response of
3866 neighbor AP against which we will compare
3867 our capabilities.
3868
3869 \return tANI_BOOLEAN - if our PMF capabilities matches with AP then we
3870 will return true to indicate that we are good
3871 to make connection with it. Else we will return
3872 false.
3873 -------------------------------------------------------------------------------*/
3874static tANI_BOOLEAN
3875csrIsPMFCapabilitiesInRSNMatch( tHalHandle hHal,
3876 tANI_BOOLEAN *pFilterMFPEnabled,
3877 tANI_U8 *pFilterMFPRequired,
3878 tANI_U8 *pFilterMFPCapable,
3879 tDot11fIERSN *pRSNIe)
3880{
3881 tANI_U8 apProfileMFPCapable = 0;
3882 tANI_U8 apProfileMFPRequired = 0;
3883 if (pRSNIe && pFilterMFPEnabled && pFilterMFPCapable && pFilterMFPRequired)
3884 {
3885 /* Extracting MFPCapable bit from RSN Ie */
3886 apProfileMFPCapable = (pRSNIe->RSN_Cap[0] >> 7) & 0x1;
3887 apProfileMFPRequired = (pRSNIe->RSN_Cap[0] >> 6) & 0x1;
3888 if (*pFilterMFPEnabled && *pFilterMFPCapable && *pFilterMFPRequired
3889 && (apProfileMFPCapable == 0))
3890 {
3891 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3892 "AP is not capable to make PMF connection");
3893 return VOS_FALSE;
3894 }
3895 else if (*pFilterMFPEnabled && *pFilterMFPCapable &&
3896 !(*pFilterMFPRequired) && (apProfileMFPCapable == 0))
3897 {
3898 /*
3899 * This is tricky, because supplicant asked us to make mandatory
3900 * PMF connection eventhough PMF connection is optional here.
3901 * so if AP is not capable of PMF then drop it. Don't try to
3902 * connect with it.
3903 */
3904 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3905 "we need PMF connection & AP isn't capable to make PMF connection");
3906 return VOS_FALSE;
3907 }
3908 else if (!(*pFilterMFPCapable) &&
3909 apProfileMFPCapable && apProfileMFPRequired)
3910 {
3911 /*
3912 * In this case, AP with whom we trying to connect requires
3913 * mandatory PMF connections and we are not capable so this AP
3914 * is not good choice to connect
3915 */
3916 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3917 "AP needs PMF connection and we are not capable of pmf connection");
3918 return VOS_FALSE;
3919 }
3920 else if (!(*pFilterMFPEnabled) && *pFilterMFPCapable &&
3921 (apProfileMFPCapable == 1))
3922 {
3923 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3924 "we don't need PMF connection eventhough both parties are capable");
3925 return VOS_FALSE;
3926 }
3927 }
3928 return VOS_TRUE;
3929}
3930#endif
3931
3932tANI_BOOLEAN csrIsRSNMatch( tHalHandle hHal, tCsrAuthList *pAuthType,
3933 eCsrEncryptionType enType,
3934 tCsrEncryptionList *pEnMcType,
3935 tANI_BOOLEAN *pMFPEnabled, tANI_U8 *pMFPRequired,
3936 tANI_U8 *pMFPCapable,
3937 tDot11fBeaconIEs *pIes,
3938 eCsrAuthType *pNegotiatedAuthType,
3939 eCsrEncryptionType *pNegotiatedMCCipher )
Jeff Johnson295189b2012-06-20 16:38:30 -07003940{
3941 tANI_BOOLEAN fRSNMatch = FALSE;
3942
3943 // See if the cyphers in the Bss description match with the settings in the profile.
3944 fRSNMatch = csrGetRSNInformation( hHal, pAuthType, enType, pEnMcType, &pIes->RSN, NULL, NULL, NULL, NULL,
3945 pNegotiatedAuthType, pNegotiatedMCCipher );
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05303946#ifdef WLAN_FEATURE_11W
3947 /* If all the filter matches then finally checks for PMF capabilities */
3948 if (fRSNMatch)
3949 {
3950 fRSNMatch = csrIsPMFCapabilitiesInRSNMatch( hHal, pMFPEnabled,
3951 pMFPRequired, pMFPCapable,
3952 &pIes->RSN);
3953 }
3954#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003955
3956 return( fRSNMatch );
3957}
3958
3959
3960tANI_BOOLEAN csrLookupPMKID( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U8 *pBSSId, tANI_U8 *pPMKId )
3961{
3962 tANI_BOOLEAN fRC = FALSE, fMatchFound = FALSE;
3963 tANI_U32 Index;
3964 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
3965
Jeff Johnson32d95a32012-09-10 13:15:23 -07003966 if(!pSession)
3967 {
3968 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3969 return FALSE;
3970 }
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07003971 /* to force the AP initiate fresh 802.1x authentication after re-association should not
3972 * fill the PMKID from cache this is needed
3973 * by the HS 2.0 passpoint certification 5.2.a and b testcases */
3974
3975 if(pSession->fIgnorePMKIDCache)
3976 {
3977 pSession->fIgnorePMKIDCache = FALSE;
3978 return fRC;
3979 }
3980
Jeff Johnson295189b2012-06-20 16:38:30 -07003981 do
3982 {
Kanchanapally, Vidyullatha2633ace2014-09-25 15:16:50 +05303983 for( Index=0; Index < CSR_MAX_PMKID_ALLOWED; Index++ )
Jeff Johnson295189b2012-06-20 16:38:30 -07003984 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303985 if( vos_mem_compare(pBSSId, pSession->PmkidCacheInfo[Index].BSSID, sizeof(tCsrBssid)) )
Jeff Johnson295189b2012-06-20 16:38:30 -07003986 {
3987 // match found
3988 fMatchFound = TRUE;
3989 break;
3990 }
3991 }
3992
3993 if( !fMatchFound ) break;
3994
Kiet Lam64c1b492013-07-12 13:56:44 +05303995 vos_mem_copy(pPMKId, pSession->PmkidCacheInfo[Index].PMKID, CSR_RSN_PMKID_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003996
3997 fRC = TRUE;
3998 }
3999 while( 0 );
Sushant Kaushik0b343422015-05-25 17:15:55 +05304000 smsLog(pMac, LOG1, "csrLookupPMKID called return match = %d pMac->roam.NumPmkidCache = %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004001 fRC, pSession->NumPmkidCache);
4002
4003 return fRC;
4004}
4005
4006
4007tANI_U8 csrConstructRSNIe( tHalHandle hHal, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
4008 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes, tCsrRSNIe *pRSNIe )
4009{
4010 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4011 tANI_BOOLEAN fRSNMatch;
4012 tANI_U8 cbRSNIe = 0;
4013 tANI_U8 UnicastCypher[ CSR_RSN_OUI_SIZE ];
4014 tANI_U8 MulticastCypher[ CSR_RSN_OUI_SIZE ];
4015 tANI_U8 AuthSuite[ CSR_RSN_OUI_SIZE ];
4016 tCsrRSNAuthIe *pAuthSuite;
4017 tCsrRSNCapabilities RSNCapabilities;
4018 tCsrRSNPMKIe *pPMK;
4019 tANI_U8 PMKId[CSR_RSN_PMKID_SIZE];
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004020#ifdef WLAN_FEATURE_11W
4021 tANI_U8 *pGroupMgmtCipherSuite;
4022#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004023 tDot11fBeaconIEs *pIesLocal = pIes;
Sachin Ahuja4f06a792014-12-04 18:14:32 +05304024 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
Jeff Johnson295189b2012-06-20 16:38:30 -07004025
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004026 smsLog(pMac, LOGW, "%s called...", __func__);
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004027
Jeff Johnson295189b2012-06-20 16:38:30 -07004028 do
4029 {
4030 if ( !csrIsProfileRSN( pProfile ) ) break;
4031
4032 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4033 {
4034 break;
4035 }
4036
4037 // See if the cyphers in the Bss description match with the settings in the profile.
4038 fRSNMatch = csrGetRSNInformation( hHal, &pProfile->AuthType, pProfile->negotiatedUCEncryptionType,
4039 &pProfile->mcEncryptionType, &pIesLocal->RSN,
Sachin Ahuja4f06a792014-12-04 18:14:32 +05304040 UnicastCypher, MulticastCypher, AuthSuite, &RSNCapabilities, &negAuthType, NULL );
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 if ( !fRSNMatch ) break;
4042
4043 pRSNIe->IeHeader.ElementID = SIR_MAC_RSN_EID;
4044
4045 pRSNIe->Version = CSR_RSN_VERSION_SUPPORTED;
4046
Kiet Lam64c1b492013-07-12 13:56:44 +05304047 vos_mem_copy(pRSNIe->MulticastOui, MulticastCypher, sizeof( MulticastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004048
4049 pRSNIe->cUnicastCyphers = 1;
4050
Kiet Lam64c1b492013-07-12 13:56:44 +05304051 vos_mem_copy(&pRSNIe->UnicastOui[ 0 ], UnicastCypher, sizeof( UnicastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004052
4053 pAuthSuite = (tCsrRSNAuthIe *)( &pRSNIe->UnicastOui[ pRSNIe->cUnicastCyphers ] );
4054
4055 pAuthSuite->cAuthenticationSuites = 1;
Kiet Lam64c1b492013-07-12 13:56:44 +05304056 vos_mem_copy(&pAuthSuite->AuthOui[ 0 ], AuthSuite, sizeof( AuthSuite ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004057
4058 // RSN capabilities follows the Auth Suite (two octects)
4059 // !!REVIEW - What should STA put in RSN capabilities, currently
4060 // just putting back APs capabilities
4061 // For one, we shouldn't EVER be sending out "pre-auth supported". It is an AP only capability
Chet Lanctot186b5732013-03-18 10:26:30 -07004062 // For another, we should use the Management Frame Protection values given by the supplicant
Jeff Johnson295189b2012-06-20 16:38:30 -07004063 RSNCapabilities.PreAuthSupported = 0;
Chet Lanctot186b5732013-03-18 10:26:30 -07004064#ifdef WLAN_FEATURE_11W
4065 RSNCapabilities.MFPRequired = pProfile->MFPRequired;
4066 RSNCapabilities.MFPCapable = pProfile->MFPCapable;
4067#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004068 *(tANI_U16 *)( &pAuthSuite->AuthOui[ 1 ] ) = *((tANI_U16 *)(&RSNCapabilities));
4069
4070 pPMK = (tCsrRSNPMKIe *)( ((tANI_U8 *)(&pAuthSuite->AuthOui[ 1 ])) + sizeof(tANI_U16) );
4071
Sachin Ahuja4f06a792014-12-04 18:14:32 +05304072 if (
4073#ifdef FEATURE_WLAN_ESE
4074 (eCSR_AUTH_TYPE_CCKM_RSN != negAuthType) &&
4075#endif
4076 csrLookupPMKID( pMac, sessionId, pSirBssDesc->bssId, &(PMKId[0]) ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07004077 {
4078 pPMK->cPMKIDs = 1;
4079
Kiet Lam64c1b492013-07-12 13:56:44 +05304080 vos_mem_copy(pPMK->PMKIDList[0].PMKID, PMKId, CSR_RSN_PMKID_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004081 }
4082 else
4083 {
4084 pPMK->cPMKIDs = 0;
4085 }
4086
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004087#ifdef WLAN_FEATURE_11W
4088 if ( pProfile->MFPEnabled )
4089 {
4090 pGroupMgmtCipherSuite = (tANI_U8 *) pPMK + sizeof ( tANI_U16 ) +
4091 ( pPMK->cPMKIDs * CSR_RSN_PMKID_SIZE );
Kiet Lam64c1b492013-07-12 13:56:44 +05304092 vos_mem_copy(pGroupMgmtCipherSuite, csrRSNOui[07], CSR_WPA_OUI_SIZE);
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004093 }
4094#endif
4095
Jeff Johnson295189b2012-06-20 16:38:30 -07004096 // Add in the fixed fields plus 1 Unicast cypher, less the IE Header length
4097 // Add in the size of the Auth suite (count plus a single OUI)
4098 // Add in the RSN caps field.
4099 // Add PMKID count and PMKID (if any)
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004100 // Add group management cipher suite
Jeff Johnson295189b2012-06-20 16:38:30 -07004101 pRSNIe->IeHeader.Length = (tANI_U8) (sizeof( *pRSNIe ) - sizeof ( pRSNIe->IeHeader ) +
4102 sizeof( *pAuthSuite ) +
4103 sizeof( tCsrRSNCapabilities ));
4104 if(pPMK->cPMKIDs)
4105 {
4106 pRSNIe->IeHeader.Length += (tANI_U8)(sizeof( tANI_U16 ) +
4107 (pPMK->cPMKIDs * CSR_RSN_PMKID_SIZE));
4108 }
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004109#ifdef WLAN_FEATURE_11W
4110 if ( pProfile->MFPEnabled )
4111 {
4112 if ( 0 == pPMK->cPMKIDs )
4113 pRSNIe->IeHeader.Length += sizeof( tANI_U16 );
4114 pRSNIe->IeHeader.Length += CSR_WPA_OUI_SIZE;
4115 }
4116#endif
4117
Jeff Johnson295189b2012-06-20 16:38:30 -07004118 // return the size of the IE header (total) constructed...
4119 cbRSNIe = pRSNIe->IeHeader.Length + sizeof( pRSNIe->IeHeader );
4120
4121 } while( 0 );
4122
4123 if( !pIes && pIesLocal )
4124 {
4125 //locally allocated
Kiet Lam64c1b492013-07-12 13:56:44 +05304126 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07004127 }
4128
4129 return( cbRSNIe );
4130}
4131
4132
4133#ifdef FEATURE_WLAN_WAPI
4134tANI_BOOLEAN csrGetWapiInformation( tHalHandle hHal, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pMCEncryption,
4135 tDot11fIEWAPI *pWapiIe,
4136 tANI_U8 *UnicastCypher,
4137 tANI_U8 *MulticastCypher,
4138 tANI_U8 *AuthSuite,
4139 eCsrAuthType *pNegotiatedAuthtype,
4140 eCsrEncryptionType *pNegotiatedMCCipher )
4141{
4142 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4143 tANI_BOOLEAN fAcceptableCyphers = FALSE;
4144 tANI_U8 cUnicastCyphers = 0;
4145 tANI_U8 cMulticastCyphers = 0;
4146 tANI_U8 cAuthSuites = 0, i;
4147 tANI_U8 Unicast[ CSR_WAPI_OUI_SIZE ];
4148 tANI_U8 Multicast[ CSR_WAPI_OUI_SIZE ];
4149 tANI_U8 AuthSuites[ CSR_WAPI_MAX_AUTH_SUITES ][ CSR_WAPI_OUI_SIZE ];
4150 tANI_U8 Authentication[ CSR_WAPI_OUI_SIZE ];
4151 tANI_U8 MulticastCyphers[ CSR_WAPI_MAX_MULTICAST_CYPHERS ][ CSR_WAPI_OUI_SIZE ];
4152 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
4153
4154 do{
4155 if ( pWapiIe->present )
4156 {
4157 cMulticastCyphers++;
Kiet Lam64c1b492013-07-12 13:56:44 +05304158 vos_mem_copy(MulticastCyphers, pWapiIe->multicast_cipher_suite,
4159 CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004160 cUnicastCyphers = (tANI_U8)(pWapiIe->unicast_cipher_suite_count);
4161 cAuthSuites = (tANI_U8)(pWapiIe->akm_suite_count);
4162 for(i = 0; i < cAuthSuites && i < CSR_WAPI_MAX_AUTH_SUITES; i++)
4163 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304164 vos_mem_copy((void *)&AuthSuites[i], (void *)&pWapiIe->akm_suites[i],
4165 CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004166 }
4167
4168 //Check - Is requested Unicast Cipher supported by the BSS.
4169 fAcceptableCyphers = csrMatchWapiOUIIndex( pMac, pWapiIe->unicast_cipher_suites, cUnicastCyphers,
4170 csrGetOUIIndexFromCipher( enType ), Unicast );
4171
4172 if( !fAcceptableCyphers ) break;
4173
4174
4175 //Unicast is supported. Pick the first matching Group cipher, if any.
4176 for( i = 0 ; i < pMCEncryption->numEntries ; i++ )
4177 {
4178 fAcceptableCyphers = csrMatchWapiOUIIndex( pMac, MulticastCyphers, cMulticastCyphers,
4179 csrGetOUIIndexFromCipher( pMCEncryption->encryptionType[i] ), Multicast );
4180 if(fAcceptableCyphers)
4181 {
4182 break;
4183 }
4184 }
4185 if( !fAcceptableCyphers ) break;
4186
4187 if( pNegotiatedMCCipher )
4188 *pNegotiatedMCCipher = pMCEncryption->encryptionType[i];
4189
4190 //Ciphers are supported, Match authentication algorithm and pick first matching authtype.
4191 if ( csrIsAuthWapiCert( pMac, AuthSuites, cAuthSuites, Authentication ) )
4192 {
4193 negAuthType = eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE;
4194 }
4195 else if ( csrIsAuthWapiPsk( pMac, AuthSuites, cAuthSuites, Authentication ) )
4196 {
4197 negAuthType = eCSR_AUTH_TYPE_WAPI_WAI_PSK;
4198 }
4199 else
4200 {
4201 fAcceptableCyphers = FALSE;
4202 negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
4203 }
4204 if( ( 0 == pAuthType->numEntries ) || ( FALSE == fAcceptableCyphers ) )
4205 {
4206 //Caller doesn't care about auth type, or BSS doesn't match
4207 break;
4208 }
4209 fAcceptableCyphers = FALSE;
4210 for( i = 0 ; i < pAuthType->numEntries; i++ )
4211 {
4212 if( pAuthType->authType[i] == negAuthType )
4213 {
4214 fAcceptableCyphers = TRUE;
4215 break;
4216 }
4217 }
4218 }
4219 }while (0);
4220
4221 if ( fAcceptableCyphers )
4222 {
4223 if ( MulticastCypher )
4224 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304225 vos_mem_copy(MulticastCypher, Multicast, CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004226 }
4227
4228 if ( UnicastCypher )
4229 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304230 vos_mem_copy(UnicastCypher, Unicast, CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004231 }
4232
4233 if ( AuthSuite )
4234 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304235 vos_mem_copy(AuthSuite, Authentication, CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004236 }
4237
4238 if ( pNegotiatedAuthtype )
4239 {
4240 *pNegotiatedAuthtype = negAuthType;
4241 }
4242 }
4243 return( fAcceptableCyphers );
4244}
4245
4246tANI_BOOLEAN csrIsWapiMatch( tHalHandle hHal, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pEnMcType,
4247 tDot11fBeaconIEs *pIes, eCsrAuthType *pNegotiatedAuthType, eCsrEncryptionType *pNegotiatedMCCipher )
4248{
4249 tANI_BOOLEAN fWapiMatch = FALSE;
4250
4251 // See if the cyphers in the Bss description match with the settings in the profile.
4252 fWapiMatch = csrGetWapiInformation( hHal, pAuthType, enType, pEnMcType, &pIes->WAPI, NULL, NULL, NULL,
4253 pNegotiatedAuthType, pNegotiatedMCCipher );
4254
4255 return( fWapiMatch );
4256}
4257
4258tANI_BOOLEAN csrLookupBKID( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U8 *pBSSId, tANI_U8 *pBKId )
4259{
4260 tANI_BOOLEAN fRC = FALSE, fMatchFound = FALSE;
4261 tANI_U32 Index;
4262 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4263
Jeff Johnson32d95a32012-09-10 13:15:23 -07004264 if(!pSession)
4265 {
4266 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4267 return FALSE;
4268 }
4269
Jeff Johnson295189b2012-06-20 16:38:30 -07004270 do
4271 {
4272 for( Index=0; Index < pSession->NumBkidCache; Index++ )
4273 {
Arif Hussaina7c8e412013-11-20 11:06:42 -08004274 smsLog(pMac, LOGW, "match BKID "MAC_ADDRESS_STR" to ",
4275 MAC_ADDR_ARRAY(pBSSId));
Kiet Lam64c1b492013-07-12 13:56:44 +05304276 if (vos_mem_compare(pBSSId, pSession->BkidCacheInfo[Index].BSSID, sizeof(tCsrBssid) ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07004277 {
4278 // match found
4279 fMatchFound = TRUE;
4280 break;
4281 }
4282 }
4283
4284 if( !fMatchFound ) break;
4285
Kiet Lam64c1b492013-07-12 13:56:44 +05304286 vos_mem_copy(pBKId, pSession->BkidCacheInfo[Index].BKID, CSR_WAPI_BKID_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004287
4288 fRC = TRUE;
4289 }
4290 while( 0 );
4291 smsLog(pMac, LOGW, "csrLookupBKID called return match = %d pMac->roam.NumBkidCache = %d", fRC, pSession->NumBkidCache);
4292
4293 return fRC;
4294}
4295
4296tANI_U8 csrConstructWapiIe( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
4297 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes, tCsrWapiIe *pWapiIe )
4298{
4299 tANI_BOOLEAN fWapiMatch = FALSE;
4300 tANI_U8 cbWapiIe = 0;
4301 tANI_U8 UnicastCypher[ CSR_WAPI_OUI_SIZE ];
4302 tANI_U8 MulticastCypher[ CSR_WAPI_OUI_SIZE ];
4303 tANI_U8 AuthSuite[ CSR_WAPI_OUI_SIZE ];
4304 tANI_U8 BKId[CSR_WAPI_BKID_SIZE];
4305 tANI_U8 *pWapi = NULL;
4306 tANI_BOOLEAN fBKIDFound = FALSE;
4307 tDot11fBeaconIEs *pIesLocal = pIes;
4308
4309 do
4310 {
4311 if ( !csrIsProfileWapi( pProfile ) ) break;
4312
4313 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4314 {
4315 break;
4316 }
4317
4318 // See if the cyphers in the Bss description match with the settings in the profile.
4319 fWapiMatch = csrGetWapiInformation( pMac, &pProfile->AuthType, pProfile->negotiatedUCEncryptionType,
4320 &pProfile->mcEncryptionType, &pIesLocal->WAPI,
4321 UnicastCypher, MulticastCypher, AuthSuite, NULL, NULL );
4322 if ( !fWapiMatch ) break;
4323
Kiet Lam64c1b492013-07-12 13:56:44 +05304324 vos_mem_set(pWapiIe, sizeof(tCsrWapiIe), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004325
4326 pWapiIe->IeHeader.ElementID = DOT11F_EID_WAPI;
4327
4328 pWapiIe->Version = CSR_WAPI_VERSION_SUPPORTED;
4329
4330 pWapiIe->cAuthenticationSuites = 1;
Kiet Lam64c1b492013-07-12 13:56:44 +05304331 vos_mem_copy(&pWapiIe->AuthOui[ 0 ], AuthSuite, sizeof( AuthSuite ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004332
4333 pWapi = (tANI_U8 *) (&pWapiIe->AuthOui[ 1 ]);
4334
4335 *pWapi = (tANI_U16)1; //cUnicastCyphers
4336 pWapi+=2;
Kiet Lam64c1b492013-07-12 13:56:44 +05304337 vos_mem_copy(pWapi, UnicastCypher, sizeof( UnicastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004338 pWapi += sizeof( UnicastCypher );
4339
Kiet Lam64c1b492013-07-12 13:56:44 +05304340 vos_mem_copy(pWapi, MulticastCypher, sizeof( MulticastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004341 pWapi += sizeof( MulticastCypher );
4342
4343
4344 // WAPI capabilities follows the Auth Suite (two octects)
4345 // we shouldn't EVER be sending out "pre-auth supported". It is an AP only capability
4346 // & since we already did a memset pWapiIe to 0, skip these fields
4347 pWapi +=2;
4348
4349 fBKIDFound = csrLookupBKID( pMac, sessionId, pSirBssDesc->bssId, &(BKId[0]) );
4350
4351
4352 if( fBKIDFound )
4353 {
4354 /* Do we need to change the endianness here */
4355 *pWapi = (tANI_U16)1; //cBKIDs
4356 pWapi+=2;
Kiet Lam64c1b492013-07-12 13:56:44 +05304357 vos_mem_copy(pWapi, BKId, CSR_WAPI_BKID_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004358 }
4359 else
4360 {
4361 *pWapi = 0;
4362 pWapi+=1;
4363 *pWapi = 0;
4364 pWapi+=1;
4365 }
4366
4367 // Add in the IE fields except the IE header
4368 // Add BKID count and BKID (if any)
4369 pWapiIe->IeHeader.Length = (tANI_U8) (sizeof( *pWapiIe ) - sizeof ( pWapiIe->IeHeader ));
4370
4371 /*2 bytes for BKID Count field*/
4372 pWapiIe->IeHeader.Length += sizeof( tANI_U16 );
4373
4374 if(fBKIDFound)
4375 {
4376 pWapiIe->IeHeader.Length += CSR_WAPI_BKID_SIZE;
4377 }
4378 // return the size of the IE header (total) constructed...
4379 cbWapiIe = pWapiIe->IeHeader.Length + sizeof( pWapiIe->IeHeader );
4380
4381 } while( 0 );
4382
4383 if( !pIes && pIesLocal )
4384 {
4385 //locally allocated
Kiet Lam64c1b492013-07-12 13:56:44 +05304386 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07004387 }
4388
4389 return( cbWapiIe );
4390}
4391#endif /* FEATURE_WLAN_WAPI */
4392
4393tANI_BOOLEAN csrGetWpaCyphers( tpAniSirGlobal pMac, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pMCEncryption,
4394 tDot11fIEWPA *pWpaIe,
4395 tANI_U8 *UnicastCypher,
4396 tANI_U8 *MulticastCypher,
4397 tANI_U8 *AuthSuite,
4398 eCsrAuthType *pNegotiatedAuthtype,
4399 eCsrEncryptionType *pNegotiatedMCCipher )
4400{
4401 tANI_BOOLEAN fAcceptableCyphers = FALSE;
4402 tANI_U8 cUnicastCyphers = 0;
4403 tANI_U8 cMulticastCyphers = 0;
4404 tANI_U8 cAuthSuites = 0;
4405 tANI_U8 Unicast[ CSR_WPA_OUI_SIZE ];
4406 tANI_U8 Multicast[ CSR_WPA_OUI_SIZE ];
4407 tANI_U8 Authentication[ CSR_WPA_OUI_SIZE ];
4408 tANI_U8 MulticastCyphers[ 1 ][ CSR_WPA_OUI_SIZE ];
4409 tANI_U8 i;
4410 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
4411
4412 do
4413 {
4414 if ( pWpaIe->present )
4415 {
4416 cMulticastCyphers = 1;
Kiet Lam64c1b492013-07-12 13:56:44 +05304417 vos_mem_copy(MulticastCyphers, pWpaIe->multicast_cipher, CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004418 cUnicastCyphers = (tANI_U8)(pWpaIe->unicast_cipher_count);
4419 cAuthSuites = (tANI_U8)(pWpaIe->auth_suite_count);
4420
4421 //Check - Is requested Unicast Cipher supported by the BSS.
4422 fAcceptableCyphers = csrMatchWPAOUIIndex( pMac, pWpaIe->unicast_ciphers, cUnicastCyphers,
4423 csrGetOUIIndexFromCipher( enType ), Unicast );
4424
4425 if( !fAcceptableCyphers ) break;
4426
4427
4428 //Unicast is supported. Pick the first matching Group cipher, if any.
4429 for( i = 0 ; i < pMCEncryption->numEntries ; i++ )
4430 {
4431 fAcceptableCyphers = csrMatchWPAOUIIndex( pMac, MulticastCyphers, cMulticastCyphers,
4432 csrGetOUIIndexFromCipher( pMCEncryption->encryptionType[i]), Multicast );
4433 if(fAcceptableCyphers)
4434 {
4435 break;
4436 }
4437 }
4438 if( !fAcceptableCyphers ) break;
4439
4440 if( pNegotiatedMCCipher )
4441 *pNegotiatedMCCipher = pMCEncryption->encryptionType[i];
4442
4443 /* Initializing with FALSE as it has TRUE value already */
4444 fAcceptableCyphers = FALSE;
4445 for (i = 0 ; i < pAuthType->numEntries; i++)
4446 {
4447 //Ciphers are supported, Match authentication algorithm and pick first matching authtype.
4448 if ( csrIsAuthWpa( pMac, pWpaIe->auth_suites, cAuthSuites, Authentication ) )
4449 {
4450 if (eCSR_AUTH_TYPE_WPA == pAuthType->authType[i])
4451 negAuthType = eCSR_AUTH_TYPE_WPA;
4452 }
4453 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthWpaPsk( pMac, pWpaIe->auth_suites, cAuthSuites, Authentication ) )
4454 {
4455 if (eCSR_AUTH_TYPE_WPA_PSK == pAuthType->authType[i])
4456 negAuthType = eCSR_AUTH_TYPE_WPA_PSK;
4457 }
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004458#ifdef FEATURE_WLAN_ESE
4459 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsEseCckmAuthWpa( pMac, pWpaIe->auth_suites, cAuthSuites, Authentication ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07004460 {
4461 if (eCSR_AUTH_TYPE_CCKM_WPA == pAuthType->authType[i])
4462 negAuthType = eCSR_AUTH_TYPE_CCKM_WPA;
4463 }
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004464#endif /* FEATURE_WLAN_ESE */
Jeff Johnson295189b2012-06-20 16:38:30 -07004465
4466 // The 1st auth type in the APs WPA IE, to match stations connecting
4467 // profiles auth type will cause us to exit this loop
4468 // This is added as some APs advertise multiple akms in the WPA IE.
4469 if (eCSR_AUTH_TYPE_UNKNOWN != negAuthType)
4470 {
4471 fAcceptableCyphers = TRUE;
4472 break;
4473 }
4474 } // for
4475 }
4476 }while(0);
4477
4478 if ( fAcceptableCyphers )
4479 {
4480 if ( MulticastCypher )
4481 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304482 vos_mem_copy((tANI_U8 **)MulticastCypher, Multicast, CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004483 }
4484
4485 if ( UnicastCypher )
4486 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304487 vos_mem_copy((tANI_U8 **)UnicastCypher, Unicast, CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004488 }
4489
4490 if ( AuthSuite )
4491 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304492 vos_mem_copy((tANI_U8 **)AuthSuite, Authentication, CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004493 }
4494
4495 if( pNegotiatedAuthtype )
4496 {
4497 *pNegotiatedAuthtype = negAuthType;
4498 }
4499 }
4500
4501 return( fAcceptableCyphers );
4502}
4503
4504
4505
4506tANI_BOOLEAN csrIsWpaEncryptionMatch( tpAniSirGlobal pMac, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pEnMcType,
4507 tDot11fBeaconIEs *pIes, eCsrAuthType *pNegotiatedAuthtype, eCsrEncryptionType *pNegotiatedMCCipher )
4508{
4509 tANI_BOOLEAN fWpaMatch = eANI_BOOLEAN_FALSE;
4510
4511 // See if the cyphers in the Bss description match with the settings in the profile.
4512 fWpaMatch = csrGetWpaCyphers( pMac, pAuthType, enType, pEnMcType, &pIes->WPA, NULL, NULL, NULL, pNegotiatedAuthtype, pNegotiatedMCCipher );
4513
4514 return( fWpaMatch );
4515}
4516
4517
4518tANI_U8 csrConstructWpaIe( tHalHandle hHal, tCsrRoamProfile *pProfile, tSirBssDescription *pSirBssDesc,
4519 tDot11fBeaconIEs *pIes, tCsrWpaIe *pWpaIe )
4520{
4521 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4522 tANI_BOOLEAN fWpaMatch;
4523 tANI_U8 cbWpaIe = 0;
4524 tANI_U8 UnicastCypher[ CSR_WPA_OUI_SIZE ];
4525 tANI_U8 MulticastCypher[ CSR_WPA_OUI_SIZE ];
4526 tANI_U8 AuthSuite[ CSR_WPA_OUI_SIZE ];
4527 tCsrWpaAuthIe *pAuthSuite;
4528 tDot11fBeaconIEs *pIesLocal = pIes;
4529
4530 do
4531 {
4532 if ( !csrIsProfileWpa( pProfile ) ) break;
4533
4534 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4535 {
4536 break;
4537 }
4538 // See if the cyphers in the Bss description match with the settings in the profile.
4539 fWpaMatch = csrGetWpaCyphers( hHal, &pProfile->AuthType, pProfile->negotiatedUCEncryptionType, &pProfile->mcEncryptionType,
4540 &pIesLocal->WPA, UnicastCypher, MulticastCypher, AuthSuite, NULL, NULL );
4541 if ( !fWpaMatch ) break;
4542
4543 pWpaIe->IeHeader.ElementID = SIR_MAC_WPA_EID;
4544
Kiet Lam64c1b492013-07-12 13:56:44 +05304545 vos_mem_copy(pWpaIe->Oui, csrWpaOui[01], sizeof( pWpaIe->Oui ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004546
4547 pWpaIe->Version = CSR_WPA_VERSION_SUPPORTED;
4548
Kiet Lam64c1b492013-07-12 13:56:44 +05304549 vos_mem_copy(pWpaIe->MulticastOui, MulticastCypher, sizeof( MulticastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004550
4551 pWpaIe->cUnicastCyphers = 1;
4552
Kiet Lam64c1b492013-07-12 13:56:44 +05304553 vos_mem_copy(&pWpaIe->UnicastOui[ 0 ], UnicastCypher, sizeof( UnicastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004554
4555 pAuthSuite = (tCsrWpaAuthIe *)( &pWpaIe->UnicastOui[ pWpaIe->cUnicastCyphers ] );
4556
4557 pAuthSuite->cAuthenticationSuites = 1;
Kiet Lam64c1b492013-07-12 13:56:44 +05304558 vos_mem_copy(&pAuthSuite->AuthOui[ 0 ], AuthSuite, sizeof( AuthSuite ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004559
4560 // The WPA capabilities follows the Auth Suite (two octects)--
4561 // this field is optional, and we always "send" zero, so just
4562 // remove it. This is consistent with our assumptions in the
4563 // frames compiler; c.f. bug 15234:
4564 // http://gold.woodsidenet.com/bugzilla/show_bug.cgi?id=15234
4565
4566 // Add in the fixed fields plus 1 Unicast cypher, less the IE Header length
4567 // Add in the size of the Auth suite (count plus a single OUI)
4568 pWpaIe->IeHeader.Length = sizeof( *pWpaIe ) - sizeof ( pWpaIe->IeHeader ) +
4569 sizeof( *pAuthSuite );
4570
4571 // return the size of the IE header (total) constructed...
4572 cbWpaIe = pWpaIe->IeHeader.Length + sizeof( pWpaIe->IeHeader );
4573
4574 } while( 0 );
4575
4576 if( !pIes && pIesLocal )
4577 {
4578 //locally allocated
Kiet Lam64c1b492013-07-12 13:56:44 +05304579 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07004580 }
4581
4582 return( cbWpaIe );
4583}
4584
4585
4586tANI_BOOLEAN csrGetWpaRsnIe( tHalHandle hHal, tANI_U8 *pIes, tANI_U32 len,
4587 tANI_U8 *pWpaIe, tANI_U8 *pcbWpaIe, tANI_U8 *pRSNIe, tANI_U8 *pcbRSNIe)
4588{
Jeff Johnson295189b2012-06-20 16:38:30 -07004589 tDot11IEHeader *pIEHeader;
4590 tSirMacPropIE *pSirMacPropIE;
4591 tANI_U32 cbParsed;
4592 tANI_U32 cbIE;
4593 int cExpectedIEs = 0;
4594 int cFoundIEs = 0;
4595 int cbPropIETotal;
4596
4597 pIEHeader = (tDot11IEHeader *)pIes;
4598 if(pWpaIe) cExpectedIEs++;
4599 if(pRSNIe) cExpectedIEs++;
4600
4601 // bss description length includes all fields other than the length itself
4602 cbParsed = 0;
4603
4604 // Loop as long as there is data left in the IE of the Bss Description
4605 // and the number of Expected IEs is NOT found yet.
4606 while( ( (cbParsed + sizeof( *pIEHeader )) <= len ) && ( cFoundIEs < cExpectedIEs ) )
4607 {
4608 cbIE = sizeof( *pIEHeader ) + pIEHeader->Length;
4609
4610 if ( ( cbIE + cbParsed ) > len ) break;
4611
4612 if ( ( pIEHeader->Length >= gCsrIELengthTable[ pIEHeader->ElementID ].min ) &&
4613 ( pIEHeader->Length <= gCsrIELengthTable[ pIEHeader->ElementID ].max ) )
4614 {
4615 switch( pIEHeader->ElementID )
4616 {
4617 // Parse the 221 (0xdd) Proprietary IEs here...
4618 // Note that the 221 IE is overloaded, containing the WPA IE, WMM/WME IE, and the
4619 // Airgo proprietary IE information.
4620 case SIR_MAC_WPA_EID:
4621 {
4622 tANI_U32 aniOUI;
4623 tANI_U8 *pOui = (tANI_U8 *)&aniOUI;
4624
4625 pOui++;
4626 aniOUI = ANI_OUI;
4627 aniOUI = i_ntohl( aniOUI );
4628
4629 pSirMacPropIE = ( tSirMacPropIE *)pIEHeader;
4630 cbPropIETotal = pSirMacPropIE->length;
4631
4632 // Validate the ANI OUI is in the OUI field in the proprietary IE...
4633 if ( ( pSirMacPropIE->length >= WNI_CFG_MANUFACTURER_OUI_LEN ) &&
4634 pOui[ 0 ] == pSirMacPropIE->oui[ 0 ] &&
4635 pOui[ 1 ] == pSirMacPropIE->oui[ 1 ] &&
4636 pOui[ 2 ] == pSirMacPropIE->oui[ 2 ] )
4637 {
4638 }
4639 else
4640 {
4641 tCsrWpaIe *pIe = ( tCsrWpaIe * )pIEHeader;
4642
4643 if(!pWpaIe || !pcbWpaIe) break;
4644 // Check if this is a valid WPA IE. Then check that the
4645 // WPA OUI is in place and the version is one that we support.
4646 if ( ( pIe->IeHeader.Length >= SIR_MAC_WPA_IE_MIN_LENGTH ) &&
Kiet Lam64c1b492013-07-12 13:56:44 +05304647 ( vos_mem_compare( pIe->Oui, (void *)csrWpaOui[1],
4648 sizeof( pIe->Oui ) ) ) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004649 ( pIe->Version <= CSR_WPA_VERSION_SUPPORTED ) )
4650 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304651 vos_mem_copy(pWpaIe, pIe,
4652 pIe->IeHeader.Length + sizeof( pIe->IeHeader ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004653 *pcbWpaIe = pIe->IeHeader.Length + sizeof( pIe->IeHeader );
4654 cFoundIEs++;
4655
4656 break;
4657 }
4658 }
4659
4660 break;
4661 }
4662
4663 case SIR_MAC_RSN_EID:
4664 {
4665 tCsrRSNIe *pIe;
4666
4667 if(!pcbRSNIe || !pRSNIe) break;
4668 pIe = (tCsrRSNIe *)pIEHeader;
4669
4670 // Check the length of the RSN Ie to assure it is valid. Then check that the
4671 // version is one that we support.
4672
4673 if ( pIe->IeHeader.Length < SIR_MAC_RSN_IE_MIN_LENGTH ) break;
4674 if ( pIe->Version > CSR_RSN_VERSION_SUPPORTED ) break;
4675
4676 cFoundIEs++;
4677
4678 // if there is enough room in the WpaIE passed in, then copy the Wpa IE into
4679 // the buffer passed in.
4680 if ( *pcbRSNIe < pIe->IeHeader.Length + sizeof( pIe->IeHeader ) ) break;
Kiet Lam64c1b492013-07-12 13:56:44 +05304681 vos_mem_copy(pRSNIe, pIe,
4682 pIe->IeHeader.Length + sizeof( pIe->IeHeader ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004683 *pcbRSNIe = pIe->IeHeader.Length + sizeof( pIe->IeHeader );
4684
4685 break;
4686 }
4687
4688 // Add support for other IE here...
4689 default:
4690 break;
4691 }
4692 }
4693
4694 cbParsed += cbIE;
4695
4696 pIEHeader = (tDot11IEHeader *)( ((tANI_U8 *)pIEHeader) + cbIE );
4697
4698 }
4699
4700 // return a BOOL that tells if all of the IEs asked for were found...
4701 return( cFoundIEs == cExpectedIEs );
4702}
4703
4704
4705//If a WPAIE exists in the profile, just use it. Or else construct one from the BSS
4706//Caller allocated memory for pWpaIe and guarrantee it can contain a max length WPA IE
4707tANI_U8 csrRetrieveWpaIe( tHalHandle hHal, tCsrRoamProfile *pProfile, tSirBssDescription *pSirBssDesc,
4708 tDot11fBeaconIEs *pIes, tCsrWpaIe *pWpaIe )
4709{
4710 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4711 tANI_U8 cbWpaIe = 0;
4712
4713 do
4714 {
4715 if ( !csrIsProfileWpa( pProfile ) ) break;
4716 if(pProfile->nWPAReqIELength && pProfile->pWPAReqIE)
4717 {
4718 if(SIR_MAC_WPA_IE_MAX_LENGTH >= pProfile->nWPAReqIELength)
4719 {
4720 cbWpaIe = (tANI_U8)pProfile->nWPAReqIELength;
Kiet Lam64c1b492013-07-12 13:56:44 +05304721 vos_mem_copy(pWpaIe, pProfile->pWPAReqIE, cbWpaIe);
Jeff Johnson295189b2012-06-20 16:38:30 -07004722 }
4723 else
4724 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08004725 smsLog(pMac, LOGW, " csrRetrieveWpaIe detect invalid WPA IE length (%d) ", pProfile->nWPAReqIELength);
Jeff Johnson295189b2012-06-20 16:38:30 -07004726 }
4727 }
4728 else
4729 {
4730 cbWpaIe = csrConstructWpaIe(pMac, pProfile, pSirBssDesc, pIes, pWpaIe);
4731 }
4732 }while(0);
4733
4734 return (cbWpaIe);
4735}
4736
4737
4738//If a RSNIE exists in the profile, just use it. Or else construct one from the BSS
4739//Caller allocated memory for pWpaIe and guarrantee it can contain a max length WPA IE
4740tANI_U8 csrRetrieveRsnIe( tHalHandle hHal, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
4741 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes, tCsrRSNIe *pRsnIe )
4742{
4743 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4744 tANI_U8 cbRsnIe = 0;
4745
4746 do
4747 {
4748 if ( !csrIsProfileRSN( pProfile ) ) break;
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004749#ifdef FEATURE_WLAN_LFR
Madan Mohan Koyyalamudi03aae5f2012-11-28 01:51:22 +05304750 if (csrRoamIsFastRoamEnabled(pMac, sessionId))
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004751 {
4752 // If "Legacy Fast Roaming" is enabled ALWAYS rebuild the RSN IE from
4753 // scratch. So it contains the current PMK-IDs
4754 cbRsnIe = csrConstructRSNIe(pMac, sessionId, pProfile, pSirBssDesc, pIes, pRsnIe);
4755 }
4756 else
4757#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004758 if(pProfile->nRSNReqIELength && pProfile->pRSNReqIE)
4759 {
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004760 // If you have one started away, re-use it.
Jeff Johnson295189b2012-06-20 16:38:30 -07004761 if(SIR_MAC_WPA_IE_MAX_LENGTH >= pProfile->nRSNReqIELength)
4762 {
4763 cbRsnIe = (tANI_U8)pProfile->nRSNReqIELength;
Kiet Lam64c1b492013-07-12 13:56:44 +05304764 vos_mem_copy(pRsnIe, pProfile->pRSNReqIE, cbRsnIe);
Jeff Johnson295189b2012-06-20 16:38:30 -07004765 }
4766 else
4767 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08004768 smsLog(pMac, LOGW, " csrRetrieveRsnIe detect invalid RSN IE length (%d) ", pProfile->nRSNReqIELength);
Jeff Johnson295189b2012-06-20 16:38:30 -07004769 }
4770 }
4771 else
4772 {
4773 cbRsnIe = csrConstructRSNIe(pMac, sessionId, pProfile, pSirBssDesc, pIes, pRsnIe);
4774 }
4775 }while(0);
4776
4777 return (cbRsnIe);
4778}
4779
4780
4781#ifdef FEATURE_WLAN_WAPI
4782//If a WAPI IE exists in the profile, just use it. Or else construct one from the BSS
4783//Caller allocated memory for pWapiIe and guarrantee it can contain a max length WAPI IE
4784tANI_U8 csrRetrieveWapiIe( tHalHandle hHal, tANI_U32 sessionId,
4785 tCsrRoamProfile *pProfile, tSirBssDescription *pSirBssDesc,
4786 tDot11fBeaconIEs *pIes, tCsrWapiIe *pWapiIe )
4787{
4788 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4789 tANI_U8 cbWapiIe = 0;
4790
4791 do
4792 {
4793 if ( !csrIsProfileWapi( pProfile ) ) break;
4794 if(pProfile->nWAPIReqIELength && pProfile->pWAPIReqIE)
4795 {
4796 if(DOT11F_IE_WAPI_MAX_LEN >= pProfile->nWAPIReqIELength)
4797 {
4798 cbWapiIe = (tANI_U8)pProfile->nWAPIReqIELength;
Kiet Lam64c1b492013-07-12 13:56:44 +05304799 vos_mem_copy(pWapiIe, pProfile->pWAPIReqIE, cbWapiIe);
Jeff Johnson295189b2012-06-20 16:38:30 -07004800 }
4801 else
4802 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08004803 smsLog(pMac, LOGW, " csrRetrieveWapiIe detect invalid WAPI IE length (%d) ", pProfile->nWAPIReqIELength);
Jeff Johnson295189b2012-06-20 16:38:30 -07004804 }
4805 }
4806 else
4807 {
4808 cbWapiIe = csrConstructWapiIe(pMac, sessionId, pProfile, pSirBssDesc, pIes, pWapiIe);
4809 }
4810 }while(0);
4811
4812 return (cbWapiIe);
4813}
4814#endif /* FEATURE_WLAN_WAPI */
4815
4816tANI_BOOLEAN csrSearchChannelListForTxPower(tHalHandle hHal, tSirBssDescription *pBssDescription, tCsrChannelSet *returnChannelGroup)
4817{
4818 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4819 tListElem *pEntry;
4820 tANI_U16 i;
4821 tANI_U16 startingChannel;
4822 tANI_BOOLEAN found = FALSE;
4823 tCsrChannelSet *pChannelGroup;
4824
4825 pEntry = csrLLPeekHead( &pMac->roam.channelList5G, LL_ACCESS_LOCK );
4826
4827 while ( pEntry )
4828 {
4829 pChannelGroup = GET_BASE_ADDR( pEntry, tCsrChannelSet, channelListLink );
4830 startingChannel = pChannelGroup->firstChannel;
4831 for ( i = 0; i < pChannelGroup->numChannels; i++ )
4832 {
4833 if ( startingChannel + i * pChannelGroup->interChannelOffset == pBssDescription->channelId )
4834 {
4835 found = TRUE;
4836 break;
4837 }
4838 }
4839
4840 if ( found )
4841 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304842 vos_mem_copy(returnChannelGroup, pChannelGroup, sizeof(tCsrChannelSet));
Jeff Johnson295189b2012-06-20 16:38:30 -07004843 break;
4844 }
4845 else
4846 {
4847 pEntry = csrLLNext( &pMac->roam.channelList5G, pEntry, LL_ACCESS_LOCK );
4848 }
4849 }
4850
4851 return( found );
4852}
4853
4854tANI_BOOLEAN csrRatesIsDot11Rate11bSupportedRate( tANI_U8 dot11Rate )
4855{
4856 tANI_BOOLEAN fSupported = FALSE;
4857 tANI_U16 nonBasicRate = (tANI_U16)( BITS_OFF( dot11Rate, CSR_DOT11_BASIC_RATE_MASK ) );
4858
4859 switch ( nonBasicRate )
4860 {
4861 case eCsrSuppRate_1Mbps:
4862 case eCsrSuppRate_2Mbps:
4863 case eCsrSuppRate_5_5Mbps:
4864 case eCsrSuppRate_11Mbps:
4865 fSupported = TRUE;
4866 break;
4867
4868 default:
4869 break;
4870 }
4871
4872 return( fSupported );
4873}
4874
4875tANI_BOOLEAN csrRatesIsDot11Rate11aSupportedRate( tANI_U8 dot11Rate )
4876{
4877 tANI_BOOLEAN fSupported = FALSE;
4878 tANI_U16 nonBasicRate = (tANI_U16)( BITS_OFF( dot11Rate, CSR_DOT11_BASIC_RATE_MASK ) );
4879
4880 switch ( nonBasicRate )
4881 {
4882 case eCsrSuppRate_6Mbps:
4883 case eCsrSuppRate_9Mbps:
4884 case eCsrSuppRate_12Mbps:
4885 case eCsrSuppRate_18Mbps:
4886 case eCsrSuppRate_24Mbps:
4887 case eCsrSuppRate_36Mbps:
4888 case eCsrSuppRate_48Mbps:
4889 case eCsrSuppRate_54Mbps:
4890 fSupported = TRUE;
4891 break;
4892
4893 default:
4894 break;
4895 }
4896
4897 return( fSupported );
4898}
4899
4900
4901
4902tAniEdType csrTranslateEncryptTypeToEdType( eCsrEncryptionType EncryptType )
4903{
4904 tAniEdType edType;
4905
4906 switch ( EncryptType )
4907 {
4908 default:
4909 case eCSR_ENCRYPT_TYPE_NONE:
4910 edType = eSIR_ED_NONE;
4911 break;
4912
4913 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
4914 case eCSR_ENCRYPT_TYPE_WEP40:
4915 edType = eSIR_ED_WEP40;
4916 break;
4917
4918 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
4919 case eCSR_ENCRYPT_TYPE_WEP104:
4920 edType = eSIR_ED_WEP104;
4921 break;
4922
4923 case eCSR_ENCRYPT_TYPE_TKIP:
4924 edType = eSIR_ED_TKIP;
4925 break;
4926
4927 case eCSR_ENCRYPT_TYPE_AES:
4928 edType = eSIR_ED_CCMP;
4929 break;
4930#ifdef FEATURE_WLAN_WAPI
4931 case eCSR_ENCRYPT_TYPE_WPI:
4932 edType = eSIR_ED_WPI;
Gopichand Nakkala39d9d7a2013-05-19 19:07:35 +05304933 break ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004934#endif
4935#ifdef WLAN_FEATURE_11W
4936 //11w BIP
4937 case eCSR_ENCRYPT_TYPE_AES_CMAC:
4938 edType = eSIR_ED_AES_128_CMAC;
4939 break;
4940#endif
4941 }
4942
4943 return( edType );
4944}
4945
4946
4947//pIes can be NULL
4948tANI_BOOLEAN csrValidateWep( tpAniSirGlobal pMac, eCsrEncryptionType ucEncryptionType,
4949 tCsrAuthList *pAuthList, tCsrEncryptionList *pMCEncryptionList,
4950 eCsrAuthType *pNegotiatedAuthType, eCsrEncryptionType *pNegotiatedMCEncryption,
4951 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes )
4952{
4953 tANI_U32 idx;
4954 tANI_BOOLEAN fMatch = FALSE;
4955 eCsrAuthType negotiatedAuth = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4956 eCsrEncryptionType negotiatedMCCipher = eCSR_ENCRYPT_TYPE_UNKNOWN;
4957
4958 //This function just checks whether HDD is giving correct values for Multicast cipher and Auth.
4959
4960 do
4961 {
4962 //If privacy bit is not set, consider no match
4963 if ( !csrIsPrivacy( pSirBssDesc ) ) break;
4964
4965 for( idx = 0; idx < pMCEncryptionList->numEntries; idx++ )
4966 {
4967 switch( pMCEncryptionList->encryptionType[idx] )
4968 {
4969 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
4970 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
4971 case eCSR_ENCRYPT_TYPE_WEP40:
4972 case eCSR_ENCRYPT_TYPE_WEP104:
4973 /* Multicast list may contain WEP40/WEP104. Check whether it matches UC.
4974 */
4975 if( ucEncryptionType == pMCEncryptionList->encryptionType[idx] )
4976 {
4977 fMatch = TRUE;
4978 negotiatedMCCipher = pMCEncryptionList->encryptionType[idx];
4979 }
4980 break;
4981 default:
4982 fMatch = FALSE;
4983 break;
4984 }
4985 if(fMatch) break;
4986 }
4987
4988 if(!fMatch) break;
4989
4990 for( idx = 0; idx < pAuthList->numEntries; idx++ )
4991 {
4992 switch( pAuthList->authType[idx] )
4993 {
4994 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
4995 case eCSR_AUTH_TYPE_SHARED_KEY:
4996 case eCSR_AUTH_TYPE_AUTOSWITCH:
4997 fMatch = TRUE;
4998 negotiatedAuth = pAuthList->authType[idx];
4999 break;
5000 default:
5001 fMatch = FALSE;
5002 }
5003 if (fMatch) break;
5004 }
5005
5006 if(!fMatch) break;
5007 //In case of WPA / WPA2, check whether it supports WEP as well
5008 if(pIes)
5009 {
5010 //Prepare the encryption type for WPA/WPA2 functions
5011 if( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == ucEncryptionType )
5012 {
5013 ucEncryptionType = eCSR_ENCRYPT_TYPE_WEP40;
5014 }
5015 else if( eCSR_ENCRYPT_TYPE_WEP104 == ucEncryptionType )
5016 {
5017 ucEncryptionType = eCSR_ENCRYPT_TYPE_WEP104;
5018 }
5019 //else we can use the encryption type directly
Kiet Lam64c1b492013-07-12 13:56:44 +05305020 if ( pIes->WPA.present )
Jeff Johnson295189b2012-06-20 16:38:30 -07005021 {
Kiet Lam64c1b492013-07-12 13:56:44 +05305022 fMatch = vos_mem_compare(pIes->WPA.multicast_cipher,
5023 csrWpaOui[csrGetOUIIndexFromCipher( ucEncryptionType )],
5024 CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005025 if( fMatch ) break;
5026 }
Kiet Lam64c1b492013-07-12 13:56:44 +05305027 if ( pIes->RSN.present )
Jeff Johnson295189b2012-06-20 16:38:30 -07005028 {
Kiet Lam64c1b492013-07-12 13:56:44 +05305029 fMatch = vos_mem_compare(pIes->RSN.gp_cipher_suite,
5030 csrRSNOui[csrGetOUIIndexFromCipher( ucEncryptionType )],
5031 CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005032 }
5033 }
5034
5035 }while(0);
5036
5037 if( fMatch )
5038 {
5039 if( pNegotiatedAuthType )
5040 *pNegotiatedAuthType = negotiatedAuth;
5041
5042 if( pNegotiatedMCEncryption )
5043 *pNegotiatedMCEncryption = negotiatedMCCipher;
5044 }
5045
5046
5047 return fMatch;
5048}
5049
5050
5051//pIes shall contain IEs from pSirBssDesc. It shall be returned from function csrGetParsedBssDescriptionIEs
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305052tANI_BOOLEAN csrIsSecurityMatch( tHalHandle hHal, tCsrAuthList *authType,
5053 tCsrEncryptionList *pUCEncryptionType,
5054 tCsrEncryptionList *pMCEncryptionType,
5055 tANI_BOOLEAN *pMFPEnabled,
5056 tANI_U8 *pMFPRequired, tANI_U8 *pMFPCapable,
5057 tSirBssDescription *pSirBssDesc,
5058 tDot11fBeaconIEs *pIes,
5059 eCsrAuthType *negotiatedAuthtype,
5060 eCsrEncryptionType *negotiatedUCCipher,
5061 eCsrEncryptionType *negotiatedMCCipher )
Jeff Johnson295189b2012-06-20 16:38:30 -07005062{
5063 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
5064 tANI_BOOLEAN fMatch = FALSE;
5065 tANI_U8 i,idx;
5066 eCsrEncryptionType mcCipher = eCSR_ENCRYPT_TYPE_UNKNOWN, ucCipher = eCSR_ENCRYPT_TYPE_UNKNOWN;
5067 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
5068
5069 for( i = 0 ; ((i < pUCEncryptionType->numEntries) && (!fMatch)) ; i++ )
5070 {
5071 ucCipher = pUCEncryptionType->encryptionType[i];
5072 // If the Bss description shows the Privacy bit is on, then we must have some sort of encryption configured
5073 // for the profile to work. Don't attempt to join networks with Privacy bit set when profiles say NONE for
5074 // encryption type.
5075 switch ( ucCipher )
5076 {
5077 case eCSR_ENCRYPT_TYPE_NONE:
5078 {
5079 // for NO encryption, if the Bss description has the Privacy bit turned on, then encryption is
5080 // required so we have to reject this Bss.
5081 if ( csrIsPrivacy( pSirBssDesc ) )
5082 {
5083 fMatch = FALSE;
5084 }
5085 else
5086 {
5087 fMatch = TRUE;
5088 }
5089
5090 if ( fMatch )
5091 {
5092 fMatch = FALSE;
5093 //Check Multicast cipher requested and Auth type requested.
5094 for( idx = 0 ; idx < pMCEncryptionType->numEntries ; idx++ )
5095 {
5096 if( eCSR_ENCRYPT_TYPE_NONE == pMCEncryptionType->encryptionType[idx] )
5097 {
5098 fMatch = TRUE; //Multicast can only be none.
5099 mcCipher = pMCEncryptionType->encryptionType[idx];
5100 break;
5101 }
5102 }
5103 if (!fMatch) break;
5104
5105 fMatch = FALSE;
5106 //Check Auth list. It should contain AuthOpen.
5107 for( idx = 0 ; idx < authType->numEntries ; idx++ )
5108 {
5109 if( eCSR_AUTH_TYPE_OPEN_SYSTEM == authType->authType[idx] )
5110 {
5111 fMatch = TRUE;
5112 negAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5113 break;
5114 }
5115 }
5116 if (!fMatch) break;
5117
5118 }
5119 break;
5120 }
5121
5122 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
5123 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
5124 // !! might want to check for WEP keys set in the Profile.... ?
5125 // !! don't need to have the privacy bit in the Bss description. Many AP policies make legacy
5126 // encryption 'optional' so we don't know if we can associate or not. The AP will reject if
5127 // encryption is not allowed without the Privacy bit turned on.
5128 fMatch = csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes);
5129
5130 break;
5131
5132 // these are all of the WPA encryption types...
5133 case eCSR_ENCRYPT_TYPE_WEP40:
5134 case eCSR_ENCRYPT_TYPE_WEP104:
5135 fMatch = csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes);
5136 break;
5137
5138 case eCSR_ENCRYPT_TYPE_TKIP:
5139 case eCSR_ENCRYPT_TYPE_AES:
5140 {
5141 if(pIes)
5142 {
5143 // First check if there is a RSN match
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305144 fMatch = csrIsRSNMatch( pMac, authType, ucCipher,
5145 pMCEncryptionType, pMFPEnabled,
5146 pMFPRequired, pMFPCapable,
5147 pIes, &negAuthType, &mcCipher );
Jeff Johnson295189b2012-06-20 16:38:30 -07005148 if( !fMatch )
5149 {
5150 // If not RSN, then check if there is a WPA match
5151 fMatch = csrIsWpaEncryptionMatch( pMac, authType, ucCipher, pMCEncryptionType, pIes,
5152 &negAuthType, &mcCipher );
5153 }
5154 }
5155 else
5156 {
5157 fMatch = FALSE;
5158 }
5159 break;
5160 }
5161#ifdef FEATURE_WLAN_WAPI
5162 case eCSR_ENCRYPT_TYPE_WPI://WAPI
5163 {
5164 if(pIes)
5165 {
5166 fMatch = csrIsWapiMatch( hHal, authType, ucCipher, pMCEncryptionType, pIes, &negAuthType, &mcCipher );
5167 }
5168 else
5169 {
5170 fMatch = FALSE;
5171 }
5172 break;
5173 }
5174#endif /* FEATURE_WLAN_WAPI */
5175 case eCSR_ENCRYPT_TYPE_ANY:
5176 default:
5177 {
5178 tANI_BOOLEAN fMatchAny = eANI_BOOLEAN_FALSE;
5179
5180 fMatch = eANI_BOOLEAN_TRUE;
5181 //It is allowed to match anything. Try the more secured ones first.
5182 if(pIes)
5183 {
5184 //Check AES first
5185 ucCipher = eCSR_ENCRYPT_TYPE_AES;
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305186 fMatchAny = csrIsRSNMatch( hHal, authType, ucCipher,
5187 pMCEncryptionType, pMFPEnabled,
5188 pMFPRequired, pMFPCapable, pIes,
5189 &negAuthType, &mcCipher );
Jeff Johnson295189b2012-06-20 16:38:30 -07005190 if(!fMatchAny)
5191 {
5192 //Check TKIP
5193 ucCipher = eCSR_ENCRYPT_TYPE_TKIP;
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305194 fMatchAny = csrIsRSNMatch( hHal, authType, ucCipher,
5195 pMCEncryptionType,
5196 pMFPEnabled, pMFPRequired,
5197 pMFPCapable, pIes,
5198 &negAuthType, &mcCipher );
Jeff Johnson295189b2012-06-20 16:38:30 -07005199 }
5200#ifdef FEATURE_WLAN_WAPI
5201 if(!fMatchAny)
5202 {
5203 //Check WAPI
5204 ucCipher = eCSR_ENCRYPT_TYPE_WPI;
5205 fMatchAny = csrIsWapiMatch( hHal, authType, ucCipher, pMCEncryptionType, pIes, &negAuthType, &mcCipher );
5206 }
5207#endif /* FEATURE_WLAN_WAPI */
5208 }
5209 if(!fMatchAny)
5210 {
5211 ucCipher = eCSR_ENCRYPT_TYPE_WEP104;
5212 if(!csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes))
5213 {
5214 ucCipher = eCSR_ENCRYPT_TYPE_WEP40;
5215 if(!csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes))
5216 {
5217 ucCipher = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
5218 if(!csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes))
5219 {
5220 ucCipher = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
5221 if(!csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes))
5222 {
5223 //It must be open and no encryption
5224 if ( csrIsPrivacy( pSirBssDesc ) )
5225 {
5226 //This is not right
5227 fMatch = eANI_BOOLEAN_FALSE;
5228 }
5229 else
5230 {
5231 negAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5232 mcCipher = eCSR_ENCRYPT_TYPE_NONE;
5233 ucCipher = eCSR_ENCRYPT_TYPE_NONE;
5234 }
5235 }
5236 }
5237 }
5238 }
5239 }
5240 break;
5241 }
5242 }
5243
5244 }
5245
5246 if( fMatch )
5247 {
5248 if( negotiatedUCCipher )
5249 *negotiatedUCCipher = ucCipher;
5250
5251 if( negotiatedMCCipher )
5252 *negotiatedMCCipher = mcCipher;
5253
5254 if( negotiatedAuthtype )
5255 *negotiatedAuthtype = negAuthType;
5256 }
5257
5258 return( fMatch );
5259}
5260
5261
5262tANI_BOOLEAN csrIsSsidMatch( tpAniSirGlobal pMac, tANI_U8 *ssid1, tANI_U8 ssid1Len, tANI_U8 *bssSsid,
5263 tANI_U8 bssSsidLen, tANI_BOOLEAN fSsidRequired )
5264{
5265 tANI_BOOLEAN fMatch = FALSE;
5266
5267 do {
Padma, Santhosh Kumara43e06c2015-05-21 14:58:13 +05305268 // Check for the specification of the Broadcast SSID at the beginning
5269 // of the list. If specified, then all SSIDs are matches
5270 // (broadcast SSID means accept all SSIDs).
5271 if ( ssid1Len == 0 )
5272 {
5273 fMatch = TRUE;
5274 break;
5275 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005276
5277 // There are a few special cases. If the Bss description has a Broadcast SSID,
5278 // then our Profile must have a single SSID without Wildcards so we can program
5279 // the SSID.
5280 // SSID could be suppressed in beacons. In that case SSID IE has valid length
5281 // but the SSID value is all NULL characters. That condition is trated same
5282 // as NULL SSID
5283 if ( csrIsNULLSSID( bssSsid, bssSsidLen ) )
5284 {
5285 if ( eANI_BOOLEAN_FALSE == fSsidRequired )
5286 {
5287 fMatch = TRUE;
5288 }
5289 break;
5290 }
5291
Jeff Johnson295189b2012-06-20 16:38:30 -07005292 if(ssid1Len != bssSsidLen) break;
Kiet Lam64c1b492013-07-12 13:56:44 +05305293 if (vos_mem_compare(bssSsid, ssid1, bssSsidLen))
Jeff Johnson295189b2012-06-20 16:38:30 -07005294 {
5295 fMatch = TRUE;
5296 break;
5297 }
5298
5299 } while( 0 );
5300
5301 return( fMatch );
5302}
5303
5304
5305//Null ssid means match
5306tANI_BOOLEAN csrIsSsidInList( tHalHandle hHal, tSirMacSSid *pSsid, tCsrSSIDs *pSsidList )
5307{
Jeff Johnson295189b2012-06-20 16:38:30 -07005308 tANI_BOOLEAN fMatch = FALSE;
5309 tANI_U32 i;
5310
5311 if ( pSsidList && pSsid )
5312 {
5313 for(i = 0; i < pSsidList->numOfSSIDs; i++)
5314 {
5315 if(csrIsNULLSSID(pSsidList->SSIDList[i].SSID.ssId, pSsidList->SSIDList[i].SSID.length) ||
Kiet Lam64c1b492013-07-12 13:56:44 +05305316 ((pSsidList->SSIDList[i].SSID.length == pSsid->length) &&
5317 vos_mem_compare(pSsid->ssId, pSsidList->SSIDList[i].SSID.ssId, pSsid->length)))
Jeff Johnson295189b2012-06-20 16:38:30 -07005318 {
5319 fMatch = TRUE;
5320 break;
5321 }
5322 }
5323 }
5324
5325 return (fMatch);
5326}
5327
5328//like to use sirCompareMacAddr
5329tANI_BOOLEAN csrIsMacAddressZero( tpAniSirGlobal pMac, tCsrBssid *pMacAddr )
5330{
5331 tANI_U8 bssid[WNI_CFG_BSSID_LEN] = {0, 0, 0, 0, 0, 0};
5332
Kiet Lam64c1b492013-07-12 13:56:44 +05305333 return (vos_mem_compare(bssid, pMacAddr, WNI_CFG_BSSID_LEN));
Jeff Johnson295189b2012-06-20 16:38:30 -07005334}
5335
5336//like to use sirCompareMacAddr
5337tANI_BOOLEAN csrIsMacAddressBroadcast( tpAniSirGlobal pMac, tCsrBssid *pMacAddr )
5338{
5339 tANI_U8 bssid[WNI_CFG_BSSID_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
5340
Kiet Lam64c1b492013-07-12 13:56:44 +05305341 return(vos_mem_compare(bssid, pMacAddr, WNI_CFG_BSSID_LEN));
Jeff Johnson295189b2012-06-20 16:38:30 -07005342}
5343
5344
5345//like to use sirCompareMacAddr
5346tANI_BOOLEAN csrIsMacAddressEqual( tpAniSirGlobal pMac, tCsrBssid *pMacAddr1, tCsrBssid *pMacAddr2 )
5347{
Kiet Lam64c1b492013-07-12 13:56:44 +05305348 return(vos_mem_compare(pMacAddr1, pMacAddr2, sizeof(tCsrBssid)));
Jeff Johnson295189b2012-06-20 16:38:30 -07005349}
5350
5351
5352tANI_BOOLEAN csrIsBssidMatch( tHalHandle hHal, tCsrBssid *pProfBssid, tCsrBssid *BssBssid )
5353{
5354 tANI_BOOLEAN fMatch = FALSE;
5355 tCsrBssid ProfileBssid;
5356 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
5357
5358 // for efficiency of the MAC_ADDRESS functions, move the
5359 // Bssid's into MAC_ADDRESS structs.
Kiet Lam64c1b492013-07-12 13:56:44 +05305360 vos_mem_copy(&ProfileBssid, pProfBssid, sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07005361
5362 do {
5363
5364 // Give the profile the benefit of the doubt... accept either all 0 or
5365 // the real broadcast Bssid (all 0xff) as broadcast Bssids (meaning to
5366 // match any Bssids).
5367 if ( csrIsMacAddressZero( pMac, &ProfileBssid ) ||
5368 csrIsMacAddressBroadcast( pMac, &ProfileBssid ) )
5369 {
5370 fMatch = TRUE;
5371 break;
5372 }
5373
5374 if ( csrIsMacAddressEqual( pMac, BssBssid, &ProfileBssid ) )
5375 {
5376 fMatch = TRUE;
5377 break;
5378 }
5379
5380 } while( 0 );
5381
5382 return( fMatch );
5383}
5384
5385
5386tANI_BOOLEAN csrIsBSSTypeMatch(eCsrRoamBssType bssType1, eCsrRoamBssType bssType2)
5387{
5388 if((eCSR_BSS_TYPE_ANY != bssType1 && eCSR_BSS_TYPE_ANY != bssType2) && (bssType1 != bssType2))
5389 return eANI_BOOLEAN_FALSE;
5390 else
5391 return eANI_BOOLEAN_TRUE;
5392}
5393
5394
5395tANI_BOOLEAN csrIsBssTypeIBSS(eCsrRoamBssType bssType)
5396{
5397 return((tANI_BOOLEAN)(eCSR_BSS_TYPE_START_IBSS == bssType || eCSR_BSS_TYPE_IBSS == bssType));
5398}
5399
5400tANI_BOOLEAN csrIsBssTypeWDS(eCsrRoamBssType bssType)
5401{
5402 return((tANI_BOOLEAN)(eCSR_BSS_TYPE_WDS_STA == bssType || eCSR_BSS_TYPE_WDS_AP == bssType));
5403}
5404
5405tANI_BOOLEAN csrIsBSSTypeCapsMatch( eCsrRoamBssType bssType, tSirBssDescription *pSirBssDesc )
5406{
5407 tANI_BOOLEAN fMatch = TRUE;
5408
5409 do
5410 {
5411 switch( bssType )
5412 {
5413 case eCSR_BSS_TYPE_ANY:
5414 break;
5415
5416 case eCSR_BSS_TYPE_INFRASTRUCTURE:
5417 case eCSR_BSS_TYPE_WDS_STA:
5418 if( !csrIsInfraBssDesc( pSirBssDesc ) )
5419 fMatch = FALSE;
5420
5421 break;
5422
5423 case eCSR_BSS_TYPE_IBSS:
5424 case eCSR_BSS_TYPE_START_IBSS:
5425 if( !csrIsIbssBssDesc( pSirBssDesc ) )
5426 fMatch = FALSE;
5427
5428 break;
5429
5430 case eCSR_BSS_TYPE_WDS_AP: //For WDS AP, no need to match anything
5431 default:
5432 fMatch = FALSE;
5433 break;
5434 }
5435 }
5436 while( 0 );
5437
5438
5439 return( fMatch );
5440}
5441
5442static tANI_BOOLEAN csrIsCapabilitiesMatch( tpAniSirGlobal pMac, eCsrRoamBssType bssType, tSirBssDescription *pSirBssDesc )
5443{
5444 return( csrIsBSSTypeCapsMatch( bssType, pSirBssDesc ) );
5445}
5446
5447
5448
5449static tANI_BOOLEAN csrIsSpecificChannelMatch( tpAniSirGlobal pMac, tSirBssDescription *pSirBssDesc, tANI_U8 Channel )
5450{
5451 tANI_BOOLEAN fMatch = TRUE;
5452
5453 do
5454 {
5455 // if the channel is ANY, then always match...
5456 if ( eCSR_OPERATING_CHANNEL_ANY == Channel ) break;
5457 if ( Channel == pSirBssDesc->channelId ) break;
5458
5459 // didn't match anything.. so return NO match
5460 fMatch = FALSE;
5461
5462 } while( 0 );
5463
5464 return( fMatch );
5465}
5466
5467
5468tANI_BOOLEAN csrIsChannelBandMatch( tpAniSirGlobal pMac, tANI_U8 channelId, tSirBssDescription *pSirBssDesc )
5469{
5470 tANI_BOOLEAN fMatch = TRUE;
5471
5472 do
5473 {
5474 // if the profile says Any channel AND the global settings says ANY channel, then we
5475 // always match...
5476 if ( eCSR_OPERATING_CHANNEL_ANY == channelId ) break;
5477
5478 if ( eCSR_OPERATING_CHANNEL_ANY != channelId )
5479 {
5480 fMatch = csrIsSpecificChannelMatch( pMac, pSirBssDesc, channelId );
5481 }
5482
5483 } while( 0 );
5484
5485 return( fMatch );
5486}
5487
5488
5489/**
5490 * \brief Enquire as to whether a given rate is supported by the
5491 * adapter as currently configured
5492 *
5493 *
5494 * \param nRate A rate in units of 500kbps
5495 *
5496 * \return TRUE if the adapter is currently capable of supporting this
5497 * rate, FALSE else
5498 *
5499 *
5500 * The rate encoding is just as in 802.11 Information Elements, except
5501 * that the high bit is \em not interpreted as indicating a Basic Rate,
5502 * and proprietary rates are allowed, too.
5503 *
5504 * Note that if the adapter's dot11Mode is g, we don't restrict the
5505 * rates. According to hwReadEepromParameters, this will happen when:
5506 *
5507 * ... the card is configured for ALL bands through the property
5508 * page. If this occurs, and the card is not an ABG card ,then this
5509 * code is setting the dot11Mode to assume the mode that the
5510 * hardware can support. For example, if the card is an 11BG card
5511 * and we are configured to support ALL bands, then we change the
5512 * dot11Mode to 11g because ALL in this case is only what the
5513 * hardware can support.
5514 *
5515 *
5516 */
5517
5518static tANI_BOOLEAN csrIsAggregateRateSupported( tpAniSirGlobal pMac, tANI_U16 rate )
5519{
5520 tANI_BOOLEAN fSupported = eANI_BOOLEAN_FALSE;
5521 tANI_U16 idx, newRate;
5522
5523 //In case basic rate flag is set
5524 newRate = BITS_OFF(rate, CSR_DOT11_BASIC_RATE_MASK);
5525 if ( eCSR_CFG_DOT11_MODE_11A == pMac->roam.configParam.uCfgDot11Mode )
5526 {
5527 switch ( newRate )
5528 {
5529 case eCsrSuppRate_6Mbps:
5530 case eCsrSuppRate_9Mbps:
5531 case eCsrSuppRate_12Mbps:
5532 case eCsrSuppRate_18Mbps:
5533 case eCsrSuppRate_24Mbps:
5534 case eCsrSuppRate_36Mbps:
5535 case eCsrSuppRate_48Mbps:
5536 case eCsrSuppRate_54Mbps:
5537 fSupported = TRUE;
5538 break;
5539 default:
5540 fSupported = FALSE;
5541 break;
5542 }
5543
5544 }
5545 else if( eCSR_CFG_DOT11_MODE_11B == pMac->roam.configParam.uCfgDot11Mode )
5546 {
5547 switch ( newRate )
5548 {
5549 case eCsrSuppRate_1Mbps:
5550 case eCsrSuppRate_2Mbps:
5551 case eCsrSuppRate_5_5Mbps:
5552 case eCsrSuppRate_11Mbps:
5553 fSupported = TRUE;
5554 break;
5555 default:
5556 fSupported = FALSE;
5557 break;
5558 }
5559 }
5560 else if ( !pMac->roam.configParam.ProprietaryRatesEnabled )
5561 {
5562
5563 switch ( newRate )
5564 {
5565 case eCsrSuppRate_1Mbps:
5566 case eCsrSuppRate_2Mbps:
5567 case eCsrSuppRate_5_5Mbps:
5568 case eCsrSuppRate_6Mbps:
5569 case eCsrSuppRate_9Mbps:
5570 case eCsrSuppRate_11Mbps:
5571 case eCsrSuppRate_12Mbps:
5572 case eCsrSuppRate_18Mbps:
5573 case eCsrSuppRate_24Mbps:
5574 case eCsrSuppRate_36Mbps:
5575 case eCsrSuppRate_48Mbps:
5576 case eCsrSuppRate_54Mbps:
5577 fSupported = TRUE;
5578 break;
5579 default:
5580 fSupported = FALSE;
5581 break;
5582 }
5583
5584 }
5585 else {
5586
5587 if ( eCsrSuppRate_1Mbps == newRate ||
5588 eCsrSuppRate_2Mbps == newRate ||
5589 eCsrSuppRate_5_5Mbps == newRate ||
5590 eCsrSuppRate_11Mbps == newRate )
5591 {
5592 fSupported = TRUE;
5593 }
5594 else {
5595 idx = 0x1;
5596
5597 switch ( newRate )
5598 {
5599 case eCsrSuppRate_6Mbps:
5600 fSupported = gPhyRatesSuppt[0][idx];
5601 break;
5602 case eCsrSuppRate_9Mbps:
5603 fSupported = gPhyRatesSuppt[1][idx];
5604 break;
5605 case eCsrSuppRate_12Mbps:
5606 fSupported = gPhyRatesSuppt[2][idx];
5607 break;
5608 case eCsrSuppRate_18Mbps:
5609 fSupported = gPhyRatesSuppt[3][idx];
5610 break;
5611 case eCsrSuppRate_20Mbps:
5612 fSupported = gPhyRatesSuppt[4][idx];
5613 break;
5614 case eCsrSuppRate_24Mbps:
5615 fSupported = gPhyRatesSuppt[5][idx];
5616 break;
5617 case eCsrSuppRate_36Mbps:
5618 fSupported = gPhyRatesSuppt[6][idx];
5619 break;
5620 case eCsrSuppRate_40Mbps:
5621 fSupported = gPhyRatesSuppt[7][idx];
5622 break;
5623 case eCsrSuppRate_42Mbps:
5624 fSupported = gPhyRatesSuppt[8][idx];
5625 break;
5626 case eCsrSuppRate_48Mbps:
5627 fSupported = gPhyRatesSuppt[9][idx];
5628 break;
5629 case eCsrSuppRate_54Mbps:
5630 fSupported = gPhyRatesSuppt[10][idx];
5631 break;
5632 case eCsrSuppRate_72Mbps:
5633 fSupported = gPhyRatesSuppt[11][idx];
5634 break;
5635 case eCsrSuppRate_80Mbps:
5636 fSupported = gPhyRatesSuppt[12][idx];
5637 break;
5638 case eCsrSuppRate_84Mbps:
5639 fSupported = gPhyRatesSuppt[13][idx];
5640 break;
5641 case eCsrSuppRate_96Mbps:
5642 fSupported = gPhyRatesSuppt[14][idx];
5643 break;
5644 case eCsrSuppRate_108Mbps:
5645 fSupported = gPhyRatesSuppt[15][idx];
5646 break;
5647 case eCsrSuppRate_120Mbps:
5648 fSupported = gPhyRatesSuppt[16][idx];
5649 break;
5650 case eCsrSuppRate_126Mbps:
5651 fSupported = gPhyRatesSuppt[17][idx];
5652 break;
5653 case eCsrSuppRate_144Mbps:
5654 fSupported = gPhyRatesSuppt[18][idx];
5655 break;
5656 case eCsrSuppRate_160Mbps:
5657 fSupported = gPhyRatesSuppt[19][idx];
5658 break;
5659 case eCsrSuppRate_168Mbps:
5660 fSupported = gPhyRatesSuppt[20][idx];
5661 break;
5662 case eCsrSuppRate_192Mbps:
5663 fSupported = gPhyRatesSuppt[21][idx];
5664 break;
5665 case eCsrSuppRate_216Mbps:
5666 fSupported = gPhyRatesSuppt[22][idx];
5667 break;
5668 case eCsrSuppRate_240Mbps:
5669 fSupported = gPhyRatesSuppt[23][idx];
5670 break;
5671 default:
5672 fSupported = FALSE;
5673 break;
5674 }
5675 }
5676 }
5677
5678 return fSupported;
5679}
5680
5681
5682
5683static tANI_BOOLEAN csrIsRateSetMatch( tpAniSirGlobal pMac,
5684 tDot11fIESuppRates *pBssSuppRates,
5685 tDot11fIEExtSuppRates *pBssExtSuppRates )
5686{
5687 tANI_BOOLEAN fMatch = TRUE;
5688 tANI_U32 i;
5689
5690
5691 // Validate that all of the Basic rates advertised in the Bss description are supported.
5692 if ( pBssSuppRates )
5693 {
5694 for( i = 0; i < pBssSuppRates->num_rates; i++ )
5695 {
5696 if ( CSR_IS_BASIC_RATE( pBssSuppRates->rates[ i ] ) )
5697 {
5698 if ( !csrIsAggregateRateSupported( pMac, pBssSuppRates->rates[ i ] ) )
5699 {
5700 fMatch = FALSE;
5701 break;
5702 }
5703 }
5704 }
5705 }
5706
5707 if ( fMatch && pBssExtSuppRates )
5708 {
5709 for( i = 0; i < pBssExtSuppRates->num_rates; i++ )
5710 {
5711 if ( CSR_IS_BASIC_RATE( pBssExtSuppRates->rates[ i ] ) )
5712 {
5713 if ( !csrIsAggregateRateSupported( pMac, pBssExtSuppRates->rates[ i ] ) )
5714 {
5715 fMatch = FALSE;
5716 break;
5717 }
5718 }
5719 }
5720 }
5721
5722 return( fMatch );
5723
5724}
5725
5726
5727//ppIes can be NULL. If caller want to get the *ppIes allocated by this function, pass in *ppIes = NULL
5728tANI_BOOLEAN csrMatchBSS( tHalHandle hHal, tSirBssDescription *pBssDesc, tCsrScanResultFilter *pFilter,
5729 eCsrAuthType *pNegAuth, eCsrEncryptionType *pNegUc, eCsrEncryptionType *pNegMc,
5730 tDot11fBeaconIEs **ppIes)
5731{
5732 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
5733 tANI_BOOLEAN fRC = eANI_BOOLEAN_FALSE, fCheck;
5734 tANI_U32 i;
5735 tDot11fBeaconIEs *pIes = NULL;
5736 tANI_U8 *pb;
5737
5738 do {
5739 if( ( NULL == ppIes ) || ( *ppIes ) == NULL )
5740 {
5741 //If no IEs passed in, get our own.
5742 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIes)))
5743 {
5744 break;
5745 }
5746 }
5747 else
5748 {
5749 //Save the one pass in for local use
5750 pIes = *ppIes;
5751 }
5752
5753 //Check if caller wants P2P
5754 fCheck = (!pFilter->p2pResult || pIes->P2PBeaconProbeRes.present);
5755 if(!fCheck) break;
5756
5757 if(pIes->SSID.present)
5758 {
5759 for(i = 0; i < pFilter->SSIDs.numOfSSIDs; i++)
5760 {
5761 fCheck = csrIsSsidMatch( pMac, pFilter->SSIDs.SSIDList[i].SSID.ssId, pFilter->SSIDs.SSIDList[i].SSID.length,
5762 pIes->SSID.ssid,
5763 pIes->SSID.num_ssid, eANI_BOOLEAN_TRUE );
5764 if ( fCheck ) break;
5765 }
5766 if(!fCheck) break;
5767 }
5768 fCheck = eANI_BOOLEAN_TRUE;
5769 for(i = 0; i < pFilter->BSSIDs.numOfBSSIDs; i++)
5770 {
5771 fCheck = csrIsBssidMatch( pMac, (tCsrBssid *)&pFilter->BSSIDs.bssid[i], (tCsrBssid *)pBssDesc->bssId );
5772 if ( fCheck ) break;
5773
5774 if (pFilter->p2pResult && pIes->P2PBeaconProbeRes.present)
5775 {
5776 fCheck = csrIsBssidMatch( pMac, (tCsrBssid *)&pFilter->BSSIDs.bssid[i],
5777 (tCsrBssid *)pIes->P2PBeaconProbeRes.P2PDeviceInfo.P2PDeviceAddress );
5778
5779 if ( fCheck ) break;
5780 }
5781 }
5782 if(!fCheck) break;
5783
5784 fCheck = eANI_BOOLEAN_TRUE;
5785 for(i = 0; i < pFilter->ChannelInfo.numOfChannels; i++)
5786 {
5787 fCheck = csrIsChannelBandMatch( pMac, pFilter->ChannelInfo.ChannelList[i], pBssDesc );
5788 if ( fCheck ) break;
5789 }
5790 if(!fCheck)
5791 break;
5792#if defined WLAN_FEATURE_VOWIFI
5793 /* If this is for measurement filtering */
5794 if( pFilter->fMeasurement )
5795 {
5796 fRC = eANI_BOOLEAN_TRUE;
5797 break;
5798 }
5799#endif
5800 if ( !csrIsPhyModeMatch( pMac, pFilter->phyMode, pBssDesc, NULL, NULL, pIes ) ) break;
Leela Venkata Kiran Kumar Reddy Chiralae208a832014-04-27 22:34:25 -07005801 if ( (!pFilter->bWPSAssociation) && (!pFilter->bOSENAssociation) &&
Abhishek Singh658d4de2014-06-26 10:53:15 +05305802#ifdef WLAN_FEATURE_11W
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305803 !csrIsSecurityMatch( pMac, &pFilter->authType,
5804 &pFilter->EncryptionType,
5805 &pFilter->mcEncryptionType,
5806 &pFilter->MFPEnabled,
5807 &pFilter->MFPRequired,
5808 &pFilter->MFPCapable,
5809 pBssDesc, pIes, pNegAuth,
Abhishek Singh658d4de2014-06-26 10:53:15 +05305810 pNegUc, pNegMc )
5811#else
5812 !csrIsSecurityMatch( pMac, &pFilter->authType,
5813 &pFilter->EncryptionType,
5814 &pFilter->mcEncryptionType,
5815 NULL, NULL, NULL,
5816 pBssDesc, pIes, pNegAuth,
5817 pNegUc, pNegMc )
5818#endif
5819 ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005820 if ( !csrIsCapabilitiesMatch( pMac, pFilter->BSSType, pBssDesc ) ) break;
5821 if ( !csrIsRateSetMatch( pMac, &pIes->SuppRates, &pIes->ExtSuppRates ) ) break;
5822 //Tush-QoS: validate first if asked for APSD or WMM association
5823 if ( (eCsrRoamWmmQbssOnly == pMac->roam.configParam.WMMSupportMode) &&
5824 !CSR_IS_QOS_BSS(pIes) )
5825 break;
5826 //Check country. check even when pb is NULL because we may want to make sure
5827 //AP has a country code in it if fEnforceCountryCodeMatch is set.
5828 pb = ( pFilter->countryCode[0] ) ? ( pFilter->countryCode) : NULL;
5829
5830 fCheck = csrMatchCountryCode( pMac, pb, pIes );
5831 if(!fCheck)
5832 break;
5833
5834#ifdef WLAN_FEATURE_VOWIFI_11R
Hema Aparna Medicharlaf9dec8d2015-04-29 12:37:06 +05305835 if (pFilter->MDID.mdiePresent && csrRoamIs11rAssoc(pMac))
Jeff Johnson295189b2012-06-20 16:38:30 -07005836 {
5837 if (pBssDesc->mdiePresent)
5838 {
5839 if (pFilter->MDID.mobilityDomain != (pBssDesc->mdie[1] << 8 | pBssDesc->mdie[0]))
5840 break;
5841 }
5842 else
5843 break;
5844 }
5845#endif
5846 fRC = eANI_BOOLEAN_TRUE;
5847
5848 } while( 0 );
5849 if( ppIes )
5850 {
5851 *ppIes = pIes;
5852 }
5853 else if( pIes )
5854 {
Kiet Lam64c1b492013-07-12 13:56:44 +05305855 vos_mem_free(pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07005856 }
5857
5858 return( fRC );
5859}
5860
5861tANI_BOOLEAN csrMatchConnectedBSSSecurity( tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile,
5862 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
5863{
5864 tCsrEncryptionList ucEncryptionList, mcEncryptionList;
5865 tCsrAuthList authList;
5866
5867 ucEncryptionList.numEntries = 1;
5868 ucEncryptionList.encryptionType[0] = pProfile->EncryptionType;
5869
5870 mcEncryptionList.numEntries = 1;
5871 mcEncryptionList.encryptionType[0] = pProfile->mcEncryptionType;
5872
5873 authList.numEntries = 1;
5874 authList.authType[0] = pProfile->AuthType;
5875
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305876 return( csrIsSecurityMatch( pMac, &authList, &ucEncryptionList,
5877 &mcEncryptionList, NULL, NULL, NULL,
5878 pBssDesc, pIes, NULL, NULL, NULL ));
Jeff Johnson295189b2012-06-20 16:38:30 -07005879
5880}
5881
5882
5883tANI_BOOLEAN csrMatchBSSToConnectProfile( tHalHandle hHal, tCsrRoamConnectedProfile *pProfile,
5884 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes )
5885{
5886 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
5887 tANI_BOOLEAN fRC = eANI_BOOLEAN_FALSE, fCheck;
5888 tDot11fBeaconIEs *pIesLocal = pIes;
5889
5890 do {
5891 if( !pIes )
5892 {
5893 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal)))
5894 {
5895 break;
5896 }
5897 }
5898 fCheck = eANI_BOOLEAN_TRUE;
5899 if(pIesLocal->SSID.present)
5900 {
5901 tANI_BOOLEAN fCheckSsid = eANI_BOOLEAN_FALSE;
5902 if(pProfile->SSID.length)
5903 {
5904 fCheckSsid = eANI_BOOLEAN_TRUE;
5905 }
5906 fCheck = csrIsSsidMatch( pMac, pProfile->SSID.ssId, pProfile->SSID.length,
5907 pIesLocal->SSID.ssid, pIesLocal->SSID.num_ssid, fCheckSsid );
5908 if(!fCheck) break;
5909 }
5910 if ( !csrMatchConnectedBSSSecurity( pMac, pProfile, pBssDesc, pIesLocal) ) break;
5911 if ( !csrIsCapabilitiesMatch( pMac, pProfile->BSSType, pBssDesc ) ) break;
5912 if ( !csrIsRateSetMatch( pMac, &pIesLocal->SuppRates, &pIesLocal->ExtSuppRates ) ) break;
5913 fCheck = csrIsChannelBandMatch( pMac, pProfile->operationChannel, pBssDesc );
5914 if(!fCheck)
5915 break;
5916
5917 fRC = eANI_BOOLEAN_TRUE;
5918
5919 } while( 0 );
5920
5921 if( !pIes && pIesLocal )
5922 {
5923 //locally allocated
Kiet Lam64c1b492013-07-12 13:56:44 +05305924 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07005925 }
5926
5927 return( fRC );
5928}
5929
5930
5931
Masti, Narayanraddi3f5affe2015-01-08 12:10:08 +05305932void csrAddRateBitmap(tANI_U8 rate, tANI_U16 *pRateBitmap)
5933{
5934 tANI_U16 rateBitmap;
5935 tANI_U16 n = BITS_OFF( rate, CSR_DOT11_BASIC_RATE_MASK );
5936 rateBitmap = *pRateBitmap;
5937 switch(n)
5938 {
5939 case SIR_MAC_RATE_1:
5940 rateBitmap |= SIR_MAC_RATE_1_BITMAP;
5941 break;
5942 case SIR_MAC_RATE_2:
5943 rateBitmap |= SIR_MAC_RATE_2_BITMAP;
5944 break;
5945 case SIR_MAC_RATE_5_5:
5946 rateBitmap |= SIR_MAC_RATE_5_5_BITMAP;
5947 break;
5948 case SIR_MAC_RATE_11:
5949 rateBitmap |= SIR_MAC_RATE_11_BITMAP;
5950 break;
5951 case SIR_MAC_RATE_6:
5952 rateBitmap |= SIR_MAC_RATE_6_BITMAP;
5953 break;
5954 case SIR_MAC_RATE_9:
5955 rateBitmap |= SIR_MAC_RATE_9_BITMAP;
5956 break;
5957 case SIR_MAC_RATE_12:
5958 rateBitmap |= SIR_MAC_RATE_12_BITMAP;
5959 break;
5960 case SIR_MAC_RATE_18:
5961 rateBitmap |= SIR_MAC_RATE_18_BITMAP;
5962 break;
5963 case SIR_MAC_RATE_24:
5964 rateBitmap |= SIR_MAC_RATE_24_BITMAP;
5965 break;
5966 case SIR_MAC_RATE_36:
5967 rateBitmap |= SIR_MAC_RATE_36_BITMAP;
5968 break;
5969 case SIR_MAC_RATE_48:
5970 rateBitmap |= SIR_MAC_RATE_48_BITMAP;
5971 break;
5972 case SIR_MAC_RATE_54:
5973 rateBitmap |= SIR_MAC_RATE_54_BITMAP;
5974 break;
5975 }
5976 *pRateBitmap = rateBitmap;
5977}
5978
5979
5980
5981tANI_BOOLEAN csrIsRateAlreadyPresent(tANI_U8 rate, tANI_U16 rateBitmap)
5982{
5983 tANI_U16 n = BITS_OFF( rate, CSR_DOT11_BASIC_RATE_MASK );
5984
5985 switch(n)
5986 {
5987 case SIR_MAC_RATE_1:
5988 rateBitmap &= SIR_MAC_RATE_1_BITMAP;
5989 break;
5990 case SIR_MAC_RATE_2:
5991 rateBitmap &= SIR_MAC_RATE_2_BITMAP;
5992 break;
5993 case SIR_MAC_RATE_5_5:
5994 rateBitmap &= SIR_MAC_RATE_5_5_BITMAP;
5995 break;
5996 case SIR_MAC_RATE_11:
5997 rateBitmap &= SIR_MAC_RATE_11_BITMAP;
5998 break;
5999 case SIR_MAC_RATE_6:
6000 rateBitmap &= SIR_MAC_RATE_6_BITMAP;
6001 break;
6002 case SIR_MAC_RATE_9:
6003 rateBitmap &= SIR_MAC_RATE_9_BITMAP;
6004 break;
6005 case SIR_MAC_RATE_12:
6006 rateBitmap &= SIR_MAC_RATE_12_BITMAP;
6007 break;
6008 case SIR_MAC_RATE_18:
6009 rateBitmap &= SIR_MAC_RATE_18_BITMAP;
6010 break;
6011 case SIR_MAC_RATE_24:
6012 rateBitmap &= SIR_MAC_RATE_24_BITMAP;
6013 break;
6014 case SIR_MAC_RATE_36:
6015 rateBitmap &= SIR_MAC_RATE_36_BITMAP;
6016 break;
6017 case SIR_MAC_RATE_48:
6018 rateBitmap &= SIR_MAC_RATE_48_BITMAP;
6019 break;
6020 case SIR_MAC_RATE_54:
6021 rateBitmap &= SIR_MAC_RATE_54_BITMAP;
6022 break;
6023 }
6024 return !!rateBitmap;
6025}
6026
6027
6028
Jeff Johnson295189b2012-06-20 16:38:30 -07006029tANI_BOOLEAN csrRatesIsDot11RateSupported( tHalHandle hHal, tANI_U8 rate )
6030{
6031 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
6032 tANI_U16 n = BITS_OFF( rate, CSR_DOT11_BASIC_RATE_MASK );
6033
6034 return csrIsAggregateRateSupported( pMac, n );
6035}
6036
6037
6038tANI_U16 csrRatesMacPropToDot11( tANI_U16 Rate )
6039{
6040 tANI_U16 ConvertedRate = Rate;
6041
6042 switch( Rate )
6043 {
6044 case SIR_MAC_RATE_1:
6045 ConvertedRate = 2;
6046 break;
6047 case SIR_MAC_RATE_2:
6048 ConvertedRate = 4;
6049 break;
6050 case SIR_MAC_RATE_5_5:
6051 ConvertedRate = 11;
6052 break;
6053 case SIR_MAC_RATE_11:
6054 ConvertedRate = 22;
6055 break;
6056
6057 case SIR_MAC_RATE_6:
6058 ConvertedRate = 12;
6059 break;
6060 case SIR_MAC_RATE_9:
6061 ConvertedRate = 18;
6062 break;
6063 case SIR_MAC_RATE_12:
6064 ConvertedRate = 24;
6065 break;
6066 case SIR_MAC_RATE_18:
6067 ConvertedRate = 36;
6068 break;
6069 case SIR_MAC_RATE_24:
6070 ConvertedRate = 48;
6071 break;
6072 case SIR_MAC_RATE_36:
6073 ConvertedRate = 72;
6074 break;
6075 case SIR_MAC_RATE_42:
6076 ConvertedRate = 84;
6077 break;
6078 case SIR_MAC_RATE_48:
6079 ConvertedRate = 96;
6080 break;
6081 case SIR_MAC_RATE_54:
6082 ConvertedRate = 108;
6083 break;
6084
6085 case SIR_MAC_RATE_72:
6086 ConvertedRate = 144;
6087 break;
6088 case SIR_MAC_RATE_84:
6089 ConvertedRate = 168;
6090 break;
6091 case SIR_MAC_RATE_96:
6092 ConvertedRate = 192;
6093 break;
6094 case SIR_MAC_RATE_108:
6095 ConvertedRate = 216;
6096 break;
6097 case SIR_MAC_RATE_126:
6098 ConvertedRate = 252;
6099 break;
6100 case SIR_MAC_RATE_144:
6101 ConvertedRate = 288;
6102 break;
6103 case SIR_MAC_RATE_168:
6104 ConvertedRate = 336;
6105 break;
6106 case SIR_MAC_RATE_192:
6107 ConvertedRate = 384;
6108 break;
6109 case SIR_MAC_RATE_216:
6110 ConvertedRate = 432;
6111 break;
6112 case SIR_MAC_RATE_240:
6113 ConvertedRate = 480;
6114 break;
6115
6116 case 0xff:
6117 ConvertedRate = 0;
6118 break;
6119 }
6120
6121 return ConvertedRate;
6122}
6123
6124
6125tANI_U16 csrRatesFindBestRate( tSirMacRateSet *pSuppRates, tSirMacRateSet *pExtRates, tSirMacPropRateSet *pPropRates )
6126{
6127 tANI_U8 i;
6128 tANI_U16 nBest;
6129
6130 nBest = pSuppRates->rate[ 0 ] & ( ~CSR_DOT11_BASIC_RATE_MASK );
6131
6132 if(pSuppRates->numRates > SIR_MAC_RATESET_EID_MAX)
6133 {
6134 pSuppRates->numRates = SIR_MAC_RATESET_EID_MAX;
6135 }
6136
6137 for ( i = 1U; i < pSuppRates->numRates; ++i )
6138 {
6139 nBest = (tANI_U16)CSR_MAX( nBest, pSuppRates->rate[ i ] & ( ~CSR_DOT11_BASIC_RATE_MASK ) );
6140 }
6141
6142 if ( NULL != pExtRates )
6143 {
6144 for ( i = 0U; i < pExtRates->numRates; ++i )
6145 {
6146 nBest = (tANI_U16)CSR_MAX( nBest, pExtRates->rate[ i ] & ( ~CSR_DOT11_BASIC_RATE_MASK ) );
6147 }
6148 }
6149
6150 if ( NULL != pPropRates )
6151 {
6152 for ( i = 0U; i < pPropRates->numPropRates; ++i )
6153 {
6154 nBest = (tANI_U16)CSR_MAX( nBest, csrRatesMacPropToDot11( pPropRates->propRate[ i ] ) );
6155 }
6156 }
6157
6158 return nBest;
6159}
6160
6161
6162void csrReleaseProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile)
6163{
6164 if(pProfile)
6165 {
6166 if(pProfile->BSSIDs.bssid)
6167 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306168 vos_mem_free(pProfile->BSSIDs.bssid);
Jeff Johnson295189b2012-06-20 16:38:30 -07006169 pProfile->BSSIDs.bssid = NULL;
6170 }
6171 if(pProfile->SSIDs.SSIDList)
6172 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306173 vos_mem_free(pProfile->SSIDs.SSIDList);
Jeff Johnson295189b2012-06-20 16:38:30 -07006174 pProfile->SSIDs.SSIDList = NULL;
6175 }
6176 if(pProfile->pWPAReqIE)
6177 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306178 vos_mem_free(pProfile->pWPAReqIE);
Jeff Johnson295189b2012-06-20 16:38:30 -07006179 pProfile->pWPAReqIE = NULL;
6180 }
6181 if(pProfile->pRSNReqIE)
6182 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306183 vos_mem_free(pProfile->pRSNReqIE);
Jeff Johnson295189b2012-06-20 16:38:30 -07006184 pProfile->pRSNReqIE = NULL;
6185 }
6186#ifdef FEATURE_WLAN_WAPI
6187 if(pProfile->pWAPIReqIE)
6188 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306189 vos_mem_free(pProfile->pWAPIReqIE);
Jeff Johnson295189b2012-06-20 16:38:30 -07006190 pProfile->pWAPIReqIE = NULL;
6191 }
6192#endif /* FEATURE_WLAN_WAPI */
6193
Agarwal Ashish4f616132013-12-30 23:32:50 +05306194 if (pProfile->nAddIEScanLength)
Jeff Johnson295189b2012-06-20 16:38:30 -07006195 {
Ganesh Kondabattini7500fb32015-04-10 14:50:32 +05306196 memset(pProfile->addIEScan, 0 , SIR_MAC_MAX_ADD_IE_LENGTH+2);
Agarwal Ashish4f616132013-12-30 23:32:50 +05306197 pProfile->nAddIEScanLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07006198 }
6199
6200 if(pProfile->pAddIEAssoc)
6201 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306202 vos_mem_free(pProfile->pAddIEAssoc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006203 pProfile->pAddIEAssoc = NULL;
6204 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006205 if(pProfile->ChannelInfo.ChannelList)
6206 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306207 vos_mem_free(pProfile->ChannelInfo.ChannelList);
Jeff Johnson295189b2012-06-20 16:38:30 -07006208 pProfile->ChannelInfo.ChannelList = NULL;
6209 }
Kiet Lam64c1b492013-07-12 13:56:44 +05306210 vos_mem_set(pProfile, sizeof(tCsrRoamProfile), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07006211 }
6212}
6213
6214void csrFreeScanFilter(tpAniSirGlobal pMac, tCsrScanResultFilter *pScanFilter)
6215{
6216 if(pScanFilter->BSSIDs.bssid)
6217 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306218 vos_mem_free(pScanFilter->BSSIDs.bssid);
Jeff Johnson295189b2012-06-20 16:38:30 -07006219 pScanFilter->BSSIDs.bssid = NULL;
6220 }
6221 if(pScanFilter->ChannelInfo.ChannelList)
6222 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306223 vos_mem_free(pScanFilter->ChannelInfo.ChannelList);
Jeff Johnson295189b2012-06-20 16:38:30 -07006224 pScanFilter->ChannelInfo.ChannelList = NULL;
6225 }
6226 if(pScanFilter->SSIDs.SSIDList)
6227 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306228 vos_mem_free(pScanFilter->SSIDs.SSIDList);
Jeff Johnson295189b2012-06-20 16:38:30 -07006229 pScanFilter->SSIDs.SSIDList = NULL;
6230 }
6231}
6232
6233
6234void csrFreeRoamProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
6235{
6236 tCsrRoamSession *pSession = &pMac->roam.roamSession[sessionId];
6237
6238 if(pSession->pCurRoamProfile)
6239 {
6240 csrReleaseProfile(pMac, pSession->pCurRoamProfile);
Kiet Lam64c1b492013-07-12 13:56:44 +05306241 vos_mem_free(pSession->pCurRoamProfile);
Jeff Johnson295189b2012-06-20 16:38:30 -07006242 pSession->pCurRoamProfile = NULL;
6243 }
6244}
6245
6246
6247void csrFreeConnectBssDesc(tpAniSirGlobal pMac, tANI_U32 sessionId)
6248{
6249 tCsrRoamSession *pSession = &pMac->roam.roamSession[sessionId];
6250
6251 if(pSession->pConnectBssDesc)
6252 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306253 vos_mem_free(pSession->pConnectBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006254 pSession->pConnectBssDesc = NULL;
6255 }
6256}
6257
6258
6259
6260tSirResultCodes csrGetDisassocRspStatusCode( tSirSmeDisassocRsp *pSmeDisassocRsp )
6261{
6262 tANI_U8 *pBuffer = (tANI_U8 *)pSmeDisassocRsp;
6263 tANI_U32 ret;
6264
6265 pBuffer += (sizeof(tANI_U16) + sizeof(tANI_U16) + sizeof(tSirMacAddr));
6266 //tSirResultCodes is an enum, assuming is 32bit
6267 //If we cannot make this assumption, use copymemory
6268 pal_get_U32( pBuffer, &ret );
6269
6270 return( ( tSirResultCodes )ret );
6271}
6272
6273
6274tSirResultCodes csrGetDeAuthRspStatusCode( tSirSmeDeauthRsp *pSmeRsp )
6275{
6276 tANI_U8 *pBuffer = (tANI_U8 *)pSmeRsp;
6277 tANI_U32 ret;
6278
Leela Venkata Kiran Kumar Reddy Chirala56df73f2014-01-30 14:18:00 -08006279 pBuffer += (sizeof(tANI_U16) + sizeof(tANI_U16) + sizeof(tANI_U8) + sizeof(tANI_U16));
Jeff Johnson295189b2012-06-20 16:38:30 -07006280 //tSirResultCodes is an enum, assuming is 32bit
6281 //If we cannot make this assumption, use copymemory
6282 pal_get_U32( pBuffer, &ret );
6283
6284 return( ( tSirResultCodes )ret );
6285}
6286
6287#if 0
6288tSirScanType csrGetScanType(tANI_U8 chnId, eRegDomainId domainId, tANI_U8 *countryCode)
6289{
6290 tSirScanType scanType = eSIR_PASSIVE_SCAN;
6291 tANI_U8 cc = 0;
6292
6293 while (cc++ < gCsrDomainChnInfo[domainId].numChannels)
6294 {
6295 if(chnId == gCsrDomainChnInfo[domainId].chnInfo[cc].chnId)
6296 {
6297 scanType = gCsrDomainChnInfo[domainId].chnInfo[cc].scanType;
6298 break;
6299 }
6300 }
6301
6302 return (scanType);
6303}
6304#endif
6305
6306tSirScanType csrGetScanType(tpAniSirGlobal pMac, tANI_U8 chnId)
6307{
6308 tSirScanType scanType = eSIR_PASSIVE_SCAN;
6309 eNVChannelEnabledType channelEnabledType;
6310
6311 channelEnabledType = vos_nv_getChannelEnabledState(chnId);
6312 if( NV_CHANNEL_ENABLE == channelEnabledType)
6313 {
6314 scanType = eSIR_ACTIVE_SCAN;
6315 }
6316 return (scanType);
6317}
6318
6319
6320tANI_U8 csrToUpper( tANI_U8 ch )
6321{
6322 tANI_U8 chOut;
6323
6324 if ( ch >= 'a' && ch <= 'z' )
6325 {
6326 chOut = ch - 'a' + 'A';
6327 }
6328 else
6329 {
6330 chOut = ch;
6331 }
6332 return( chOut );
6333}
6334
6335
6336tSirBssType csrTranslateBsstypeToMacType(eCsrRoamBssType csrtype)
6337{
6338 tSirBssType ret;
6339
6340 switch(csrtype)
6341 {
6342 case eCSR_BSS_TYPE_INFRASTRUCTURE:
6343 ret = eSIR_INFRASTRUCTURE_MODE;
6344 break;
6345 case eCSR_BSS_TYPE_IBSS:
6346 case eCSR_BSS_TYPE_START_IBSS:
6347 ret = eSIR_IBSS_MODE;
6348 break;
6349 case eCSR_BSS_TYPE_WDS_AP:
6350 ret = eSIR_BTAMP_AP_MODE;
6351 break;
6352 case eCSR_BSS_TYPE_WDS_STA:
6353 ret = eSIR_BTAMP_STA_MODE;
6354 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006355 case eCSR_BSS_TYPE_INFRA_AP:
6356 ret = eSIR_INFRA_AP_MODE;
6357 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006358 case eCSR_BSS_TYPE_ANY:
6359 default:
6360 ret = eSIR_AUTO_MODE;
6361 break;
6362 }
6363
6364 return (ret);
6365}
6366
6367
6368//This function use the parameters to decide the CFG value.
6369//CSR never sets WNI_CFG_DOT11_MODE_ALL to the CFG
6370//So PE should not see WNI_CFG_DOT11_MODE_ALL when it gets the CFG value
Jeff Johnson295189b2012-06-20 16:38:30 -07006371eCsrCfgDot11Mode csrGetCfgDot11ModeFromCsrPhyMode(tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tANI_BOOLEAN fProprietary)
Jeff Johnson295189b2012-06-20 16:38:30 -07006372{
6373 tANI_U32 cfgDot11Mode = eCSR_CFG_DOT11_MODE_ABG;
6374
6375 switch(phyMode)
6376 {
6377 case eCSR_DOT11_MODE_11a:
6378 case eCSR_DOT11_MODE_11a_ONLY:
6379 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
6380 break;
6381 case eCSR_DOT11_MODE_11b:
6382 case eCSR_DOT11_MODE_11b_ONLY:
6383 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
6384 break;
6385 case eCSR_DOT11_MODE_11g:
6386 case eCSR_DOT11_MODE_11g_ONLY:
Jeff Johnson295189b2012-06-20 16:38:30 -07006387 if(pProfile && (CSR_IS_INFRA_AP(pProfile)) && (phyMode == eCSR_DOT11_MODE_11g_ONLY))
6388 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G_ONLY;
6389 else
Jeff Johnson295189b2012-06-20 16:38:30 -07006390 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
6391 break;
6392 case eCSR_DOT11_MODE_11n:
6393 if(fProprietary)
6394 {
6395 cfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
6396 }
6397 else
6398 {
6399 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
6400 }
6401 break;
6402 case eCSR_DOT11_MODE_11n_ONLY:
Jeff Johnson295189b2012-06-20 16:38:30 -07006403 if(pProfile && CSR_IS_INFRA_AP(pProfile))
6404 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N_ONLY;
6405 else
Jeff Johnson295189b2012-06-20 16:38:30 -07006406 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
6407 break;
6408 case eCSR_DOT11_MODE_TAURUS:
6409 cfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
6410 break;
6411 case eCSR_DOT11_MODE_abg:
6412 cfgDot11Mode = eCSR_CFG_DOT11_MODE_ABG;
6413 break;
6414 case eCSR_DOT11_MODE_AUTO:
6415 cfgDot11Mode = eCSR_CFG_DOT11_MODE_AUTO;
6416 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07006417
6418#ifdef WLAN_FEATURE_11AC
6419 case eCSR_DOT11_MODE_11ac:
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006420 if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
6421 {
6422 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
6423 }
6424 else
6425 {
Ravi Joshia96ceb42013-05-20 18:52:39 -07006426 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006427 }
Jeff Johnsone7245742012-09-05 17:12:55 -07006428 break;
6429 case eCSR_DOT11_MODE_11ac_ONLY:
Ravi Joshia96ceb42013-05-20 18:52:39 -07006430 if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
6431 {
6432 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC_ONLY;
6433 }
6434 else
6435 {
6436 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
6437 }
Jeff Johnsone7245742012-09-05 17:12:55 -07006438 break;
6439#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006440 default:
6441 //No need to assign anything here
6442 break;
6443 }
6444
6445 return (cfgDot11Mode);
6446}
6447
6448
6449eHalStatus csrSetRegulatoryDomain(tpAniSirGlobal pMac, v_REGDOMAIN_t domainId, tANI_BOOLEAN *pfRestartNeeded)
6450{
6451 eHalStatus status = eHAL_STATUS_SUCCESS;
6452 tANI_BOOLEAN fRestart;
6453
6454 if(pMac->scan.domainIdCurrent == domainId)
6455 {
6456 //no change
6457 fRestart = eANI_BOOLEAN_FALSE;
6458 }
6459 else if( !pMac->roam.configParam.fEnforceDefaultDomain )
6460 {
6461 pMac->scan.domainIdCurrent = domainId;
6462 fRestart = eANI_BOOLEAN_TRUE;
6463 }
6464 else
6465 {
6466 //We cannot change the domain
6467 status = eHAL_STATUS_CSR_WRONG_STATE;
6468 fRestart = eANI_BOOLEAN_FALSE;
6469 }
6470 if(pfRestartNeeded)
6471 {
6472 *pfRestartNeeded = fRestart;
6473 }
6474
6475 return (status);
6476}
6477
6478
6479v_REGDOMAIN_t csrGetCurrentRegulatoryDomain(tpAniSirGlobal pMac)
6480{
6481 return (pMac->scan.domainIdCurrent);
6482}
6483
Jeff Johnson295189b2012-06-20 16:38:30 -07006484
Kiet Lam6c583332013-10-14 05:37:09 +05306485eHalStatus csrGetRegulatoryDomainForCountry
6486(
6487tpAniSirGlobal pMac,
6488tANI_U8 *pCountry,
6489v_REGDOMAIN_t *pDomainId,
6490v_CountryInfoSource_t source
6491)
Jeff Johnson295189b2012-06-20 16:38:30 -07006492{
6493 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
6494 VOS_STATUS vosStatus;
6495 v_COUNTRYCODE_t countryCode;
6496 v_REGDOMAIN_t domainId;
6497
6498 if(pCountry)
6499 {
6500 countryCode[0] = pCountry[0];
6501 countryCode[1] = pCountry[1];
Kiet Lam6c583332013-10-14 05:37:09 +05306502 vosStatus = vos_nv_getRegDomainFromCountryCode(&domainId,
6503 countryCode,
6504 source);
6505
Jeff Johnson295189b2012-06-20 16:38:30 -07006506 if( VOS_IS_STATUS_SUCCESS(vosStatus) )
6507 {
6508 if( pDomainId )
6509 {
6510 *pDomainId = domainId;
6511 }
6512 status = eHAL_STATUS_SUCCESS;
6513 }
6514 else
6515 {
Agarwal Ashishe3cca2a2013-07-21 03:01:48 +05306516 smsLog(pMac, LOGW, FL(" Couldn't find domain for country code %c%c"), pCountry[0], pCountry[1]);
Jeff Johnson295189b2012-06-20 16:38:30 -07006517 status = eHAL_STATUS_INVALID_PARAMETER;
6518 }
6519 }
6520
6521 return (status);
6522}
6523
6524//To check whether a country code matches the one in the IE
6525//Only check the first two characters, ignoring in/outdoor
6526//pCountry -- caller allocated buffer contain the country code that is checking against
6527//the one in pIes. It can be NULL.
6528//caller must provide pIes, it cannot be NULL
6529//This function always return TRUE if 11d support is not turned on.
6530tANI_BOOLEAN csrMatchCountryCode( tpAniSirGlobal pMac, tANI_U8 *pCountry, tDot11fBeaconIEs *pIes )
6531{
6532 tANI_BOOLEAN fRet = eANI_BOOLEAN_TRUE;
Jeff Johnson43971f52012-07-17 12:26:56 -07006533 v_REGDOMAIN_t domainId = REGDOMAIN_COUNT; //This is init to invalid value
Jeff Johnson295189b2012-06-20 16:38:30 -07006534 eHalStatus status;
6535
6536 do
6537 {
6538 if( !csrIs11dSupported( pMac) )
6539 {
6540 break;
6541 }
6542 if( !pIes )
6543 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08006544 smsLog(pMac, LOGE, FL(" No IEs"));
Jeff Johnson295189b2012-06-20 16:38:30 -07006545 break;
6546 }
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006547 if( pMac->roam.configParam.fEnforceDefaultDomain ||
6548 pMac->roam.configParam.fEnforceCountryCodeMatch )
Jeff Johnson295189b2012-06-20 16:38:30 -07006549 {
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006550 //Make sure this country is recognizable
6551 if( pIes->Country.present )
Jeff Johnson295189b2012-06-20 16:38:30 -07006552 {
Kiet Lam6c583332013-10-14 05:37:09 +05306553 status = csrGetRegulatoryDomainForCountry(pMac,
6554 pIes->Country.country,
6555 &domainId, COUNTRY_QUERY);
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006556 if( !HAL_STATUS_SUCCESS( status ) )
6557 {
Kiet Lam6c583332013-10-14 05:37:09 +05306558 status = csrGetRegulatoryDomainForCountry(pMac,
6559 pMac->scan.countryCode11d,
6560 (v_REGDOMAIN_t *) &domainId,
6561 COUNTRY_QUERY);
Gowri Deepthiff9adf92012-12-13 15:09:56 -08006562 if( !HAL_STATUS_SUCCESS( status ) )
6563 {
6564 fRet = eANI_BOOLEAN_FALSE;
6565 break;
6566 }
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006567 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006568 }
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006569 //check whether it is needed to enforce to the default regulatory domain first
6570 if( pMac->roam.configParam.fEnforceDefaultDomain )
Jeff Johnson295189b2012-06-20 16:38:30 -07006571 {
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006572 if( domainId != pMac->scan.domainIdCurrent )
6573 {
6574 fRet = eANI_BOOLEAN_FALSE;
6575 break;
6576 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006577 }
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006578 if( pMac->roam.configParam.fEnforceCountryCodeMatch )
6579 {
Jeff Johnson43971f52012-07-17 12:26:56 -07006580 if( domainId >= REGDOMAIN_COUNT )
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006581 {
6582 fRet = eANI_BOOLEAN_FALSE;
6583 break;
6584 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006585 }
6586 }
6587 if( pCountry )
6588 {
6589 tANI_U32 i;
6590
6591 if( !pIes->Country.present )
6592 {
6593 fRet = eANI_BOOLEAN_FALSE;
6594 break;
6595 }
6596 // Convert the CountryCode characters to upper
6597 for ( i = 0; i < WNI_CFG_COUNTRY_CODE_LEN - 1; i++ )
6598 {
6599 pCountry[i] = csrToUpper( pCountry[i] );
6600 }
Kiet Lam64c1b492013-07-12 13:56:44 +05306601 if (!vos_mem_compare(pIes->Country.country, pCountry,
6602 WNI_CFG_COUNTRY_CODE_LEN - 1))
Jeff Johnson295189b2012-06-20 16:38:30 -07006603 {
6604 fRet = eANI_BOOLEAN_FALSE;
6605 break;
6606 }
6607 }
6608 } while(0);
6609
6610 return (fRet);
6611}
6612
6613#if 0
6614eHalStatus csrSetCountryDomainMapping(tpAniSirGlobal pMac, tCsrCountryDomainMapping *pCountryDomainMapping)
6615{
6616 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
6617 tANI_U32 i, j;
6618 tANI_BOOLEAN fDomainChanged = eANI_BOOLEAN_FALSE;
6619 tANI_U8 countryCode[WNI_CFG_COUNTRY_CODE_LEN];
6620
6621 i = WNI_CFG_COUNTRY_CODE_LEN;
6622 //Get the currently used country code
6623 status = ccmCfgGetStr(pMac, WNI_CFG_COUNTRY_CODE, countryCode, &i);
6624 if(HAL_STATUS_SUCCESS(status))
6625 {
6626 if(pCountryDomainMapping && pCountryDomainMapping->numEntry)
6627 {
6628 for(i = 0; i < pCountryDomainMapping->numEntry; i++)
6629 {
6630 for(j = 0; j < eCSR_NUM_COUNTRY_INDEX; j++)
6631 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306632 if (vos_mem_compare(gCsrCountryInfo[j].countryCode,
6633 pCountryDomainMapping->pCountryInfo[i].countryCode,
6634 2))
Jeff Johnson295189b2012-06-20 16:38:30 -07006635 {
6636 if(gCsrCountryInfo[j].domainId != pCountryDomainMapping->pCountryInfo[i].domainId)
6637 {
6638 gCsrCountryInfo[j].domainId = pCountryDomainMapping->pCountryInfo[i].domainId;
6639 //Check whether it matches the currently used country code
6640 //If matching, need to update base on the new domain setting.
Kiet Lam64c1b492013-07-12 13:56:44 +05306641 if (vos_mem_compare(countryCode,
6642 pCountryDomainMapping->pCountryInfo[i].countryCode,
6643 2))
Jeff Johnson295189b2012-06-20 16:38:30 -07006644 {
6645 fDomainChanged = eANI_BOOLEAN_TRUE;
6646 }
6647 }
6648 break;
6649 }
6650 }
6651 }
6652 status = eHAL_STATUS_SUCCESS;
6653 if(fDomainChanged)
6654 {
6655 tCsrChannel *pChannelList;
6656
6657 if(pMac->scan.f11dInfoApplied)
6658 {
6659 //11d info already applied. Let's reapply with the new domain setting
6660 if(pMac->scan.channels11d.numChannels)
6661 {
6662 pChannelList = &pMac->scan.channels11d;
6663 }
6664 else
6665 {
6666 pChannelList = &pMac->scan.base20MHzChannels;
6667 }
6668 }
6669 else
6670 {
6671 //no 11d so we use the base channelist from EEPROM
6672 pChannelList = &pMac->scan.base20MHzChannels;
6673 }
6674 //set the new domain's scan requirement to CFG
6675 csrSetCfgScanControlList(pMac, countryCode, pChannelList);
6676 }
6677 }
6678 }
6679
6680 return (status);
6681}
6682
6683eHalStatus csrSetDomainScanSetting(tpAniSirGlobal pMac, tCsrDomainFreqInfo *pDomainFreqInfo)
6684{
6685 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
6686 tANI_U32 i, j;
6687 tANI_U16 freq;
6688
6689 if(pDomainFreqInfo && pDomainFreqInfo->numEntry && (pDomainFreqInfo->domainId < NUM_REG_DOMAINS))
6690 {
6691 tCsrDomainChnInfo *pDomainChnInfo = &gCsrDomainChnInfo[pDomainFreqInfo->domainId];
6692
6693 for(j = 0; j < pDomainChnInfo->numChannels; j++)
6694 {
6695 if(HAL_STATUS_SUCCESS(halPhyChIdToFreqConversion(pDomainChnInfo->chnInfo[j].chnId, &freq)))
6696 {
6697 for(i = 0; i < pDomainFreqInfo->numEntry; i++)
6698 {
6699 if((pDomainFreqInfo->pCsrScanFreqInfo[i].nStartFreq <= freq) &&
6700 (freq <= pDomainFreqInfo->pCsrScanFreqInfo[i].nEndFreq))
6701 {
6702 pDomainChnInfo->chnInfo[j].scanType = pDomainFreqInfo->pCsrScanFreqInfo[i].scanType;
6703 break;
6704 }
6705 }
6706 }
6707 else
6708 {
6709 smsLog(pMac, LOGW, " Failed to get frequency of channel %d", pDomainChnInfo->chnInfo[j].chnId);
6710 }
6711 }
6712 status = eHAL_STATUS_SUCCESS;
6713 }
6714
6715 return (status);
6716}
6717#endif
6718
6719eHalStatus csrGetModifyProfileFields(tpAniSirGlobal pMac, tANI_U32 sessionId,
6720 tCsrRoamModifyProfileFields *pModifyProfileFields)
6721{
6722
6723 if(!pModifyProfileFields)
6724 {
6725 return eHAL_STATUS_FAILURE;
6726 }
6727
Kiet Lam64c1b492013-07-12 13:56:44 +05306728 vos_mem_copy(pModifyProfileFields,
6729 &pMac->roam.roamSession[sessionId].connectedProfile.modifyProfileFields,
6730 sizeof(tCsrRoamModifyProfileFields));
Jeff Johnson295189b2012-06-20 16:38:30 -07006731
6732 return eHAL_STATUS_SUCCESS;
6733}
6734
6735eHalStatus csrSetModifyProfileFields(tpAniSirGlobal pMac, tANI_U32 sessionId,
6736 tCsrRoamModifyProfileFields *pModifyProfileFields)
6737{
6738 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
6739
Kiet Lam64c1b492013-07-12 13:56:44 +05306740 vos_mem_copy(&pSession->connectedProfile.modifyProfileFields,
6741 pModifyProfileFields,
6742 sizeof(tCsrRoamModifyProfileFields));
Jeff Johnson295189b2012-06-20 16:38:30 -07006743
6744 return eHAL_STATUS_SUCCESS;
6745}
6746
6747
6748#if 0
6749/* ---------------------------------------------------------------------------
6750 \fn csrGetSupportedCountryCode
6751 \brief this function is to get a list of the country code current being supported
6752 \param pBuf - Caller allocated buffer with at least 3 bytes, upon success return,
6753 this has the country code list. 3 bytes for each country code. This may be NULL if
6754 caller wants to know the needed bytes.
6755 \param pbLen - Caller allocated, as input, it indicates the length of pBuf. Upon success return,
6756 this contains the length of the data in pBuf
6757 \return eHalStatus
6758 -------------------------------------------------------------------------------*/
6759eHalStatus csrGetSupportedCountryCode(tpAniSirGlobal pMac, tANI_U8 *pBuf, tANI_U32 *pbLen)
6760{
6761 tANI_U32 numOfCountry = sizeof( gCsrCountryInfo ) / sizeof( gCsrCountryInfo[0] );
6762 tANI_U32 numBytes = 0;
6763 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
6764
6765 if( pbLen )
6766 {
6767 numBytes = *pbLen;
6768 //Consider it ok, at least we can return the number of bytes needed;
6769 *pbLen = numOfCountry * WNI_CFG_COUNTRY_CODE_LEN;
6770 status = eHAL_STATUS_SUCCESS;
6771 if( pBuf && ( numBytes >= *pbLen ) )
6772 {
6773 //The ugly part starts.
6774 //We may need to alter the data structure and find a way to make this faster.
6775 tANI_U32 i;
6776
Kiet Lam64c1b492013-07-12 13:56:44 +05306777 for ( i = 0; i < numOfCountry; i++ )
Jeff Johnson295189b2012-06-20 16:38:30 -07006778 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306779 vos_mem_copy(pBuf + ( i * WNI_CFG_COUNTRY_CODE_LEN ),
6780 gCsrCountryInfo[i].countryCode,
6781 WNI_CFG_COUNTRY_CODE_LEN);
Jeff Johnson295189b2012-06-20 16:38:30 -07006782 }
6783 }
6784 }
6785
6786 return ( status );
6787}
6788#endif
6789
6790/* ---------------------------------------------------------------------------
6791 \fn csrGetSupportedCountryCode
6792 \brief this function is to get a list of the country code current being supported
6793 \param pBuf - Caller allocated buffer with at least 3 bytes, upon success return,
6794 this has the country code list. 3 bytes for each country code. This may be NULL if
6795 caller wants to know the needed bytes.
6796 \param pbLen - Caller allocated, as input, it indicates the length of pBuf. Upon success return,
6797 this contains the length of the data in pBuf
6798 \return eHalStatus
6799 -------------------------------------------------------------------------------*/
6800eHalStatus csrGetSupportedCountryCode(tpAniSirGlobal pMac, tANI_U8 *pBuf, tANI_U32 *pbLen)
6801{
6802 eHalStatus status = eHAL_STATUS_SUCCESS;
6803 VOS_STATUS vosStatus;
6804 v_SIZE_t size = (v_SIZE_t)*pbLen;
6805
6806 vosStatus = vos_nv_getSupportedCountryCode( pBuf, &size, 1 );
6807 //eiter way, return the value back
6808 *pbLen = (tANI_U32)size;
6809
6810 //If pBuf is NULL, caller just want to get the size, consider it success
6811 if(pBuf)
6812 {
6813 if( VOS_IS_STATUS_SUCCESS( vosStatus ) )
6814 {
6815 tANI_U32 i, n = *pbLen / 3;
6816
6817 for( i = 0; i < n; i++ )
6818 {
6819 pBuf[i*3 + 2] = ' ';
6820 }
6821 }
6822 else
6823 {
6824 status = eHAL_STATUS_FAILURE;
6825 }
6826 }
6827
6828 return (status);
6829}
6830
6831
6832
6833//Upper layer to get the list of the base channels to scan for passively 11d info from csr
6834eHalStatus csrScanGetBaseChannels( tpAniSirGlobal pMac, tCsrChannelInfo * pChannelInfo )
6835{
6836 eHalStatus status = eHAL_STATUS_FAILURE;
6837
6838 do
6839 {
6840
6841 if(!pMac->scan.baseChannels.numChannels || !pChannelInfo)
6842 {
6843 break;
6844 }
Kiet Lam64c1b492013-07-12 13:56:44 +05306845 pChannelInfo->ChannelList = vos_mem_malloc(pMac->scan.baseChannels.numChannels);
6846 if ( NULL == pChannelInfo->ChannelList )
Jeff Johnson295189b2012-06-20 16:38:30 -07006847 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08006848 smsLog( pMac, LOGE, FL("csrScanGetBaseChannels: fail to allocate memory") );
Kiet Lam64c1b492013-07-12 13:56:44 +05306849 return eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006850 }
Kiet Lam64c1b492013-07-12 13:56:44 +05306851 vos_mem_copy(pChannelInfo->ChannelList,
6852 pMac->scan.baseChannels.channelList,
6853 pMac->scan.baseChannels.numChannels);
Jeff Johnson295189b2012-06-20 16:38:30 -07006854 pChannelInfo->numOfChannels = pMac->scan.baseChannels.numChannels;
6855
6856 }while(0);
6857
6858 return ( status );
6859}
6860
6861
6862tANI_BOOLEAN csrIsSetKeyAllowed(tpAniSirGlobal pMac, tANI_U32 sessionId)
6863{
6864 tANI_BOOLEAN fRet = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006865 tCsrRoamSession *pSession;
6866
6867 pSession =CSR_GET_SESSION(pMac, sessionId);
6868
6869 /*This condition is not working for infra state. When infra is in not-connected state
6870 * the pSession->pCurRoamProfile is NULL. And this function returns TRUE, that is incorrect.
6871 * Since SAP requires to set key without any BSS started, it needs this condition to be met.
6872 * In other words, this function is useless.
6873 * The current work-around is to process setcontext_rsp and removekey_rsp no matter what the
6874 * state is.
6875 */
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08006876 smsLog( pMac, LOG2, FL(" is not what it intends to. Must be revisit or removed") );
Jeff Johnson295189b2012-06-20 16:38:30 -07006877 if( (NULL == pSession) ||
6878 ( csrIsConnStateDisconnected( pMac, sessionId ) &&
6879 (pSession->pCurRoamProfile != NULL) &&
6880 (!(CSR_IS_INFRA_AP(pSession->pCurRoamProfile))) )
6881 )
6882 {
6883 fRet = eANI_BOOLEAN_FALSE;
6884 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006885
6886 return ( fRet );
6887}
6888
6889//no need to acquire lock for this basic function
6890tANI_U16 sme_ChnToFreq(tANI_U8 chanNum)
6891{
6892 int i;
6893
6894 for (i = 0; i < NUM_RF_CHANNELS; i++)
6895 {
6896 if (rfChannels[i].channelNum == chanNum)
6897 {
6898 return rfChannels[i].targetFreq;
6899 }
6900 }
6901
6902 return (0);
6903}
6904
6905/* Disconnect all active sessions by sending disassoc. This is mainly used to disconnect the remaining session when we
6906 * transition from concurrent sessions to a single session. The use case is Infra STA and wifi direct multiple sessions are up and
6907 * P2P session is removed. The Infra STA session remains and should resume BMPS if BMPS is enabled by default. However, there
6908 * are some issues seen with BMPS resume during this transition and this is a workaround which will allow the Infra STA session to
6909 * disconnect and auto connect back and enter BMPS this giving the same effect as resuming BMPS
6910 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006911
6912//Remove this code once SLM_Sessionization is supported
6913//BMPS_WORKAROUND_NOT_NEEDED
Jeff Johnson295189b2012-06-20 16:38:30 -07006914void csrDisconnectAllActiveSessions(tpAniSirGlobal pMac)
6915{
6916 tANI_U8 i;
6917
6918 /* Disconnect all the active sessions */
6919 for (i=0; i<CSR_ROAM_SESSION_MAX; i++)
6920 {
6921 if( CSR_IS_SESSION_VALID( pMac, i ) && !csrIsConnStateDisconnected( pMac, i ) )
6922 {
6923 csrRoamDisconnectInternal(pMac, i, eCSR_DISCONNECT_REASON_UNSPECIFIED);
6924 }
6925 }
6926}
Mohit Khanna349bc392012-09-11 17:24:52 -07006927
Madan Mohan Koyyalamudi470d2cf2012-09-28 14:43:44 -07006928#ifdef FEATURE_WLAN_LFR
6929tANI_BOOLEAN csrIsChannelPresentInList(
6930 tANI_U8 *pChannelList,
6931 int numChannels,
6932 tANI_U8 channel
6933 )
6934{
6935 int i = 0;
6936
6937 // Check for NULL pointer
Madan Mohan Koyyalamudidd3c9662012-11-09 17:39:30 -08006938 if (!pChannelList || (numChannels == 0))
6939 {
6940 return FALSE;
6941 }
Madan Mohan Koyyalamudi470d2cf2012-09-28 14:43:44 -07006942
6943 // Look for the channel in the list
6944 for (i = 0; i < numChannels; i++)
6945 {
6946 if (pChannelList[i] == channel)
6947 return TRUE;
6948 }
6949
6950 return FALSE;
6951}
6952
6953VOS_STATUS csrAddToChannelListFront(
6954 tANI_U8 *pChannelList,
6955 int numChannels,
6956 tANI_U8 channel
6957 )
6958{
6959 int i = 0;
6960
6961 // Check for NULL pointer
6962 if (!pChannelList) return eHAL_STATUS_E_NULL_VALUE;
6963
6964 // Make room for the addition. (Start moving from the back.)
6965 for (i = numChannels; i > 0; i--)
6966 {
6967 pChannelList[i] = pChannelList[i-1];
6968 }
6969
6970 // Now add the NEW channel...at the front
6971 pChannelList[0] = channel;
6972
6973 return eHAL_STATUS_SUCCESS;
6974}
6975#endif
Sushant Kaushike0d2cce2014-04-10 14:36:07 +05306976const char * sme_requestTypetoString(const v_U8_t requestType)
6977{
6978 switch (requestType)
6979 {
6980 CASE_RETURN_STRING( eCSR_SCAN_REQUEST_11D_SCAN );
6981 CASE_RETURN_STRING( eCSR_SCAN_REQUEST_FULL_SCAN );
6982 CASE_RETURN_STRING( eCSR_SCAN_IDLE_MODE_SCAN );
6983 CASE_RETURN_STRING( eCSR_SCAN_HO_BG_SCAN );
6984 CASE_RETURN_STRING( eCSR_SCAN_HO_PROBE_SCAN );
6985 CASE_RETURN_STRING( eCSR_SCAN_HO_NT_BG_SCAN );
6986 CASE_RETURN_STRING( eCSR_SCAN_P2P_DISCOVERY );
6987 CASE_RETURN_STRING( eCSR_SCAN_SOFTAP_CHANNEL_RANGE );
6988 CASE_RETURN_STRING( eCSR_SCAN_P2P_FIND_PEER );
6989 default:
6990 return "Unknown Scan Request Type";
6991 }
6992}