blob: 9da468c8b4761d54d0d48360e07817ce94b5a8e2 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam0fb93dd2014-02-19 00:32:59 -08002 * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
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);
1271 CASE_RETURN_STR(eCSR_ROAM_INDICATE_MGMT_FRAME);
1272 CASE_RETURN_STR(eCSR_ROAM_REMAIN_CHAN_READY);
1273 CASE_RETURN_STR(eCSR_ROAM_SEND_ACTION_CNF);
1274 CASE_RETURN_STR(eCSR_ROAM_SESSION_OPENED);
1275 CASE_RETURN_STR(eCSR_ROAM_FT_REASSOC_FAILED);
1276#ifdef FEATURE_WLAN_LFR
1277 CASE_RETURN_STR(eCSR_ROAM_PMK_NOTIFY);
1278#endif
1279#ifdef FEATURE_WLAN_LFR_METRICS
1280 CASE_RETURN_STR(eCSR_ROAM_PREAUTH_INIT_NOTIFY);
1281 CASE_RETURN_STR(eCSR_ROAM_PREAUTH_STATUS_SUCCESS);
1282 CASE_RETURN_STR(eCSR_ROAM_PREAUTH_STATUS_FAILURE);
1283 CASE_RETURN_STR(eCSR_ROAM_HANDOVER_SUCCESS);
1284#endif
1285#ifdef FEATURE_WLAN_TDLS
1286 CASE_RETURN_STR(eCSR_ROAM_TDLS_STATUS_UPDATE);
1287 CASE_RETURN_STR(eCSR_ROAM_RESULT_MGMT_TX_COMPLETE_IND);
1288#endif
1289 CASE_RETURN_STR(eCSR_ROAM_DISCONNECT_ALL_P2P_CLIENTS);
1290 CASE_RETURN_STR(eCSR_ROAM_SEND_P2P_STOP_BSS);
1291#ifdef WLAN_FEATURE_11W
1292 CASE_RETURN_STR(eCSR_ROAM_UNPROT_MGMT_FRAME_IND);
1293#endif
1294#ifdef WLAN_FEATURE_RMC
1295 CASE_RETURN_STR(eCSR_ROAM_IBSS_PEER_INFO_COMPLETE);
1296#endif
1297#ifdef WLAN_FEATURE_AP_HT40_24G
1298 CASE_RETURN_STR(eCSR_ROAM_2040_COEX_INFO_IND);
1299#endif
1300#if defined(FEATURE_WLAN_ESE) && defined(FEATURE_WLAN_ESE_UPLOAD)
1301 CASE_RETURN_STR(eCSR_ROAM_TSM_IE_IND);
1302 CASE_RETURN_STR(eCSR_ROAM_CCKM_PREAUTH_NOTIFY);
1303 CASE_RETURN_STR(eCSR_ROAM_ESE_ADJ_AP_REPORT_IND);
1304 CASE_RETURN_STR(eCSR_ROAM_ESE_BCN_REPORT_IND);
1305#endif /* FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
1306 CASE_RETURN_STR(eCSR_ROAM_UPDATE_MAX_RATE_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 );
2067 int ieLen = (int)(pBssDesc->length + sizeof( pBssDesc->length ) - GET_FIELD_OFFSET( tSirBssDescription, ieFields ));
2068
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 }
2343 }
2344 }
2345 if(pIes->HTCaps.present && (eCSR_DOT11_MODE_TAURUS != phyMode))
2346 {
2347 phyMode = eCSR_DOT11_MODE_11n;
2348 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002349
2350#ifdef WLAN_FEATURE_11AC
2351 if ( pIes->VHTCaps.present && (eCSR_DOT11_MODE_TAURUS != phyMode))
2352 {
2353 phyMode = eCSR_DOT11_MODE_11ac;
2354 }
2355#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002356 *pPhyMode = phyMode;
2357 }
2358
2359 return (status);
2360
2361}
2362
2363
2364//This function returns the correct eCSR_CFG_DOT11_MODE is the two phyModes matches
2365//bssPhyMode is the mode derived from the BSS description
2366//f5GhzBand is derived from the channel id of BSS description
2367tANI_BOOLEAN csrGetPhyModeInUse( eCsrPhyMode phyModeIn, eCsrPhyMode bssPhyMode, tANI_BOOLEAN f5GhzBand,
2368 eCsrCfgDot11Mode *pCfgDot11ModeToUse )
2369{
2370 tANI_BOOLEAN fMatch = FALSE;
2371 eCsrCfgDot11Mode cfgDot11Mode;
2372
2373 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N; // to suppress compiler warning
2374
2375 switch( phyModeIn )
2376 {
2377 case eCSR_DOT11_MODE_abg: //11a or 11b or 11g
2378 if( f5GhzBand )
2379 {
2380 fMatch = TRUE;
2381 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2382 }
2383 else if( eCSR_DOT11_MODE_11b == bssPhyMode )
2384 {
2385 fMatch = TRUE;
2386 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2387 }
2388 else
2389 {
2390 fMatch = TRUE;
2391 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2392 }
2393 break;
2394
2395 case eCSR_DOT11_MODE_11a: //11a
2396 if( f5GhzBand )
2397 {
2398 fMatch = TRUE;
2399 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2400 }
2401 break;
2402
2403 case eCSR_DOT11_MODE_11a_ONLY: //11a
2404 if( eCSR_DOT11_MODE_11a == bssPhyMode )
2405 {
2406 fMatch = TRUE;
2407 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2408 }
2409 break;
2410
2411 case eCSR_DOT11_MODE_11g:
2412 if(!f5GhzBand)
2413 {
2414 if( eCSR_DOT11_MODE_11b == bssPhyMode )
2415 {
2416 fMatch = TRUE;
2417 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2418 }
2419 else
2420 {
2421 fMatch = TRUE;
2422 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2423 }
2424 }
2425 break;
2426
2427 case eCSR_DOT11_MODE_11g_ONLY:
2428 if( eCSR_DOT11_MODE_11g == bssPhyMode )
2429 {
2430 fMatch = TRUE;
2431 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2432 }
2433 break;
2434
2435 case eCSR_DOT11_MODE_11b:
2436 if( !f5GhzBand )
2437 {
2438 fMatch = TRUE;
2439 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2440 }
2441 break;
2442
2443 case eCSR_DOT11_MODE_11b_ONLY:
2444 if( eCSR_DOT11_MODE_11b == bssPhyMode )
2445 {
2446 fMatch = TRUE;
2447 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2448 }
2449 break;
2450
2451 case eCSR_DOT11_MODE_11n:
2452 fMatch = TRUE;
2453 switch(bssPhyMode)
2454 {
2455 case eCSR_DOT11_MODE_11g:
2456 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2457 break;
2458 case eCSR_DOT11_MODE_11b:
2459 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2460 break;
2461 case eCSR_DOT11_MODE_11a:
2462 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2463 break;
2464 case eCSR_DOT11_MODE_11n:
Jeff Johnsone7245742012-09-05 17:12:55 -07002465#ifdef WLAN_FEATURE_11AC
2466 case eCSR_DOT11_MODE_11ac:
2467#endif
2468 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
2469 break;
2470
Jeff Johnson295189b2012-06-20 16:38:30 -07002471 case eCSR_DOT11_MODE_TAURUS:
2472 default:
Jeff Johnsone7245742012-09-05 17:12:55 -07002473#ifdef WLAN_FEATURE_11AC
2474 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
2475#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002476 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
Jeff Johnsone7245742012-09-05 17:12:55 -07002477#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002478 break;
2479 }
2480 break;
2481
2482 case eCSR_DOT11_MODE_11n_ONLY:
2483 if((eCSR_DOT11_MODE_11n == bssPhyMode) || (eCSR_DOT11_MODE_TAURUS == bssPhyMode))
2484 {
2485 fMatch = TRUE;
2486 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
Jeff Johnsone7245742012-09-05 17:12:55 -07002487
2488 }
2489
2490 break;
2491#ifdef WLAN_FEATURE_11AC
2492 case eCSR_DOT11_MODE_11ac:
2493 fMatch = TRUE;
2494 switch(bssPhyMode)
2495 {
2496 case eCSR_DOT11_MODE_11g:
2497 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2498 break;
2499 case eCSR_DOT11_MODE_11b:
2500 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2501 break;
2502 case eCSR_DOT11_MODE_11a:
2503 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2504 break;
2505 case eCSR_DOT11_MODE_11n:
2506 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
2507 break;
2508 case eCSR_DOT11_MODE_11ac:
2509 case eCSR_DOT11_MODE_TAURUS:
2510 default:
2511 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
2512 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002513 }
2514 break;
2515
Jeff Johnsone7245742012-09-05 17:12:55 -07002516 case eCSR_DOT11_MODE_11ac_ONLY:
2517 if((eCSR_DOT11_MODE_11ac == bssPhyMode) || (eCSR_DOT11_MODE_TAURUS == bssPhyMode))
2518 {
2519 fMatch = TRUE;
2520 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
2521 }
2522 break;
2523#endif
2524
Jeff Johnson295189b2012-06-20 16:38:30 -07002525 case eCSR_DOT11_MODE_TAURUS:
2526 default:
2527 fMatch = TRUE;
2528 switch(bssPhyMode)
2529 {
2530 case eCSR_DOT11_MODE_11g:
2531 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2532 break;
2533 case eCSR_DOT11_MODE_11b:
2534 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
2535 break;
2536 case eCSR_DOT11_MODE_11a:
2537 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2538 break;
2539 case eCSR_DOT11_MODE_11n:
2540 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
2541 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07002542#ifdef WLAN_FEATURE_11AC
2543 case eCSR_DOT11_MODE_11ac:
2544 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
2545 break;
2546#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002547 case eCSR_DOT11_MODE_TAURUS:
2548 default:
2549 cfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
2550 break;
2551 }
2552 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002553 }
2554
2555 if ( fMatch && pCfgDot11ModeToUse )
2556 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002557#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudief5dd972012-10-11 15:06:09 -07002558 if(cfgDot11Mode == eCSR_CFG_DOT11_MODE_11AC && (!IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)))
Jeff Johnsone7245742012-09-05 17:12:55 -07002559 {
2560 *pCfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
2561 }
2562 else
2563#endif
2564 {
2565 *pCfgDot11ModeToUse = cfgDot11Mode;
2566 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002567 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002568 return( fMatch );
2569}
2570
2571
2572//This function decides whether the one of the bit of phyMode is matching the mode in the BSS and allowed by the user
2573//setting, pMac->roam.configParam.uCfgDot11Mode. It returns the mode that fits the criteria.
2574tANI_BOOLEAN csrIsPhyModeMatch( tpAniSirGlobal pMac, tANI_U32 phyMode,
2575 tSirBssDescription *pSirBssDesc, tCsrRoamProfile *pProfile,
2576 eCsrCfgDot11Mode *pReturnCfgDot11Mode,
2577 tDot11fBeaconIEs *pIes)
2578{
2579 tANI_BOOLEAN fMatch = FALSE;
2580 eCsrPhyMode phyModeInBssDesc, phyMode2;
2581 eCsrCfgDot11Mode cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_TAURUS;
2582 tANI_U32 bitMask, loopCount;
2583
2584 if(HAL_STATUS_SUCCESS(csrGetPhyModeFromBss(pMac, pSirBssDesc, &phyModeInBssDesc, pIes )))
2585 {
2586 //In case some change change eCSR_DOT11_MODE_TAURUS to non-0
2587 if ( (0 == phyMode) || (eCSR_DOT11_MODE_AUTO & phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode))
2588 {
2589 //Taurus means anything
2590 if ( eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode )
2591 {
2592 phyMode = eCSR_DOT11_MODE_abg;
2593 }
2594 else if(eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode)
2595 {
2596 if(pMac->roam.configParam.ProprietaryRatesEnabled)
2597 {
2598 phyMode = eCSR_DOT11_MODE_TAURUS;
2599 }
2600 else
2601 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002602
2603#ifdef WLAN_FEATURE_11AC
2604 phyMode = eCSR_DOT11_MODE_11ac;
2605#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002606 phyMode = eCSR_DOT11_MODE_11n;
Jeff Johnsone7245742012-09-05 17:12:55 -07002607#endif
2608
Jeff Johnson295189b2012-06-20 16:38:30 -07002609 }
2610 }
2611 else
2612 {
2613 //user's pick
2614 phyMode = pMac->roam.configParam.phyMode;
2615 }
2616 }
2617 if ( (0 == phyMode) || (eCSR_DOT11_MODE_AUTO & phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode) )
2618 {
2619 if(0 != phyMode)
2620 {
2621 if(eCSR_DOT11_MODE_AUTO & phyMode)
2622 {
2623 phyMode2 = eCSR_DOT11_MODE_AUTO & phyMode;
2624 }
2625 else
2626 {
2627 phyMode2 = eCSR_DOT11_MODE_TAURUS & phyMode;
2628 }
2629 }
2630 else
2631 {
2632 phyMode2 = phyMode;
2633 }
2634 fMatch = csrGetPhyModeInUse( phyMode2, phyModeInBssDesc, CSR_IS_CHANNEL_5GHZ(pSirBssDesc->channelId),
2635 &cfgDot11ModeToUse );
2636 }
2637 else
2638 {
2639 bitMask = 1;
2640 loopCount = 0;
2641 while(loopCount < eCSR_NUM_PHY_MODE)
2642 {
2643 if(0 != ( phyMode2 = (phyMode & (bitMask << loopCount++)) ))
2644 {
2645 fMatch = csrGetPhyModeInUse( phyMode2, phyModeInBssDesc, CSR_IS_CHANNEL_5GHZ(pSirBssDesc->channelId),
2646 &cfgDot11ModeToUse );
2647 if(fMatch) break;
2648 }
2649 }
2650 }
2651 if ( fMatch && pReturnCfgDot11Mode )
2652 {
2653 if( pProfile )
2654 {
2655 /* IEEE 11n spec (8.4.3): HT STA shall eliminate TKIP as a
2656 * choice for the pairwise cipher suite if CCMP is advertised
2657 * by the AP or if the AP included an HT capabilities element
2658 * in its Beacons and Probe Response.
2659 */
2660 if( (!CSR_IS_11n_ALLOWED( pProfile->negotiatedUCEncryptionType )) &&
2661 ((eCSR_CFG_DOT11_MODE_11N == cfgDot11ModeToUse) ||
Jeff Johnsone7245742012-09-05 17:12:55 -07002662#ifdef WLAN_FEATURE_11AC
2663 (eCSR_CFG_DOT11_MODE_11AC == cfgDot11ModeToUse) ||
2664#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002665 (eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11ModeToUse)) )
2666 {
2667 //We cannot do 11n here
2668 if( !CSR_IS_CHANNEL_5GHZ(pSirBssDesc->channelId) )
2669 {
2670 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11G;
2671 }
2672 else
2673 {
2674 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11A;
2675 }
2676 }
2677 }
2678 *pReturnCfgDot11Mode = cfgDot11ModeToUse;
2679 }
2680 }
2681
2682 return( fMatch );
2683}
2684
2685
2686eCsrCfgDot11Mode csrFindBestPhyMode( tpAniSirGlobal pMac, tANI_U32 phyMode )
2687{
2688 eCsrCfgDot11Mode cfgDot11ModeToUse;
2689 eCsrBand eBand = pMac->roam.configParam.eBand;
2690
Jeff Johnsone7245742012-09-05 17:12:55 -07002691
Madan Mohan Koyyalamudi0dae8812013-07-15 19:22:49 +05302692 if ((0 == phyMode) ||
Jeff Johnsone7245742012-09-05 17:12:55 -07002693#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudi0dae8812013-07-15 19:22:49 +05302694 (eCSR_DOT11_MODE_11ac & phyMode) ||
Jeff Johnsone7245742012-09-05 17:12:55 -07002695#endif
Madan Mohan Koyyalamudi0dae8812013-07-15 19:22:49 +05302696 (eCSR_DOT11_MODE_AUTO & phyMode))
Jeff Johnson295189b2012-06-20 16:38:30 -07002697 {
Madan Mohan Koyyalamudi0dae8812013-07-15 19:22:49 +05302698#ifdef WLAN_FEATURE_11AC
2699 if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
2700 {
2701 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11AC;
2702 }
2703 else
2704#endif
2705 {
2706 /* Default to 11N mode if user has configured 11ac mode
2707 * and FW doesn't supports 11ac mode .
2708 */
2709 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
2710 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002711 }
2712 else
2713 {
2714 if( ( eCSR_DOT11_MODE_11n | eCSR_DOT11_MODE_11n_ONLY ) & phyMode )
2715 {
2716 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
2717 }
2718 else if ( eCSR_DOT11_MODE_abg & phyMode )
2719 {
2720 if( eCSR_BAND_24 != eBand )
2721 {
2722 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11A;
2723 }
2724 else
2725 {
2726 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11G;
2727 }
2728 }
2729 else if( ( eCSR_DOT11_MODE_11a | eCSR_DOT11_MODE_11a_ONLY ) & phyMode )
2730 {
2731 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11A;
2732 }
2733 else if( ( eCSR_DOT11_MODE_11g | eCSR_DOT11_MODE_11g_ONLY ) & phyMode )
2734 {
2735 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11G;
2736 }
2737 else
2738 {
2739 cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11B;
2740 }
2741 }
2742
2743 return ( cfgDot11ModeToUse );
2744}
2745
2746
2747
2748
2749tANI_U32 csrGet11hPowerConstraint( tHalHandle hHal, tDot11fIEPowerConstraints *pPowerConstraint )
2750{
2751 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
2752 tANI_U32 localPowerConstraint = 0;
2753
2754 // check if .11h support is enabled, if not, the power constraint is 0.
2755 if(pMac->roam.configParam.Is11hSupportEnabled && pPowerConstraint->present)
2756 {
2757 localPowerConstraint = pPowerConstraint->localPowerConstraints;
2758 }
2759
2760 return( localPowerConstraint );
2761}
2762
2763
2764tANI_BOOLEAN csrIsProfileWpa( tCsrRoamProfile *pProfile )
2765{
2766 tANI_BOOLEAN fWpaProfile = FALSE;
2767
2768 switch ( pProfile->negotiatedAuthType )
2769 {
2770 case eCSR_AUTH_TYPE_WPA:
2771 case eCSR_AUTH_TYPE_WPA_PSK:
2772 case eCSR_AUTH_TYPE_WPA_NONE:
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08002773#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07002774 case eCSR_AUTH_TYPE_CCKM_WPA:
2775#endif
2776 fWpaProfile = TRUE;
2777 break;
2778
2779 default:
2780 fWpaProfile = FALSE;
2781 break;
2782 }
2783
2784 if ( fWpaProfile )
2785 {
2786 switch ( pProfile->negotiatedUCEncryptionType )
2787 {
2788 case eCSR_ENCRYPT_TYPE_WEP40:
2789 case eCSR_ENCRYPT_TYPE_WEP104:
2790 case eCSR_ENCRYPT_TYPE_TKIP:
2791 case eCSR_ENCRYPT_TYPE_AES:
2792 fWpaProfile = TRUE;
2793 break;
2794
2795 default:
2796 fWpaProfile = FALSE;
2797 break;
2798 }
2799 }
2800 return( fWpaProfile );
2801}
2802
2803tANI_BOOLEAN csrIsProfileRSN( tCsrRoamProfile *pProfile )
2804{
2805 tANI_BOOLEAN fRSNProfile = FALSE;
2806
2807 switch ( pProfile->negotiatedAuthType )
2808 {
2809 case eCSR_AUTH_TYPE_RSN:
2810 case eCSR_AUTH_TYPE_RSN_PSK:
2811#ifdef WLAN_FEATURE_VOWIFI_11R
2812 case eCSR_AUTH_TYPE_FT_RSN:
2813 case eCSR_AUTH_TYPE_FT_RSN_PSK:
2814#endif
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08002815#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07002816 case eCSR_AUTH_TYPE_CCKM_RSN:
2817#endif
Chet Lanctot186b5732013-03-18 10:26:30 -07002818#ifdef WLAN_FEATURE_11W
2819 case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
Abhishek Singhae408032014-09-25 17:22:04 +05302820 case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
Chet Lanctot186b5732013-03-18 10:26:30 -07002821#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002822 fRSNProfile = TRUE;
2823 break;
2824
2825 default:
2826 fRSNProfile = FALSE;
2827 break;
2828 }
2829
2830 if ( fRSNProfile )
2831 {
2832 switch ( pProfile->negotiatedUCEncryptionType )
2833 {
2834 // !!REVIEW - For WPA2, use of RSN IE mandates
2835 // use of AES as encryption. Here, we qualify
2836 // even if encryption type is WEP or TKIP
2837 case eCSR_ENCRYPT_TYPE_WEP40:
2838 case eCSR_ENCRYPT_TYPE_WEP104:
2839 case eCSR_ENCRYPT_TYPE_TKIP:
2840 case eCSR_ENCRYPT_TYPE_AES:
2841 fRSNProfile = TRUE;
2842 break;
2843
2844 default:
2845 fRSNProfile = FALSE;
2846 break;
2847 }
2848 }
2849 return( fRSNProfile );
2850}
2851
Jeff Johnsone7245742012-09-05 17:12:55 -07002852eHalStatus
2853csrIsconcurrentsessionValid(tpAniSirGlobal pMac,tANI_U32 cursessionId,
2854 tVOS_CON_MODE currBssPersona)
2855{
2856 tANI_U32 sessionId = 0;
2857
2858 for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
2859 {
2860 if (cursessionId != sessionId )
2861 {
2862 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
2863 {
2864 continue;
2865 }
2866
2867 switch (currBssPersona)
2868 {
2869 case VOS_STA_MODE:
Jeff Johnsone7245742012-09-05 17:12:55 -07002870 {
Agarwal Ashish4cfa1e52014-05-09 20:25:11 +05302871 smsLog(pMac, LOG4, FL(" Second session for persona %d"), currBssPersona);
Agarwal Ashishe16e1212014-05-15 14:51:36 +05302872 return eHAL_STATUS_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -07002873 }
2874 break;
2875
2876 case VOS_STA_SAP_MODE:
Gopichand Nakkala53fefcd2013-02-28 12:35:20 +05302877 if((pMac->roam.roamSession[sessionId].bssParams.bssPersona
2878 == VOS_STA_SAP_MODE)&&
Ravi Joshia96ceb42013-05-20 18:52:39 -07002879 (pMac->roam.roamSession[sessionId].connectState
2880 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED))
Jeff Johnsone7245742012-09-05 17:12:55 -07002881 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002882 smsLog(pMac, LOGE, FL(" ****SoftAP mode already exists ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002883 return eHAL_STATUS_FAILURE;
2884 }
Ravi Joshia96ceb42013-05-20 18:52:39 -07002885 else if( (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2886 == VOS_P2P_GO_MODE &&
2887 pMac->roam.roamSession[sessionId].connectState
2888 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED) ||
2889 (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2890 == VOS_IBSS_MODE &&
2891 pMac->roam.roamSession[sessionId].connectState
2892 != eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED))
Jeff Johnsone7245742012-09-05 17:12:55 -07002893 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002894 smsLog(pMac, LOGE, FL(" ****Cannot start Multiple Beaconing Role ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002895 return eHAL_STATUS_FAILURE;
2896 }
2897 break;
2898
2899 case VOS_P2P_CLIENT_MODE:
2900 if(pMac->roam.roamSession[sessionId].pCurRoamProfile &&
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07002901 (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07002902 == VOS_P2P_CLIENT_MODE)) //check for P2P client mode
2903 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002904 smsLog(pMac, LOGE, FL(" ****CLIENT mode already exists ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002905 return eHAL_STATUS_FAILURE;
2906 }
2907 break;
2908
2909 case VOS_P2P_GO_MODE:
Gopichand Nakkala53fefcd2013-02-28 12:35:20 +05302910 if((pMac->roam.roamSession[sessionId].bssParams.bssPersona
2911 == VOS_P2P_GO_MODE) &&
Ravi Joshia96ceb42013-05-20 18:52:39 -07002912 (pMac->roam.roamSession[sessionId].connectState
2913 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED))
Jeff Johnsone7245742012-09-05 17:12:55 -07002914 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002915 smsLog(pMac, LOGE, FL(" ****P2P GO mode already exists ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002916 return eHAL_STATUS_FAILURE;
2917 }
Ravi Joshia96ceb42013-05-20 18:52:39 -07002918 else if( (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2919 == VOS_STA_SAP_MODE &&
2920 pMac->roam.roamSession[sessionId].connectState
2921 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED) ||
2922 (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2923 == VOS_IBSS_MODE &&
2924 pMac->roam.roamSession[sessionId].connectState
2925 != eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED) )
Jeff Johnsone7245742012-09-05 17:12:55 -07002926 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002927 smsLog(pMac, LOGE, FL(" ****Cannot start Multiple Beaconing Role ****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002928 return eHAL_STATUS_FAILURE;
2929 }
2930 break;
Ravi Joshia96ceb42013-05-20 18:52:39 -07002931 case VOS_IBSS_MODE:
2932 if((pMac->roam.roamSession[sessionId].bssParams.bssPersona
2933 == VOS_IBSS_MODE) &&
2934 (pMac->roam.roamSession[sessionId].connectState
2935 != eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED))
2936 {
2937 smsLog(pMac, LOGE, FL(" ****IBSS mode already exists ****"));
2938 return eHAL_STATUS_FAILURE;
2939 }
2940 else if( (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2941 == VOS_P2P_GO_MODE ||
2942 pMac->roam.roamSession[sessionId].bssParams.bssPersona
2943 == VOS_STA_SAP_MODE) &&
2944 pMac->roam.roamSession[sessionId].connectState
2945 != eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED)
2946 {
2947 smsLog(pMac, LOGE, FL(" ****Cannot start Multiple Beaconing Role ****"));
2948 return eHAL_STATUS_FAILURE;
2949 }
2950 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07002951 default :
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08002952 smsLog(pMac, LOGE, FL("***Persona not handled = %d*****"),currBssPersona);
Jeff Johnsone7245742012-09-05 17:12:55 -07002953 break;
2954 }
2955 }
2956 }
2957 return eHAL_STATUS_SUCCESS;
2958
2959}
2960
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08002961eHalStatus csrUpdateMCCp2pBeaconInterval(tpAniSirGlobal pMac)
Jeff Johnsone7245742012-09-05 17:12:55 -07002962{
2963 tANI_U32 sessionId = 0;
2964
2965 //If MCC is not supported just break and return SUCCESS
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08002966 if ( !pMac->roam.configParam.fenableMCCMode){
2967 return eHAL_STATUS_FAILURE;
2968 }
2969
2970 for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
2971 {
2972 /* If GO in MCC support different beacon interval,
2973 * change the BI of the P2P-GO */
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07002974 if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
2975 == VOS_P2P_GO_MODE)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08002976 {
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07002977 /* Handle different BI scneario based on the configuration set.
2978 * If Config is set to 0x02 then Disconnect all the P2P clients
2979 * associated. If config is set to 0x04 then update the BI
2980 * without disconnecting all the clients
2981 */
2982 if ((pMac->roam.configParam.fAllowMCCGODiffBI == 0x04) &&
2983 (pMac->roam.roamSession[sessionId].bssParams.updatebeaconInterval))
2984 {
2985 return csrSendChngMCCBeaconInterval( pMac, sessionId);
2986 }
2987 //If the configuration of fAllowMCCGODiffBI is set to other than 0x04
2988 else if ( pMac->roam.roamSession[sessionId].bssParams.updatebeaconInterval)
2989 {
2990 return csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_DISCONNECT_ALL_P2P_CLIENTS, eCSR_ROAM_RESULT_NONE);
2991 }
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08002992 }
2993 }
2994 return eHAL_STATUS_FAILURE;
2995}
2996
2997tANI_U16 csrCalculateMCCBeaconInterval(tpAniSirGlobal pMac, tANI_U16 sta_bi, tANI_U16 go_gbi)
2998{
2999 tANI_U8 num_beacons = 0;
3000 tANI_U8 is_multiple = 0;
3001 tANI_U16 go_cbi = 0;
3002 tANI_U16 go_fbi = 0;
3003 tANI_U16 sta_cbi = 0;
3004
3005 //If GO's given beacon Interval is less than 100
3006 if(go_gbi < 100)
3007 go_cbi = 100;
3008 //if GO's given beacon Interval is greater than or equal to 100
3009 else
3010 go_cbi = 100 + (go_gbi % 100);
3011
AnjaneeDevi Kapparapu4b043912014-02-18 13:22:35 +05303012 if ( sta_bi == 0 )
3013 {
3014 /* There is possibility to receive zero as value.
3015 Which will cause divide by zero. Hence initialise with 100
3016 */
3017 sta_bi = 100;
3018 smsLog(pMac, LOGW,
3019 FL("sta_bi 2nd parameter is zero, initialise to %d"), sta_bi);
3020 }
3021
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003022 // check, if either one is multiple of another
3023 if (sta_bi > go_cbi)
3024 {
3025 is_multiple = !(sta_bi % go_cbi);
3026 }
3027 else
3028 {
3029 is_multiple = !(go_cbi % sta_bi);
3030 }
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08003031 // if it is multiple, then accept GO's beacon interval range [100,199] as it is
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003032 if (is_multiple)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003033 {
3034 return go_cbi;
3035 }
3036 //else , if it is not multiple, then then check for number of beacons to be
3037 //inserted based on sta BI
3038 num_beacons = sta_bi / 100;
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003039 if (num_beacons)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003040 {
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08003041 // GO's final beacon interval will be aligned to sta beacon interval, but
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003042 //in the range of [100, 199].
3043 sta_cbi = sta_bi / num_beacons;
3044 go_fbi = sta_cbi;
3045 }
3046 else
3047 {
Madan Mohan Koyyalamudi48081ef2012-12-04 16:49:55 -08003048 // if STA beacon interval is less than 100, use GO's change bacon interval
3049 //instead of updating to STA's beacon interval.
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003050 go_fbi = go_cbi;
3051 }
3052 return go_fbi;
3053}
3054
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003055eHalStatus csrValidateMCCBeaconInterval(tpAniSirGlobal pMac, tANI_U8 channelId,
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003056 tANI_U16 *beaconInterval, tANI_U32 cursessionId,
3057 tVOS_CON_MODE currBssPersona)
3058{
3059 tANI_U32 sessionId = 0;
3060 tANI_U16 new_beaconInterval = 0;
3061
3062 //If MCC is not supported just break
3063 if (!pMac->roam.configParam.fenableMCCMode){
Jeff Johnsone7245742012-09-05 17:12:55 -07003064 return eHAL_STATUS_FAILURE;
3065 }
3066
3067 for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
3068 {
3069 if (cursessionId != sessionId )
3070 {
3071 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
3072 {
3073 continue;
3074 }
3075
3076 switch (currBssPersona)
3077 {
3078 case VOS_STA_MODE:
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003079 if (pMac->roam.roamSession[sessionId].pCurRoamProfile &&
3080 (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003081 == VOS_P2P_CLIENT_MODE)) //check for P2P client mode
3082 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003083 smsLog(pMac, LOG1, FL(" Beacon Interval Validation not required for STA/CLIENT"));
Jeff Johnsone7245742012-09-05 17:12:55 -07003084 }
3085 //IF SAP has started and STA wants to connect on different channel MCC should
3086 //MCC should not be enabled so making it false to enforce on same channel
3087 else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
3088 == VOS_STA_SAP_MODE)
3089 {
3090 if (pMac->roam.roamSession[sessionId].bssParams.operationChn
3091 != channelId )
3092 {
Agarwal Ashish4cfa1e52014-05-09 20:25:11 +05303093 smsLog(pMac, LOGE, FL("*** MCC with SAP+STA sessions ****"));
3094 return eHAL_STATUS_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -07003095 }
3096 }
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003097 else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003098 == VOS_P2P_GO_MODE) //Check for P2P go scenario
3099 {
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003100 /* if GO in MCC support different beacon interval,
3101 * change the BI of the P2P-GO */
3102 if ((pMac->roam.roamSession[sessionId].bssParams.operationChn
Jeff Johnsone7245742012-09-05 17:12:55 -07003103 != channelId ) &&
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003104 (pMac->roam.roamSession[sessionId].bssParams.beaconInterval
Jeff Johnsone7245742012-09-05 17:12:55 -07003105 != *beaconInterval))
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003106 {
3107 /* if GO in MCC support different beacon interval, return success */
3108 if ( pMac->roam.configParam.fAllowMCCGODiffBI == 0x01)
3109 {
3110 return eHAL_STATUS_SUCCESS;
3111 }
3112 // Send only Broadcast disassoc and update beaconInterval
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003113 //If configuration is set to 0x04 then dont
3114 // disconnect all the station
3115 else if ((pMac->roam.configParam.fAllowMCCGODiffBI == 0x02) ||
3116 (pMac->roam.configParam.fAllowMCCGODiffBI == 0x04))
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003117 {
3118 //Check to pass the right beacon Interval
3119 new_beaconInterval = csrCalculateMCCBeaconInterval(pMac, *beaconInterval,
3120 pMac->roam.roamSession[sessionId].bssParams.beaconInterval);
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003121 smsLog(pMac, LOG1, FL(" Peer AP BI : %d, new Beacon Interval: %d"),*beaconInterval,new_beaconInterval );
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003122 //Update the becon Interval
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003123 if (new_beaconInterval != pMac->roam.roamSession[sessionId].bssParams.beaconInterval)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003124 {
3125 //Update the beaconInterval now
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003126 smsLog(pMac, LOGE, FL(" Beacon Interval got changed config used: %d\n"),
3127 pMac->roam.configParam.fAllowMCCGODiffBI);
3128
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003129 pMac->roam.roamSession[sessionId].bssParams.beaconInterval = new_beaconInterval;
3130 pMac->roam.roamSession[sessionId].bssParams.updatebeaconInterval = eANI_BOOLEAN_TRUE;
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003131 return csrUpdateMCCp2pBeaconInterval(pMac);
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003132 }
3133 return eHAL_STATUS_SUCCESS;
3134 }
3135 //Disconnect the P2P session
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003136 else if (pMac->roam.configParam.fAllowMCCGODiffBI == 0x03)
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003137 {
3138 pMac->roam.roamSession[sessionId].bssParams.updatebeaconInterval = eANI_BOOLEAN_FALSE;
3139 return csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_SEND_P2P_STOP_BSS, eCSR_ROAM_RESULT_NONE);
3140 }
3141 else
3142 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003143 smsLog(pMac, LOGE, FL("BeaconInterval is different cannot connect to preferred AP..."));
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003144 return eHAL_STATUS_FAILURE;
3145 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003146 }
3147 }
3148 break;
3149
3150 case VOS_P2P_CLIENT_MODE:
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003151 if (pMac->roam.roamSession[sessionId].pCurRoamProfile &&
3152 (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003153 == VOS_STA_MODE)) //check for P2P client mode
3154 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003155 smsLog(pMac, LOG1, FL(" Ignore Beacon Interval Validation..."));
Jeff Johnsone7245742012-09-05 17:12:55 -07003156 }
3157 //IF SAP has started and STA wants to connect on different channel MCC should
3158 //MCC should not be enabled so making it false to enforce on same channel
3159 else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
3160 == VOS_STA_SAP_MODE)
3161 {
3162 if (pMac->roam.roamSession[sessionId].bssParams.operationChn
3163 != channelId )
3164 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003165 smsLog(pMac, LOGE, FL("***MCC is not enabled for SAP + CLIENT****"));
Jeff Johnsone7245742012-09-05 17:12:55 -07003166 return eHAL_STATUS_FAILURE;
3167 }
3168 }
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003169 else if (pMac->roam.roamSession[sessionId].bssParams.bssPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003170 == VOS_P2P_GO_MODE) //Check for P2P go scenario
3171 {
3172 if ((pMac->roam.roamSession[sessionId].bssParams.operationChn
3173 != channelId ) &&
3174 (pMac->roam.roamSession[sessionId].bssParams.beaconInterval
3175 != *beaconInterval))
3176 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08003177 smsLog(pMac, LOGE, FL("BeaconInterval is different cannot connect to P2P_GO network ..."));
Jeff Johnsone7245742012-09-05 17:12:55 -07003178 return eHAL_STATUS_FAILURE;
3179 }
3180 }
3181 break;
3182
3183 case VOS_P2P_GO_MODE :
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003184 {
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003185 if (pMac->roam.roamSession[sessionId].pCurRoamProfile &&
3186 ((pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003187 == VOS_P2P_CLIENT_MODE) ||
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003188 (pMac->roam.roamSession[sessionId].pCurRoamProfile->csrPersona
Jeff Johnsone7245742012-09-05 17:12:55 -07003189 == VOS_STA_MODE))) //check for P2P_client scenario
3190 {
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003191 if ((pMac->roam.roamSession[sessionId].connectedProfile.operationChannel
Jeff Johnsone7245742012-09-05 17:12:55 -07003192 == 0 )&&
3193 (pMac->roam.roamSession[sessionId].connectedProfile.beaconInterval
3194 == 0))
3195 {
3196 continue;
3197 }
3198
AnjaneeDevi Kapparapu4b043912014-02-18 13:22:35 +05303199 //Assert if connected profile beacon internal is ZERO
3200 if(!pMac->roam.roamSession[sessionId].\
3201 connectedProfile.beaconInterval)
3202 {
3203 smsLog( pMac, LOGE, FL(" Connected profile "
3204 "beacon interval is zero") );
3205 }
3206
Jeff Johnsone7245742012-09-05 17:12:55 -07003207
3208 if (csrIsConnStateConnectedInfra(pMac, sessionId) &&
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003209 (pMac->roam.roamSession[sessionId].connectedProfile.operationChannel
Jeff Johnsone7245742012-09-05 17:12:55 -07003210 != channelId ) &&
Sudhir Sattayappa Kohallid9a4df62013-04-04 14:47:54 -07003211 (pMac->roam.roamSession[sessionId].connectedProfile.beaconInterval
Jeff Johnsone7245742012-09-05 17:12:55 -07003212 != *beaconInterval))
3213 {
3214 /*
3215 * Updated beaconInterval should be used only when we are starting a new BSS
3216 * not incase of client or STA case
3217 */
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003218 //Calculate beacon Interval for P2P-GO incase of MCC
3219 new_beaconInterval = csrCalculateMCCBeaconInterval(pMac,
Chet Lanctot4c986162013-05-08 13:59:56 -07003220 pMac->roam.roamSession[sessionId].bssParams.beaconInterval,
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003221 *beaconInterval );
3222 if(*beaconInterval != new_beaconInterval)
3223 *beaconInterval = new_beaconInterval;
Jeff Johnsone7245742012-09-05 17:12:55 -07003224 return eHAL_STATUS_SUCCESS;
3225 }
3226 }
Madan Mohan Koyyalamudi167b95e2012-11-27 15:53:38 -08003227 }
3228 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07003229
3230 default :
Agarwal Ashishe3cca2a2013-07-21 03:01:48 +05303231 smsLog(pMac, LOGE, FL(" Persona not supported : %d"),currBssPersona);
Jeff Johnsone7245742012-09-05 17:12:55 -07003232 return eHAL_STATUS_FAILURE;
3233 }
3234 }
3235 }
3236
3237 return eHAL_STATUS_SUCCESS;
3238}
Jeff Johnson295189b2012-06-20 16:38:30 -07003239
3240#ifdef WLAN_FEATURE_VOWIFI_11R
3241/* Function to return TRUE if the authtype is 11r */
Madan Mohan Koyyalamudi5e32b962012-11-28 16:07:55 -08003242tANI_BOOLEAN csrIsAuthType11r( eCsrAuthType AuthType, tANI_U8 mdiePresent)
Jeff Johnson295189b2012-06-20 16:38:30 -07003243{
3244 switch ( AuthType )
3245 {
Madan Mohan Koyyalamudi5e32b962012-11-28 16:07:55 -08003246 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3247 if(mdiePresent)
3248 return TRUE;
3249 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003250 case eCSR_AUTH_TYPE_FT_RSN_PSK:
3251 case eCSR_AUTH_TYPE_FT_RSN:
3252 return TRUE;
3253 break;
3254 default:
3255 break;
3256 }
3257 return FALSE;
3258}
3259
3260/* Function to return TRUE if the profile is 11r */
3261tANI_BOOLEAN csrIsProfile11r( tCsrRoamProfile *pProfile )
3262{
Madan Mohan Koyyalamudi5e32b962012-11-28 16:07:55 -08003263 return csrIsAuthType11r( pProfile->negotiatedAuthType, pProfile->MDID.mdiePresent );
Jeff Johnson295189b2012-06-20 16:38:30 -07003264}
3265
3266#endif
3267
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003268#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07003269
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003270/* Function to return TRUE if the authtype is ESE */
3271tANI_BOOLEAN csrIsAuthTypeESE( eCsrAuthType AuthType )
Jeff Johnson295189b2012-06-20 16:38:30 -07003272{
3273 switch ( AuthType )
3274 {
3275 case eCSR_AUTH_TYPE_CCKM_WPA:
3276 case eCSR_AUTH_TYPE_CCKM_RSN:
3277 return TRUE;
3278 break;
3279 default:
3280 break;
3281 }
3282 return FALSE;
3283}
3284
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003285/* Function to return TRUE if the profile is ESE */
3286tANI_BOOLEAN csrIsProfileESE( tCsrRoamProfile *pProfile )
Jeff Johnson295189b2012-06-20 16:38:30 -07003287{
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003288 return (csrIsAuthTypeESE( pProfile->negotiatedAuthType ));
Jeff Johnson295189b2012-06-20 16:38:30 -07003289}
3290
3291#endif
3292
3293#ifdef FEATURE_WLAN_WAPI
3294tANI_BOOLEAN csrIsProfileWapi( tCsrRoamProfile *pProfile )
3295{
3296 tANI_BOOLEAN fWapiProfile = FALSE;
3297
3298 switch ( pProfile->negotiatedAuthType )
3299 {
3300 case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
3301 case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
3302 fWapiProfile = TRUE;
3303 break;
3304
3305 default:
3306 fWapiProfile = FALSE;
3307 break;
3308 }
3309
3310 if ( fWapiProfile )
3311 {
3312 switch ( pProfile->negotiatedUCEncryptionType )
3313 {
3314 case eCSR_ENCRYPT_TYPE_WPI:
3315 fWapiProfile = TRUE;
3316 break;
3317
3318 default:
3319 fWapiProfile = FALSE;
3320 break;
3321 }
3322 }
3323 return( fWapiProfile );
3324}
3325
3326static tANI_BOOLEAN csrIsWapiOuiEqual( tpAniSirGlobal pMac, tANI_U8 *Oui1, tANI_U8 *Oui2 )
3327{
Kiet Lam64c1b492013-07-12 13:56:44 +05303328 return (vos_mem_compare(Oui1, Oui2, CSR_WAPI_OUI_SIZE));
Jeff Johnson295189b2012-06-20 16:38:30 -07003329}
3330
3331static tANI_BOOLEAN csrIsWapiOuiMatch( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WAPI_OUI_SIZE],
3332 tANI_U8 cAllCyphers,
3333 tANI_U8 Cypher[],
3334 tANI_U8 Oui[] )
3335{
3336 tANI_BOOLEAN fYes = FALSE;
3337 tANI_U8 idx;
3338
3339 for ( idx = 0; idx < cAllCyphers; idx++ )
3340 {
3341 if ( csrIsWapiOuiEqual( pMac, AllCyphers[ idx ], Cypher ) )
3342 {
3343 fYes = TRUE;
3344 break;
3345 }
3346 }
3347
3348 if ( fYes && Oui )
3349 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303350 vos_mem_copy(Oui, AllCyphers[ idx ], CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003351 }
3352
3353 return( fYes );
3354}
3355#endif /* FEATURE_WLAN_WAPI */
3356
3357static tANI_BOOLEAN csrIsWpaOuiEqual( tpAniSirGlobal pMac, tANI_U8 *Oui1, tANI_U8 *Oui2 )
3358{
Kiet Lam64c1b492013-07-12 13:56:44 +05303359 return(vos_mem_compare(Oui1, Oui2, CSR_WPA_OUI_SIZE));
Jeff Johnson295189b2012-06-20 16:38:30 -07003360}
3361
3362static tANI_BOOLEAN csrIsOuiMatch( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3363 tANI_U8 cAllCyphers,
3364 tANI_U8 Cypher[],
3365 tANI_U8 Oui[] )
3366{
3367 tANI_BOOLEAN fYes = FALSE;
3368 tANI_U8 idx;
3369
3370 for ( idx = 0; idx < cAllCyphers; idx++ )
3371 {
3372 if ( csrIsWpaOuiEqual( pMac, AllCyphers[ idx ], Cypher ) )
3373 {
3374 fYes = TRUE;
3375 break;
3376 }
3377 }
3378
3379 if ( fYes && Oui )
3380 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303381 vos_mem_copy(Oui, AllCyphers[ idx ], CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003382 }
3383
3384 return( fYes );
3385}
3386
3387static tANI_BOOLEAN csrMatchRSNOUIIndex( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3388 tANI_U8 cAllCyphers, tANI_U8 ouiIndex,
3389 tANI_U8 Oui[] )
3390{
3391 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui[ouiIndex], Oui ) );
3392
3393}
3394
3395#ifdef FEATURE_WLAN_WAPI
3396static tANI_BOOLEAN csrMatchWapiOUIIndex( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WAPI_OUI_SIZE],
3397 tANI_U8 cAllCyphers, tANI_U8 ouiIndex,
3398 tANI_U8 Oui[] )
3399{
Kaushik, Sushantfe230152014-04-08 14:37:47 +05303400 if (ouiIndex < CSR_WAPI_OUI_ROW_SIZE)// since csrWapiOui row size is 3 .
3401 return( csrIsWapiOuiMatch( pMac, AllCyphers, cAllCyphers,
3402 csrWapiOui[ouiIndex], Oui ) );
3403 else
3404 return FALSE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003405
3406}
3407#endif /* FEATURE_WLAN_WAPI */
3408
3409static tANI_BOOLEAN csrMatchWPAOUIIndex( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3410 tANI_U8 cAllCyphers, tANI_U8 ouiIndex,
3411 tANI_U8 Oui[] )
3412{
3413 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui[ouiIndex], Oui ) );
3414
3415}
3416
3417#if 0
3418static tANI_BOOLEAN csrIsRSNUnicastNone( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3419 tANI_U8 cAllCyphers,
3420 tANI_U8 Oui[] )
3421{
3422 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui00, Oui ) );
3423}
3424
3425static tANI_BOOLEAN csrIsRSNMulticastWep( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3426 tANI_U8 cAllCyphers,
3427 tANI_U8 Oui[] )
3428{
3429 tANI_BOOLEAN fYes = FALSE;
3430
3431 // Check Wep 104 first, if fails, then check Wep40.
3432 fYes = csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui05, Oui );
3433
3434 if ( !fYes )
3435 {
3436 // if not Wep-104, check Wep-40
3437 fYes = csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui01, Oui );
3438 }
3439
3440 return( fYes );
3441}
3442
3443
3444static tANI_BOOLEAN csrIsRSNUnicastTkip( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3445 tANI_U8 cAllCyphers,
3446 tANI_U8 Oui[] )
3447{
3448 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui02, Oui ) );
3449}
3450
3451
3452static tANI_BOOLEAN csrIsRSNMulticastTkip( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3453 tANI_U8 cAllCyphers,
3454 tANI_U8 Oui[] )
3455{
3456 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui02, Oui ) );
3457}
3458
3459static tANI_BOOLEAN csrIsRSNUnicastAes( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3460 tANI_U8 cAllCyphers,
3461 tANI_U8 Oui[] )
3462{
3463 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui04, Oui ) );
3464}
3465
3466static tANI_BOOLEAN csrIsRSNMulticastAes( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_RSN_OUI_SIZE],
3467 tANI_U8 cAllCyphers,
3468 tANI_U8 Oui[] )
3469{
3470 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrRSNOui04, Oui ) );
3471}
3472#endif
3473#ifdef FEATURE_WLAN_WAPI
3474static tANI_BOOLEAN csrIsAuthWapiCert( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WAPI_OUI_SIZE],
3475 tANI_U8 cAllSuites,
3476 tANI_U8 Oui[] )
3477{
3478 return( csrIsWapiOuiMatch( pMac, AllSuites, cAllSuites, csrWapiOui[1], Oui ) );
3479}
3480static tANI_BOOLEAN csrIsAuthWapiPsk( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WAPI_OUI_SIZE],
3481 tANI_U8 cAllSuites,
3482 tANI_U8 Oui[] )
3483{
3484 return( csrIsWapiOuiMatch( pMac, AllSuites, cAllSuites, csrWapiOui[2], Oui ) );
3485}
3486#endif /* FEATURE_WLAN_WAPI */
3487
3488#ifdef WLAN_FEATURE_VOWIFI_11R
3489
3490/*
3491 * Function for 11R FT Authentication. We match the FT Authentication Cipher suite
3492 * here. This matches for FT Auth with the 802.1X exchange.
3493 *
3494 */
3495static tANI_BOOLEAN csrIsFTAuthRSN( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3496 tANI_U8 cAllSuites,
3497 tANI_U8 Oui[] )
3498{
3499 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[03], Oui ) );
3500}
3501
3502/*
3503 * Function for 11R FT Authentication. We match the FT Authentication Cipher suite
3504 * here. This matches for FT Auth with the PSK.
3505 *
3506 */
3507static tANI_BOOLEAN csrIsFTAuthRSNPsk( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3508 tANI_U8 cAllSuites,
3509 tANI_U8 Oui[] )
3510{
3511 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[04], Oui ) );
3512}
3513
3514#endif
3515
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003516#ifdef FEATURE_WLAN_ESE
Jeff Johnson295189b2012-06-20 16:38:30 -07003517
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003518/*
3519 * Function for ESE CCKM AKM Authentication. We match the CCKM AKM Authentication Key Management suite
Jeff Johnson295189b2012-06-20 16:38:30 -07003520 * here. This matches for CCKM AKM Auth with the 802.1X exchange.
3521 *
3522 */
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003523static tANI_BOOLEAN csrIsEseCckmAuthRSN( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
Jeff Johnson295189b2012-06-20 16:38:30 -07003524 tANI_U8 cAllSuites,
3525 tANI_U8 Oui[] )
3526{
3527 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[06], Oui ) );
3528}
3529
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003530static tANI_BOOLEAN csrIsEseCckmAuthWpa( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
Jeff Johnson295189b2012-06-20 16:38:30 -07003531 tANI_U8 cAllSuites,
3532 tANI_U8 Oui[] )
3533{
3534 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrWpaOui[06], Oui ) );
3535}
3536
3537#endif
3538
3539static tANI_BOOLEAN csrIsAuthRSN( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3540 tANI_U8 cAllSuites,
3541 tANI_U8 Oui[] )
3542{
Jeff Johnson295189b2012-06-20 16:38:30 -07003543 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[01], Oui ) );
Jeff Johnson295189b2012-06-20 16:38:30 -07003544}
3545static tANI_BOOLEAN csrIsAuthRSNPsk( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3546 tANI_U8 cAllSuites,
3547 tANI_U8 Oui[] )
3548{
Jeff Johnson295189b2012-06-20 16:38:30 -07003549 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[02], Oui ) );
Jeff Johnson295189b2012-06-20 16:38:30 -07003550}
3551
Chet Lanctot186b5732013-03-18 10:26:30 -07003552#ifdef WLAN_FEATURE_11W
3553static tANI_BOOLEAN csrIsAuthRSNPskSha256( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3554 tANI_U8 cAllSuites,
3555 tANI_U8 Oui[] )
3556{
Chet Lanctot4c986162013-05-08 13:59:56 -07003557 return csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[07], Oui );
Chet Lanctot186b5732013-03-18 10:26:30 -07003558}
Abhishek Singhae408032014-09-25 17:22:04 +05303559static tANI_BOOLEAN csrIsAuthRSN8021xSha256(tpAniSirGlobal pMac,
3560 tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
3561 tANI_U8 cAllSuites,
3562 tANI_U8 Oui[] )
3563{
3564 return csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[8], Oui );
3565}
Chet Lanctot186b5732013-03-18 10:26:30 -07003566#endif
3567
Jeff Johnson295189b2012-06-20 16:38:30 -07003568static tANI_BOOLEAN csrIsAuthWpa( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
3569 tANI_U8 cAllSuites,
3570 tANI_U8 Oui[] )
3571{
3572 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrWpaOui[01], Oui ) );
3573}
3574
3575#ifdef NOT_CURRENTLY_USED
3576static tANI_BOOLEAN csrIsAuth802_1x( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
3577 tANI_U8 cAllSuites,
3578 tANI_U8 Oui[] )
3579{
3580 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrWpaOui[00], Oui ) );
3581}
3582#endif // NOT_CURRENTLY_USED
3583
3584static tANI_BOOLEAN csrIsAuthWpaPsk( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
3585 tANI_U8 cAllSuites,
3586 tANI_U8 Oui[] )
3587{
3588 return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrWpaOui[02], Oui ) );
3589}
3590#if 0
3591static tANI_BOOLEAN csrIsUnicastNone( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3592 tANI_U8 cAllCyphers,
3593 tANI_U8 Oui[] )
3594{
3595 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui00, Oui ) );
3596}
3597
3598static tANI_BOOLEAN csrIsUnicastTkip( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3599 tANI_U8 cAllCyphers,
3600 tANI_U8 Oui[] )
3601{
3602 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui02, Oui ) );
3603}
3604
3605static tANI_BOOLEAN csrIsUnicastAes( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3606 tANI_U8 cAllCyphers,
3607 tANI_U8 Oui[] )
3608{
3609 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui04, Oui ) );
3610}
3611
3612
3613static tANI_BOOLEAN csrIsMulticastWep( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3614 tANI_U8 cAllCyphers,
3615 tANI_U8 Oui[] )
3616{
3617 tANI_BOOLEAN fYes = FALSE;
3618
3619 // Check Wep 104 first, if fails, then check Wep40.
3620 fYes = csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui05, Oui );
3621
3622 if ( !fYes )
3623 {
3624 // if not Wep-104, check Wep-40
3625 fYes = csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui01, Oui );
3626 }
3627
3628 return( fYes );
3629}
3630
3631
3632static tANI_BOOLEAN csrIsMulticastTkip( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3633 tANI_U8 cAllCyphers,
3634 tANI_U8 Oui[] )
3635{
3636 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui02, Oui ) );
3637}
3638
3639
3640static tANI_BOOLEAN csrIsMulticastAes( tpAniSirGlobal pMac, tANI_U8 AllCyphers[][CSR_WPA_OUI_SIZE],
3641 tANI_U8 cAllCyphers,
3642 tANI_U8 Oui[] )
3643{
3644 return( csrIsOuiMatch( pMac, AllCyphers, cAllCyphers, csrWpaOui04, Oui ) );
3645}
3646
3647#endif
3648
3649tANI_U8 csrGetOUIIndexFromCipher( eCsrEncryptionType enType )
3650{
3651 tANI_U8 OUIIndex;
3652
3653 switch ( enType )
3654 {
3655 case eCSR_ENCRYPT_TYPE_WEP40:
3656 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
3657 OUIIndex = CSR_OUI_WEP40_OR_1X_INDEX;
3658 break;
3659 case eCSR_ENCRYPT_TYPE_WEP104:
3660 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
3661 OUIIndex = CSR_OUI_WEP104_INDEX;
3662 break;
3663 case eCSR_ENCRYPT_TYPE_TKIP:
3664 OUIIndex = CSR_OUI_TKIP_OR_PSK_INDEX;
3665 break;
3666 case eCSR_ENCRYPT_TYPE_AES:
3667 OUIIndex = CSR_OUI_AES_INDEX;
3668 break;
3669 case eCSR_ENCRYPT_TYPE_NONE:
3670 OUIIndex = CSR_OUI_USE_GROUP_CIPHER_INDEX;
3671 break;
3672#ifdef FEATURE_WLAN_WAPI
3673 case eCSR_ENCRYPT_TYPE_WPI:
3674 OUIIndex = CSR_OUI_WAPI_WAI_CERT_OR_SMS4_INDEX;
3675 break;
3676#endif /* FEATURE_WLAN_WAPI */
3677 default: //HOWTO handle this?
3678 OUIIndex = CSR_OUI_RESERVED_INDEX;
3679 break;
3680 }//switch
3681
3682 return OUIIndex;
3683}
3684
3685tANI_BOOLEAN csrGetRSNInformation( tHalHandle hHal, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pMCEncryption,
3686 tDot11fIERSN *pRSNIe,
3687 tANI_U8 *UnicastCypher,
3688 tANI_U8 *MulticastCypher,
3689 tANI_U8 *AuthSuite,
3690 tCsrRSNCapabilities *Capabilities,
3691 eCsrAuthType *pNegotiatedAuthtype,
3692 eCsrEncryptionType *pNegotiatedMCCipher )
3693{
3694 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
3695 tANI_BOOLEAN fAcceptableCyphers = FALSE;
3696 tANI_U8 cUnicastCyphers = 0;
3697 tANI_U8 cMulticastCyphers = 0;
3698 tANI_U8 cAuthSuites = 0, i;
3699 tANI_U8 Unicast[ CSR_RSN_OUI_SIZE ];
3700 tANI_U8 Multicast[ CSR_RSN_OUI_SIZE ];
3701 tANI_U8 AuthSuites[ CSR_RSN_MAX_AUTH_SUITES ][ CSR_RSN_OUI_SIZE ];
3702 tANI_U8 Authentication[ CSR_RSN_OUI_SIZE ];
3703 tANI_U8 MulticastCyphers[ CSR_RSN_MAX_MULTICAST_CYPHERS ][ CSR_RSN_OUI_SIZE ];
3704 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
3705
3706 do{
3707 if ( pRSNIe->present )
3708 {
3709 cMulticastCyphers++;
Kiet Lam64c1b492013-07-12 13:56:44 +05303710 vos_mem_copy(MulticastCyphers, pRSNIe->gp_cipher_suite, CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003711 cUnicastCyphers = (tANI_U8)(pRSNIe->pwise_cipher_suite_count);
3712 cAuthSuites = (tANI_U8)(pRSNIe->akm_suite_count);
3713 for(i = 0; i < cAuthSuites && i < CSR_RSN_MAX_AUTH_SUITES; i++)
3714 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303715 vos_mem_copy((void *)&AuthSuites[i],
3716 (void *)&pRSNIe->akm_suites[i],
3717 CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003718 }
3719
3720 //Check - Is requested Unicast Cipher supported by the BSS.
3721 fAcceptableCyphers = csrMatchRSNOUIIndex( pMac, pRSNIe->pwise_cipher_suites, cUnicastCyphers,
3722 csrGetOUIIndexFromCipher( enType ), Unicast );
3723
3724 if( !fAcceptableCyphers ) break;
3725
3726
3727 //Unicast is supported. Pick the first matching Group cipher, if any.
3728 for( i = 0 ; i < pMCEncryption->numEntries ; i++ )
3729 {
3730 fAcceptableCyphers = csrMatchRSNOUIIndex( pMac, MulticastCyphers, cMulticastCyphers,
3731 csrGetOUIIndexFromCipher( pMCEncryption->encryptionType[i] ), Multicast );
3732 if(fAcceptableCyphers)
3733 {
3734 break;
3735 }
3736 }
3737 if( !fAcceptableCyphers ) break;
3738
3739 if( pNegotiatedMCCipher )
3740 *pNegotiatedMCCipher = pMCEncryption->encryptionType[i];
3741
3742 /* Initializing with FALSE as it has TRUE value already */
3743 fAcceptableCyphers = FALSE;
3744 for (i = 0 ; i < pAuthType->numEntries; i++)
3745 {
3746 //Ciphers are supported, Match authentication algorithm and pick first matching authtype.
3747 #ifdef WLAN_FEATURE_VOWIFI_11R
3748 /* Changed the AKM suites according to order of preference */
3749 if ( csrIsFTAuthRSN( pMac, AuthSuites, cAuthSuites, Authentication ) )
3750 {
3751 if (eCSR_AUTH_TYPE_FT_RSN == pAuthType->authType[i])
3752 negAuthType = eCSR_AUTH_TYPE_FT_RSN;
3753 }
3754 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsFTAuthRSNPsk( pMac, AuthSuites, cAuthSuites, Authentication ) )
3755 {
3756 if (eCSR_AUTH_TYPE_FT_RSN_PSK == pAuthType->authType[i])
3757 negAuthType = eCSR_AUTH_TYPE_FT_RSN_PSK;
3758 }
3759#endif
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08003760#ifdef FEATURE_WLAN_ESE
3761 /* ESE only supports 802.1X. No PSK. */
3762 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsEseCckmAuthRSN( pMac, AuthSuites, cAuthSuites, Authentication ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07003763 {
3764 if (eCSR_AUTH_TYPE_CCKM_RSN == pAuthType->authType[i])
3765 negAuthType = eCSR_AUTH_TYPE_CCKM_RSN;
3766 }
3767#endif
3768 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthRSN( pMac, AuthSuites, cAuthSuites, Authentication ) )
3769 {
3770 if (eCSR_AUTH_TYPE_RSN == pAuthType->authType[i])
3771 negAuthType = eCSR_AUTH_TYPE_RSN;
3772 }
3773 if ((negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthRSNPsk( pMac, AuthSuites, cAuthSuites, Authentication ) )
3774 {
3775 if (eCSR_AUTH_TYPE_RSN_PSK == pAuthType->authType[i])
3776 negAuthType = eCSR_AUTH_TYPE_RSN_PSK;
3777 }
Chet Lanctot186b5732013-03-18 10:26:30 -07003778#ifdef WLAN_FEATURE_11W
3779 if ((negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthRSNPskSha256( pMac, AuthSuites, cAuthSuites, Authentication ) )
3780 {
3781 if (eCSR_AUTH_TYPE_RSN_PSK_SHA256 == pAuthType->authType[i])
3782 negAuthType = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
3783 }
Abhishek Singhae408032014-09-25 17:22:04 +05303784 if ((negAuthType == eCSR_AUTH_TYPE_UNKNOWN) &&
3785 csrIsAuthRSN8021xSha256(pMac, AuthSuites,
3786 cAuthSuites, Authentication)) {
3787 if (eCSR_AUTH_TYPE_RSN_8021X_SHA256 ==
3788 pAuthType->authType[i])
3789 negAuthType = eCSR_AUTH_TYPE_RSN_8021X_SHA256;
3790 }
Chet Lanctot186b5732013-03-18 10:26:30 -07003791#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003792
3793 // The 1st auth type in the APs RSN IE, to match stations connecting
3794 // profiles auth type will cause us to exit this loop
3795 // This is added as some APs advertise multiple akms in the RSN IE.
3796 if (eCSR_AUTH_TYPE_UNKNOWN != negAuthType)
3797 {
3798 fAcceptableCyphers = TRUE;
3799 break;
3800 }
3801 } // for
3802 }
3803
3804 }while (0);
3805
3806 if ( fAcceptableCyphers )
3807 {
3808 if ( MulticastCypher )
3809 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303810 vos_mem_copy(MulticastCypher, Multicast, CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003811 }
3812
3813 if ( UnicastCypher )
3814 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303815 vos_mem_copy(UnicastCypher, Unicast, CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003816 }
3817
3818 if ( AuthSuite )
3819 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303820 vos_mem_copy(AuthSuite, Authentication, CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003821 }
3822
3823 if ( pNegotiatedAuthtype )
3824 {
3825 *pNegotiatedAuthtype = negAuthType;
3826 }
3827 if ( Capabilities )
3828 {
Venkata Prathyusha Kuntupalliea7098e2013-01-31 16:08:13 -08003829 Capabilities->PreAuthSupported = (pRSNIe->RSN_Cap[0] >> 0) & 0x1 ; // Bit 0 PreAuthentication
3830 Capabilities->NoPairwise = (pRSNIe->RSN_Cap[0] >> 1) & 0x1 ; // Bit 1 No Pairwise
3831 Capabilities->PTKSAReplayCounter = (pRSNIe->RSN_Cap[0] >> 2) & 0x3 ; // Bit 2, 3 PTKSA Replay Counter
Chet Lanctot186b5732013-03-18 10:26:30 -07003832 Capabilities->GTKSAReplayCounter = (pRSNIe->RSN_Cap[0] >> 4) & 0x3 ; // Bit 4, 5 GTKSA Replay Counter
Abhishek Singhf53e89d2015-06-18 12:30:00 +05303833#ifdef WLAN_FEATURE_11W
Chet Lanctot186b5732013-03-18 10:26:30 -07003834 Capabilities->MFPRequired = (pRSNIe->RSN_Cap[0] >> 6) & 0x1 ; // Bit 6 MFPR
3835 Capabilities->MFPCapable = (pRSNIe->RSN_Cap[0] >> 7) & 0x1 ; // Bit 7 MFPC
Abhishek Singhf53e89d2015-06-18 12:30:00 +05303836#else
3837 Capabilities->MFPRequired = 0 ; // Bit 6 MFPR
3838 Capabilities->MFPCapable = 0 ; // Bit 7 MFPC
3839#endif
3840
Chet Lanctot186b5732013-03-18 10:26:30 -07003841 Capabilities->Reserved = pRSNIe->RSN_Cap[1] & 0xff ; // remaining reserved
Jeff Johnson295189b2012-06-20 16:38:30 -07003842 }
3843 }
3844 return( fAcceptableCyphers );
3845}
3846
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05303847#ifdef WLAN_FEATURE_11W
3848/* ---------------------------------------------------------------------------
3849 \fn csrIsPMFCapabilitiesInRSNMatch
Jeff Johnson295189b2012-06-20 16:38:30 -07003850
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05303851 \brief this function is to match our current capabilities with the AP
3852 to which we are expecting make the connection.
3853
3854 \param hHal - HAL Pointer
3855 pFilterMFPEnabled - given by supplicant to us to specify what kind
3856 of connection supplicant is expecting to make
3857 if it is enabled then make PMF connection.
3858 if it is disabled then make normal connection.
3859 pFilterMFPRequired - given by supplicant based on our configuration
3860 if it is 1 then we will require mandatory
3861 PMF connection and if it is 0 then we PMF
3862 connection is optional.
3863 pFilterMFPCapable - given by supplicant based on our configuration
3864 if it 1 then we are PMF capable and if it 0
3865 then we are not PMF capable.
3866 pRSNIe - RSNIe from Beacon/probe response of
3867 neighbor AP against which we will compare
3868 our capabilities.
3869
3870 \return tANI_BOOLEAN - if our PMF capabilities matches with AP then we
3871 will return true to indicate that we are good
3872 to make connection with it. Else we will return
3873 false.
3874 -------------------------------------------------------------------------------*/
3875static tANI_BOOLEAN
3876csrIsPMFCapabilitiesInRSNMatch( tHalHandle hHal,
3877 tANI_BOOLEAN *pFilterMFPEnabled,
3878 tANI_U8 *pFilterMFPRequired,
3879 tANI_U8 *pFilterMFPCapable,
3880 tDot11fIERSN *pRSNIe)
3881{
3882 tANI_U8 apProfileMFPCapable = 0;
3883 tANI_U8 apProfileMFPRequired = 0;
3884 if (pRSNIe && pFilterMFPEnabled && pFilterMFPCapable && pFilterMFPRequired)
3885 {
3886 /* Extracting MFPCapable bit from RSN Ie */
3887 apProfileMFPCapable = (pRSNIe->RSN_Cap[0] >> 7) & 0x1;
3888 apProfileMFPRequired = (pRSNIe->RSN_Cap[0] >> 6) & 0x1;
3889 if (*pFilterMFPEnabled && *pFilterMFPCapable && *pFilterMFPRequired
3890 && (apProfileMFPCapable == 0))
3891 {
3892 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3893 "AP is not capable to make PMF connection");
3894 return VOS_FALSE;
3895 }
3896 else if (*pFilterMFPEnabled && *pFilterMFPCapable &&
3897 !(*pFilterMFPRequired) && (apProfileMFPCapable == 0))
3898 {
3899 /*
3900 * This is tricky, because supplicant asked us to make mandatory
3901 * PMF connection eventhough PMF connection is optional here.
3902 * so if AP is not capable of PMF then drop it. Don't try to
3903 * connect with it.
3904 */
3905 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3906 "we need PMF connection & AP isn't capable to make PMF connection");
3907 return VOS_FALSE;
3908 }
3909 else if (!(*pFilterMFPCapable) &&
3910 apProfileMFPCapable && apProfileMFPRequired)
3911 {
3912 /*
3913 * In this case, AP with whom we trying to connect requires
3914 * mandatory PMF connections and we are not capable so this AP
3915 * is not good choice to connect
3916 */
3917 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3918 "AP needs PMF connection and we are not capable of pmf connection");
3919 return VOS_FALSE;
3920 }
3921 else if (!(*pFilterMFPEnabled) && *pFilterMFPCapable &&
3922 (apProfileMFPCapable == 1))
3923 {
3924 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3925 "we don't need PMF connection eventhough both parties are capable");
3926 return VOS_FALSE;
3927 }
3928 }
3929 return VOS_TRUE;
3930}
3931#endif
3932
3933tANI_BOOLEAN csrIsRSNMatch( tHalHandle hHal, tCsrAuthList *pAuthType,
3934 eCsrEncryptionType enType,
3935 tCsrEncryptionList *pEnMcType,
3936 tANI_BOOLEAN *pMFPEnabled, tANI_U8 *pMFPRequired,
3937 tANI_U8 *pMFPCapable,
3938 tDot11fBeaconIEs *pIes,
3939 eCsrAuthType *pNegotiatedAuthType,
3940 eCsrEncryptionType *pNegotiatedMCCipher )
Jeff Johnson295189b2012-06-20 16:38:30 -07003941{
3942 tANI_BOOLEAN fRSNMatch = FALSE;
3943
3944 // See if the cyphers in the Bss description match with the settings in the profile.
3945 fRSNMatch = csrGetRSNInformation( hHal, pAuthType, enType, pEnMcType, &pIes->RSN, NULL, NULL, NULL, NULL,
3946 pNegotiatedAuthType, pNegotiatedMCCipher );
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05303947#ifdef WLAN_FEATURE_11W
3948 /* If all the filter matches then finally checks for PMF capabilities */
3949 if (fRSNMatch)
3950 {
3951 fRSNMatch = csrIsPMFCapabilitiesInRSNMatch( hHal, pMFPEnabled,
3952 pMFPRequired, pMFPCapable,
3953 &pIes->RSN);
3954 }
3955#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003956
3957 return( fRSNMatch );
3958}
3959
3960
3961tANI_BOOLEAN csrLookupPMKID( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U8 *pBSSId, tANI_U8 *pPMKId )
3962{
3963 tANI_BOOLEAN fRC = FALSE, fMatchFound = FALSE;
3964 tANI_U32 Index;
3965 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
3966
Jeff Johnson32d95a32012-09-10 13:15:23 -07003967 if(!pSession)
3968 {
3969 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3970 return FALSE;
3971 }
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07003972 /* to force the AP initiate fresh 802.1x authentication after re-association should not
3973 * fill the PMKID from cache this is needed
3974 * by the HS 2.0 passpoint certification 5.2.a and b testcases */
3975
3976 if(pSession->fIgnorePMKIDCache)
3977 {
3978 pSession->fIgnorePMKIDCache = FALSE;
3979 return fRC;
3980 }
3981
Jeff Johnson295189b2012-06-20 16:38:30 -07003982 do
3983 {
Kanchanapally, Vidyullatha2633ace2014-09-25 15:16:50 +05303984 for( Index=0; Index < CSR_MAX_PMKID_ALLOWED; Index++ )
Jeff Johnson295189b2012-06-20 16:38:30 -07003985 {
Kiet Lam64c1b492013-07-12 13:56:44 +05303986 if( vos_mem_compare(pBSSId, pSession->PmkidCacheInfo[Index].BSSID, sizeof(tCsrBssid)) )
Jeff Johnson295189b2012-06-20 16:38:30 -07003987 {
3988 // match found
3989 fMatchFound = TRUE;
3990 break;
3991 }
3992 }
3993
3994 if( !fMatchFound ) break;
3995
Kiet Lam64c1b492013-07-12 13:56:44 +05303996 vos_mem_copy(pPMKId, pSession->PmkidCacheInfo[Index].PMKID, CSR_RSN_PMKID_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003997
3998 fRC = TRUE;
3999 }
4000 while( 0 );
Sushant Kaushik0b343422015-05-25 17:15:55 +05304001 smsLog(pMac, LOG1, "csrLookupPMKID called return match = %d pMac->roam.NumPmkidCache = %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004002 fRC, pSession->NumPmkidCache);
4003
4004 return fRC;
4005}
4006
4007
4008tANI_U8 csrConstructRSNIe( tHalHandle hHal, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
4009 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes, tCsrRSNIe *pRSNIe )
4010{
4011 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4012 tANI_BOOLEAN fRSNMatch;
4013 tANI_U8 cbRSNIe = 0;
4014 tANI_U8 UnicastCypher[ CSR_RSN_OUI_SIZE ];
4015 tANI_U8 MulticastCypher[ CSR_RSN_OUI_SIZE ];
4016 tANI_U8 AuthSuite[ CSR_RSN_OUI_SIZE ];
4017 tCsrRSNAuthIe *pAuthSuite;
4018 tCsrRSNCapabilities RSNCapabilities;
4019 tCsrRSNPMKIe *pPMK;
4020 tANI_U8 PMKId[CSR_RSN_PMKID_SIZE];
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004021#ifdef WLAN_FEATURE_11W
4022 tANI_U8 *pGroupMgmtCipherSuite;
4023#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004024 tDot11fBeaconIEs *pIesLocal = pIes;
Sachin Ahuja4f06a792014-12-04 18:14:32 +05304025 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
Jeff Johnson295189b2012-06-20 16:38:30 -07004026
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004027 smsLog(pMac, LOGW, "%s called...", __func__);
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004028
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 do
4030 {
4031 if ( !csrIsProfileRSN( pProfile ) ) break;
4032
4033 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4034 {
4035 break;
4036 }
4037
4038 // See if the cyphers in the Bss description match with the settings in the profile.
4039 fRSNMatch = csrGetRSNInformation( hHal, &pProfile->AuthType, pProfile->negotiatedUCEncryptionType,
4040 &pProfile->mcEncryptionType, &pIesLocal->RSN,
Sachin Ahuja4f06a792014-12-04 18:14:32 +05304041 UnicastCypher, MulticastCypher, AuthSuite, &RSNCapabilities, &negAuthType, NULL );
Jeff Johnson295189b2012-06-20 16:38:30 -07004042 if ( !fRSNMatch ) break;
4043
4044 pRSNIe->IeHeader.ElementID = SIR_MAC_RSN_EID;
4045
4046 pRSNIe->Version = CSR_RSN_VERSION_SUPPORTED;
4047
Kiet Lam64c1b492013-07-12 13:56:44 +05304048 vos_mem_copy(pRSNIe->MulticastOui, MulticastCypher, sizeof( MulticastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004049
4050 pRSNIe->cUnicastCyphers = 1;
4051
Kiet Lam64c1b492013-07-12 13:56:44 +05304052 vos_mem_copy(&pRSNIe->UnicastOui[ 0 ], UnicastCypher, sizeof( UnicastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004053
4054 pAuthSuite = (tCsrRSNAuthIe *)( &pRSNIe->UnicastOui[ pRSNIe->cUnicastCyphers ] );
4055
4056 pAuthSuite->cAuthenticationSuites = 1;
Kiet Lam64c1b492013-07-12 13:56:44 +05304057 vos_mem_copy(&pAuthSuite->AuthOui[ 0 ], AuthSuite, sizeof( AuthSuite ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004058
4059 // RSN capabilities follows the Auth Suite (two octects)
4060 // !!REVIEW - What should STA put in RSN capabilities, currently
4061 // just putting back APs capabilities
4062 // 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 -07004063 // For another, we should use the Management Frame Protection values given by the supplicant
Jeff Johnson295189b2012-06-20 16:38:30 -07004064 RSNCapabilities.PreAuthSupported = 0;
Chet Lanctot186b5732013-03-18 10:26:30 -07004065#ifdef WLAN_FEATURE_11W
4066 RSNCapabilities.MFPRequired = pProfile->MFPRequired;
4067 RSNCapabilities.MFPCapable = pProfile->MFPCapable;
4068#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004069 *(tANI_U16 *)( &pAuthSuite->AuthOui[ 1 ] ) = *((tANI_U16 *)(&RSNCapabilities));
4070
4071 pPMK = (tCsrRSNPMKIe *)( ((tANI_U8 *)(&pAuthSuite->AuthOui[ 1 ])) + sizeof(tANI_U16) );
4072
Sachin Ahuja4f06a792014-12-04 18:14:32 +05304073 if (
4074#ifdef FEATURE_WLAN_ESE
4075 (eCSR_AUTH_TYPE_CCKM_RSN != negAuthType) &&
4076#endif
4077 csrLookupPMKID( pMac, sessionId, pSirBssDesc->bssId, &(PMKId[0]) ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07004078 {
4079 pPMK->cPMKIDs = 1;
4080
Kiet Lam64c1b492013-07-12 13:56:44 +05304081 vos_mem_copy(pPMK->PMKIDList[0].PMKID, PMKId, CSR_RSN_PMKID_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004082 }
4083 else
4084 {
4085 pPMK->cPMKIDs = 0;
4086 }
4087
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004088#ifdef WLAN_FEATURE_11W
4089 if ( pProfile->MFPEnabled )
4090 {
4091 pGroupMgmtCipherSuite = (tANI_U8 *) pPMK + sizeof ( tANI_U16 ) +
4092 ( pPMK->cPMKIDs * CSR_RSN_PMKID_SIZE );
Kiet Lam64c1b492013-07-12 13:56:44 +05304093 vos_mem_copy(pGroupMgmtCipherSuite, csrRSNOui[07], CSR_WPA_OUI_SIZE);
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004094 }
4095#endif
4096
Jeff Johnson295189b2012-06-20 16:38:30 -07004097 // Add in the fixed fields plus 1 Unicast cypher, less the IE Header length
4098 // Add in the size of the Auth suite (count plus a single OUI)
4099 // Add in the RSN caps field.
4100 // Add PMKID count and PMKID (if any)
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004101 // Add group management cipher suite
Jeff Johnson295189b2012-06-20 16:38:30 -07004102 pRSNIe->IeHeader.Length = (tANI_U8) (sizeof( *pRSNIe ) - sizeof ( pRSNIe->IeHeader ) +
4103 sizeof( *pAuthSuite ) +
4104 sizeof( tCsrRSNCapabilities ));
4105 if(pPMK->cPMKIDs)
4106 {
4107 pRSNIe->IeHeader.Length += (tANI_U8)(sizeof( tANI_U16 ) +
4108 (pPMK->cPMKIDs * CSR_RSN_PMKID_SIZE));
4109 }
Chet Lanctotedf3dbe2013-05-15 13:21:28 -07004110#ifdef WLAN_FEATURE_11W
4111 if ( pProfile->MFPEnabled )
4112 {
4113 if ( 0 == pPMK->cPMKIDs )
4114 pRSNIe->IeHeader.Length += sizeof( tANI_U16 );
4115 pRSNIe->IeHeader.Length += CSR_WPA_OUI_SIZE;
4116 }
4117#endif
4118
Jeff Johnson295189b2012-06-20 16:38:30 -07004119 // return the size of the IE header (total) constructed...
4120 cbRSNIe = pRSNIe->IeHeader.Length + sizeof( pRSNIe->IeHeader );
4121
4122 } while( 0 );
4123
4124 if( !pIes && pIesLocal )
4125 {
4126 //locally allocated
Kiet Lam64c1b492013-07-12 13:56:44 +05304127 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07004128 }
4129
4130 return( cbRSNIe );
4131}
4132
4133
4134#ifdef FEATURE_WLAN_WAPI
4135tANI_BOOLEAN csrGetWapiInformation( tHalHandle hHal, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pMCEncryption,
4136 tDot11fIEWAPI *pWapiIe,
4137 tANI_U8 *UnicastCypher,
4138 tANI_U8 *MulticastCypher,
4139 tANI_U8 *AuthSuite,
4140 eCsrAuthType *pNegotiatedAuthtype,
4141 eCsrEncryptionType *pNegotiatedMCCipher )
4142{
4143 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4144 tANI_BOOLEAN fAcceptableCyphers = FALSE;
4145 tANI_U8 cUnicastCyphers = 0;
4146 tANI_U8 cMulticastCyphers = 0;
4147 tANI_U8 cAuthSuites = 0, i;
4148 tANI_U8 Unicast[ CSR_WAPI_OUI_SIZE ];
4149 tANI_U8 Multicast[ CSR_WAPI_OUI_SIZE ];
4150 tANI_U8 AuthSuites[ CSR_WAPI_MAX_AUTH_SUITES ][ CSR_WAPI_OUI_SIZE ];
4151 tANI_U8 Authentication[ CSR_WAPI_OUI_SIZE ];
4152 tANI_U8 MulticastCyphers[ CSR_WAPI_MAX_MULTICAST_CYPHERS ][ CSR_WAPI_OUI_SIZE ];
4153 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
4154
4155 do{
4156 if ( pWapiIe->present )
4157 {
4158 cMulticastCyphers++;
Kiet Lam64c1b492013-07-12 13:56:44 +05304159 vos_mem_copy(MulticastCyphers, pWapiIe->multicast_cipher_suite,
4160 CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004161 cUnicastCyphers = (tANI_U8)(pWapiIe->unicast_cipher_suite_count);
4162 cAuthSuites = (tANI_U8)(pWapiIe->akm_suite_count);
4163 for(i = 0; i < cAuthSuites && i < CSR_WAPI_MAX_AUTH_SUITES; i++)
4164 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304165 vos_mem_copy((void *)&AuthSuites[i], (void *)&pWapiIe->akm_suites[i],
4166 CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004167 }
4168
4169 //Check - Is requested Unicast Cipher supported by the BSS.
4170 fAcceptableCyphers = csrMatchWapiOUIIndex( pMac, pWapiIe->unicast_cipher_suites, cUnicastCyphers,
4171 csrGetOUIIndexFromCipher( enType ), Unicast );
4172
4173 if( !fAcceptableCyphers ) break;
4174
4175
4176 //Unicast is supported. Pick the first matching Group cipher, if any.
4177 for( i = 0 ; i < pMCEncryption->numEntries ; i++ )
4178 {
4179 fAcceptableCyphers = csrMatchWapiOUIIndex( pMac, MulticastCyphers, cMulticastCyphers,
4180 csrGetOUIIndexFromCipher( pMCEncryption->encryptionType[i] ), Multicast );
4181 if(fAcceptableCyphers)
4182 {
4183 break;
4184 }
4185 }
4186 if( !fAcceptableCyphers ) break;
4187
4188 if( pNegotiatedMCCipher )
4189 *pNegotiatedMCCipher = pMCEncryption->encryptionType[i];
4190
4191 //Ciphers are supported, Match authentication algorithm and pick first matching authtype.
4192 if ( csrIsAuthWapiCert( pMac, AuthSuites, cAuthSuites, Authentication ) )
4193 {
4194 negAuthType = eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE;
4195 }
4196 else if ( csrIsAuthWapiPsk( pMac, AuthSuites, cAuthSuites, Authentication ) )
4197 {
4198 negAuthType = eCSR_AUTH_TYPE_WAPI_WAI_PSK;
4199 }
4200 else
4201 {
4202 fAcceptableCyphers = FALSE;
4203 negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
4204 }
4205 if( ( 0 == pAuthType->numEntries ) || ( FALSE == fAcceptableCyphers ) )
4206 {
4207 //Caller doesn't care about auth type, or BSS doesn't match
4208 break;
4209 }
4210 fAcceptableCyphers = FALSE;
4211 for( i = 0 ; i < pAuthType->numEntries; i++ )
4212 {
4213 if( pAuthType->authType[i] == negAuthType )
4214 {
4215 fAcceptableCyphers = TRUE;
4216 break;
4217 }
4218 }
4219 }
4220 }while (0);
4221
4222 if ( fAcceptableCyphers )
4223 {
4224 if ( MulticastCypher )
4225 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304226 vos_mem_copy(MulticastCypher, Multicast, CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004227 }
4228
4229 if ( UnicastCypher )
4230 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304231 vos_mem_copy(UnicastCypher, Unicast, CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004232 }
4233
4234 if ( AuthSuite )
4235 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304236 vos_mem_copy(AuthSuite, Authentication, CSR_WAPI_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004237 }
4238
4239 if ( pNegotiatedAuthtype )
4240 {
4241 *pNegotiatedAuthtype = negAuthType;
4242 }
4243 }
4244 return( fAcceptableCyphers );
4245}
4246
4247tANI_BOOLEAN csrIsWapiMatch( tHalHandle hHal, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pEnMcType,
4248 tDot11fBeaconIEs *pIes, eCsrAuthType *pNegotiatedAuthType, eCsrEncryptionType *pNegotiatedMCCipher )
4249{
4250 tANI_BOOLEAN fWapiMatch = FALSE;
4251
4252 // See if the cyphers in the Bss description match with the settings in the profile.
4253 fWapiMatch = csrGetWapiInformation( hHal, pAuthType, enType, pEnMcType, &pIes->WAPI, NULL, NULL, NULL,
4254 pNegotiatedAuthType, pNegotiatedMCCipher );
4255
4256 return( fWapiMatch );
4257}
4258
4259tANI_BOOLEAN csrLookupBKID( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U8 *pBSSId, tANI_U8 *pBKId )
4260{
4261 tANI_BOOLEAN fRC = FALSE, fMatchFound = FALSE;
4262 tANI_U32 Index;
4263 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4264
Jeff Johnson32d95a32012-09-10 13:15:23 -07004265 if(!pSession)
4266 {
4267 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4268 return FALSE;
4269 }
4270
Jeff Johnson295189b2012-06-20 16:38:30 -07004271 do
4272 {
4273 for( Index=0; Index < pSession->NumBkidCache; Index++ )
4274 {
Arif Hussaina7c8e412013-11-20 11:06:42 -08004275 smsLog(pMac, LOGW, "match BKID "MAC_ADDRESS_STR" to ",
4276 MAC_ADDR_ARRAY(pBSSId));
Kiet Lam64c1b492013-07-12 13:56:44 +05304277 if (vos_mem_compare(pBSSId, pSession->BkidCacheInfo[Index].BSSID, sizeof(tCsrBssid) ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07004278 {
4279 // match found
4280 fMatchFound = TRUE;
4281 break;
4282 }
4283 }
4284
4285 if( !fMatchFound ) break;
4286
Kiet Lam64c1b492013-07-12 13:56:44 +05304287 vos_mem_copy(pBKId, pSession->BkidCacheInfo[Index].BKID, CSR_WAPI_BKID_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004288
4289 fRC = TRUE;
4290 }
4291 while( 0 );
4292 smsLog(pMac, LOGW, "csrLookupBKID called return match = %d pMac->roam.NumBkidCache = %d", fRC, pSession->NumBkidCache);
4293
4294 return fRC;
4295}
4296
4297tANI_U8 csrConstructWapiIe( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
4298 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes, tCsrWapiIe *pWapiIe )
4299{
4300 tANI_BOOLEAN fWapiMatch = FALSE;
4301 tANI_U8 cbWapiIe = 0;
4302 tANI_U8 UnicastCypher[ CSR_WAPI_OUI_SIZE ];
4303 tANI_U8 MulticastCypher[ CSR_WAPI_OUI_SIZE ];
4304 tANI_U8 AuthSuite[ CSR_WAPI_OUI_SIZE ];
4305 tANI_U8 BKId[CSR_WAPI_BKID_SIZE];
4306 tANI_U8 *pWapi = NULL;
4307 tANI_BOOLEAN fBKIDFound = FALSE;
4308 tDot11fBeaconIEs *pIesLocal = pIes;
4309
4310 do
4311 {
4312 if ( !csrIsProfileWapi( pProfile ) ) break;
4313
4314 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4315 {
4316 break;
4317 }
4318
4319 // See if the cyphers in the Bss description match with the settings in the profile.
4320 fWapiMatch = csrGetWapiInformation( pMac, &pProfile->AuthType, pProfile->negotiatedUCEncryptionType,
4321 &pProfile->mcEncryptionType, &pIesLocal->WAPI,
4322 UnicastCypher, MulticastCypher, AuthSuite, NULL, NULL );
4323 if ( !fWapiMatch ) break;
4324
Kiet Lam64c1b492013-07-12 13:56:44 +05304325 vos_mem_set(pWapiIe, sizeof(tCsrWapiIe), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004326
4327 pWapiIe->IeHeader.ElementID = DOT11F_EID_WAPI;
4328
4329 pWapiIe->Version = CSR_WAPI_VERSION_SUPPORTED;
4330
4331 pWapiIe->cAuthenticationSuites = 1;
Kiet Lam64c1b492013-07-12 13:56:44 +05304332 vos_mem_copy(&pWapiIe->AuthOui[ 0 ], AuthSuite, sizeof( AuthSuite ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004333
4334 pWapi = (tANI_U8 *) (&pWapiIe->AuthOui[ 1 ]);
4335
4336 *pWapi = (tANI_U16)1; //cUnicastCyphers
4337 pWapi+=2;
Kiet Lam64c1b492013-07-12 13:56:44 +05304338 vos_mem_copy(pWapi, UnicastCypher, sizeof( UnicastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004339 pWapi += sizeof( UnicastCypher );
4340
Kiet Lam64c1b492013-07-12 13:56:44 +05304341 vos_mem_copy(pWapi, MulticastCypher, sizeof( MulticastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004342 pWapi += sizeof( MulticastCypher );
4343
4344
4345 // WAPI capabilities follows the Auth Suite (two octects)
4346 // we shouldn't EVER be sending out "pre-auth supported". It is an AP only capability
4347 // & since we already did a memset pWapiIe to 0, skip these fields
4348 pWapi +=2;
4349
4350 fBKIDFound = csrLookupBKID( pMac, sessionId, pSirBssDesc->bssId, &(BKId[0]) );
4351
4352
4353 if( fBKIDFound )
4354 {
4355 /* Do we need to change the endianness here */
4356 *pWapi = (tANI_U16)1; //cBKIDs
4357 pWapi+=2;
Kiet Lam64c1b492013-07-12 13:56:44 +05304358 vos_mem_copy(pWapi, BKId, CSR_WAPI_BKID_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004359 }
4360 else
4361 {
4362 *pWapi = 0;
4363 pWapi+=1;
4364 *pWapi = 0;
4365 pWapi+=1;
4366 }
4367
4368 // Add in the IE fields except the IE header
4369 // Add BKID count and BKID (if any)
4370 pWapiIe->IeHeader.Length = (tANI_U8) (sizeof( *pWapiIe ) - sizeof ( pWapiIe->IeHeader ));
4371
4372 /*2 bytes for BKID Count field*/
4373 pWapiIe->IeHeader.Length += sizeof( tANI_U16 );
4374
4375 if(fBKIDFound)
4376 {
4377 pWapiIe->IeHeader.Length += CSR_WAPI_BKID_SIZE;
4378 }
4379 // return the size of the IE header (total) constructed...
4380 cbWapiIe = pWapiIe->IeHeader.Length + sizeof( pWapiIe->IeHeader );
4381
4382 } while( 0 );
4383
4384 if( !pIes && pIesLocal )
4385 {
4386 //locally allocated
Kiet Lam64c1b492013-07-12 13:56:44 +05304387 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07004388 }
4389
4390 return( cbWapiIe );
4391}
4392#endif /* FEATURE_WLAN_WAPI */
4393
4394tANI_BOOLEAN csrGetWpaCyphers( tpAniSirGlobal pMac, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pMCEncryption,
4395 tDot11fIEWPA *pWpaIe,
4396 tANI_U8 *UnicastCypher,
4397 tANI_U8 *MulticastCypher,
4398 tANI_U8 *AuthSuite,
4399 eCsrAuthType *pNegotiatedAuthtype,
4400 eCsrEncryptionType *pNegotiatedMCCipher )
4401{
4402 tANI_BOOLEAN fAcceptableCyphers = FALSE;
4403 tANI_U8 cUnicastCyphers = 0;
4404 tANI_U8 cMulticastCyphers = 0;
4405 tANI_U8 cAuthSuites = 0;
4406 tANI_U8 Unicast[ CSR_WPA_OUI_SIZE ];
4407 tANI_U8 Multicast[ CSR_WPA_OUI_SIZE ];
4408 tANI_U8 Authentication[ CSR_WPA_OUI_SIZE ];
4409 tANI_U8 MulticastCyphers[ 1 ][ CSR_WPA_OUI_SIZE ];
4410 tANI_U8 i;
4411 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
4412
4413 do
4414 {
4415 if ( pWpaIe->present )
4416 {
4417 cMulticastCyphers = 1;
Kiet Lam64c1b492013-07-12 13:56:44 +05304418 vos_mem_copy(MulticastCyphers, pWpaIe->multicast_cipher, CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 cUnicastCyphers = (tANI_U8)(pWpaIe->unicast_cipher_count);
4420 cAuthSuites = (tANI_U8)(pWpaIe->auth_suite_count);
4421
4422 //Check - Is requested Unicast Cipher supported by the BSS.
4423 fAcceptableCyphers = csrMatchWPAOUIIndex( pMac, pWpaIe->unicast_ciphers, cUnicastCyphers,
4424 csrGetOUIIndexFromCipher( enType ), Unicast );
4425
4426 if( !fAcceptableCyphers ) break;
4427
4428
4429 //Unicast is supported. Pick the first matching Group cipher, if any.
4430 for( i = 0 ; i < pMCEncryption->numEntries ; i++ )
4431 {
4432 fAcceptableCyphers = csrMatchWPAOUIIndex( pMac, MulticastCyphers, cMulticastCyphers,
4433 csrGetOUIIndexFromCipher( pMCEncryption->encryptionType[i]), Multicast );
4434 if(fAcceptableCyphers)
4435 {
4436 break;
4437 }
4438 }
4439 if( !fAcceptableCyphers ) break;
4440
4441 if( pNegotiatedMCCipher )
4442 *pNegotiatedMCCipher = pMCEncryption->encryptionType[i];
4443
4444 /* Initializing with FALSE as it has TRUE value already */
4445 fAcceptableCyphers = FALSE;
4446 for (i = 0 ; i < pAuthType->numEntries; i++)
4447 {
4448 //Ciphers are supported, Match authentication algorithm and pick first matching authtype.
4449 if ( csrIsAuthWpa( pMac, pWpaIe->auth_suites, cAuthSuites, Authentication ) )
4450 {
4451 if (eCSR_AUTH_TYPE_WPA == pAuthType->authType[i])
4452 negAuthType = eCSR_AUTH_TYPE_WPA;
4453 }
4454 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthWpaPsk( pMac, pWpaIe->auth_suites, cAuthSuites, Authentication ) )
4455 {
4456 if (eCSR_AUTH_TYPE_WPA_PSK == pAuthType->authType[i])
4457 negAuthType = eCSR_AUTH_TYPE_WPA_PSK;
4458 }
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004459#ifdef FEATURE_WLAN_ESE
4460 if ( (negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsEseCckmAuthWpa( pMac, pWpaIe->auth_suites, cAuthSuites, Authentication ) )
Jeff Johnson295189b2012-06-20 16:38:30 -07004461 {
4462 if (eCSR_AUTH_TYPE_CCKM_WPA == pAuthType->authType[i])
4463 negAuthType = eCSR_AUTH_TYPE_CCKM_WPA;
4464 }
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004465#endif /* FEATURE_WLAN_ESE */
Jeff Johnson295189b2012-06-20 16:38:30 -07004466
4467 // The 1st auth type in the APs WPA IE, to match stations connecting
4468 // profiles auth type will cause us to exit this loop
4469 // This is added as some APs advertise multiple akms in the WPA IE.
4470 if (eCSR_AUTH_TYPE_UNKNOWN != negAuthType)
4471 {
4472 fAcceptableCyphers = TRUE;
4473 break;
4474 }
4475 } // for
4476 }
4477 }while(0);
4478
4479 if ( fAcceptableCyphers )
4480 {
4481 if ( MulticastCypher )
4482 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304483 vos_mem_copy((tANI_U8 **)MulticastCypher, Multicast, CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004484 }
4485
4486 if ( UnicastCypher )
4487 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304488 vos_mem_copy((tANI_U8 **)UnicastCypher, Unicast, CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004489 }
4490
4491 if ( AuthSuite )
4492 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304493 vos_mem_copy((tANI_U8 **)AuthSuite, Authentication, CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004494 }
4495
4496 if( pNegotiatedAuthtype )
4497 {
4498 *pNegotiatedAuthtype = negAuthType;
4499 }
4500 }
4501
4502 return( fAcceptableCyphers );
4503}
4504
4505
4506
4507tANI_BOOLEAN csrIsWpaEncryptionMatch( tpAniSirGlobal pMac, tCsrAuthList *pAuthType, eCsrEncryptionType enType, tCsrEncryptionList *pEnMcType,
4508 tDot11fBeaconIEs *pIes, eCsrAuthType *pNegotiatedAuthtype, eCsrEncryptionType *pNegotiatedMCCipher )
4509{
4510 tANI_BOOLEAN fWpaMatch = eANI_BOOLEAN_FALSE;
4511
4512 // See if the cyphers in the Bss description match with the settings in the profile.
4513 fWpaMatch = csrGetWpaCyphers( pMac, pAuthType, enType, pEnMcType, &pIes->WPA, NULL, NULL, NULL, pNegotiatedAuthtype, pNegotiatedMCCipher );
4514
4515 return( fWpaMatch );
4516}
4517
4518
4519tANI_U8 csrConstructWpaIe( tHalHandle hHal, tCsrRoamProfile *pProfile, tSirBssDescription *pSirBssDesc,
4520 tDot11fBeaconIEs *pIes, tCsrWpaIe *pWpaIe )
4521{
4522 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4523 tANI_BOOLEAN fWpaMatch;
4524 tANI_U8 cbWpaIe = 0;
4525 tANI_U8 UnicastCypher[ CSR_WPA_OUI_SIZE ];
4526 tANI_U8 MulticastCypher[ CSR_WPA_OUI_SIZE ];
4527 tANI_U8 AuthSuite[ CSR_WPA_OUI_SIZE ];
4528 tCsrWpaAuthIe *pAuthSuite;
4529 tDot11fBeaconIEs *pIesLocal = pIes;
4530
4531 do
4532 {
4533 if ( !csrIsProfileWpa( pProfile ) ) break;
4534
4535 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4536 {
4537 break;
4538 }
4539 // See if the cyphers in the Bss description match with the settings in the profile.
4540 fWpaMatch = csrGetWpaCyphers( hHal, &pProfile->AuthType, pProfile->negotiatedUCEncryptionType, &pProfile->mcEncryptionType,
4541 &pIesLocal->WPA, UnicastCypher, MulticastCypher, AuthSuite, NULL, NULL );
4542 if ( !fWpaMatch ) break;
4543
4544 pWpaIe->IeHeader.ElementID = SIR_MAC_WPA_EID;
4545
Kiet Lam64c1b492013-07-12 13:56:44 +05304546 vos_mem_copy(pWpaIe->Oui, csrWpaOui[01], sizeof( pWpaIe->Oui ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004547
4548 pWpaIe->Version = CSR_WPA_VERSION_SUPPORTED;
4549
Kiet Lam64c1b492013-07-12 13:56:44 +05304550 vos_mem_copy(pWpaIe->MulticastOui, MulticastCypher, sizeof( MulticastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004551
4552 pWpaIe->cUnicastCyphers = 1;
4553
Kiet Lam64c1b492013-07-12 13:56:44 +05304554 vos_mem_copy(&pWpaIe->UnicastOui[ 0 ], UnicastCypher, sizeof( UnicastCypher ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004555
4556 pAuthSuite = (tCsrWpaAuthIe *)( &pWpaIe->UnicastOui[ pWpaIe->cUnicastCyphers ] );
4557
4558 pAuthSuite->cAuthenticationSuites = 1;
Kiet Lam64c1b492013-07-12 13:56:44 +05304559 vos_mem_copy(&pAuthSuite->AuthOui[ 0 ], AuthSuite, sizeof( AuthSuite ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004560
4561 // The WPA capabilities follows the Auth Suite (two octects)--
4562 // this field is optional, and we always "send" zero, so just
4563 // remove it. This is consistent with our assumptions in the
4564 // frames compiler; c.f. bug 15234:
4565 // http://gold.woodsidenet.com/bugzilla/show_bug.cgi?id=15234
4566
4567 // Add in the fixed fields plus 1 Unicast cypher, less the IE Header length
4568 // Add in the size of the Auth suite (count plus a single OUI)
4569 pWpaIe->IeHeader.Length = sizeof( *pWpaIe ) - sizeof ( pWpaIe->IeHeader ) +
4570 sizeof( *pAuthSuite );
4571
4572 // return the size of the IE header (total) constructed...
4573 cbWpaIe = pWpaIe->IeHeader.Length + sizeof( pWpaIe->IeHeader );
4574
4575 } while( 0 );
4576
4577 if( !pIes && pIesLocal )
4578 {
4579 //locally allocated
Kiet Lam64c1b492013-07-12 13:56:44 +05304580 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07004581 }
4582
4583 return( cbWpaIe );
4584}
4585
4586
4587tANI_BOOLEAN csrGetWpaRsnIe( tHalHandle hHal, tANI_U8 *pIes, tANI_U32 len,
4588 tANI_U8 *pWpaIe, tANI_U8 *pcbWpaIe, tANI_U8 *pRSNIe, tANI_U8 *pcbRSNIe)
4589{
Jeff Johnson295189b2012-06-20 16:38:30 -07004590 tDot11IEHeader *pIEHeader;
4591 tSirMacPropIE *pSirMacPropIE;
4592 tANI_U32 cbParsed;
4593 tANI_U32 cbIE;
4594 int cExpectedIEs = 0;
4595 int cFoundIEs = 0;
4596 int cbPropIETotal;
4597
4598 pIEHeader = (tDot11IEHeader *)pIes;
4599 if(pWpaIe) cExpectedIEs++;
4600 if(pRSNIe) cExpectedIEs++;
4601
4602 // bss description length includes all fields other than the length itself
4603 cbParsed = 0;
4604
4605 // Loop as long as there is data left in the IE of the Bss Description
4606 // and the number of Expected IEs is NOT found yet.
4607 while( ( (cbParsed + sizeof( *pIEHeader )) <= len ) && ( cFoundIEs < cExpectedIEs ) )
4608 {
4609 cbIE = sizeof( *pIEHeader ) + pIEHeader->Length;
4610
4611 if ( ( cbIE + cbParsed ) > len ) break;
4612
4613 if ( ( pIEHeader->Length >= gCsrIELengthTable[ pIEHeader->ElementID ].min ) &&
4614 ( pIEHeader->Length <= gCsrIELengthTable[ pIEHeader->ElementID ].max ) )
4615 {
4616 switch( pIEHeader->ElementID )
4617 {
4618 // Parse the 221 (0xdd) Proprietary IEs here...
4619 // Note that the 221 IE is overloaded, containing the WPA IE, WMM/WME IE, and the
4620 // Airgo proprietary IE information.
4621 case SIR_MAC_WPA_EID:
4622 {
4623 tANI_U32 aniOUI;
4624 tANI_U8 *pOui = (tANI_U8 *)&aniOUI;
4625
4626 pOui++;
4627 aniOUI = ANI_OUI;
4628 aniOUI = i_ntohl( aniOUI );
4629
4630 pSirMacPropIE = ( tSirMacPropIE *)pIEHeader;
4631 cbPropIETotal = pSirMacPropIE->length;
4632
4633 // Validate the ANI OUI is in the OUI field in the proprietary IE...
4634 if ( ( pSirMacPropIE->length >= WNI_CFG_MANUFACTURER_OUI_LEN ) &&
4635 pOui[ 0 ] == pSirMacPropIE->oui[ 0 ] &&
4636 pOui[ 1 ] == pSirMacPropIE->oui[ 1 ] &&
4637 pOui[ 2 ] == pSirMacPropIE->oui[ 2 ] )
4638 {
4639 }
4640 else
4641 {
4642 tCsrWpaIe *pIe = ( tCsrWpaIe * )pIEHeader;
4643
4644 if(!pWpaIe || !pcbWpaIe) break;
4645 // Check if this is a valid WPA IE. Then check that the
4646 // WPA OUI is in place and the version is one that we support.
4647 if ( ( pIe->IeHeader.Length >= SIR_MAC_WPA_IE_MIN_LENGTH ) &&
Kiet Lam64c1b492013-07-12 13:56:44 +05304648 ( vos_mem_compare( pIe->Oui, (void *)csrWpaOui[1],
4649 sizeof( pIe->Oui ) ) ) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004650 ( pIe->Version <= CSR_WPA_VERSION_SUPPORTED ) )
4651 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304652 vos_mem_copy(pWpaIe, pIe,
4653 pIe->IeHeader.Length + sizeof( pIe->IeHeader ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004654 *pcbWpaIe = pIe->IeHeader.Length + sizeof( pIe->IeHeader );
4655 cFoundIEs++;
4656
4657 break;
4658 }
4659 }
4660
4661 break;
4662 }
4663
4664 case SIR_MAC_RSN_EID:
4665 {
4666 tCsrRSNIe *pIe;
4667
4668 if(!pcbRSNIe || !pRSNIe) break;
4669 pIe = (tCsrRSNIe *)pIEHeader;
4670
4671 // Check the length of the RSN Ie to assure it is valid. Then check that the
4672 // version is one that we support.
4673
4674 if ( pIe->IeHeader.Length < SIR_MAC_RSN_IE_MIN_LENGTH ) break;
4675 if ( pIe->Version > CSR_RSN_VERSION_SUPPORTED ) break;
4676
4677 cFoundIEs++;
4678
4679 // if there is enough room in the WpaIE passed in, then copy the Wpa IE into
4680 // the buffer passed in.
4681 if ( *pcbRSNIe < pIe->IeHeader.Length + sizeof( pIe->IeHeader ) ) break;
Kiet Lam64c1b492013-07-12 13:56:44 +05304682 vos_mem_copy(pRSNIe, pIe,
4683 pIe->IeHeader.Length + sizeof( pIe->IeHeader ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004684 *pcbRSNIe = pIe->IeHeader.Length + sizeof( pIe->IeHeader );
4685
4686 break;
4687 }
4688
4689 // Add support for other IE here...
4690 default:
4691 break;
4692 }
4693 }
4694
4695 cbParsed += cbIE;
4696
4697 pIEHeader = (tDot11IEHeader *)( ((tANI_U8 *)pIEHeader) + cbIE );
4698
4699 }
4700
4701 // return a BOOL that tells if all of the IEs asked for were found...
4702 return( cFoundIEs == cExpectedIEs );
4703}
4704
4705
4706//If a WPAIE exists in the profile, just use it. Or else construct one from the BSS
4707//Caller allocated memory for pWpaIe and guarrantee it can contain a max length WPA IE
4708tANI_U8 csrRetrieveWpaIe( tHalHandle hHal, tCsrRoamProfile *pProfile, tSirBssDescription *pSirBssDesc,
4709 tDot11fBeaconIEs *pIes, tCsrWpaIe *pWpaIe )
4710{
4711 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4712 tANI_U8 cbWpaIe = 0;
4713
4714 do
4715 {
4716 if ( !csrIsProfileWpa( pProfile ) ) break;
4717 if(pProfile->nWPAReqIELength && pProfile->pWPAReqIE)
4718 {
4719 if(SIR_MAC_WPA_IE_MAX_LENGTH >= pProfile->nWPAReqIELength)
4720 {
4721 cbWpaIe = (tANI_U8)pProfile->nWPAReqIELength;
Kiet Lam64c1b492013-07-12 13:56:44 +05304722 vos_mem_copy(pWpaIe, pProfile->pWPAReqIE, cbWpaIe);
Jeff Johnson295189b2012-06-20 16:38:30 -07004723 }
4724 else
4725 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08004726 smsLog(pMac, LOGW, " csrRetrieveWpaIe detect invalid WPA IE length (%d) ", pProfile->nWPAReqIELength);
Jeff Johnson295189b2012-06-20 16:38:30 -07004727 }
4728 }
4729 else
4730 {
4731 cbWpaIe = csrConstructWpaIe(pMac, pProfile, pSirBssDesc, pIes, pWpaIe);
4732 }
4733 }while(0);
4734
4735 return (cbWpaIe);
4736}
4737
4738
4739//If a RSNIE exists in the profile, just use it. Or else construct one from the BSS
4740//Caller allocated memory for pWpaIe and guarrantee it can contain a max length WPA IE
4741tANI_U8 csrRetrieveRsnIe( tHalHandle hHal, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
4742 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes, tCsrRSNIe *pRsnIe )
4743{
4744 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4745 tANI_U8 cbRsnIe = 0;
4746
4747 do
4748 {
4749 if ( !csrIsProfileRSN( pProfile ) ) break;
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004750#ifdef FEATURE_WLAN_LFR
Madan Mohan Koyyalamudi03aae5f2012-11-28 01:51:22 +05304751 if (csrRoamIsFastRoamEnabled(pMac, sessionId))
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004752 {
4753 // If "Legacy Fast Roaming" is enabled ALWAYS rebuild the RSN IE from
4754 // scratch. So it contains the current PMK-IDs
4755 cbRsnIe = csrConstructRSNIe(pMac, sessionId, pProfile, pSirBssDesc, pIes, pRsnIe);
4756 }
4757 else
4758#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004759 if(pProfile->nRSNReqIELength && pProfile->pRSNReqIE)
4760 {
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004761 // If you have one started away, re-use it.
Jeff Johnson295189b2012-06-20 16:38:30 -07004762 if(SIR_MAC_WPA_IE_MAX_LENGTH >= pProfile->nRSNReqIELength)
4763 {
4764 cbRsnIe = (tANI_U8)pProfile->nRSNReqIELength;
Kiet Lam64c1b492013-07-12 13:56:44 +05304765 vos_mem_copy(pRsnIe, pProfile->pRSNReqIE, cbRsnIe);
Jeff Johnson295189b2012-06-20 16:38:30 -07004766 }
4767 else
4768 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08004769 smsLog(pMac, LOGW, " csrRetrieveRsnIe detect invalid RSN IE length (%d) ", pProfile->nRSNReqIELength);
Jeff Johnson295189b2012-06-20 16:38:30 -07004770 }
4771 }
4772 else
4773 {
4774 cbRsnIe = csrConstructRSNIe(pMac, sessionId, pProfile, pSirBssDesc, pIes, pRsnIe);
4775 }
4776 }while(0);
4777
4778 return (cbRsnIe);
4779}
4780
4781
4782#ifdef FEATURE_WLAN_WAPI
4783//If a WAPI IE exists in the profile, just use it. Or else construct one from the BSS
4784//Caller allocated memory for pWapiIe and guarrantee it can contain a max length WAPI IE
4785tANI_U8 csrRetrieveWapiIe( tHalHandle hHal, tANI_U32 sessionId,
4786 tCsrRoamProfile *pProfile, tSirBssDescription *pSirBssDesc,
4787 tDot11fBeaconIEs *pIes, tCsrWapiIe *pWapiIe )
4788{
4789 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4790 tANI_U8 cbWapiIe = 0;
4791
4792 do
4793 {
4794 if ( !csrIsProfileWapi( pProfile ) ) break;
4795 if(pProfile->nWAPIReqIELength && pProfile->pWAPIReqIE)
4796 {
4797 if(DOT11F_IE_WAPI_MAX_LEN >= pProfile->nWAPIReqIELength)
4798 {
4799 cbWapiIe = (tANI_U8)pProfile->nWAPIReqIELength;
Kiet Lam64c1b492013-07-12 13:56:44 +05304800 vos_mem_copy(pWapiIe, pProfile->pWAPIReqIE, cbWapiIe);
Jeff Johnson295189b2012-06-20 16:38:30 -07004801 }
4802 else
4803 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08004804 smsLog(pMac, LOGW, " csrRetrieveWapiIe detect invalid WAPI IE length (%d) ", pProfile->nWAPIReqIELength);
Jeff Johnson295189b2012-06-20 16:38:30 -07004805 }
4806 }
4807 else
4808 {
4809 cbWapiIe = csrConstructWapiIe(pMac, sessionId, pProfile, pSirBssDesc, pIes, pWapiIe);
4810 }
4811 }while(0);
4812
4813 return (cbWapiIe);
4814}
4815#endif /* FEATURE_WLAN_WAPI */
4816
4817tANI_BOOLEAN csrSearchChannelListForTxPower(tHalHandle hHal, tSirBssDescription *pBssDescription, tCsrChannelSet *returnChannelGroup)
4818{
4819 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
4820 tListElem *pEntry;
4821 tANI_U16 i;
4822 tANI_U16 startingChannel;
4823 tANI_BOOLEAN found = FALSE;
4824 tCsrChannelSet *pChannelGroup;
4825
4826 pEntry = csrLLPeekHead( &pMac->roam.channelList5G, LL_ACCESS_LOCK );
4827
4828 while ( pEntry )
4829 {
4830 pChannelGroup = GET_BASE_ADDR( pEntry, tCsrChannelSet, channelListLink );
4831 startingChannel = pChannelGroup->firstChannel;
4832 for ( i = 0; i < pChannelGroup->numChannels; i++ )
4833 {
4834 if ( startingChannel + i * pChannelGroup->interChannelOffset == pBssDescription->channelId )
4835 {
4836 found = TRUE;
4837 break;
4838 }
4839 }
4840
4841 if ( found )
4842 {
Kiet Lam64c1b492013-07-12 13:56:44 +05304843 vos_mem_copy(returnChannelGroup, pChannelGroup, sizeof(tCsrChannelSet));
Jeff Johnson295189b2012-06-20 16:38:30 -07004844 break;
4845 }
4846 else
4847 {
4848 pEntry = csrLLNext( &pMac->roam.channelList5G, pEntry, LL_ACCESS_LOCK );
4849 }
4850 }
4851
4852 return( found );
4853}
4854
4855tANI_BOOLEAN csrRatesIsDot11Rate11bSupportedRate( tANI_U8 dot11Rate )
4856{
4857 tANI_BOOLEAN fSupported = FALSE;
4858 tANI_U16 nonBasicRate = (tANI_U16)( BITS_OFF( dot11Rate, CSR_DOT11_BASIC_RATE_MASK ) );
4859
4860 switch ( nonBasicRate )
4861 {
4862 case eCsrSuppRate_1Mbps:
4863 case eCsrSuppRate_2Mbps:
4864 case eCsrSuppRate_5_5Mbps:
4865 case eCsrSuppRate_11Mbps:
4866 fSupported = TRUE;
4867 break;
4868
4869 default:
4870 break;
4871 }
4872
4873 return( fSupported );
4874}
4875
4876tANI_BOOLEAN csrRatesIsDot11Rate11aSupportedRate( tANI_U8 dot11Rate )
4877{
4878 tANI_BOOLEAN fSupported = FALSE;
4879 tANI_U16 nonBasicRate = (tANI_U16)( BITS_OFF( dot11Rate, CSR_DOT11_BASIC_RATE_MASK ) );
4880
4881 switch ( nonBasicRate )
4882 {
4883 case eCsrSuppRate_6Mbps:
4884 case eCsrSuppRate_9Mbps:
4885 case eCsrSuppRate_12Mbps:
4886 case eCsrSuppRate_18Mbps:
4887 case eCsrSuppRate_24Mbps:
4888 case eCsrSuppRate_36Mbps:
4889 case eCsrSuppRate_48Mbps:
4890 case eCsrSuppRate_54Mbps:
4891 fSupported = TRUE;
4892 break;
4893
4894 default:
4895 break;
4896 }
4897
4898 return( fSupported );
4899}
4900
4901
4902
4903tAniEdType csrTranslateEncryptTypeToEdType( eCsrEncryptionType EncryptType )
4904{
4905 tAniEdType edType;
4906
4907 switch ( EncryptType )
4908 {
4909 default:
4910 case eCSR_ENCRYPT_TYPE_NONE:
4911 edType = eSIR_ED_NONE;
4912 break;
4913
4914 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
4915 case eCSR_ENCRYPT_TYPE_WEP40:
4916 edType = eSIR_ED_WEP40;
4917 break;
4918
4919 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
4920 case eCSR_ENCRYPT_TYPE_WEP104:
4921 edType = eSIR_ED_WEP104;
4922 break;
4923
4924 case eCSR_ENCRYPT_TYPE_TKIP:
4925 edType = eSIR_ED_TKIP;
4926 break;
4927
4928 case eCSR_ENCRYPT_TYPE_AES:
4929 edType = eSIR_ED_CCMP;
4930 break;
4931#ifdef FEATURE_WLAN_WAPI
4932 case eCSR_ENCRYPT_TYPE_WPI:
4933 edType = eSIR_ED_WPI;
Gopichand Nakkala39d9d7a2013-05-19 19:07:35 +05304934 break ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004935#endif
4936#ifdef WLAN_FEATURE_11W
4937 //11w BIP
4938 case eCSR_ENCRYPT_TYPE_AES_CMAC:
4939 edType = eSIR_ED_AES_128_CMAC;
4940 break;
4941#endif
4942 }
4943
4944 return( edType );
4945}
4946
4947
4948//pIes can be NULL
4949tANI_BOOLEAN csrValidateWep( tpAniSirGlobal pMac, eCsrEncryptionType ucEncryptionType,
4950 tCsrAuthList *pAuthList, tCsrEncryptionList *pMCEncryptionList,
4951 eCsrAuthType *pNegotiatedAuthType, eCsrEncryptionType *pNegotiatedMCEncryption,
4952 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes )
4953{
4954 tANI_U32 idx;
4955 tANI_BOOLEAN fMatch = FALSE;
4956 eCsrAuthType negotiatedAuth = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4957 eCsrEncryptionType negotiatedMCCipher = eCSR_ENCRYPT_TYPE_UNKNOWN;
4958
4959 //This function just checks whether HDD is giving correct values for Multicast cipher and Auth.
4960
4961 do
4962 {
4963 //If privacy bit is not set, consider no match
4964 if ( !csrIsPrivacy( pSirBssDesc ) ) break;
4965
4966 for( idx = 0; idx < pMCEncryptionList->numEntries; idx++ )
4967 {
4968 switch( pMCEncryptionList->encryptionType[idx] )
4969 {
4970 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
4971 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
4972 case eCSR_ENCRYPT_TYPE_WEP40:
4973 case eCSR_ENCRYPT_TYPE_WEP104:
4974 /* Multicast list may contain WEP40/WEP104. Check whether it matches UC.
4975 */
4976 if( ucEncryptionType == pMCEncryptionList->encryptionType[idx] )
4977 {
4978 fMatch = TRUE;
4979 negotiatedMCCipher = pMCEncryptionList->encryptionType[idx];
4980 }
4981 break;
4982 default:
4983 fMatch = FALSE;
4984 break;
4985 }
4986 if(fMatch) break;
4987 }
4988
4989 if(!fMatch) break;
4990
4991 for( idx = 0; idx < pAuthList->numEntries; idx++ )
4992 {
4993 switch( pAuthList->authType[idx] )
4994 {
4995 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
4996 case eCSR_AUTH_TYPE_SHARED_KEY:
4997 case eCSR_AUTH_TYPE_AUTOSWITCH:
4998 fMatch = TRUE;
4999 negotiatedAuth = pAuthList->authType[idx];
5000 break;
5001 default:
5002 fMatch = FALSE;
5003 }
5004 if (fMatch) break;
5005 }
5006
5007 if(!fMatch) break;
5008 //In case of WPA / WPA2, check whether it supports WEP as well
5009 if(pIes)
5010 {
5011 //Prepare the encryption type for WPA/WPA2 functions
5012 if( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == ucEncryptionType )
5013 {
5014 ucEncryptionType = eCSR_ENCRYPT_TYPE_WEP40;
5015 }
5016 else if( eCSR_ENCRYPT_TYPE_WEP104 == ucEncryptionType )
5017 {
5018 ucEncryptionType = eCSR_ENCRYPT_TYPE_WEP104;
5019 }
5020 //else we can use the encryption type directly
Kiet Lam64c1b492013-07-12 13:56:44 +05305021 if ( pIes->WPA.present )
Jeff Johnson295189b2012-06-20 16:38:30 -07005022 {
Kiet Lam64c1b492013-07-12 13:56:44 +05305023 fMatch = vos_mem_compare(pIes->WPA.multicast_cipher,
5024 csrWpaOui[csrGetOUIIndexFromCipher( ucEncryptionType )],
5025 CSR_WPA_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005026 if( fMatch ) break;
5027 }
Kiet Lam64c1b492013-07-12 13:56:44 +05305028 if ( pIes->RSN.present )
Jeff Johnson295189b2012-06-20 16:38:30 -07005029 {
Kiet Lam64c1b492013-07-12 13:56:44 +05305030 fMatch = vos_mem_compare(pIes->RSN.gp_cipher_suite,
5031 csrRSNOui[csrGetOUIIndexFromCipher( ucEncryptionType )],
5032 CSR_RSN_OUI_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005033 }
5034 }
5035
5036 }while(0);
5037
5038 if( fMatch )
5039 {
5040 if( pNegotiatedAuthType )
5041 *pNegotiatedAuthType = negotiatedAuth;
5042
5043 if( pNegotiatedMCEncryption )
5044 *pNegotiatedMCEncryption = negotiatedMCCipher;
5045 }
5046
5047
5048 return fMatch;
5049}
5050
5051
5052//pIes shall contain IEs from pSirBssDesc. It shall be returned from function csrGetParsedBssDescriptionIEs
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305053tANI_BOOLEAN csrIsSecurityMatch( tHalHandle hHal, tCsrAuthList *authType,
5054 tCsrEncryptionList *pUCEncryptionType,
5055 tCsrEncryptionList *pMCEncryptionType,
5056 tANI_BOOLEAN *pMFPEnabled,
5057 tANI_U8 *pMFPRequired, tANI_U8 *pMFPCapable,
5058 tSirBssDescription *pSirBssDesc,
5059 tDot11fBeaconIEs *pIes,
5060 eCsrAuthType *negotiatedAuthtype,
5061 eCsrEncryptionType *negotiatedUCCipher,
5062 eCsrEncryptionType *negotiatedMCCipher )
Jeff Johnson295189b2012-06-20 16:38:30 -07005063{
5064 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
5065 tANI_BOOLEAN fMatch = FALSE;
5066 tANI_U8 i,idx;
5067 eCsrEncryptionType mcCipher = eCSR_ENCRYPT_TYPE_UNKNOWN, ucCipher = eCSR_ENCRYPT_TYPE_UNKNOWN;
5068 eCsrAuthType negAuthType = eCSR_AUTH_TYPE_UNKNOWN;
5069
5070 for( i = 0 ; ((i < pUCEncryptionType->numEntries) && (!fMatch)) ; i++ )
5071 {
5072 ucCipher = pUCEncryptionType->encryptionType[i];
5073 // If the Bss description shows the Privacy bit is on, then we must have some sort of encryption configured
5074 // for the profile to work. Don't attempt to join networks with Privacy bit set when profiles say NONE for
5075 // encryption type.
5076 switch ( ucCipher )
5077 {
5078 case eCSR_ENCRYPT_TYPE_NONE:
5079 {
5080 // for NO encryption, if the Bss description has the Privacy bit turned on, then encryption is
5081 // required so we have to reject this Bss.
5082 if ( csrIsPrivacy( pSirBssDesc ) )
5083 {
5084 fMatch = FALSE;
5085 }
5086 else
5087 {
5088 fMatch = TRUE;
5089 }
5090
5091 if ( fMatch )
5092 {
5093 fMatch = FALSE;
5094 //Check Multicast cipher requested and Auth type requested.
5095 for( idx = 0 ; idx < pMCEncryptionType->numEntries ; idx++ )
5096 {
5097 if( eCSR_ENCRYPT_TYPE_NONE == pMCEncryptionType->encryptionType[idx] )
5098 {
5099 fMatch = TRUE; //Multicast can only be none.
5100 mcCipher = pMCEncryptionType->encryptionType[idx];
5101 break;
5102 }
5103 }
5104 if (!fMatch) break;
5105
5106 fMatch = FALSE;
5107 //Check Auth list. It should contain AuthOpen.
5108 for( idx = 0 ; idx < authType->numEntries ; idx++ )
5109 {
5110 if( eCSR_AUTH_TYPE_OPEN_SYSTEM == authType->authType[idx] )
5111 {
5112 fMatch = TRUE;
5113 negAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5114 break;
5115 }
5116 }
5117 if (!fMatch) break;
5118
5119 }
5120 break;
5121 }
5122
5123 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
5124 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
5125 // !! might want to check for WEP keys set in the Profile.... ?
5126 // !! don't need to have the privacy bit in the Bss description. Many AP policies make legacy
5127 // encryption 'optional' so we don't know if we can associate or not. The AP will reject if
5128 // encryption is not allowed without the Privacy bit turned on.
5129 fMatch = csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes);
5130
5131 break;
5132
5133 // these are all of the WPA encryption types...
5134 case eCSR_ENCRYPT_TYPE_WEP40:
5135 case eCSR_ENCRYPT_TYPE_WEP104:
5136 fMatch = csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes);
5137 break;
5138
5139 case eCSR_ENCRYPT_TYPE_TKIP:
5140 case eCSR_ENCRYPT_TYPE_AES:
5141 {
5142 if(pIes)
5143 {
5144 // First check if there is a RSN match
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305145 fMatch = csrIsRSNMatch( pMac, authType, ucCipher,
5146 pMCEncryptionType, pMFPEnabled,
5147 pMFPRequired, pMFPCapable,
5148 pIes, &negAuthType, &mcCipher );
Jeff Johnson295189b2012-06-20 16:38:30 -07005149 if( !fMatch )
5150 {
5151 // If not RSN, then check if there is a WPA match
5152 fMatch = csrIsWpaEncryptionMatch( pMac, authType, ucCipher, pMCEncryptionType, pIes,
5153 &negAuthType, &mcCipher );
5154 }
5155 }
5156 else
5157 {
5158 fMatch = FALSE;
5159 }
5160 break;
5161 }
5162#ifdef FEATURE_WLAN_WAPI
5163 case eCSR_ENCRYPT_TYPE_WPI://WAPI
5164 {
5165 if(pIes)
5166 {
5167 fMatch = csrIsWapiMatch( hHal, authType, ucCipher, pMCEncryptionType, pIes, &negAuthType, &mcCipher );
5168 }
5169 else
5170 {
5171 fMatch = FALSE;
5172 }
5173 break;
5174 }
5175#endif /* FEATURE_WLAN_WAPI */
5176 case eCSR_ENCRYPT_TYPE_ANY:
5177 default:
5178 {
5179 tANI_BOOLEAN fMatchAny = eANI_BOOLEAN_FALSE;
5180
5181 fMatch = eANI_BOOLEAN_TRUE;
5182 //It is allowed to match anything. Try the more secured ones first.
5183 if(pIes)
5184 {
5185 //Check AES first
5186 ucCipher = eCSR_ENCRYPT_TYPE_AES;
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305187 fMatchAny = csrIsRSNMatch( hHal, authType, ucCipher,
5188 pMCEncryptionType, pMFPEnabled,
5189 pMFPRequired, pMFPCapable, pIes,
5190 &negAuthType, &mcCipher );
Jeff Johnson295189b2012-06-20 16:38:30 -07005191 if(!fMatchAny)
5192 {
5193 //Check TKIP
5194 ucCipher = eCSR_ENCRYPT_TYPE_TKIP;
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305195 fMatchAny = csrIsRSNMatch( hHal, authType, ucCipher,
5196 pMCEncryptionType,
5197 pMFPEnabled, pMFPRequired,
5198 pMFPCapable, pIes,
5199 &negAuthType, &mcCipher );
Jeff Johnson295189b2012-06-20 16:38:30 -07005200 }
5201#ifdef FEATURE_WLAN_WAPI
5202 if(!fMatchAny)
5203 {
5204 //Check WAPI
5205 ucCipher = eCSR_ENCRYPT_TYPE_WPI;
5206 fMatchAny = csrIsWapiMatch( hHal, authType, ucCipher, pMCEncryptionType, pIes, &negAuthType, &mcCipher );
5207 }
5208#endif /* FEATURE_WLAN_WAPI */
5209 }
5210 if(!fMatchAny)
5211 {
5212 ucCipher = eCSR_ENCRYPT_TYPE_WEP104;
5213 if(!csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes))
5214 {
5215 ucCipher = eCSR_ENCRYPT_TYPE_WEP40;
5216 if(!csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes))
5217 {
5218 ucCipher = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
5219 if(!csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes))
5220 {
5221 ucCipher = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
5222 if(!csrValidateWep( pMac, ucCipher, authType, pMCEncryptionType, &negAuthType, &mcCipher, pSirBssDesc, pIes))
5223 {
5224 //It must be open and no encryption
5225 if ( csrIsPrivacy( pSirBssDesc ) )
5226 {
5227 //This is not right
5228 fMatch = eANI_BOOLEAN_FALSE;
5229 }
5230 else
5231 {
5232 negAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5233 mcCipher = eCSR_ENCRYPT_TYPE_NONE;
5234 ucCipher = eCSR_ENCRYPT_TYPE_NONE;
5235 }
5236 }
5237 }
5238 }
5239 }
5240 }
5241 break;
5242 }
5243 }
5244
5245 }
5246
5247 if( fMatch )
5248 {
5249 if( negotiatedUCCipher )
5250 *negotiatedUCCipher = ucCipher;
5251
5252 if( negotiatedMCCipher )
5253 *negotiatedMCCipher = mcCipher;
5254
5255 if( negotiatedAuthtype )
5256 *negotiatedAuthtype = negAuthType;
5257 }
5258
5259 return( fMatch );
5260}
5261
5262
5263tANI_BOOLEAN csrIsSsidMatch( tpAniSirGlobal pMac, tANI_U8 *ssid1, tANI_U8 ssid1Len, tANI_U8 *bssSsid,
5264 tANI_U8 bssSsidLen, tANI_BOOLEAN fSsidRequired )
5265{
5266 tANI_BOOLEAN fMatch = FALSE;
5267
5268 do {
Padma, Santhosh Kumara43e06c2015-05-21 14:58:13 +05305269 // Check for the specification of the Broadcast SSID at the beginning
5270 // of the list. If specified, then all SSIDs are matches
5271 // (broadcast SSID means accept all SSIDs).
5272 if ( ssid1Len == 0 )
5273 {
5274 fMatch = TRUE;
5275 break;
5276 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005277
5278 // There are a few special cases. If the Bss description has a Broadcast SSID,
5279 // then our Profile must have a single SSID without Wildcards so we can program
5280 // the SSID.
5281 // SSID could be suppressed in beacons. In that case SSID IE has valid length
5282 // but the SSID value is all NULL characters. That condition is trated same
5283 // as NULL SSID
5284 if ( csrIsNULLSSID( bssSsid, bssSsidLen ) )
5285 {
5286 if ( eANI_BOOLEAN_FALSE == fSsidRequired )
5287 {
5288 fMatch = TRUE;
5289 }
5290 break;
5291 }
5292
Jeff Johnson295189b2012-06-20 16:38:30 -07005293 if(ssid1Len != bssSsidLen) break;
Kiet Lam64c1b492013-07-12 13:56:44 +05305294 if (vos_mem_compare(bssSsid, ssid1, bssSsidLen))
Jeff Johnson295189b2012-06-20 16:38:30 -07005295 {
5296 fMatch = TRUE;
5297 break;
5298 }
5299
5300 } while( 0 );
5301
5302 return( fMatch );
5303}
5304
5305
5306//Null ssid means match
5307tANI_BOOLEAN csrIsSsidInList( tHalHandle hHal, tSirMacSSid *pSsid, tCsrSSIDs *pSsidList )
5308{
Jeff Johnson295189b2012-06-20 16:38:30 -07005309 tANI_BOOLEAN fMatch = FALSE;
5310 tANI_U32 i;
5311
5312 if ( pSsidList && pSsid )
5313 {
5314 for(i = 0; i < pSsidList->numOfSSIDs; i++)
5315 {
5316 if(csrIsNULLSSID(pSsidList->SSIDList[i].SSID.ssId, pSsidList->SSIDList[i].SSID.length) ||
Kiet Lam64c1b492013-07-12 13:56:44 +05305317 ((pSsidList->SSIDList[i].SSID.length == pSsid->length) &&
5318 vos_mem_compare(pSsid->ssId, pSsidList->SSIDList[i].SSID.ssId, pSsid->length)))
Jeff Johnson295189b2012-06-20 16:38:30 -07005319 {
5320 fMatch = TRUE;
5321 break;
5322 }
5323 }
5324 }
5325
5326 return (fMatch);
5327}
5328
5329//like to use sirCompareMacAddr
5330tANI_BOOLEAN csrIsMacAddressZero( tpAniSirGlobal pMac, tCsrBssid *pMacAddr )
5331{
5332 tANI_U8 bssid[WNI_CFG_BSSID_LEN] = {0, 0, 0, 0, 0, 0};
5333
Kiet Lam64c1b492013-07-12 13:56:44 +05305334 return (vos_mem_compare(bssid, pMacAddr, WNI_CFG_BSSID_LEN));
Jeff Johnson295189b2012-06-20 16:38:30 -07005335}
5336
5337//like to use sirCompareMacAddr
5338tANI_BOOLEAN csrIsMacAddressBroadcast( tpAniSirGlobal pMac, tCsrBssid *pMacAddr )
5339{
5340 tANI_U8 bssid[WNI_CFG_BSSID_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
5341
Kiet Lam64c1b492013-07-12 13:56:44 +05305342 return(vos_mem_compare(bssid, pMacAddr, WNI_CFG_BSSID_LEN));
Jeff Johnson295189b2012-06-20 16:38:30 -07005343}
5344
5345
5346//like to use sirCompareMacAddr
5347tANI_BOOLEAN csrIsMacAddressEqual( tpAniSirGlobal pMac, tCsrBssid *pMacAddr1, tCsrBssid *pMacAddr2 )
5348{
Kiet Lam64c1b492013-07-12 13:56:44 +05305349 return(vos_mem_compare(pMacAddr1, pMacAddr2, sizeof(tCsrBssid)));
Jeff Johnson295189b2012-06-20 16:38:30 -07005350}
5351
5352
5353tANI_BOOLEAN csrIsBssidMatch( tHalHandle hHal, tCsrBssid *pProfBssid, tCsrBssid *BssBssid )
5354{
5355 tANI_BOOLEAN fMatch = FALSE;
5356 tCsrBssid ProfileBssid;
5357 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
5358
5359 // for efficiency of the MAC_ADDRESS functions, move the
5360 // Bssid's into MAC_ADDRESS structs.
Kiet Lam64c1b492013-07-12 13:56:44 +05305361 vos_mem_copy(&ProfileBssid, pProfBssid, sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07005362
5363 do {
5364
5365 // Give the profile the benefit of the doubt... accept either all 0 or
5366 // the real broadcast Bssid (all 0xff) as broadcast Bssids (meaning to
5367 // match any Bssids).
5368 if ( csrIsMacAddressZero( pMac, &ProfileBssid ) ||
5369 csrIsMacAddressBroadcast( pMac, &ProfileBssid ) )
5370 {
5371 fMatch = TRUE;
5372 break;
5373 }
5374
5375 if ( csrIsMacAddressEqual( pMac, BssBssid, &ProfileBssid ) )
5376 {
5377 fMatch = TRUE;
5378 break;
5379 }
5380
5381 } while( 0 );
5382
5383 return( fMatch );
5384}
5385
5386
5387tANI_BOOLEAN csrIsBSSTypeMatch(eCsrRoamBssType bssType1, eCsrRoamBssType bssType2)
5388{
5389 if((eCSR_BSS_TYPE_ANY != bssType1 && eCSR_BSS_TYPE_ANY != bssType2) && (bssType1 != bssType2))
5390 return eANI_BOOLEAN_FALSE;
5391 else
5392 return eANI_BOOLEAN_TRUE;
5393}
5394
5395
5396tANI_BOOLEAN csrIsBssTypeIBSS(eCsrRoamBssType bssType)
5397{
5398 return((tANI_BOOLEAN)(eCSR_BSS_TYPE_START_IBSS == bssType || eCSR_BSS_TYPE_IBSS == bssType));
5399}
5400
5401tANI_BOOLEAN csrIsBssTypeWDS(eCsrRoamBssType bssType)
5402{
5403 return((tANI_BOOLEAN)(eCSR_BSS_TYPE_WDS_STA == bssType || eCSR_BSS_TYPE_WDS_AP == bssType));
5404}
5405
5406tANI_BOOLEAN csrIsBSSTypeCapsMatch( eCsrRoamBssType bssType, tSirBssDescription *pSirBssDesc )
5407{
5408 tANI_BOOLEAN fMatch = TRUE;
5409
5410 do
5411 {
5412 switch( bssType )
5413 {
5414 case eCSR_BSS_TYPE_ANY:
5415 break;
5416
5417 case eCSR_BSS_TYPE_INFRASTRUCTURE:
5418 case eCSR_BSS_TYPE_WDS_STA:
5419 if( !csrIsInfraBssDesc( pSirBssDesc ) )
5420 fMatch = FALSE;
5421
5422 break;
5423
5424 case eCSR_BSS_TYPE_IBSS:
5425 case eCSR_BSS_TYPE_START_IBSS:
5426 if( !csrIsIbssBssDesc( pSirBssDesc ) )
5427 fMatch = FALSE;
5428
5429 break;
5430
5431 case eCSR_BSS_TYPE_WDS_AP: //For WDS AP, no need to match anything
5432 default:
5433 fMatch = FALSE;
5434 break;
5435 }
5436 }
5437 while( 0 );
5438
5439
5440 return( fMatch );
5441}
5442
5443static tANI_BOOLEAN csrIsCapabilitiesMatch( tpAniSirGlobal pMac, eCsrRoamBssType bssType, tSirBssDescription *pSirBssDesc )
5444{
5445 return( csrIsBSSTypeCapsMatch( bssType, pSirBssDesc ) );
5446}
5447
5448
5449
5450static tANI_BOOLEAN csrIsSpecificChannelMatch( tpAniSirGlobal pMac, tSirBssDescription *pSirBssDesc, tANI_U8 Channel )
5451{
5452 tANI_BOOLEAN fMatch = TRUE;
5453
5454 do
5455 {
5456 // if the channel is ANY, then always match...
5457 if ( eCSR_OPERATING_CHANNEL_ANY == Channel ) break;
5458 if ( Channel == pSirBssDesc->channelId ) break;
5459
5460 // didn't match anything.. so return NO match
5461 fMatch = FALSE;
5462
5463 } while( 0 );
5464
5465 return( fMatch );
5466}
5467
5468
5469tANI_BOOLEAN csrIsChannelBandMatch( tpAniSirGlobal pMac, tANI_U8 channelId, tSirBssDescription *pSirBssDesc )
5470{
5471 tANI_BOOLEAN fMatch = TRUE;
5472
5473 do
5474 {
5475 // if the profile says Any channel AND the global settings says ANY channel, then we
5476 // always match...
5477 if ( eCSR_OPERATING_CHANNEL_ANY == channelId ) break;
5478
5479 if ( eCSR_OPERATING_CHANNEL_ANY != channelId )
5480 {
5481 fMatch = csrIsSpecificChannelMatch( pMac, pSirBssDesc, channelId );
5482 }
5483
5484 } while( 0 );
5485
5486 return( fMatch );
5487}
5488
5489
5490/**
5491 * \brief Enquire as to whether a given rate is supported by the
5492 * adapter as currently configured
5493 *
5494 *
5495 * \param nRate A rate in units of 500kbps
5496 *
5497 * \return TRUE if the adapter is currently capable of supporting this
5498 * rate, FALSE else
5499 *
5500 *
5501 * The rate encoding is just as in 802.11 Information Elements, except
5502 * that the high bit is \em not interpreted as indicating a Basic Rate,
5503 * and proprietary rates are allowed, too.
5504 *
5505 * Note that if the adapter's dot11Mode is g, we don't restrict the
5506 * rates. According to hwReadEepromParameters, this will happen when:
5507 *
5508 * ... the card is configured for ALL bands through the property
5509 * page. If this occurs, and the card is not an ABG card ,then this
5510 * code is setting the dot11Mode to assume the mode that the
5511 * hardware can support. For example, if the card is an 11BG card
5512 * and we are configured to support ALL bands, then we change the
5513 * dot11Mode to 11g because ALL in this case is only what the
5514 * hardware can support.
5515 *
5516 *
5517 */
5518
5519static tANI_BOOLEAN csrIsAggregateRateSupported( tpAniSirGlobal pMac, tANI_U16 rate )
5520{
5521 tANI_BOOLEAN fSupported = eANI_BOOLEAN_FALSE;
5522 tANI_U16 idx, newRate;
5523
5524 //In case basic rate flag is set
5525 newRate = BITS_OFF(rate, CSR_DOT11_BASIC_RATE_MASK);
5526 if ( eCSR_CFG_DOT11_MODE_11A == pMac->roam.configParam.uCfgDot11Mode )
5527 {
5528 switch ( newRate )
5529 {
5530 case eCsrSuppRate_6Mbps:
5531 case eCsrSuppRate_9Mbps:
5532 case eCsrSuppRate_12Mbps:
5533 case eCsrSuppRate_18Mbps:
5534 case eCsrSuppRate_24Mbps:
5535 case eCsrSuppRate_36Mbps:
5536 case eCsrSuppRate_48Mbps:
5537 case eCsrSuppRate_54Mbps:
5538 fSupported = TRUE;
5539 break;
5540 default:
5541 fSupported = FALSE;
5542 break;
5543 }
5544
5545 }
5546 else if( eCSR_CFG_DOT11_MODE_11B == pMac->roam.configParam.uCfgDot11Mode )
5547 {
5548 switch ( newRate )
5549 {
5550 case eCsrSuppRate_1Mbps:
5551 case eCsrSuppRate_2Mbps:
5552 case eCsrSuppRate_5_5Mbps:
5553 case eCsrSuppRate_11Mbps:
5554 fSupported = TRUE;
5555 break;
5556 default:
5557 fSupported = FALSE;
5558 break;
5559 }
5560 }
5561 else if ( !pMac->roam.configParam.ProprietaryRatesEnabled )
5562 {
5563
5564 switch ( newRate )
5565 {
5566 case eCsrSuppRate_1Mbps:
5567 case eCsrSuppRate_2Mbps:
5568 case eCsrSuppRate_5_5Mbps:
5569 case eCsrSuppRate_6Mbps:
5570 case eCsrSuppRate_9Mbps:
5571 case eCsrSuppRate_11Mbps:
5572 case eCsrSuppRate_12Mbps:
5573 case eCsrSuppRate_18Mbps:
5574 case eCsrSuppRate_24Mbps:
5575 case eCsrSuppRate_36Mbps:
5576 case eCsrSuppRate_48Mbps:
5577 case eCsrSuppRate_54Mbps:
5578 fSupported = TRUE;
5579 break;
5580 default:
5581 fSupported = FALSE;
5582 break;
5583 }
5584
5585 }
5586 else {
5587
5588 if ( eCsrSuppRate_1Mbps == newRate ||
5589 eCsrSuppRate_2Mbps == newRate ||
5590 eCsrSuppRate_5_5Mbps == newRate ||
5591 eCsrSuppRate_11Mbps == newRate )
5592 {
5593 fSupported = TRUE;
5594 }
5595 else {
5596 idx = 0x1;
5597
5598 switch ( newRate )
5599 {
5600 case eCsrSuppRate_6Mbps:
5601 fSupported = gPhyRatesSuppt[0][idx];
5602 break;
5603 case eCsrSuppRate_9Mbps:
5604 fSupported = gPhyRatesSuppt[1][idx];
5605 break;
5606 case eCsrSuppRate_12Mbps:
5607 fSupported = gPhyRatesSuppt[2][idx];
5608 break;
5609 case eCsrSuppRate_18Mbps:
5610 fSupported = gPhyRatesSuppt[3][idx];
5611 break;
5612 case eCsrSuppRate_20Mbps:
5613 fSupported = gPhyRatesSuppt[4][idx];
5614 break;
5615 case eCsrSuppRate_24Mbps:
5616 fSupported = gPhyRatesSuppt[5][idx];
5617 break;
5618 case eCsrSuppRate_36Mbps:
5619 fSupported = gPhyRatesSuppt[6][idx];
5620 break;
5621 case eCsrSuppRate_40Mbps:
5622 fSupported = gPhyRatesSuppt[7][idx];
5623 break;
5624 case eCsrSuppRate_42Mbps:
5625 fSupported = gPhyRatesSuppt[8][idx];
5626 break;
5627 case eCsrSuppRate_48Mbps:
5628 fSupported = gPhyRatesSuppt[9][idx];
5629 break;
5630 case eCsrSuppRate_54Mbps:
5631 fSupported = gPhyRatesSuppt[10][idx];
5632 break;
5633 case eCsrSuppRate_72Mbps:
5634 fSupported = gPhyRatesSuppt[11][idx];
5635 break;
5636 case eCsrSuppRate_80Mbps:
5637 fSupported = gPhyRatesSuppt[12][idx];
5638 break;
5639 case eCsrSuppRate_84Mbps:
5640 fSupported = gPhyRatesSuppt[13][idx];
5641 break;
5642 case eCsrSuppRate_96Mbps:
5643 fSupported = gPhyRatesSuppt[14][idx];
5644 break;
5645 case eCsrSuppRate_108Mbps:
5646 fSupported = gPhyRatesSuppt[15][idx];
5647 break;
5648 case eCsrSuppRate_120Mbps:
5649 fSupported = gPhyRatesSuppt[16][idx];
5650 break;
5651 case eCsrSuppRate_126Mbps:
5652 fSupported = gPhyRatesSuppt[17][idx];
5653 break;
5654 case eCsrSuppRate_144Mbps:
5655 fSupported = gPhyRatesSuppt[18][idx];
5656 break;
5657 case eCsrSuppRate_160Mbps:
5658 fSupported = gPhyRatesSuppt[19][idx];
5659 break;
5660 case eCsrSuppRate_168Mbps:
5661 fSupported = gPhyRatesSuppt[20][idx];
5662 break;
5663 case eCsrSuppRate_192Mbps:
5664 fSupported = gPhyRatesSuppt[21][idx];
5665 break;
5666 case eCsrSuppRate_216Mbps:
5667 fSupported = gPhyRatesSuppt[22][idx];
5668 break;
5669 case eCsrSuppRate_240Mbps:
5670 fSupported = gPhyRatesSuppt[23][idx];
5671 break;
5672 default:
5673 fSupported = FALSE;
5674 break;
5675 }
5676 }
5677 }
5678
5679 return fSupported;
5680}
5681
5682
5683
5684static tANI_BOOLEAN csrIsRateSetMatch( tpAniSirGlobal pMac,
5685 tDot11fIESuppRates *pBssSuppRates,
5686 tDot11fIEExtSuppRates *pBssExtSuppRates )
5687{
5688 tANI_BOOLEAN fMatch = TRUE;
5689 tANI_U32 i;
5690
5691
5692 // Validate that all of the Basic rates advertised in the Bss description are supported.
5693 if ( pBssSuppRates )
5694 {
5695 for( i = 0; i < pBssSuppRates->num_rates; i++ )
5696 {
5697 if ( CSR_IS_BASIC_RATE( pBssSuppRates->rates[ i ] ) )
5698 {
5699 if ( !csrIsAggregateRateSupported( pMac, pBssSuppRates->rates[ i ] ) )
5700 {
5701 fMatch = FALSE;
5702 break;
5703 }
5704 }
5705 }
5706 }
5707
5708 if ( fMatch && pBssExtSuppRates )
5709 {
5710 for( i = 0; i < pBssExtSuppRates->num_rates; i++ )
5711 {
5712 if ( CSR_IS_BASIC_RATE( pBssExtSuppRates->rates[ i ] ) )
5713 {
5714 if ( !csrIsAggregateRateSupported( pMac, pBssExtSuppRates->rates[ i ] ) )
5715 {
5716 fMatch = FALSE;
5717 break;
5718 }
5719 }
5720 }
5721 }
5722
5723 return( fMatch );
5724
5725}
5726
5727
5728//ppIes can be NULL. If caller want to get the *ppIes allocated by this function, pass in *ppIes = NULL
5729tANI_BOOLEAN csrMatchBSS( tHalHandle hHal, tSirBssDescription *pBssDesc, tCsrScanResultFilter *pFilter,
5730 eCsrAuthType *pNegAuth, eCsrEncryptionType *pNegUc, eCsrEncryptionType *pNegMc,
5731 tDot11fBeaconIEs **ppIes)
5732{
5733 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
5734 tANI_BOOLEAN fRC = eANI_BOOLEAN_FALSE, fCheck;
5735 tANI_U32 i;
5736 tDot11fBeaconIEs *pIes = NULL;
5737 tANI_U8 *pb;
5738
5739 do {
5740 if( ( NULL == ppIes ) || ( *ppIes ) == NULL )
5741 {
5742 //If no IEs passed in, get our own.
5743 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIes)))
5744 {
5745 break;
5746 }
5747 }
5748 else
5749 {
5750 //Save the one pass in for local use
5751 pIes = *ppIes;
5752 }
5753
5754 //Check if caller wants P2P
5755 fCheck = (!pFilter->p2pResult || pIes->P2PBeaconProbeRes.present);
5756 if(!fCheck) break;
5757
5758 if(pIes->SSID.present)
5759 {
5760 for(i = 0; i < pFilter->SSIDs.numOfSSIDs; i++)
5761 {
5762 fCheck = csrIsSsidMatch( pMac, pFilter->SSIDs.SSIDList[i].SSID.ssId, pFilter->SSIDs.SSIDList[i].SSID.length,
5763 pIes->SSID.ssid,
5764 pIes->SSID.num_ssid, eANI_BOOLEAN_TRUE );
5765 if ( fCheck ) break;
5766 }
5767 if(!fCheck) break;
5768 }
5769 fCheck = eANI_BOOLEAN_TRUE;
5770 for(i = 0; i < pFilter->BSSIDs.numOfBSSIDs; i++)
5771 {
5772 fCheck = csrIsBssidMatch( pMac, (tCsrBssid *)&pFilter->BSSIDs.bssid[i], (tCsrBssid *)pBssDesc->bssId );
5773 if ( fCheck ) break;
5774
5775 if (pFilter->p2pResult && pIes->P2PBeaconProbeRes.present)
5776 {
5777 fCheck = csrIsBssidMatch( pMac, (tCsrBssid *)&pFilter->BSSIDs.bssid[i],
5778 (tCsrBssid *)pIes->P2PBeaconProbeRes.P2PDeviceInfo.P2PDeviceAddress );
5779
5780 if ( fCheck ) break;
5781 }
5782 }
5783 if(!fCheck) break;
5784
5785 fCheck = eANI_BOOLEAN_TRUE;
5786 for(i = 0; i < pFilter->ChannelInfo.numOfChannels; i++)
5787 {
5788 fCheck = csrIsChannelBandMatch( pMac, pFilter->ChannelInfo.ChannelList[i], pBssDesc );
5789 if ( fCheck ) break;
5790 }
5791 if(!fCheck)
5792 break;
5793#if defined WLAN_FEATURE_VOWIFI
5794 /* If this is for measurement filtering */
5795 if( pFilter->fMeasurement )
5796 {
5797 fRC = eANI_BOOLEAN_TRUE;
5798 break;
5799 }
5800#endif
5801 if ( !csrIsPhyModeMatch( pMac, pFilter->phyMode, pBssDesc, NULL, NULL, pIes ) ) break;
Leela Venkata Kiran Kumar Reddy Chiralae208a832014-04-27 22:34:25 -07005802 if ( (!pFilter->bWPSAssociation) && (!pFilter->bOSENAssociation) &&
Abhishek Singh658d4de2014-06-26 10:53:15 +05305803#ifdef WLAN_FEATURE_11W
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305804 !csrIsSecurityMatch( pMac, &pFilter->authType,
5805 &pFilter->EncryptionType,
5806 &pFilter->mcEncryptionType,
5807 &pFilter->MFPEnabled,
5808 &pFilter->MFPRequired,
5809 &pFilter->MFPCapable,
5810 pBssDesc, pIes, pNegAuth,
Abhishek Singh658d4de2014-06-26 10:53:15 +05305811 pNegUc, pNegMc )
5812#else
5813 !csrIsSecurityMatch( pMac, &pFilter->authType,
5814 &pFilter->EncryptionType,
5815 &pFilter->mcEncryptionType,
5816 NULL, NULL, NULL,
5817 pBssDesc, pIes, pNegAuth,
5818 pNegUc, pNegMc )
5819#endif
5820 ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005821 if ( !csrIsCapabilitiesMatch( pMac, pFilter->BSSType, pBssDesc ) ) break;
5822 if ( !csrIsRateSetMatch( pMac, &pIes->SuppRates, &pIes->ExtSuppRates ) ) break;
5823 //Tush-QoS: validate first if asked for APSD or WMM association
5824 if ( (eCsrRoamWmmQbssOnly == pMac->roam.configParam.WMMSupportMode) &&
5825 !CSR_IS_QOS_BSS(pIes) )
5826 break;
5827 //Check country. check even when pb is NULL because we may want to make sure
5828 //AP has a country code in it if fEnforceCountryCodeMatch is set.
5829 pb = ( pFilter->countryCode[0] ) ? ( pFilter->countryCode) : NULL;
5830
5831 fCheck = csrMatchCountryCode( pMac, pb, pIes );
5832 if(!fCheck)
5833 break;
5834
5835#ifdef WLAN_FEATURE_VOWIFI_11R
Hema Aparna Medicharlaf9dec8d2015-04-29 12:37:06 +05305836 if (pFilter->MDID.mdiePresent && csrRoamIs11rAssoc(pMac))
Jeff Johnson295189b2012-06-20 16:38:30 -07005837 {
5838 if (pBssDesc->mdiePresent)
5839 {
5840 if (pFilter->MDID.mobilityDomain != (pBssDesc->mdie[1] << 8 | pBssDesc->mdie[0]))
5841 break;
5842 }
5843 else
5844 break;
5845 }
5846#endif
5847 fRC = eANI_BOOLEAN_TRUE;
5848
5849 } while( 0 );
5850 if( ppIes )
5851 {
5852 *ppIes = pIes;
5853 }
5854 else if( pIes )
5855 {
Kiet Lam64c1b492013-07-12 13:56:44 +05305856 vos_mem_free(pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07005857 }
5858
5859 return( fRC );
5860}
5861
5862tANI_BOOLEAN csrMatchConnectedBSSSecurity( tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile,
5863 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
5864{
5865 tCsrEncryptionList ucEncryptionList, mcEncryptionList;
5866 tCsrAuthList authList;
5867
5868 ucEncryptionList.numEntries = 1;
5869 ucEncryptionList.encryptionType[0] = pProfile->EncryptionType;
5870
5871 mcEncryptionList.numEntries = 1;
5872 mcEncryptionList.encryptionType[0] = pProfile->mcEncryptionType;
5873
5874 authList.numEntries = 1;
5875 authList.authType[0] = pProfile->AuthType;
5876
Abhishek Singh3b56d3a2014-06-25 12:37:39 +05305877 return( csrIsSecurityMatch( pMac, &authList, &ucEncryptionList,
5878 &mcEncryptionList, NULL, NULL, NULL,
5879 pBssDesc, pIes, NULL, NULL, NULL ));
Jeff Johnson295189b2012-06-20 16:38:30 -07005880
5881}
5882
5883
5884tANI_BOOLEAN csrMatchBSSToConnectProfile( tHalHandle hHal, tCsrRoamConnectedProfile *pProfile,
5885 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes )
5886{
5887 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
5888 tANI_BOOLEAN fRC = eANI_BOOLEAN_FALSE, fCheck;
5889 tDot11fBeaconIEs *pIesLocal = pIes;
5890
5891 do {
5892 if( !pIes )
5893 {
5894 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal)))
5895 {
5896 break;
5897 }
5898 }
5899 fCheck = eANI_BOOLEAN_TRUE;
5900 if(pIesLocal->SSID.present)
5901 {
5902 tANI_BOOLEAN fCheckSsid = eANI_BOOLEAN_FALSE;
5903 if(pProfile->SSID.length)
5904 {
5905 fCheckSsid = eANI_BOOLEAN_TRUE;
5906 }
5907 fCheck = csrIsSsidMatch( pMac, pProfile->SSID.ssId, pProfile->SSID.length,
5908 pIesLocal->SSID.ssid, pIesLocal->SSID.num_ssid, fCheckSsid );
5909 if(!fCheck) break;
5910 }
5911 if ( !csrMatchConnectedBSSSecurity( pMac, pProfile, pBssDesc, pIesLocal) ) break;
5912 if ( !csrIsCapabilitiesMatch( pMac, pProfile->BSSType, pBssDesc ) ) break;
5913 if ( !csrIsRateSetMatch( pMac, &pIesLocal->SuppRates, &pIesLocal->ExtSuppRates ) ) break;
5914 fCheck = csrIsChannelBandMatch( pMac, pProfile->operationChannel, pBssDesc );
5915 if(!fCheck)
5916 break;
5917
5918 fRC = eANI_BOOLEAN_TRUE;
5919
5920 } while( 0 );
5921
5922 if( !pIes && pIesLocal )
5923 {
5924 //locally allocated
Kiet Lam64c1b492013-07-12 13:56:44 +05305925 vos_mem_free(pIesLocal);
Jeff Johnson295189b2012-06-20 16:38:30 -07005926 }
5927
5928 return( fRC );
5929}
5930
5931
5932
Masti, Narayanraddi3f5affe2015-01-08 12:10:08 +05305933void csrAddRateBitmap(tANI_U8 rate, tANI_U16 *pRateBitmap)
5934{
5935 tANI_U16 rateBitmap;
5936 tANI_U16 n = BITS_OFF( rate, CSR_DOT11_BASIC_RATE_MASK );
5937 rateBitmap = *pRateBitmap;
5938 switch(n)
5939 {
5940 case SIR_MAC_RATE_1:
5941 rateBitmap |= SIR_MAC_RATE_1_BITMAP;
5942 break;
5943 case SIR_MAC_RATE_2:
5944 rateBitmap |= SIR_MAC_RATE_2_BITMAP;
5945 break;
5946 case SIR_MAC_RATE_5_5:
5947 rateBitmap |= SIR_MAC_RATE_5_5_BITMAP;
5948 break;
5949 case SIR_MAC_RATE_11:
5950 rateBitmap |= SIR_MAC_RATE_11_BITMAP;
5951 break;
5952 case SIR_MAC_RATE_6:
5953 rateBitmap |= SIR_MAC_RATE_6_BITMAP;
5954 break;
5955 case SIR_MAC_RATE_9:
5956 rateBitmap |= SIR_MAC_RATE_9_BITMAP;
5957 break;
5958 case SIR_MAC_RATE_12:
5959 rateBitmap |= SIR_MAC_RATE_12_BITMAP;
5960 break;
5961 case SIR_MAC_RATE_18:
5962 rateBitmap |= SIR_MAC_RATE_18_BITMAP;
5963 break;
5964 case SIR_MAC_RATE_24:
5965 rateBitmap |= SIR_MAC_RATE_24_BITMAP;
5966 break;
5967 case SIR_MAC_RATE_36:
5968 rateBitmap |= SIR_MAC_RATE_36_BITMAP;
5969 break;
5970 case SIR_MAC_RATE_48:
5971 rateBitmap |= SIR_MAC_RATE_48_BITMAP;
5972 break;
5973 case SIR_MAC_RATE_54:
5974 rateBitmap |= SIR_MAC_RATE_54_BITMAP;
5975 break;
5976 }
5977 *pRateBitmap = rateBitmap;
5978}
5979
5980
5981
5982tANI_BOOLEAN csrIsRateAlreadyPresent(tANI_U8 rate, tANI_U16 rateBitmap)
5983{
5984 tANI_U16 n = BITS_OFF( rate, CSR_DOT11_BASIC_RATE_MASK );
5985
5986 switch(n)
5987 {
5988 case SIR_MAC_RATE_1:
5989 rateBitmap &= SIR_MAC_RATE_1_BITMAP;
5990 break;
5991 case SIR_MAC_RATE_2:
5992 rateBitmap &= SIR_MAC_RATE_2_BITMAP;
5993 break;
5994 case SIR_MAC_RATE_5_5:
5995 rateBitmap &= SIR_MAC_RATE_5_5_BITMAP;
5996 break;
5997 case SIR_MAC_RATE_11:
5998 rateBitmap &= SIR_MAC_RATE_11_BITMAP;
5999 break;
6000 case SIR_MAC_RATE_6:
6001 rateBitmap &= SIR_MAC_RATE_6_BITMAP;
6002 break;
6003 case SIR_MAC_RATE_9:
6004 rateBitmap &= SIR_MAC_RATE_9_BITMAP;
6005 break;
6006 case SIR_MAC_RATE_12:
6007 rateBitmap &= SIR_MAC_RATE_12_BITMAP;
6008 break;
6009 case SIR_MAC_RATE_18:
6010 rateBitmap &= SIR_MAC_RATE_18_BITMAP;
6011 break;
6012 case SIR_MAC_RATE_24:
6013 rateBitmap &= SIR_MAC_RATE_24_BITMAP;
6014 break;
6015 case SIR_MAC_RATE_36:
6016 rateBitmap &= SIR_MAC_RATE_36_BITMAP;
6017 break;
6018 case SIR_MAC_RATE_48:
6019 rateBitmap &= SIR_MAC_RATE_48_BITMAP;
6020 break;
6021 case SIR_MAC_RATE_54:
6022 rateBitmap &= SIR_MAC_RATE_54_BITMAP;
6023 break;
6024 }
6025 return !!rateBitmap;
6026}
6027
6028
6029
Jeff Johnson295189b2012-06-20 16:38:30 -07006030tANI_BOOLEAN csrRatesIsDot11RateSupported( tHalHandle hHal, tANI_U8 rate )
6031{
6032 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
6033 tANI_U16 n = BITS_OFF( rate, CSR_DOT11_BASIC_RATE_MASK );
6034
6035 return csrIsAggregateRateSupported( pMac, n );
6036}
6037
6038
6039tANI_U16 csrRatesMacPropToDot11( tANI_U16 Rate )
6040{
6041 tANI_U16 ConvertedRate = Rate;
6042
6043 switch( Rate )
6044 {
6045 case SIR_MAC_RATE_1:
6046 ConvertedRate = 2;
6047 break;
6048 case SIR_MAC_RATE_2:
6049 ConvertedRate = 4;
6050 break;
6051 case SIR_MAC_RATE_5_5:
6052 ConvertedRate = 11;
6053 break;
6054 case SIR_MAC_RATE_11:
6055 ConvertedRate = 22;
6056 break;
6057
6058 case SIR_MAC_RATE_6:
6059 ConvertedRate = 12;
6060 break;
6061 case SIR_MAC_RATE_9:
6062 ConvertedRate = 18;
6063 break;
6064 case SIR_MAC_RATE_12:
6065 ConvertedRate = 24;
6066 break;
6067 case SIR_MAC_RATE_18:
6068 ConvertedRate = 36;
6069 break;
6070 case SIR_MAC_RATE_24:
6071 ConvertedRate = 48;
6072 break;
6073 case SIR_MAC_RATE_36:
6074 ConvertedRate = 72;
6075 break;
6076 case SIR_MAC_RATE_42:
6077 ConvertedRate = 84;
6078 break;
6079 case SIR_MAC_RATE_48:
6080 ConvertedRate = 96;
6081 break;
6082 case SIR_MAC_RATE_54:
6083 ConvertedRate = 108;
6084 break;
6085
6086 case SIR_MAC_RATE_72:
6087 ConvertedRate = 144;
6088 break;
6089 case SIR_MAC_RATE_84:
6090 ConvertedRate = 168;
6091 break;
6092 case SIR_MAC_RATE_96:
6093 ConvertedRate = 192;
6094 break;
6095 case SIR_MAC_RATE_108:
6096 ConvertedRate = 216;
6097 break;
6098 case SIR_MAC_RATE_126:
6099 ConvertedRate = 252;
6100 break;
6101 case SIR_MAC_RATE_144:
6102 ConvertedRate = 288;
6103 break;
6104 case SIR_MAC_RATE_168:
6105 ConvertedRate = 336;
6106 break;
6107 case SIR_MAC_RATE_192:
6108 ConvertedRate = 384;
6109 break;
6110 case SIR_MAC_RATE_216:
6111 ConvertedRate = 432;
6112 break;
6113 case SIR_MAC_RATE_240:
6114 ConvertedRate = 480;
6115 break;
6116
6117 case 0xff:
6118 ConvertedRate = 0;
6119 break;
6120 }
6121
6122 return ConvertedRate;
6123}
6124
6125
6126tANI_U16 csrRatesFindBestRate( tSirMacRateSet *pSuppRates, tSirMacRateSet *pExtRates, tSirMacPropRateSet *pPropRates )
6127{
6128 tANI_U8 i;
6129 tANI_U16 nBest;
6130
6131 nBest = pSuppRates->rate[ 0 ] & ( ~CSR_DOT11_BASIC_RATE_MASK );
6132
6133 if(pSuppRates->numRates > SIR_MAC_RATESET_EID_MAX)
6134 {
6135 pSuppRates->numRates = SIR_MAC_RATESET_EID_MAX;
6136 }
6137
6138 for ( i = 1U; i < pSuppRates->numRates; ++i )
6139 {
6140 nBest = (tANI_U16)CSR_MAX( nBest, pSuppRates->rate[ i ] & ( ~CSR_DOT11_BASIC_RATE_MASK ) );
6141 }
6142
6143 if ( NULL != pExtRates )
6144 {
6145 for ( i = 0U; i < pExtRates->numRates; ++i )
6146 {
6147 nBest = (tANI_U16)CSR_MAX( nBest, pExtRates->rate[ i ] & ( ~CSR_DOT11_BASIC_RATE_MASK ) );
6148 }
6149 }
6150
6151 if ( NULL != pPropRates )
6152 {
6153 for ( i = 0U; i < pPropRates->numPropRates; ++i )
6154 {
6155 nBest = (tANI_U16)CSR_MAX( nBest, csrRatesMacPropToDot11( pPropRates->propRate[ i ] ) );
6156 }
6157 }
6158
6159 return nBest;
6160}
6161
6162
6163void csrReleaseProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile)
6164{
6165 if(pProfile)
6166 {
6167 if(pProfile->BSSIDs.bssid)
6168 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306169 vos_mem_free(pProfile->BSSIDs.bssid);
Jeff Johnson295189b2012-06-20 16:38:30 -07006170 pProfile->BSSIDs.bssid = NULL;
6171 }
6172 if(pProfile->SSIDs.SSIDList)
6173 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306174 vos_mem_free(pProfile->SSIDs.SSIDList);
Jeff Johnson295189b2012-06-20 16:38:30 -07006175 pProfile->SSIDs.SSIDList = NULL;
6176 }
6177 if(pProfile->pWPAReqIE)
6178 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306179 vos_mem_free(pProfile->pWPAReqIE);
Jeff Johnson295189b2012-06-20 16:38:30 -07006180 pProfile->pWPAReqIE = NULL;
6181 }
6182 if(pProfile->pRSNReqIE)
6183 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306184 vos_mem_free(pProfile->pRSNReqIE);
Jeff Johnson295189b2012-06-20 16:38:30 -07006185 pProfile->pRSNReqIE = NULL;
6186 }
6187#ifdef FEATURE_WLAN_WAPI
6188 if(pProfile->pWAPIReqIE)
6189 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306190 vos_mem_free(pProfile->pWAPIReqIE);
Jeff Johnson295189b2012-06-20 16:38:30 -07006191 pProfile->pWAPIReqIE = NULL;
6192 }
6193#endif /* FEATURE_WLAN_WAPI */
6194
Agarwal Ashish4f616132013-12-30 23:32:50 +05306195 if (pProfile->nAddIEScanLength)
Jeff Johnson295189b2012-06-20 16:38:30 -07006196 {
Ganesh Kondabattini7500fb32015-04-10 14:50:32 +05306197 memset(pProfile->addIEScan, 0 , SIR_MAC_MAX_ADD_IE_LENGTH+2);
Agarwal Ashish4f616132013-12-30 23:32:50 +05306198 pProfile->nAddIEScanLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07006199 }
6200
6201 if(pProfile->pAddIEAssoc)
6202 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306203 vos_mem_free(pProfile->pAddIEAssoc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006204 pProfile->pAddIEAssoc = NULL;
6205 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006206 if(pProfile->ChannelInfo.ChannelList)
6207 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306208 vos_mem_free(pProfile->ChannelInfo.ChannelList);
Jeff Johnson295189b2012-06-20 16:38:30 -07006209 pProfile->ChannelInfo.ChannelList = NULL;
6210 }
Kiet Lam64c1b492013-07-12 13:56:44 +05306211 vos_mem_set(pProfile, sizeof(tCsrRoamProfile), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07006212 }
6213}
6214
6215void csrFreeScanFilter(tpAniSirGlobal pMac, tCsrScanResultFilter *pScanFilter)
6216{
6217 if(pScanFilter->BSSIDs.bssid)
6218 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306219 vos_mem_free(pScanFilter->BSSIDs.bssid);
Jeff Johnson295189b2012-06-20 16:38:30 -07006220 pScanFilter->BSSIDs.bssid = NULL;
6221 }
6222 if(pScanFilter->ChannelInfo.ChannelList)
6223 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306224 vos_mem_free(pScanFilter->ChannelInfo.ChannelList);
Jeff Johnson295189b2012-06-20 16:38:30 -07006225 pScanFilter->ChannelInfo.ChannelList = NULL;
6226 }
6227 if(pScanFilter->SSIDs.SSIDList)
6228 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306229 vos_mem_free(pScanFilter->SSIDs.SSIDList);
Jeff Johnson295189b2012-06-20 16:38:30 -07006230 pScanFilter->SSIDs.SSIDList = NULL;
6231 }
6232}
6233
6234
6235void csrFreeRoamProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
6236{
6237 tCsrRoamSession *pSession = &pMac->roam.roamSession[sessionId];
6238
6239 if(pSession->pCurRoamProfile)
6240 {
6241 csrReleaseProfile(pMac, pSession->pCurRoamProfile);
Kiet Lam64c1b492013-07-12 13:56:44 +05306242 vos_mem_free(pSession->pCurRoamProfile);
Jeff Johnson295189b2012-06-20 16:38:30 -07006243 pSession->pCurRoamProfile = NULL;
6244 }
6245}
6246
6247
6248void csrFreeConnectBssDesc(tpAniSirGlobal pMac, tANI_U32 sessionId)
6249{
6250 tCsrRoamSession *pSession = &pMac->roam.roamSession[sessionId];
6251
6252 if(pSession->pConnectBssDesc)
6253 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306254 vos_mem_free(pSession->pConnectBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006255 pSession->pConnectBssDesc = NULL;
6256 }
6257}
6258
6259
6260
6261tSirResultCodes csrGetDisassocRspStatusCode( tSirSmeDisassocRsp *pSmeDisassocRsp )
6262{
6263 tANI_U8 *pBuffer = (tANI_U8 *)pSmeDisassocRsp;
6264 tANI_U32 ret;
6265
6266 pBuffer += (sizeof(tANI_U16) + sizeof(tANI_U16) + sizeof(tSirMacAddr));
6267 //tSirResultCodes is an enum, assuming is 32bit
6268 //If we cannot make this assumption, use copymemory
6269 pal_get_U32( pBuffer, &ret );
6270
6271 return( ( tSirResultCodes )ret );
6272}
6273
6274
6275tSirResultCodes csrGetDeAuthRspStatusCode( tSirSmeDeauthRsp *pSmeRsp )
6276{
6277 tANI_U8 *pBuffer = (tANI_U8 *)pSmeRsp;
6278 tANI_U32 ret;
6279
Leela Venkata Kiran Kumar Reddy Chirala56df73f2014-01-30 14:18:00 -08006280 pBuffer += (sizeof(tANI_U16) + sizeof(tANI_U16) + sizeof(tANI_U8) + sizeof(tANI_U16));
Jeff Johnson295189b2012-06-20 16:38:30 -07006281 //tSirResultCodes is an enum, assuming is 32bit
6282 //If we cannot make this assumption, use copymemory
6283 pal_get_U32( pBuffer, &ret );
6284
6285 return( ( tSirResultCodes )ret );
6286}
6287
6288#if 0
6289tSirScanType csrGetScanType(tANI_U8 chnId, eRegDomainId domainId, tANI_U8 *countryCode)
6290{
6291 tSirScanType scanType = eSIR_PASSIVE_SCAN;
6292 tANI_U8 cc = 0;
6293
6294 while (cc++ < gCsrDomainChnInfo[domainId].numChannels)
6295 {
6296 if(chnId == gCsrDomainChnInfo[domainId].chnInfo[cc].chnId)
6297 {
6298 scanType = gCsrDomainChnInfo[domainId].chnInfo[cc].scanType;
6299 break;
6300 }
6301 }
6302
6303 return (scanType);
6304}
6305#endif
6306
6307tSirScanType csrGetScanType(tpAniSirGlobal pMac, tANI_U8 chnId)
6308{
6309 tSirScanType scanType = eSIR_PASSIVE_SCAN;
6310 eNVChannelEnabledType channelEnabledType;
6311
6312 channelEnabledType = vos_nv_getChannelEnabledState(chnId);
6313 if( NV_CHANNEL_ENABLE == channelEnabledType)
6314 {
6315 scanType = eSIR_ACTIVE_SCAN;
6316 }
6317 return (scanType);
6318}
6319
6320
6321tANI_U8 csrToUpper( tANI_U8 ch )
6322{
6323 tANI_U8 chOut;
6324
6325 if ( ch >= 'a' && ch <= 'z' )
6326 {
6327 chOut = ch - 'a' + 'A';
6328 }
6329 else
6330 {
6331 chOut = ch;
6332 }
6333 return( chOut );
6334}
6335
6336
6337tSirBssType csrTranslateBsstypeToMacType(eCsrRoamBssType csrtype)
6338{
6339 tSirBssType ret;
6340
6341 switch(csrtype)
6342 {
6343 case eCSR_BSS_TYPE_INFRASTRUCTURE:
6344 ret = eSIR_INFRASTRUCTURE_MODE;
6345 break;
6346 case eCSR_BSS_TYPE_IBSS:
6347 case eCSR_BSS_TYPE_START_IBSS:
6348 ret = eSIR_IBSS_MODE;
6349 break;
6350 case eCSR_BSS_TYPE_WDS_AP:
6351 ret = eSIR_BTAMP_AP_MODE;
6352 break;
6353 case eCSR_BSS_TYPE_WDS_STA:
6354 ret = eSIR_BTAMP_STA_MODE;
6355 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006356 case eCSR_BSS_TYPE_INFRA_AP:
6357 ret = eSIR_INFRA_AP_MODE;
6358 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006359 case eCSR_BSS_TYPE_ANY:
6360 default:
6361 ret = eSIR_AUTO_MODE;
6362 break;
6363 }
6364
6365 return (ret);
6366}
6367
6368
6369//This function use the parameters to decide the CFG value.
6370//CSR never sets WNI_CFG_DOT11_MODE_ALL to the CFG
6371//So PE should not see WNI_CFG_DOT11_MODE_ALL when it gets the CFG value
Jeff Johnson295189b2012-06-20 16:38:30 -07006372eCsrCfgDot11Mode csrGetCfgDot11ModeFromCsrPhyMode(tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tANI_BOOLEAN fProprietary)
Jeff Johnson295189b2012-06-20 16:38:30 -07006373{
6374 tANI_U32 cfgDot11Mode = eCSR_CFG_DOT11_MODE_ABG;
6375
6376 switch(phyMode)
6377 {
6378 case eCSR_DOT11_MODE_11a:
6379 case eCSR_DOT11_MODE_11a_ONLY:
6380 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
6381 break;
6382 case eCSR_DOT11_MODE_11b:
6383 case eCSR_DOT11_MODE_11b_ONLY:
6384 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
6385 break;
6386 case eCSR_DOT11_MODE_11g:
6387 case eCSR_DOT11_MODE_11g_ONLY:
Jeff Johnson295189b2012-06-20 16:38:30 -07006388 if(pProfile && (CSR_IS_INFRA_AP(pProfile)) && (phyMode == eCSR_DOT11_MODE_11g_ONLY))
6389 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G_ONLY;
6390 else
Jeff Johnson295189b2012-06-20 16:38:30 -07006391 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
6392 break;
6393 case eCSR_DOT11_MODE_11n:
6394 if(fProprietary)
6395 {
6396 cfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
6397 }
6398 else
6399 {
6400 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
6401 }
6402 break;
6403 case eCSR_DOT11_MODE_11n_ONLY:
Jeff Johnson295189b2012-06-20 16:38:30 -07006404 if(pProfile && CSR_IS_INFRA_AP(pProfile))
6405 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N_ONLY;
6406 else
Jeff Johnson295189b2012-06-20 16:38:30 -07006407 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
6408 break;
6409 case eCSR_DOT11_MODE_TAURUS:
6410 cfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
6411 break;
6412 case eCSR_DOT11_MODE_abg:
6413 cfgDot11Mode = eCSR_CFG_DOT11_MODE_ABG;
6414 break;
6415 case eCSR_DOT11_MODE_AUTO:
6416 cfgDot11Mode = eCSR_CFG_DOT11_MODE_AUTO;
6417 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07006418
6419#ifdef WLAN_FEATURE_11AC
6420 case eCSR_DOT11_MODE_11ac:
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006421 if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
6422 {
6423 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
6424 }
6425 else
6426 {
Ravi Joshia96ceb42013-05-20 18:52:39 -07006427 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006428 }
Jeff Johnsone7245742012-09-05 17:12:55 -07006429 break;
6430 case eCSR_DOT11_MODE_11ac_ONLY:
Ravi Joshia96ceb42013-05-20 18:52:39 -07006431 if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
6432 {
6433 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC_ONLY;
6434 }
6435 else
6436 {
6437 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
6438 }
Jeff Johnsone7245742012-09-05 17:12:55 -07006439 break;
6440#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006441 default:
6442 //No need to assign anything here
6443 break;
6444 }
6445
6446 return (cfgDot11Mode);
6447}
6448
6449
6450eHalStatus csrSetRegulatoryDomain(tpAniSirGlobal pMac, v_REGDOMAIN_t domainId, tANI_BOOLEAN *pfRestartNeeded)
6451{
6452 eHalStatus status = eHAL_STATUS_SUCCESS;
6453 tANI_BOOLEAN fRestart;
6454
6455 if(pMac->scan.domainIdCurrent == domainId)
6456 {
6457 //no change
6458 fRestart = eANI_BOOLEAN_FALSE;
6459 }
6460 else if( !pMac->roam.configParam.fEnforceDefaultDomain )
6461 {
6462 pMac->scan.domainIdCurrent = domainId;
6463 fRestart = eANI_BOOLEAN_TRUE;
6464 }
6465 else
6466 {
6467 //We cannot change the domain
6468 status = eHAL_STATUS_CSR_WRONG_STATE;
6469 fRestart = eANI_BOOLEAN_FALSE;
6470 }
6471 if(pfRestartNeeded)
6472 {
6473 *pfRestartNeeded = fRestart;
6474 }
6475
6476 return (status);
6477}
6478
6479
6480v_REGDOMAIN_t csrGetCurrentRegulatoryDomain(tpAniSirGlobal pMac)
6481{
6482 return (pMac->scan.domainIdCurrent);
6483}
6484
Jeff Johnson295189b2012-06-20 16:38:30 -07006485
Kiet Lam6c583332013-10-14 05:37:09 +05306486eHalStatus csrGetRegulatoryDomainForCountry
6487(
6488tpAniSirGlobal pMac,
6489tANI_U8 *pCountry,
6490v_REGDOMAIN_t *pDomainId,
6491v_CountryInfoSource_t source
6492)
Jeff Johnson295189b2012-06-20 16:38:30 -07006493{
6494 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
6495 VOS_STATUS vosStatus;
6496 v_COUNTRYCODE_t countryCode;
6497 v_REGDOMAIN_t domainId;
6498
6499 if(pCountry)
6500 {
6501 countryCode[0] = pCountry[0];
6502 countryCode[1] = pCountry[1];
Kiet Lam6c583332013-10-14 05:37:09 +05306503 vosStatus = vos_nv_getRegDomainFromCountryCode(&domainId,
6504 countryCode,
6505 source);
6506
Jeff Johnson295189b2012-06-20 16:38:30 -07006507 if( VOS_IS_STATUS_SUCCESS(vosStatus) )
6508 {
6509 if( pDomainId )
6510 {
6511 *pDomainId = domainId;
6512 }
6513 status = eHAL_STATUS_SUCCESS;
6514 }
6515 else
6516 {
Agarwal Ashishe3cca2a2013-07-21 03:01:48 +05306517 smsLog(pMac, LOGW, FL(" Couldn't find domain for country code %c%c"), pCountry[0], pCountry[1]);
Jeff Johnson295189b2012-06-20 16:38:30 -07006518 status = eHAL_STATUS_INVALID_PARAMETER;
6519 }
6520 }
6521
6522 return (status);
6523}
6524
6525//To check whether a country code matches the one in the IE
6526//Only check the first two characters, ignoring in/outdoor
6527//pCountry -- caller allocated buffer contain the country code that is checking against
6528//the one in pIes. It can be NULL.
6529//caller must provide pIes, it cannot be NULL
6530//This function always return TRUE if 11d support is not turned on.
6531tANI_BOOLEAN csrMatchCountryCode( tpAniSirGlobal pMac, tANI_U8 *pCountry, tDot11fBeaconIEs *pIes )
6532{
6533 tANI_BOOLEAN fRet = eANI_BOOLEAN_TRUE;
Jeff Johnson43971f52012-07-17 12:26:56 -07006534 v_REGDOMAIN_t domainId = REGDOMAIN_COUNT; //This is init to invalid value
Jeff Johnson295189b2012-06-20 16:38:30 -07006535 eHalStatus status;
6536
6537 do
6538 {
6539 if( !csrIs11dSupported( pMac) )
6540 {
6541 break;
6542 }
6543 if( !pIes )
6544 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08006545 smsLog(pMac, LOGE, FL(" No IEs"));
Jeff Johnson295189b2012-06-20 16:38:30 -07006546 break;
6547 }
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006548 if( pMac->roam.configParam.fEnforceDefaultDomain ||
6549 pMac->roam.configParam.fEnforceCountryCodeMatch )
Jeff Johnson295189b2012-06-20 16:38:30 -07006550 {
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006551 //Make sure this country is recognizable
6552 if( pIes->Country.present )
Jeff Johnson295189b2012-06-20 16:38:30 -07006553 {
Kiet Lam6c583332013-10-14 05:37:09 +05306554 status = csrGetRegulatoryDomainForCountry(pMac,
6555 pIes->Country.country,
6556 &domainId, COUNTRY_QUERY);
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006557 if( !HAL_STATUS_SUCCESS( status ) )
6558 {
Kiet Lam6c583332013-10-14 05:37:09 +05306559 status = csrGetRegulatoryDomainForCountry(pMac,
6560 pMac->scan.countryCode11d,
6561 (v_REGDOMAIN_t *) &domainId,
6562 COUNTRY_QUERY);
Gowri Deepthiff9adf92012-12-13 15:09:56 -08006563 if( !HAL_STATUS_SUCCESS( status ) )
6564 {
6565 fRet = eANI_BOOLEAN_FALSE;
6566 break;
6567 }
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006568 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006569 }
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006570 //check whether it is needed to enforce to the default regulatory domain first
6571 if( pMac->roam.configParam.fEnforceDefaultDomain )
Jeff Johnson295189b2012-06-20 16:38:30 -07006572 {
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006573 if( domainId != pMac->scan.domainIdCurrent )
6574 {
6575 fRet = eANI_BOOLEAN_FALSE;
6576 break;
6577 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006578 }
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006579 if( pMac->roam.configParam.fEnforceCountryCodeMatch )
6580 {
Jeff Johnson43971f52012-07-17 12:26:56 -07006581 if( domainId >= REGDOMAIN_COUNT )
Madan Mohan Koyyalamudi42af1782012-10-21 12:13:23 -07006582 {
6583 fRet = eANI_BOOLEAN_FALSE;
6584 break;
6585 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006586 }
6587 }
6588 if( pCountry )
6589 {
6590 tANI_U32 i;
6591
6592 if( !pIes->Country.present )
6593 {
6594 fRet = eANI_BOOLEAN_FALSE;
6595 break;
6596 }
6597 // Convert the CountryCode characters to upper
6598 for ( i = 0; i < WNI_CFG_COUNTRY_CODE_LEN - 1; i++ )
6599 {
6600 pCountry[i] = csrToUpper( pCountry[i] );
6601 }
Kiet Lam64c1b492013-07-12 13:56:44 +05306602 if (!vos_mem_compare(pIes->Country.country, pCountry,
6603 WNI_CFG_COUNTRY_CODE_LEN - 1))
Jeff Johnson295189b2012-06-20 16:38:30 -07006604 {
6605 fRet = eANI_BOOLEAN_FALSE;
6606 break;
6607 }
6608 }
6609 } while(0);
6610
6611 return (fRet);
6612}
6613
6614#if 0
6615eHalStatus csrSetCountryDomainMapping(tpAniSirGlobal pMac, tCsrCountryDomainMapping *pCountryDomainMapping)
6616{
6617 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
6618 tANI_U32 i, j;
6619 tANI_BOOLEAN fDomainChanged = eANI_BOOLEAN_FALSE;
6620 tANI_U8 countryCode[WNI_CFG_COUNTRY_CODE_LEN];
6621
6622 i = WNI_CFG_COUNTRY_CODE_LEN;
6623 //Get the currently used country code
6624 status = ccmCfgGetStr(pMac, WNI_CFG_COUNTRY_CODE, countryCode, &i);
6625 if(HAL_STATUS_SUCCESS(status))
6626 {
6627 if(pCountryDomainMapping && pCountryDomainMapping->numEntry)
6628 {
6629 for(i = 0; i < pCountryDomainMapping->numEntry; i++)
6630 {
6631 for(j = 0; j < eCSR_NUM_COUNTRY_INDEX; j++)
6632 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306633 if (vos_mem_compare(gCsrCountryInfo[j].countryCode,
6634 pCountryDomainMapping->pCountryInfo[i].countryCode,
6635 2))
Jeff Johnson295189b2012-06-20 16:38:30 -07006636 {
6637 if(gCsrCountryInfo[j].domainId != pCountryDomainMapping->pCountryInfo[i].domainId)
6638 {
6639 gCsrCountryInfo[j].domainId = pCountryDomainMapping->pCountryInfo[i].domainId;
6640 //Check whether it matches the currently used country code
6641 //If matching, need to update base on the new domain setting.
Kiet Lam64c1b492013-07-12 13:56:44 +05306642 if (vos_mem_compare(countryCode,
6643 pCountryDomainMapping->pCountryInfo[i].countryCode,
6644 2))
Jeff Johnson295189b2012-06-20 16:38:30 -07006645 {
6646 fDomainChanged = eANI_BOOLEAN_TRUE;
6647 }
6648 }
6649 break;
6650 }
6651 }
6652 }
6653 status = eHAL_STATUS_SUCCESS;
6654 if(fDomainChanged)
6655 {
6656 tCsrChannel *pChannelList;
6657
6658 if(pMac->scan.f11dInfoApplied)
6659 {
6660 //11d info already applied. Let's reapply with the new domain setting
6661 if(pMac->scan.channels11d.numChannels)
6662 {
6663 pChannelList = &pMac->scan.channels11d;
6664 }
6665 else
6666 {
6667 pChannelList = &pMac->scan.base20MHzChannels;
6668 }
6669 }
6670 else
6671 {
6672 //no 11d so we use the base channelist from EEPROM
6673 pChannelList = &pMac->scan.base20MHzChannels;
6674 }
6675 //set the new domain's scan requirement to CFG
6676 csrSetCfgScanControlList(pMac, countryCode, pChannelList);
6677 }
6678 }
6679 }
6680
6681 return (status);
6682}
6683
6684eHalStatus csrSetDomainScanSetting(tpAniSirGlobal pMac, tCsrDomainFreqInfo *pDomainFreqInfo)
6685{
6686 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
6687 tANI_U32 i, j;
6688 tANI_U16 freq;
6689
6690 if(pDomainFreqInfo && pDomainFreqInfo->numEntry && (pDomainFreqInfo->domainId < NUM_REG_DOMAINS))
6691 {
6692 tCsrDomainChnInfo *pDomainChnInfo = &gCsrDomainChnInfo[pDomainFreqInfo->domainId];
6693
6694 for(j = 0; j < pDomainChnInfo->numChannels; j++)
6695 {
6696 if(HAL_STATUS_SUCCESS(halPhyChIdToFreqConversion(pDomainChnInfo->chnInfo[j].chnId, &freq)))
6697 {
6698 for(i = 0; i < pDomainFreqInfo->numEntry; i++)
6699 {
6700 if((pDomainFreqInfo->pCsrScanFreqInfo[i].nStartFreq <= freq) &&
6701 (freq <= pDomainFreqInfo->pCsrScanFreqInfo[i].nEndFreq))
6702 {
6703 pDomainChnInfo->chnInfo[j].scanType = pDomainFreqInfo->pCsrScanFreqInfo[i].scanType;
6704 break;
6705 }
6706 }
6707 }
6708 else
6709 {
6710 smsLog(pMac, LOGW, " Failed to get frequency of channel %d", pDomainChnInfo->chnInfo[j].chnId);
6711 }
6712 }
6713 status = eHAL_STATUS_SUCCESS;
6714 }
6715
6716 return (status);
6717}
6718#endif
6719
6720eHalStatus csrGetModifyProfileFields(tpAniSirGlobal pMac, tANI_U32 sessionId,
6721 tCsrRoamModifyProfileFields *pModifyProfileFields)
6722{
6723
6724 if(!pModifyProfileFields)
6725 {
6726 return eHAL_STATUS_FAILURE;
6727 }
6728
Kiet Lam64c1b492013-07-12 13:56:44 +05306729 vos_mem_copy(pModifyProfileFields,
6730 &pMac->roam.roamSession[sessionId].connectedProfile.modifyProfileFields,
6731 sizeof(tCsrRoamModifyProfileFields));
Jeff Johnson295189b2012-06-20 16:38:30 -07006732
6733 return eHAL_STATUS_SUCCESS;
6734}
6735
6736eHalStatus csrSetModifyProfileFields(tpAniSirGlobal pMac, tANI_U32 sessionId,
6737 tCsrRoamModifyProfileFields *pModifyProfileFields)
6738{
6739 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
6740
Kiet Lam64c1b492013-07-12 13:56:44 +05306741 vos_mem_copy(&pSession->connectedProfile.modifyProfileFields,
6742 pModifyProfileFields,
6743 sizeof(tCsrRoamModifyProfileFields));
Jeff Johnson295189b2012-06-20 16:38:30 -07006744
6745 return eHAL_STATUS_SUCCESS;
6746}
6747
6748
6749#if 0
6750/* ---------------------------------------------------------------------------
6751 \fn csrGetSupportedCountryCode
6752 \brief this function is to get a list of the country code current being supported
6753 \param pBuf - Caller allocated buffer with at least 3 bytes, upon success return,
6754 this has the country code list. 3 bytes for each country code. This may be NULL if
6755 caller wants to know the needed bytes.
6756 \param pbLen - Caller allocated, as input, it indicates the length of pBuf. Upon success return,
6757 this contains the length of the data in pBuf
6758 \return eHalStatus
6759 -------------------------------------------------------------------------------*/
6760eHalStatus csrGetSupportedCountryCode(tpAniSirGlobal pMac, tANI_U8 *pBuf, tANI_U32 *pbLen)
6761{
6762 tANI_U32 numOfCountry = sizeof( gCsrCountryInfo ) / sizeof( gCsrCountryInfo[0] );
6763 tANI_U32 numBytes = 0;
6764 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
6765
6766 if( pbLen )
6767 {
6768 numBytes = *pbLen;
6769 //Consider it ok, at least we can return the number of bytes needed;
6770 *pbLen = numOfCountry * WNI_CFG_COUNTRY_CODE_LEN;
6771 status = eHAL_STATUS_SUCCESS;
6772 if( pBuf && ( numBytes >= *pbLen ) )
6773 {
6774 //The ugly part starts.
6775 //We may need to alter the data structure and find a way to make this faster.
6776 tANI_U32 i;
6777
Kiet Lam64c1b492013-07-12 13:56:44 +05306778 for ( i = 0; i < numOfCountry; i++ )
Jeff Johnson295189b2012-06-20 16:38:30 -07006779 {
Kiet Lam64c1b492013-07-12 13:56:44 +05306780 vos_mem_copy(pBuf + ( i * WNI_CFG_COUNTRY_CODE_LEN ),
6781 gCsrCountryInfo[i].countryCode,
6782 WNI_CFG_COUNTRY_CODE_LEN);
Jeff Johnson295189b2012-06-20 16:38:30 -07006783 }
6784 }
6785 }
6786
6787 return ( status );
6788}
6789#endif
6790
6791/* ---------------------------------------------------------------------------
6792 \fn csrGetSupportedCountryCode
6793 \brief this function is to get a list of the country code current being supported
6794 \param pBuf - Caller allocated buffer with at least 3 bytes, upon success return,
6795 this has the country code list. 3 bytes for each country code. This may be NULL if
6796 caller wants to know the needed bytes.
6797 \param pbLen - Caller allocated, as input, it indicates the length of pBuf. Upon success return,
6798 this contains the length of the data in pBuf
6799 \return eHalStatus
6800 -------------------------------------------------------------------------------*/
6801eHalStatus csrGetSupportedCountryCode(tpAniSirGlobal pMac, tANI_U8 *pBuf, tANI_U32 *pbLen)
6802{
6803 eHalStatus status = eHAL_STATUS_SUCCESS;
6804 VOS_STATUS vosStatus;
6805 v_SIZE_t size = (v_SIZE_t)*pbLen;
6806
6807 vosStatus = vos_nv_getSupportedCountryCode( pBuf, &size, 1 );
6808 //eiter way, return the value back
6809 *pbLen = (tANI_U32)size;
6810
6811 //If pBuf is NULL, caller just want to get the size, consider it success
6812 if(pBuf)
6813 {
6814 if( VOS_IS_STATUS_SUCCESS( vosStatus ) )
6815 {
6816 tANI_U32 i, n = *pbLen / 3;
6817
6818 for( i = 0; i < n; i++ )
6819 {
6820 pBuf[i*3 + 2] = ' ';
6821 }
6822 }
6823 else
6824 {
6825 status = eHAL_STATUS_FAILURE;
6826 }
6827 }
6828
6829 return (status);
6830}
6831
6832
6833
6834//Upper layer to get the list of the base channels to scan for passively 11d info from csr
6835eHalStatus csrScanGetBaseChannels( tpAniSirGlobal pMac, tCsrChannelInfo * pChannelInfo )
6836{
6837 eHalStatus status = eHAL_STATUS_FAILURE;
6838
6839 do
6840 {
6841
6842 if(!pMac->scan.baseChannels.numChannels || !pChannelInfo)
6843 {
6844 break;
6845 }
Kiet Lam64c1b492013-07-12 13:56:44 +05306846 pChannelInfo->ChannelList = vos_mem_malloc(pMac->scan.baseChannels.numChannels);
6847 if ( NULL == pChannelInfo->ChannelList )
Jeff Johnson295189b2012-06-20 16:38:30 -07006848 {
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08006849 smsLog( pMac, LOGE, FL("csrScanGetBaseChannels: fail to allocate memory") );
Kiet Lam64c1b492013-07-12 13:56:44 +05306850 return eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006851 }
Kiet Lam64c1b492013-07-12 13:56:44 +05306852 vos_mem_copy(pChannelInfo->ChannelList,
6853 pMac->scan.baseChannels.channelList,
6854 pMac->scan.baseChannels.numChannels);
Jeff Johnson295189b2012-06-20 16:38:30 -07006855 pChannelInfo->numOfChannels = pMac->scan.baseChannels.numChannels;
6856
6857 }while(0);
6858
6859 return ( status );
6860}
6861
6862
6863tANI_BOOLEAN csrIsSetKeyAllowed(tpAniSirGlobal pMac, tANI_U32 sessionId)
6864{
6865 tANI_BOOLEAN fRet = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006866 tCsrRoamSession *pSession;
6867
6868 pSession =CSR_GET_SESSION(pMac, sessionId);
6869
6870 /*This condition is not working for infra state. When infra is in not-connected state
6871 * the pSession->pCurRoamProfile is NULL. And this function returns TRUE, that is incorrect.
6872 * Since SAP requires to set key without any BSS started, it needs this condition to be met.
6873 * In other words, this function is useless.
6874 * The current work-around is to process setcontext_rsp and removekey_rsp no matter what the
6875 * state is.
6876 */
Kiran Kumar Lokere3334fbb2013-03-07 12:36:05 -08006877 smsLog( pMac, LOG2, FL(" is not what it intends to. Must be revisit or removed") );
Jeff Johnson295189b2012-06-20 16:38:30 -07006878 if( (NULL == pSession) ||
6879 ( csrIsConnStateDisconnected( pMac, sessionId ) &&
6880 (pSession->pCurRoamProfile != NULL) &&
6881 (!(CSR_IS_INFRA_AP(pSession->pCurRoamProfile))) )
6882 )
6883 {
6884 fRet = eANI_BOOLEAN_FALSE;
6885 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006886
6887 return ( fRet );
6888}
6889
6890//no need to acquire lock for this basic function
6891tANI_U16 sme_ChnToFreq(tANI_U8 chanNum)
6892{
6893 int i;
6894
6895 for (i = 0; i < NUM_RF_CHANNELS; i++)
6896 {
6897 if (rfChannels[i].channelNum == chanNum)
6898 {
6899 return rfChannels[i].targetFreq;
6900 }
6901 }
6902
6903 return (0);
6904}
6905
6906/* Disconnect all active sessions by sending disassoc. This is mainly used to disconnect the remaining session when we
6907 * transition from concurrent sessions to a single session. The use case is Infra STA and wifi direct multiple sessions are up and
6908 * P2P session is removed. The Infra STA session remains and should resume BMPS if BMPS is enabled by default. However, there
6909 * are some issues seen with BMPS resume during this transition and this is a workaround which will allow the Infra STA session to
6910 * disconnect and auto connect back and enter BMPS this giving the same effect as resuming BMPS
6911 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006912
6913//Remove this code once SLM_Sessionization is supported
6914//BMPS_WORKAROUND_NOT_NEEDED
Jeff Johnson295189b2012-06-20 16:38:30 -07006915void csrDisconnectAllActiveSessions(tpAniSirGlobal pMac)
6916{
6917 tANI_U8 i;
6918
6919 /* Disconnect all the active sessions */
6920 for (i=0; i<CSR_ROAM_SESSION_MAX; i++)
6921 {
6922 if( CSR_IS_SESSION_VALID( pMac, i ) && !csrIsConnStateDisconnected( pMac, i ) )
6923 {
6924 csrRoamDisconnectInternal(pMac, i, eCSR_DISCONNECT_REASON_UNSPECIFIED);
6925 }
6926 }
6927}
Mohit Khanna349bc392012-09-11 17:24:52 -07006928
Madan Mohan Koyyalamudi470d2cf2012-09-28 14:43:44 -07006929#ifdef FEATURE_WLAN_LFR
6930tANI_BOOLEAN csrIsChannelPresentInList(
6931 tANI_U8 *pChannelList,
6932 int numChannels,
6933 tANI_U8 channel
6934 )
6935{
6936 int i = 0;
6937
6938 // Check for NULL pointer
Madan Mohan Koyyalamudidd3c9662012-11-09 17:39:30 -08006939 if (!pChannelList || (numChannels == 0))
6940 {
6941 return FALSE;
6942 }
Madan Mohan Koyyalamudi470d2cf2012-09-28 14:43:44 -07006943
6944 // Look for the channel in the list
6945 for (i = 0; i < numChannels; i++)
6946 {
6947 if (pChannelList[i] == channel)
6948 return TRUE;
6949 }
6950
6951 return FALSE;
6952}
6953
6954VOS_STATUS csrAddToChannelListFront(
6955 tANI_U8 *pChannelList,
6956 int numChannels,
6957 tANI_U8 channel
6958 )
6959{
6960 int i = 0;
6961
6962 // Check for NULL pointer
6963 if (!pChannelList) return eHAL_STATUS_E_NULL_VALUE;
6964
6965 // Make room for the addition. (Start moving from the back.)
6966 for (i = numChannels; i > 0; i--)
6967 {
6968 pChannelList[i] = pChannelList[i-1];
6969 }
6970
6971 // Now add the NEW channel...at the front
6972 pChannelList[0] = channel;
6973
6974 return eHAL_STATUS_SUCCESS;
6975}
6976#endif
Sushant Kaushike0d2cce2014-04-10 14:36:07 +05306977const char * sme_requestTypetoString(const v_U8_t requestType)
6978{
6979 switch (requestType)
6980 {
6981 CASE_RETURN_STRING( eCSR_SCAN_REQUEST_11D_SCAN );
6982 CASE_RETURN_STRING( eCSR_SCAN_REQUEST_FULL_SCAN );
6983 CASE_RETURN_STRING( eCSR_SCAN_IDLE_MODE_SCAN );
6984 CASE_RETURN_STRING( eCSR_SCAN_HO_BG_SCAN );
6985 CASE_RETURN_STRING( eCSR_SCAN_HO_PROBE_SCAN );
6986 CASE_RETURN_STRING( eCSR_SCAN_HO_NT_BG_SCAN );
6987 CASE_RETURN_STRING( eCSR_SCAN_P2P_DISCOVERY );
6988 CASE_RETURN_STRING( eCSR_SCAN_SOFTAP_CHANNEL_RANGE );
6989 CASE_RETURN_STRING( eCSR_SCAN_P2P_FIND_PEER );
6990 default:
6991 return "Unknown Scan Request Type";
6992 }
6993}