1 /*
2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 #include "oal_mem.h"
20 #include "wlan_types.h"
21 #include "mac_vap.h"
22 #include "mac_device.h"
23 #include "mac_resource.h"
24 #include "mac_regdomain.h"
25 #include "dmac_ext_if.h"
26 #include "hi_isr.h"
27 #include "hmac_ext_if.h"
28
29 #ifdef __cplusplus
30 #if __cplusplus
31 extern "C" {
32 #endif
33 #endif
34
35 /* ****************************************************************************
36 全局变量定义
37 **************************************************************************** */
38 #define __WIFI_ROM_SECTION__ /* 代码ROM段起始位置 */
39 WIFI_ROM_BSS hi_u8 g_vap_res_map = 0; /* vap 资源map表 */
40 WIFI_ROM_BSS hi_u8 *g_puc_mac_vap_res = HI_NULL;
41 /* WME初始参数定义,按照OFDM初始化 AP模式 值来自于TGn 9 Appendix D: Default WMM AC Parameters */
42 WIFI_ROM_RODATA static const mac_wme_param_stru g_ast_wmm_initial_params_ap[WLAN_WME_AC_BUTT] = {
43 /* AIFS, cwmin, cwmax, txop */
44 /* BE */
45 { 3, 4, 6, 0, },
46 /* BK */
47 { 7, 4, 10, 0, },
48 /* VI */
49 { 1, 3, 4, 3008, },
50 /* VO */
51 { 1, 2, 3, 1504, },
52 };
53
54 /* WMM初始参数定义,按照OFDM初始化 STA模式 */
55 WIFI_ROM_RODATA static const mac_wme_param_stru g_ast_wmm_initial_params_sta[WLAN_WME_AC_BUTT] = {
56 /* AIFS, cwmin, cwmax, txop */
57 /* BE */
58 { 3, 3, 10, 0, },
59 /* BK */
60 { 7, 4, 10, 0, },
61 /* VI */
62 { 2, 3, 4, 3008, },
63 /* VO */
64 { 2, 2, 3, 1504, },
65 };
66
67 /* WMM初始参数定义,aput建立的bss中STA的使用的EDCA参数 */
68 WIFI_ROM_RODATA static const mac_wme_param_stru g_ast_wmm_initial_params_bss[WLAN_WME_AC_BUTT] = {
69 /* AIFS, cwmin, cwmax, txop */
70 /* BE */
71 { 3, 4, 10, 0, },
72 /* BK */
73 { 7, 4, 10, 0, },
74 /* VI */
75 { 2, 3, 4, 3008, },
76 /* VO */
77 { 2, 2, 3, 1504, },
78 };
79
80 /* ****************************************************************************
81 功能描述 : 分配一个未使用vap资源
82 返 回 值 : 未使用的vap资源id
83 修改历史 :
84 **************************************************************************** */
mac_vap_alloc_vap_res(hi_void)85 WIFI_ROM_TEXT hi_u8 mac_vap_alloc_vap_res(hi_void)
86 {
87 hi_u8 vap_res_idx;
88 hi_u8 vap_res_num = oal_mem_get_vap_res_num();
89 vap_res_idx = oal_bit_find_first_zero((hi_u32)g_vap_res_map, vap_res_num);
90 if (vap_res_idx >= vap_res_num) {
91 oam_error_log1(0, OAM_SF_ANY, "{mac_vap_alloc_vap_res:: alloc vap res fail. res[%x].}", g_vap_res_map);
92 vap_res_idx = MAC_VAP_RES_ID_INVALID;
93 } else {
94 /* 将对应的res标志位置1 */
95 g_vap_res_map |= (hi_u8)(BIT0 << vap_res_idx);
96 }
97 return vap_res_idx;
98 }
99
100 /* ****************************************************************************
101 功能描述 : 删除一个已使用vap资源map标志位,内存不需要释放(驱动卸载时释放)和清零(创建初始化时清零)
102 OFFLOAD模式下dmac hmac各自释放,非OFFLOAD模式下统一由hmac申请和释放
103 输入参数 : vap资源id
104 修改历史 :
105 1.日 期 : 2019年5月25日
106 作 者 : HiSilicon
107 修改内容 : 新生成函数
108 **************************************************************************** */
mac_vap_free_vap_res(hi_u8 idx)109 WIFI_ROM_TEXT hi_void mac_vap_free_vap_res(hi_u8 idx)
110 {
111 g_vap_res_map &= (~((hi_u8)(BIT0 << idx)));
112 }
113
114 /* ****************************************************************************
115 功能描述 : mac vap资源初始化,根据vap数量申请内存
116 修改历史 :
117 1.日 期 : 2019年5月30日
118 作 者 : HiSilicon
119 修改内容 : 新生成函数
120 **************************************************************************** */
mac_vap_res_init(const hi_u8 vap_num)121 WIFI_ROM_TEXT hi_u32 mac_vap_res_init(const hi_u8 vap_num)
122 {
123 hi_u32 vap_size = sizeof(mac_vap_stru) * vap_num;
124 /* mac user 在非offload模式下存在两次申请的情况,已经申请过则跳过 */
125 if (g_puc_mac_vap_res != HI_NULL) {
126 return HI_SUCCESS;
127 }
128 g_puc_mac_vap_res = hi_malloc(HI_MOD_ID_WIFI_DRV, vap_size);
129 if (g_puc_mac_vap_res == HI_NULL) {
130 hi_diag_log_msg_e1(0, "{mac_vap_res_init::mem alloc vap res null. size = %d.}", vap_size);
131 return HI_ERR_CODE_ALLOC_MEM_FAIL;
132 }
133 /* 安全编程规则6.6例外(3)从堆中分配内存后,赋予初值 */
134 memset_s(g_puc_mac_vap_res, vap_size, 0, vap_size);
135 return HI_SUCCESS;
136 }
137
138 /* ****************************************************************************
139 功能描述 : mac vap资源去初始化
140 修改历史 :
141 1.日 期 : 2019年5月30日
142 作 者 : HiSilicon
143 修改内容 : 新生成函数
144 **************************************************************************** */
mac_vap_res_exit(hi_void)145 WIFI_ROM_TEXT hi_u32 mac_vap_res_exit(hi_void)
146 {
147 if (g_puc_mac_vap_res != HI_NULL) {
148 hi_free(HI_MOD_ID_WIFI_DRV, g_puc_mac_vap_res);
149 g_puc_mac_vap_res = HI_NULL;
150 }
151
152 return HI_SUCCESS;
153 }
154
155 /* ****************************************************************************
156 功能描述 : 获取mac vap结构体
157 输入参数 : vap资源id
158 修改历史 :
159 1.日 期 : 2019年5月25日
160 作 者 : HiSilicon
161 修改内容 : 新生成函数
162 **************************************************************************** */
mac_vap_get_vap_stru(hi_u8 idx)163 WIFI_ROM_TEXT mac_vap_stru *mac_vap_get_vap_stru(hi_u8 idx)
164 {
165 hi_u8 vap_res_num = oal_mem_get_vap_res_num();
166 if (oal_unlikely(idx >= vap_res_num)) {
167 return HI_NULL;
168 }
169 return (mac_vap_stru *)(g_puc_mac_vap_res + idx * sizeof(mac_vap_stru));
170 }
171
172 /* ****************************************************************************
173 功能描述 : 判断vap是否存在
174 输入参数 : vap资源id
175 修改历史 :
176 1.日 期 : 2019年5月25日
177 作 者 : HiSilicon
178 修改内容 : 新生成函数
179 **************************************************************************** */
mac_vap_is_valid(hi_u8 idx)180 WIFI_ROM_TEXT hi_u32 mac_vap_is_valid(hi_u8 idx)
181 {
182 if (oal_unlikely(idx >= oal_mem_get_vap_res_num())) {
183 return HI_FALSE;
184 }
185 if (g_vap_res_map & (BIT0 << idx)) {
186 return HI_TRUE;
187 }
188 return HI_FALSE;
189 }
190
191 /* ****************************************************************************
192 功能描述 : 获取ap或者sta 的配置指针
193 输入参数 : en_vap_mode: en_vap_mode当前模式
194 返 回 值 : wmm配置指针
195 修改历史 :
196 1.日 期 : 2014年1月27日
197 作 者 : HiSilicon
198 修改内容 : 新生成函数
199 **************************************************************************** */
mac_get_wmm_cfg(wlan_vap_mode_enum_uint8 vap_mode)200 WIFI_ROM_TEXT mac_wme_param_stru *mac_get_wmm_cfg(wlan_vap_mode_enum_uint8 vap_mode)
201 {
202 /* 参考认证项配置,没有按照协议配置,WLAN_VAP_MODE_BUTT表示是ap广播给sta的edca参数 */
203 if (vap_mode == WLAN_VAP_MODE_BUTT) {
204 return (mac_wme_param_stru *)g_ast_wmm_initial_params_bss;
205 } else if (vap_mode == WLAN_VAP_MODE_BSS_AP) {
206 return (mac_wme_param_stru *)g_ast_wmm_initial_params_ap;
207 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
208 } else if (vap_mode == WLAN_VAP_MODE_MESH) {
209 return (mac_wme_param_stru *)g_ast_wmm_initial_params_ap;
210 #endif
211 }
212
213 return (mac_wme_param_stru *)g_ast_wmm_initial_params_sta;
214 }
215
216 /* ****************************************************************************
217 功能描述 : 初始化wme参数, 除sta之外的模式
218 输出参数 : pst_wme_param: wme参数
219 返 回 值 : HI_SUCCESS 或其它错误码
220 修改历史 :
221 1.日 期 : 2012年12月13日
222 作 者 : HiSilicon
223 修改内容 : 新生成函数
224 **************************************************************************** */
mac_vap_init_wme_param(const mac_vap_stru * mac_vap)225 WIFI_ROM_TEXT hi_void mac_vap_init_wme_param(const mac_vap_stru *mac_vap)
226 {
227 const mac_wme_param_stru *wmm_param = HI_NULL;
228 const mac_wme_param_stru *wmm_param_sta = HI_NULL;
229 hi_u8 ac_type;
230
231 wmm_param = mac_get_wmm_cfg(mac_vap->vap_mode);
232 for (ac_type = 0; ac_type < WLAN_WME_AC_BUTT; ac_type++) {
233 /* VAP自身的EDCA参数 */
234 mac_vap->mib_info->wlan_mib_qap_edac[ac_type].dot11_qapedca_table_aifsn = wmm_param[ac_type].aifsn;
235 mac_vap->mib_info->wlan_mib_qap_edac[ac_type].dot11_qapedca_table_c_wmin = wmm_param[ac_type].logcwmin;
236 mac_vap->mib_info->wlan_mib_qap_edac[ac_type].dot11_qapedca_table_c_wmax = wmm_param[ac_type].us_logcwmax;
237 mac_vap->mib_info->wlan_mib_qap_edac[ac_type].dot11_qapedca_table_txop_limit = wmm_param[ac_type].txop_limit;
238 }
239
240 if ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP)
241 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
242 || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
243 #endif
244 ) {
245 /* AP模式时广播给STA的EDCA参数,只在AP模式需要初始化此值,使用WLAN_VAP_MODE_BUTT, */
246 wmm_param_sta = mac_get_wmm_cfg(WLAN_VAP_MODE_BUTT);
247
248 for (ac_type = 0; ac_type < WLAN_WME_AC_BUTT; ac_type++) {
249 mac_vap->mib_info->ast_wlan_mib_edca[ac_type].dot11_edca_table_aifsn = wmm_param_sta[ac_type].aifsn;
250 mac_vap->mib_info->ast_wlan_mib_edca[ac_type].dot11_edca_table_c_wmin = wmm_param_sta[ac_type].logcwmin;
251 mac_vap->mib_info->ast_wlan_mib_edca[ac_type].dot11_edca_table_c_wmax = wmm_param_sta[ac_type].us_logcwmax;
252 mac_vap->mib_info->ast_wlan_mib_edca[ac_type].dot11_edca_table_txop_limit =
253 wmm_param_sta[ac_type].txop_limit;
254 }
255 }
256 }
257
258 /* ****************************************************************************
259 功能描述 : 增加关联用户,获取hash值并加入hash表中
260 输入参数 : vap对象内存指针,以及user对象指针(user对象需要在调用此函数前申请并赋值)
261 修改历史 :
262 1.日 期 : 2012年10月22日
263 作 者 : HiSilicon
264 修改内容 : 新生成函数
265 **************************************************************************** */
mac_vap_add_assoc_user(mac_vap_stru * mac_vap,hi_u8 user_idx)266 WIFI_ROM_TEXT hi_u32 mac_vap_add_assoc_user(mac_vap_stru *mac_vap, hi_u8 user_idx)
267 {
268 mac_user_stru *user = HI_NULL;
269 mac_res_user_hash_stru *hash = HI_NULL;
270 hi_u32 rslt;
271 hi_u8 hash_idx;
272 hi_list *dlist_head = HI_NULL;
273 unsigned long irq_save;
274 user = mac_user_get_user_stru(user_idx);
275 if (oal_unlikely(user == HI_NULL)) {
276 oam_error_log1(mac_vap->vap_id, OAM_SF_ANY, "{mac_vap_add_assoc_user::pst_user[%d] null.}", user_idx);
277 return HI_ERR_CODE_PTR_NULL;
278 }
279 user->user_hash_idx = mac_calculate_hash_value(user->user_mac_addr);
280 rslt = mac_res_alloc_hash(&hash_idx);
281 if (rslt != HI_SUCCESS) {
282 oam_warning_log1(mac_vap->vap_id, OAM_SF_ANY, "{mac_vap_add_assoc_user::alloc hash failed[%d].}", rslt);
283 return rslt;
284 }
285 hash = mac_res_get_hash(hash_idx);
286
287 if (mac_vap_user_exist(&(user->user_dlist), &(mac_vap->mac_user_list_head)) == HI_TRUE) {
288 mac_res_free_hash(hash_idx);
289 oam_error_log1(mac_vap->vap_id, OAM_SF_ASSOC, "{mac_vap_add_assoc_user::user[%d] already exist.}", user_idx);
290 return HI_ERR_CODE_PTR_NULL;
291 }
292 hash->us_hash_res_idx = hash_idx; /* 记录HASH对应的资源池索引值 */
293 hash->user_idx = user_idx; /* 记录对应的用户索引值 */
294 dlist_head = &(mac_vap->ast_user_hash[user->user_hash_idx]);
295 hi_list_head_insert(&(hash->entry), dlist_head);
296 dlist_head = &(mac_vap->mac_user_list_head); /* 加入双向链表表头 */
297 hi_list_head_insert(&(user->user_dlist), dlist_head);
298
299 oal_spin_lock_irq_save(&mac_vap->cache_user_lock, &irq_save);
300
301 if (memcpy_s(mac_vap->auc_cache_user_mac_addr, WLAN_MAC_ADDR_LEN, /* 更新cache user */
302 user->user_mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
303 oam_error_log0(mac_vap->vap_id, OAM_SF_ASSOC, "{mac_vap_add_assoc_user::mem safe func err!}");
304 oal_spin_unlock_irq_restore(&mac_vap->cache_user_lock, &irq_save);
305 return HI_FAIL;
306 }
307 mac_vap->cache_user_id = user_idx;
308
309 oal_spin_unlock_irq_restore(&mac_vap->cache_user_lock, &irq_save);
310
311 if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) { /* 记录STA模式下的与之关联的VAP的id */
312 mac_vap_set_assoc_id(mac_vap, user_idx);
313 }
314 mac_vap->user_nums++; /* vap已关联 user个数++ */
315 return HI_SUCCESS;
316 }
317
mac_vap_user_remove_list(const hi_list * hash_head,mac_user_stru * user,hi_u8 user_idx)318 WIFI_ROM_TEXT hi_u32 mac_vap_user_remove_list(const hi_list *hash_head, mac_user_stru *user, hi_u8 user_idx)
319 {
320 mac_user_stru *user_temp = HI_NULL;
321 hi_list *entry = HI_NULL;
322 mac_res_user_hash_stru *user_hash = HI_NULL;
323 hi_list *dlist_tmp = HI_NULL;
324 hi_u32 ret = HI_FAIL;
325
326 hi_list_for_each_safe(entry, dlist_tmp, hash_head) {
327 user_hash = (mac_res_user_hash_stru *)entry;
328 user_temp = mac_user_get_user_stru(user_hash->user_idx);
329 if (user_temp == HI_NULL) {
330 continue;
331 }
332 if (!oal_compare_mac_addr(user->user_mac_addr, user_temp->user_mac_addr, WLAN_MAC_ADDR_LEN)) {
333 hi_list_delete(entry);
334 /* 从双向链表中拆掉 */
335 hi_list_delete(&(user->user_dlist));
336 mac_res_free_hash(user_hash->us_hash_res_idx);
337
338 /* 初始化相应成员 */
339 user->user_hash_idx = 0xff;
340 user->us_assoc_id = user_idx;
341 user->is_multi_user = HI_FALSE;
342 /* 安全编程规则6.6例外(1) 对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
343 memset_s(user->user_mac_addr, WLAN_MAC_ADDR_LEN, 0, WLAN_MAC_ADDR_LEN);
344 user->vap_id = 0x0f;
345 user->user_asoc_state = MAC_USER_STATE_BUTT;
346
347 ret = HI_SUCCESS;
348 }
349 }
350
351 return ret;
352 }
353
354 /* ****************************************************************************
355 功能描述 : 删除用户,将用户从双向链表中删除,并从hash表中删除
356 **************************************************************************** */
mac_vap_del_user(mac_vap_stru * mac_vap,hi_u8 user_idx)357 WIFI_ROM_TEXT hi_u32 mac_vap_del_user(mac_vap_stru *mac_vap, hi_u8 user_idx)
358 {
359 mac_user_stru *user = HI_NULL;
360 hi_list *hash_head = HI_NULL;
361 hi_u32 ret;
362 unsigned long irq_save;
363
364 oal_spin_lock_irq_save(&mac_vap->cache_user_lock, &irq_save);
365
366 if (user_idx == mac_vap->cache_user_id) { /* 与cache user id对比 , 相等则清空cache user */
367 oal_set_mac_addr_zero(mac_vap->auc_cache_user_mac_addr);
368 mac_vap->cache_user_id = MAC_INVALID_USER_ID;
369 }
370
371 oal_spin_unlock_irq_restore(&mac_vap->cache_user_lock, &irq_save);
372
373 user = mac_user_get_user_stru(user_idx);
374 if (oal_unlikely(user == HI_NULL)) {
375 oam_error_log1(mac_vap->vap_id, OAM_SF_ASSOC, "{mac_vap_del_user::pst_user null, user_idx is %d}", user_idx);
376 return HI_ERR_CODE_PTR_NULL;
377 }
378 mac_user_set_asoc_state(user, MAC_USER_STATE_BUTT);
379 if (user->user_hash_idx >= MAC_VAP_USER_HASH_MAX_VALUE) {
380 /* ADD USER命令丢失,或者重复删除User都可能进入此分支 */
381 oam_error_log1(mac_vap->vap_id, OAM_SF_ASSOC, "{mac_vap_del_user::hash idx invalid %u}", user->user_hash_idx);
382 return HI_FAIL;
383 }
384
385 hash_head = &(mac_vap->ast_user_hash[user->user_hash_idx]);
386 ret = mac_vap_user_remove_list(hash_head, user, user_idx);
387 if (ret == HI_SUCCESS) {
388 /* vap已关联 user个数-- */
389 if (mac_vap->user_nums) {
390 mac_vap->user_nums--;
391 }
392 /* STA模式下将关联的VAP的id置为非法值 */
393 if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
394 mac_vap_set_assoc_id(mac_vap, 0xff);
395 }
396 return HI_SUCCESS;
397 }
398
399 oam_warning_log1(mac_vap->vap_id, OAM_SF_ASSOC,
400 "{mac_vap_del_user::delete user failed,user idx is %d.}", user_idx);
401
402 return HI_FAIL;
403 }
404
405 /* ****************************************************************************
406 功能描述 : 根据user MAC地址查找user对象
407 **************************************************************************** */
mac_vap_find_user_by_macaddr(mac_vap_stru * mac_vap,const hi_u8 * sta_mac_addr,hi_u8 mac_addr_len,hi_u8 * puc_user_idx)408 WIFI_ROM_TEXT hi_u32 mac_vap_find_user_by_macaddr(mac_vap_stru *mac_vap, const hi_u8 *sta_mac_addr, hi_u8 mac_addr_len,
409 hi_u8 *puc_user_idx)
410 {
411 mac_user_stru *mac_user = HI_NULL;
412 hi_u32 user_hash_value;
413 mac_res_user_hash_stru *hash = HI_NULL;
414 hi_list *entry = HI_NULL;
415 unsigned long irq_save;
416
417 if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
418 mac_user = mac_user_get_user_stru(mac_vap->assoc_vap_id);
419 if (mac_user == HI_NULL) {
420 return HI_FAIL;
421 }
422 if (!oal_compare_mac_addr(mac_user->user_mac_addr, sta_mac_addr, mac_addr_len)) {
423 *puc_user_idx = mac_vap->assoc_vap_id;
424 return (hi_u32)((*puc_user_idx != MAC_INVALID_USER_ID) ? HI_SUCCESS : HI_FAIL);
425 }
426 return HI_FAIL;
427 }
428
429 oal_spin_lock_irq_save(&mac_vap->cache_user_lock, &irq_save);
430
431 /* 与cache user对比 , 相等则直接返回cache user id */
432 if (!oal_compare_mac_addr(mac_vap->auc_cache_user_mac_addr, sta_mac_addr, mac_addr_len)) {
433 *puc_user_idx = mac_vap->cache_user_id;
434 oal_spin_unlock_irq_restore(&mac_vap->cache_user_lock, &irq_save);
435 return (hi_u32)((*puc_user_idx != MAC_INVALID_USER_ID) ? HI_SUCCESS : HI_FAIL);
436 }
437
438 user_hash_value = mac_calculate_hash_value(sta_mac_addr);
439 hi_list_for_each(entry, &(mac_vap->ast_user_hash[user_hash_value])) {
440 hash = (mac_res_user_hash_stru *)entry;
441
442 mac_user = mac_user_get_user_stru(hash->user_idx);
443 if (mac_user == HI_NULL) {
444 oam_error_log1(mac_vap->vap_id, OAM_SF_ANY,
445 "{mac_vap_find_user_by_macaddr::pst_mac_user null.user idx %d}",
446 hash->user_idx);
447 continue;
448 }
449
450 /* 相同的MAC地址 */
451 if (!oal_compare_mac_addr(mac_user->user_mac_addr, sta_mac_addr, mac_addr_len)) {
452 *puc_user_idx = hash->user_idx;
453 /* 更新cache user */
454 if (memcpy_s(mac_vap->auc_cache_user_mac_addr, WLAN_MAC_ADDR_LEN, mac_user->user_mac_addr,
455 WLAN_MAC_ADDR_LEN) != EOK) {
456 oam_error_log0(0, 0, "{mac_vap_find_user_by_macaddr::mem safe func err!}");
457 continue;
458 }
459 mac_vap->cache_user_id = (hi_u8)hash->user_idx;
460 oal_spin_unlock_irq_restore(&mac_vap->cache_user_lock, &irq_save);
461 return (hi_u32)((*puc_user_idx != MAC_INVALID_USER_ID) ? HI_SUCCESS : HI_FAIL);
462 }
463 }
464 oal_spin_unlock_irq_restore(&mac_vap->cache_user_lock, &irq_save);
465
466 return HI_FAIL;
467 }
468
469 /* ****************************************************************************
470 功能描述 : 初始化11n的mib
471 **************************************************************************** */
mac_vap_init_mib_11n(const mac_vap_stru * mac_vap)472 WIFI_ROM_TEXT static hi_void mac_vap_init_mib_11n(const mac_vap_stru *mac_vap)
473 {
474 wlan_mib_ieee802dot11_stru *mib_info = HI_NULL;
475 mac_device_stru *mac_dev = HI_NULL;
476 mac_dev = mac_res_get_dev();
477 mib_info = mac_vap->mib_info;
478 mib_info->wlan_mib_sta_config.dot11_high_throughput_option_implemented = HI_FALSE;
479 mib_info->phy_ht.dot11_ldpc_coding_option_implemented = HI_FALSE;
480 mib_info->phy_ht.dot11_ldpc_coding_option_activated = HI_FALSE;
481 mib_info->phy_ht.dot11_tx_stbc_option_activated = HI_FALSE;
482 mib_info->phy_ht.dot112_g_forty_m_hz_operation_implemented = HI_FALSE;
483 mib_info->phy_ht.dot11_short_gi_option_in_twenty_implemented = HI_TRUE;
484 mib_info->phy_ht.dot112_g_short_gi_option_in_forty_implemented = HI_FALSE;
485 mib_info->phy_ht.dot11_tx_stbc_option_implemented = mac_dev->tx_stbc;
486 mib_info->phy_ht.dot11_rx_stbc_option_implemented = mac_dev->rx_stbc;
487 mib_info->wlan_mib_operation.dot11_obss_scan_passive_dwell = 20; /* obss被动扫描时每个信道的扫描时间 20 TUs */
488 mib_info->wlan_mib_operation.dot11_obss_scan_active_dwell = 10; /* 主动扫描时间 10TUs */
489 /* 防止host默认参数与关联ap下发参数一致,不执行扫描,特将300s改小
490 host配置obss 扫描间隔不低于300s故此处只要小于300即可 */
491 mib_info->wlan_mib_operation.dot11_bss_width_trigger_scan_interval = 299; /* 设置为299 */
492 mib_info->wlan_mib_operation.dot11_obss_scan_passive_total_per_channel = 200; /* 设置为200 */
493 mib_info->wlan_mib_operation.dot11_obss_scan_active_total_per_channel = 20; /* 设置为20 */
494 mib_info->wlan_mib_operation.dot11_bss_width_channel_transition_delay_factor = 5; /* 设置为5 */
495 mib_info->wlan_mib_operation.dot11_obss_scan_activity_threshold = 25; /* 设置为25 */
496 mac_mib_init_2040(mac_vap);
497 }
498
499 /* ****************************************************************************
500 功能描述 : 初始化11i mib信息
501 输入参数 : pst_vap 指向VAP用户的指针
502 修改历史 :
503 1.日 期 : 2013年6月29日
504 作 者 : HiSilicon
505 修改内容 : 新生成函数
506 **************************************************************************** */
mac_vap_init_mib_11i(const mac_vap_stru * mac_vap)507 WIFI_ROM_TEXT static hi_void mac_vap_init_mib_11i(const mac_vap_stru *mac_vap)
508 {
509 /* WEP、WAPI加密方式时、IBSS下需要去使能 */
510 mac_vap->mib_info->wlan_mib_privacy.dot11_rsna_activated = HI_FALSE;
511 mac_vap->mib_info->wlan_mib_privacy.dot11_rsnamfpr = HI_FALSE;
512 mac_vap->mib_info->wlan_mib_privacy.dot11_rsnamfpc = HI_FALSE;
513 mac_vap->mib_info->wlan_mib_privacy.dot11_rsna_preauthentication_activated = HI_FALSE;
514 mac_vap->mib_info->wlan_mib_privacy.dot11_privacy_invoked = HI_FALSE;
515 /* Version信息为1 */
516 /* see <80211-2012> chapter 8.4.2.27 RSN elemet */
517 /* RSN Version 1 is defined in this standard */
518 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_config_version = MAC_RSN_IE_VERSION;
519 if (mac_vap->cap_flag.wpa2) {
520 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_config_group_cipher = WLAN_80211_CIPHER_SUITE_CCMP;
521 /* CCMP加密方式下GTK的bit位为256 */
522 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_config_group_cipher_size = WLAN_CCMP_KEY_LEN * 8; /* 乘8转bit */
523 }
524 if (mac_vap->cap_flag.wpa) {
525 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_config_group_cipher = WLAN_80211_CIPHER_SUITE_TKIP;
526 /* TKIP加密方式下GTK的bit位为256 */
527 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_config_group_cipher_size = WLAN_TKIP_KEY_LEN * 8; /* 乘8转bit */
528 }
529 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_pairwise_cipher_requested = 0;
530 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_group_cipher_requested = 0;
531 /* wpa PairwiseCipher CCMP */
532 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_wpa_pairwise_cipher[0].dot11_rsna_config_pairwise_cipher_implemented =
533 WLAN_80211_CIPHER_SUITE_CCMP;
534 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_wpa_pairwise_cipher[0].dot11_rsna_config_pairwise_cipher_activated =
535 HI_FALSE;
536 /* wpa PairwiseCipher TKIP */
537 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_wpa_pairwise_cipher[1].dot11_rsna_config_pairwise_cipher_implemented =
538 WLAN_80211_CIPHER_SUITE_TKIP;
539 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_wpa_pairwise_cipher[1].dot11_rsna_config_pairwise_cipher_activated =
540 HI_FALSE;
541 /* wpa2 PairwiseCipher CCMP */
542 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_wpa2_pairwise_cipher[0].dot11_rsna_config_pairwise_cipher_implemented =
543 WLAN_80211_CIPHER_SUITE_CCMP;
544 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_wpa2_pairwise_cipher[0].dot11_rsna_config_pairwise_cipher_activated =
545 HI_FALSE;
546 /* wpa2 PairwiseCipher TKIP */
547 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_wpa2_pairwise_cipher[1].dot11_rsna_config_pairwise_cipher_implemented =
548 WLAN_80211_CIPHER_SUITE_TKIP;
549 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_wpa2_pairwise_cipher[1].dot11_rsna_config_pairwise_cipher_activated =
550 HI_FALSE;
551 /* AuthenticationSuite */
552 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_auth_suite[0].dot11_rsna_config_authentication_suite_implemented =
553 WLAN_AUTH_SUITE_PSK;
554 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_auth_suite[0].dot11_rsna_config_authentication_suite_activated = HI_FALSE;
555 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_auth_suite[1].dot11_rsna_config_authentication_suite_implemented =
556 WLAN_AUTH_SUITE_PSK_SHA256;
557 mac_vap->mib_info->ast_wlan_mib_rsna_cfg_auth_suite[1].dot11_rsna_config_authentication_suite_activated = HI_FALSE;
558 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_config_number_of_ptksa_replay_counters_implemented = 0;
559 mac_vap->mib_info->wlan_mib_rsna_cfg.dot11_rsna_config_number_of_gtksa_replay_counters_implemented = 0;
560 }
561
562 /* ****************************************************************************
563 功能描述 : 初始化11a 11g速率
564 修改历史 :
565 1.日 期 : 2013年7月31日
566 作 者 : HiSilicon
567 修改内容 : 新生成函数
568 **************************************************************************** */
mac_vap_init_legacy_rates(mac_vap_stru * mac_vap,mac_data_rate_stru * rates)569 WIFI_ROM_TEXT static hi_void mac_vap_init_legacy_rates(mac_vap_stru *mac_vap, mac_data_rate_stru *rates)
570 {
571 hi_u8 rate_index;
572 hi_u8 curr_rate_index = 0;
573 mac_data_rate_stru *puc_orig_rate = HI_NULL;
574 mac_data_rate_stru *puc_curr_rate = HI_NULL;
575
576 /* 初始化速率个数,基本速率个数,非基本速率个数 */
577 mac_vap->curr_sup_rates.rate.rs_nrates = MAC_NUM_DR_802_11G;
578 mac_vap->curr_sup_rates.br_rate_num = MAC_NUM_BR_802_11G;
579 mac_vap->curr_sup_rates.nbr_rate_num = MAC_NUM_NBR_802_11G;
580 mac_vap->curr_sup_rates.min_rate = 6; /* 最小基本速率设置为6 */
581 mac_vap->curr_sup_rates.max_rate = 24; /* 最大基本速率设置为24 */
582 /* 将速率拷贝到VAP结构体下的速率集中 */
583 for (rate_index = 0; rate_index < MAC_DATARATES_PHY_80211G_NUM; rate_index++) {
584 puc_orig_rate = &rates[rate_index];
585 puc_curr_rate = &(mac_vap->curr_sup_rates.rate.ast_rs_rates[curr_rate_index]);
586 /* Basic Rates */
587 if ((puc_orig_rate->mbps == 6) || (puc_orig_rate->mbps == 12) || /* 判断mbps 6/12 */
588 (puc_orig_rate->mbps == 24)) { /* 判断mbps 24 */
589 if (memcpy_s(puc_curr_rate, sizeof(mac_data_rate_stru), puc_orig_rate,
590 sizeof(mac_data_rate_stru)) != EOK) {
591 continue;
592 }
593 puc_curr_rate->mac_rate |= 0x80;
594 curr_rate_index++;
595 } else if ((puc_orig_rate->mbps == 9) || (puc_orig_rate->mbps == 18) || /* 判断mbps 9/18 */
596 (puc_orig_rate->mbps == 36) || (puc_orig_rate->mbps == 48) || /* 判断mbps 36/48 */
597 (puc_orig_rate->mbps == 54)) { /* 判断mbps 54 */
598 /* Non-basic rates */
599 if (memcpy_s(puc_curr_rate, sizeof(mac_data_rate_stru), puc_orig_rate,
600 sizeof(mac_data_rate_stru)) != EOK) {
601 return;
602 }
603 curr_rate_index++;
604 }
605 if (curr_rate_index == mac_vap->curr_sup_rates.rate.rs_nrates) {
606 break;
607 }
608 }
609 }
610
611 /* ****************************************************************************
612 功能描述 : 初始化11b速率
613 修改历史 :
614 1.日 期 : 2013年7月31日
615 作 者 : HiSilicon
616 修改内容 : 新生成函数
617 **************************************************************************** */
mac_vap_init_11b_rates(mac_vap_stru * mac_vap,mac_data_rate_stru * rates)618 WIFI_ROM_TEXT static hi_void mac_vap_init_11b_rates(mac_vap_stru *mac_vap, mac_data_rate_stru *rates)
619 {
620 hi_u8 rate_index;
621 hi_u8 curr_rate_index = 0;
622 mac_data_rate_stru *puc_orig_rate = HI_NULL;
623 mac_data_rate_stru *puc_curr_rate = HI_NULL;
624
625 /* 初始化速率个数,基本速率个数,非基本速率个数 */
626 mac_vap->curr_sup_rates.rate.rs_nrates = MAC_NUM_DR_802_11B;
627 mac_vap->curr_sup_rates.br_rate_num = 0;
628 mac_vap->curr_sup_rates.nbr_rate_num = MAC_NUM_NBR_802_11B;
629 mac_vap->curr_sup_rates.min_rate = 1;
630 mac_vap->curr_sup_rates.max_rate = 2; /* 最大基本速率设置为2 */
631 /* 将速率拷贝到VAP结构体下的速率集中 */
632 for (rate_index = 0; rate_index < MAC_DATARATES_PHY_80211G_NUM; rate_index++) {
633 puc_orig_rate = &rates[rate_index];
634 puc_curr_rate = &(mac_vap->curr_sup_rates.rate.ast_rs_rates[curr_rate_index]);
635 /* Basic Rates */
636 if ((puc_orig_rate->mbps == 1) || (puc_orig_rate->mbps == 2) || /* mbps 1/2 为Basic Rates */
637 ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) &&
638 ((puc_orig_rate->mbps == 5) || (puc_orig_rate->mbps == 11)))) { /* mbps 5/11 为Basic Rates */
639 mac_vap->curr_sup_rates.br_rate_num++;
640 if (memcpy_s(puc_curr_rate, sizeof(mac_data_rate_stru), puc_orig_rate, sizeof(mac_data_rate_stru)) != EOK) {
641 oam_error_log0(0, 0, "{mac_vap_init_11b_rates::mem safe func err!}");
642 continue;
643 }
644 puc_curr_rate->mac_rate |= 0x80;
645 curr_rate_index++;
646 } else if (((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP) /* Non-basic rates */
647 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
648 || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
649 #endif
650 ) && ((puc_orig_rate->mbps == 5) || (puc_orig_rate->mbps == 11))) { /* 判断mbps 5/11 */
651 if (memcpy_s(puc_curr_rate, sizeof(mac_data_rate_stru), puc_orig_rate, sizeof(mac_data_rate_stru)) != EOK) {
652 oam_error_log0(0, 0, "{mac_vap_init_11b_rates::mem safe func err!}");
653 continue;
654 }
655 /* 初始化11b速率时,将高位置0 */
656 puc_curr_rate->mac_rate &= 0x7f;
657 curr_rate_index++;
658 } else {
659 continue;
660 }
661 if (curr_rate_index == mac_vap->curr_sup_rates.rate.rs_nrates) {
662 break;
663 }
664 }
665 }
666
667 /* ****************************************************************************
668 功能描述 : 初始化11g 混合1速率
669 修改历史 :
670 1.日 期 : 2013年7月31日
671 作 者 : HiSilicon
672 修改内容 : 新生成函数
673 **************************************************************************** */
mac_vap_init_11g_mixed_one_rates(mac_vap_stru * mac_vap,mac_data_rate_stru * rates)674 WIFI_ROM_TEXT static hi_void mac_vap_init_11g_mixed_one_rates(mac_vap_stru *mac_vap, mac_data_rate_stru *rates)
675 {
676 hi_u8 rate_index;
677 mac_data_rate_stru *puc_orig_rate = HI_NULL;
678 mac_data_rate_stru *puc_curr_rate = HI_NULL;
679 hi_u8 rates_num;
680
681 /* 初始化速率集 */
682 rates_num = MAC_DATARATES_PHY_80211G_NUM;
683 /* 初始化速率个数,基本速率个数,非基本速率个数 */
684 mac_vap->curr_sup_rates.rate.rs_nrates = MAC_NUM_DR_802_11G_MIXED;
685 mac_vap->curr_sup_rates.br_rate_num = MAC_NUM_BR_802_11G_MIXED_ONE;
686 mac_vap->curr_sup_rates.nbr_rate_num = MAC_NUM_NBR_802_11G_MIXED_ONE;
687 mac_vap->curr_sup_rates.min_rate = 1;
688 mac_vap->curr_sup_rates.max_rate = 11; /* max_rate 设置为11 */
689 /* 将速率拷贝到VAP结构体下的速率集中 */
690 for (rate_index = 0; rate_index < rates_num; rate_index++) {
691 puc_orig_rate = &rates[rate_index];
692 puc_curr_rate = &(mac_vap->curr_sup_rates.rate.ast_rs_rates[rate_index]);
693 if (memcpy_s(puc_curr_rate, sizeof(mac_data_rate_stru), puc_orig_rate, sizeof(mac_data_rate_stru)) != EOK) {
694 continue;
695 }
696 /* Basic Rates */
697 if ((puc_orig_rate->mbps == 1) || (puc_orig_rate->mbps == 2) /* mbps 1/2 为Basic Rates */
698 || (puc_orig_rate->mbps == 5) || (puc_orig_rate->mbps == 11)) { /* mbps 5/11 为Basic Rates */
699 puc_curr_rate->mac_rate |= 0x80;
700 }
701 }
702 }
703
704 /* ****************************************************************************
705 功能描述 : 初始化11g mixed two速率
706 修改历史 :
707 1.日 期 : 2013年7月31日
708 作 者 : HiSilicon
709 修改内容 : 新生成函数
710 **************************************************************************** */
mac_vap_init_11g_mixed_two_rates(mac_vap_stru * mac_vap,mac_data_rate_stru * rates)711 WIFI_ROM_TEXT static hi_void mac_vap_init_11g_mixed_two_rates(mac_vap_stru *mac_vap, mac_data_rate_stru *rates)
712 {
713 hi_u8 rate_index;
714 mac_data_rate_stru *puc_orig_rate = HI_NULL;
715 mac_data_rate_stru *puc_curr_rate = HI_NULL;
716
717 /* 初始化速率个数,基本速率个数,非基本速率个数 */
718 mac_vap->curr_sup_rates.rate.rs_nrates = MAC_NUM_DR_802_11G_MIXED;
719 mac_vap->curr_sup_rates.br_rate_num = MAC_NUM_BR_802_11G_MIXED_TWO;
720 mac_vap->curr_sup_rates.nbr_rate_num = MAC_NUM_NBR_802_11G_MIXED_TWO;
721 mac_vap->curr_sup_rates.min_rate = 1;
722 mac_vap->curr_sup_rates.max_rate = 24; /* max_rate设置为24 */
723 /* 将速率拷贝到VAP结构体下的速率集中 */
724 for (rate_index = 0; rate_index < MAC_DATARATES_PHY_80211G_NUM; rate_index++) {
725 puc_orig_rate = &rates[rate_index];
726 puc_curr_rate = &(mac_vap->curr_sup_rates.rate.ast_rs_rates[rate_index]);
727 if (memcpy_s(puc_curr_rate, sizeof(mac_data_rate_stru), puc_orig_rate, sizeof(mac_data_rate_stru)) != EOK) {
728 continue;
729 }
730 /* Basic Rates */
731 if ((puc_orig_rate->mbps == 1) || (puc_orig_rate->mbps == 2) || /* mbps 1/2 为Basic Rates */
732 (puc_orig_rate->mbps == 5) || (puc_orig_rate->mbps == 11) || /* mbps 5/11 为Basic Rates */
733 (puc_orig_rate->mbps == 6) || (puc_orig_rate->mbps == 12) /* mbps 6/12 为Basic Rates */
734 || (puc_orig_rate->mbps == 24)) { /* mbps 24 为Basic Rates */
735 puc_curr_rate->mac_rate |= 0x80;
736 }
737 }
738 }
739
740 /* ****************************************************************************
741 功能描述 : 初始化11n速率
742 修改历史 :
743 1.日 期 : 2013年7月31日
744 作 者 : HiSilicon
745 修改内容 : 新生成函数
746 **************************************************************************** */
mac_vap_init_11n_rates(const mac_vap_stru * mac_vap)747 WIFI_ROM_TEXT static hi_void mac_vap_init_11n_rates(const mac_vap_stru *mac_vap)
748 {
749 wlan_mib_ieee802dot11_stru *mib_info = HI_NULL;
750
751 mib_info = mac_vap->mib_info;
752 /* MCS相关MIB值初始化 */
753 /* 安全编程规则6.6例外(1) 对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
754 memset_s(mib_info->supported_mcsrx.auc_dot11_supported_mcs_rx_value, WLAN_HT_MCS_BITMASK_LEN, 0,
755 WLAN_HT_MCS_BITMASK_LEN);
756 mib_info->supported_mcsrx.auc_dot11_supported_mcs_rx_value[0] = 0xFF; /* 支持 RX MCS 0-7,8位全置为1 */
757 mib_info->supported_mcstx.auc_dot11_supported_mcs_tx_value[0] = 0xFF; /* 支持 TX MCS 0-7,8位全置为1 */
758 }
759
760 /* ****************************************************************************
761 功能描述 : 初始化p2p vap的速率集
762 修改历史 :
763 1.日 期 : 2014年11月21日
764 作 者 : HiSilicon
765 修改内容 : 新生成函数
766 **************************************************************************** */
mac_vap_init_p2p_rates(mac_vap_stru * mac_vap,mac_data_rate_stru * rates)767 WIFI_ROM_TEXT hi_void mac_vap_init_p2p_rates(mac_vap_stru *mac_vap, mac_data_rate_stru *rates)
768 {
769 mac_vap_init_legacy_rates(mac_vap, rates);
770 mac_vap_init_11n_rates(mac_vap);
771 }
772
mac_vap_init_rates_by_protocol(mac_vap_stru * mac_vap,wlan_protocol_enum_uint8 vap_protocol,mac_data_rate_stru * rates)773 WIFI_ROM_TEXT hi_void mac_vap_init_rates_by_protocol(mac_vap_stru *mac_vap, wlan_protocol_enum_uint8 vap_protocol,
774 mac_data_rate_stru *rates)
775 {
776 /* STA模式默认协议模式是11n,初始化速率集为所有速率集 */
777 #ifdef _PRE_WLAN_FEATURE_P2P_ROM
778 if (!is_legacy_vap(mac_vap)) {
779 mac_vap_init_p2p_rates(mac_vap, rates);
780 return;
781 }
782 #endif
783 if ((vap_protocol == WLAN_HT_ONLY_MODE) || (vap_protocol == WLAN_HT_MODE)) {
784 mac_vap_init_11g_mixed_one_rates(mac_vap, rates);
785 mac_vap_init_11n_rates(mac_vap);
786 } else if (vap_protocol == WLAN_LEGACY_11G_MODE) {
787 mac_vap_init_legacy_rates(mac_vap, rates);
788 } else if (vap_protocol == WLAN_LEGACY_11B_MODE) {
789 mac_vap_init_11b_rates(mac_vap, rates);
790 } else if (vap_protocol == WLAN_MIXED_ONE_11G_MODE) {
791 mac_vap_init_11g_mixed_one_rates(mac_vap, rates);
792 } else if (vap_protocol == WLAN_MIXED_TWO_11G_MODE) {
793 mac_vap_init_11g_mixed_two_rates(mac_vap, rates);
794 } else {
795 oam_error_log1(mac_vap->vap_id, OAM_SF_ANY, "{mac_vap_init_rates_by_protocol::protocol[%d] isn't supportted.}",
796 vap_protocol);
797 }
798 }
799
800 /* ****************************************************************************
801 功能描述 : 初始化速率集
802 修改历史 :
803 1.日 期 : 2013年7月30日
804 作 者 : HiSilicon
805 修改内容 : 新生成函数
806 2.日 期 : 2013年11月6日
807 作 者 : HiSilicon
808 修改内容 : 修改不同协议模式速率初始化
809
810 **************************************************************************** */
mac_vap_init_rates(mac_vap_stru * mac_vap)811 WIFI_ROM_TEXT hi_void mac_vap_init_rates(mac_vap_stru *mac_vap)
812 {
813 mac_device_stru *mac_dev = HI_NULL;
814 wlan_protocol_enum_uint8 vap_protocol;
815 mac_data_rate_stru *rates = HI_NULL;
816
817 mac_dev = mac_res_get_dev();
818 /* 初始化速率集 */
819 rates = &mac_dev->mac_rates_11g[0];
820 vap_protocol = mac_vap->protocol;
821 mac_vap_init_rates_by_protocol(mac_vap, vap_protocol, rates);
822 }
823
824 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
825
826 /* ****************************************************************************
827 功能描述 : 根据wpa下发的mesh配置参数设置Mesh相关Mib值
828 当前只支持设置auth protocol
829 输入参数 :mac_vap_stru *pst_vap
830 hi_u8 uc_mesh_formation_info
831 hi_u8 uc_mesh_capability
832 修改历史 :
833 1.日 期 : 2019年3月19日
834 作 者 : HiSilicon
835 修改内容 : 新生成函数
836 **************************************************************************** */
mac_vap_set_mib_mesh(const mac_vap_stru * mac_vap,hi_u8 mesh_auth_protocol)837 WIFI_ROM_TEXT hi_void mac_vap_set_mib_mesh(const mac_vap_stru *mac_vap, hi_u8 mesh_auth_protocol)
838 {
839 /* 先清空之前的信息 */
840 mac_mib_set_mesh_security(mac_vap, HI_FALSE);
841 mac_mib_clear_mesh_auth_protocol(mac_vap);
842
843 if (mesh_auth_protocol == 0) {
844 mac_mib_set_mesh_security(mac_vap, HI_FALSE);
845 mac_mib_set_mesh_auth_protocol(mac_vap, 0);
846 } else {
847 mac_mib_set_mesh_security(mac_vap, HI_TRUE);
848 mac_mib_set_mesh_auth_protocol(mac_vap, mesh_auth_protocol);
849 }
850
851 oam_warning_log2(mac_vap->vap_id, OAM_SF_ANY,
852 "{mac_vap_set_mib_mesh::meshSecurityActivated = %d , meshactiveAuthenticationProtocol = %d}",
853 mac_vap->mib_info->wlan_mib_mesh_sta_cfg.dot11_mesh_security_activated,
854 mac_vap->mib_info->wlan_mib_mesh_sta_cfg.dot11_mesh_active_authentication_protocol);
855 }
856 #endif
857
858 /* ****************************************************************************
859 功能描述 : 删除P2P vap num的功能函数
860 修改历史 :
861 1.日 期 : 2014年11月22日
862 作 者 : HiSilicon
863 修改内容 : 新生成函数
864 **************************************************************************** */
mac_dec_p2p_num(const mac_vap_stru * mac_vap)865 WIFI_ROM_TEXT hi_void mac_dec_p2p_num(const mac_vap_stru *mac_vap)
866 {
867 mac_device_stru *mac_dev = HI_NULL;
868
869 mac_dev = mac_res_get_dev();
870 if (is_p2p_dev(mac_vap)) {
871 mac_dev->p2p_info.p2p_device_num--;
872 } else if (is_p2p_go(mac_vap) || is_p2p_cl(mac_vap)) {
873 mac_dev->p2p_info.p2p_goclient_num--;
874 }
875 }
876
877 /* ****************************************************************************
878 功能描述 : add p2p vap时同步增加p2p设备的计数器
879 修改历史 :
880 1.日 期 : 2014年11月21日
881 作 者 : HiSilicon
882 修改内容 : 新生成函数
883 **************************************************************************** */
mac_inc_p2p_num(const mac_vap_stru * mac_vap)884 WIFI_ROM_TEXT hi_void mac_inc_p2p_num(const mac_vap_stru *mac_vap)
885 {
886 mac_device_stru *mac_dev = HI_NULL;
887
888 mac_dev = mac_res_get_dev();
889 if (is_p2p_dev(mac_vap)) {
890 /* device下sta个数加1 */
891 mac_dev->sta_num++;
892 mac_dev->p2p_info.p2p_device_num++;
893 } else if (is_p2p_go(mac_vap)) {
894 mac_dev->p2p_info.p2p_goclient_num++;
895 } else if (is_p2p_cl(mac_vap)) {
896 mac_dev->p2p_info.p2p_goclient_num++;
897 }
898 }
899
900 /* ****************************************************************************
901 功能描述 : 将用户态 IE 信息拷贝到内核态中
902 输入参数 : mac_vap_stru *pst_mac_vap
903 oal_net_dev_ioctl_data_stru *pst_ioctl_data
904 enum WPS_IE_TYPE en_type
905 修改历史 :
906 1.日 期 : 2015年4月28日
907 作 者 : HiSilicon
908 修改内容 : 新生成函数
909 **************************************************************************** */
mac_vap_save_app_ie(mac_vap_stru * mac_vap,const oal_app_ie_stru * app_ie,en_app_ie_type_uint8 type)910 WIFI_ROM_TEXT hi_u32 mac_vap_save_app_ie(mac_vap_stru *mac_vap, const oal_app_ie_stru *app_ie,
911 en_app_ie_type_uint8 type)
912 {
913 hi_u8 *puc_ie = HI_NULL;
914 hi_u32 ie_len;
915
916 if (type >= OAL_APP_IE_NUM) {
917 oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{mac_vap_save_app_ie::invalid en_type[%d].}", type);
918 return HI_ERR_CODE_INVALID_CONFIG;
919 }
920
921 ie_len = app_ie->ie_len;
922 /* 如果输入WPS 长度为0, 则直接释放VAP 中资源 */
923 if (ie_len == 0) {
924 if (mac_vap->ast_app_ie[type].puc_ie != HI_NULL) {
925 oal_mem_free(mac_vap->ast_app_ie[type].puc_ie);
926 }
927 mac_vap->ast_app_ie[type].puc_ie = HI_NULL;
928 mac_vap->ast_app_ie[type].ie_len = 0;
929 return HI_SUCCESS;
930 }
931 /* 检查该类型的IE是否需要申请内存 */
932 if ((mac_vap->ast_app_ie[type].ie_len < ie_len) || (mac_vap->ast_app_ie[type].puc_ie == HI_NULL)) {
933 /* 如果以前的内存空间小于新信息元素需要的长度,则需要重新申请内存 */
934 puc_ie = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, (hi_u16)(ie_len));
935 if (puc_ie == HI_NULL) {
936 oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG,
937 "{mac_vap_set_app_ie::LOCAL_MEM_POOL is empty!,len[%d], en_type[%d].}", app_ie->ie_len, type);
938 return HI_ERR_CODE_ALLOC_MEM_FAIL;
939 }
940 if (mac_vap->ast_app_ie[type].puc_ie != HI_NULL) {
941 oal_mem_free(mac_vap->ast_app_ie[type].puc_ie);
942 }
943 mac_vap->ast_app_ie[type].puc_ie = puc_ie;
944 }
945 if (memcpy_s((hi_void *)mac_vap->ast_app_ie[type].puc_ie, ie_len, (hi_void *)app_ie->auc_ie, ie_len) != EOK) {
946 if (puc_ie != HI_NULL) {
947 oal_mem_free(puc_ie);
948 mac_vap->ast_app_ie[type].puc_ie = HI_NULL;
949 }
950 return HI_FAIL;
951 }
952 mac_vap->ast_app_ie[type].ie_len = ie_len;
953 return HI_SUCCESS;
954 }
955
956 /* ****************************************************************************
957 功能描述 : mac vap exit
958 修改历史 :
959 1.日 期 : 2013年5月29日
960 作 者 : HiSilicon
961 修改内容 : 新生成函数
962 **************************************************************************** */
mac_vap_exit(mac_vap_stru * mac_vap)963 WIFI_ROM_TEXT hi_void mac_vap_exit(mac_vap_stru *mac_vap)
964 {
965 mac_device_stru *mac_dev = HI_NULL;
966 hi_u8 index;
967
968 /* 释放与hmac有关的内存 */
969 mac_vap_free_mib(mac_vap);
970 /* 释放WPS信息元素内存 */
971 for (index = 0; index < OAL_APP_IE_NUM; index++) {
972 mac_vap_clear_app_ie(mac_vap, index);
973 }
974 /* 业务vap已删除,从device上去掉 */
975 mac_dev = mac_res_get_dev();
976 /* 业务vap已经删除,从device中去掉 */
977 for (index = 0; index < mac_dev->vap_num; index++) {
978 /* 从device中找到vap id */
979 if (mac_dev->auc_vap_id[index] == mac_vap->vap_id) {
980 /* 如果不是最后一个vap,则把最后一个vap id移动到这个位置,使得该数组是紧凑的 */
981 if (index < (mac_dev->vap_num - 1)) {
982 mac_dev->auc_vap_id[index] = mac_dev->auc_vap_id[mac_dev->vap_num - 1];
983 break;
984 }
985 }
986 }
987 /* device下的vap总数减1 */
988 mac_dev->vap_num--;
989 /* 清除数组中已删除的vap id,保证非零数组元素均为未删除vap */
990 mac_dev->auc_vap_id[mac_dev->vap_num] = 0;
991 /* device下sta个数减1 */
992 if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
993 mac_dev->sta_num--;
994 }
995 #ifdef _PRE_WLAN_FEATURE_P2P_ROM
996 mac_dec_p2p_num(mac_vap);
997 #endif
998 mac_vap->protocol = WLAN_PROTOCOL_BUTT;
999 /* 最后1个vap删除时,清除device级带宽信息 */
1000 if (mac_dev->vap_num == 0) {
1001 mac_dev->max_channel = 0;
1002 mac_dev->max_band = WLAN_BAND_BUTT;
1003 mac_dev->max_bandwidth = WLAN_BAND_WIDTH_BUTT;
1004 }
1005 /* 删除之后将vap的状态置位非法 */
1006 mac_vap_state_change(mac_vap, MAC_VAP_STATE_BUTT);
1007 }
1008
1009 /* ****************************************************************************
1010 功能描述 : mib初始化函数
1011 修改历史 :
1012 1.日 期 : 2013年7月29日
1013 作 者 : HiSilicon
1014 修改内容 : 新生成函数
1015 2.日 期 : 2013年11月6日
1016 作 者 : HiSilicon
1017 修改内容 : 增加HT only和VHT only协议模式的初始化
1018 **************************************************************************** */
mac_init_mib(const mac_vap_stru * mac_vap)1019 WIFI_ROM_TEXT static hi_void mac_init_mib(const mac_vap_stru *mac_vap)
1020 {
1021 wlan_mib_ieee802dot11_stru *mib_info = HI_NULL;
1022 hi_u8 idx;
1023
1024 mib_info = mac_vap->mib_info;
1025 /* 公共特性mib值初始化 */
1026 mib_info->wlan_mib_sta_config.dot11_dtim_period = WLAN_DTIM_DEFAULT;
1027 mib_info->wlan_mib_operation.dot11_rts_threshold = WLAN_RTS_MAX;
1028 mib_info->wlan_mib_operation.dot11_fragmentation_threshold = WLAN_FRAG_THRESHOLD_MAX;
1029 mib_info->wlan_mib_sta_config.dot11_desired_bss_type = WLAN_MIB_DESIRED_BSSTYPE_INFRA;
1030 mib_info->wlan_mib_sta_config.dot11_beacon_period = WLAN_BEACON_INTVAL_DEFAULT;
1031 mib_info->phy_hrdsss.dot11_short_preamble_option_implemented = WLAN_LEGACY_11B_MIB_SHORT_PREAMBLE;
1032 mib_info->phy_hrdsss.dot11_pbcc_option_implemented = HI_FALSE;
1033 mib_info->phy_hrdsss.dot11_channel_agility_present = HI_FALSE;
1034 mib_info->wlan_mib_sta_config.dot11_multi_domain_capability_activated = HI_TRUE;
1035 mib_info->wlan_mib_sta_config.dot11_spectrum_management_required = HI_TRUE;
1036 mib_info->wlan_mib_sta_config.dot11_extended_channel_switch_activated = HI_FALSE;
1037 mib_info->wlan_mib_sta_config.dot11_qos_option_implemented = HI_TRUE;
1038 mib_info->wlan_mib_sta_config.dot11_apsd_option_implemented = HI_FALSE;
1039 mib_info->wlan_mib_sta_config.dot11_qbss_load_implemented = HI_TRUE;
1040 mib_info->wlan_mib_sta_config.dot11_radio_measurement_activated = HI_FALSE;
1041 mib_info->wlan_mib_sta_config.dot11_immediate_block_ack_option_implemented = HI_TRUE;
1042 mib_info->wlan_mib_sta_config.dot11_delayed_block_ack_option_implemented = HI_FALSE;
1043 mib_info->wlan_mib_sta_config.dot11_authentication_response_time_out = WLAN_AUTH_TIMEOUT;
1044 mib_info->wlan_mib_operation.dot11_ht_protection = WLAN_MIB_HT_NO_PROTECTION;
1045 mib_info->wlan_mib_operation.dot11_rifs_mode = HI_TRUE;
1046 mib_info->wlan_mib_operation.dot11_non_gf_entities_present = HI_FALSE;
1047 mib_info->wlan_mib_operation.dot11_lsigtxop_full_protection_activated = HI_TRUE;
1048 mib_info->wlan_mib_sta_config.dot11_association_response_time_out = WLAN_ASSOC_TIMEOUT;
1049 mib_info->wlan_mib_sta_config.dot11_association_sa_query_maximum_timeout = WLAN_SA_QUERY_RETRY_TIME;
1050 mib_info->wlan_mib_sta_config.dot11_association_sa_query_retry_timeout = WLAN_SA_QUERY_MAXIMUM_TIME;
1051 /* 认证算法表初始化 */
1052 mib_info->wlan_mib_auth_alg.dot11_authentication_algorithm = WLAN_WITP_AUTH_OPEN_SYSTEM;
1053 mib_info->wlan_mib_auth_alg.dot11_authentication_algorithms_activated = HI_FALSE;
1054 /* WEP 缺省Key表初始化 */
1055 for (idx = 0; idx < WLAN_NUM_DOT11WEPDEFAULTKEYVALUE; idx++) {
1056 mib_info->ast_wlan_mib_wep_dflt_key[idx].auc_dot11_wep_default_key_value[WLAN_WEP_SIZE_OFFSET] =
1057 40; /* 大小初始化为 WEP-40 */
1058 }
1059 /* 相关私有表初始化 */
1060 mib_info->wlan_mib_privacy.dot11_privacy_invoked = HI_FALSE;
1061 mib_info->wlan_mib_privacy.dot11_wep_default_key_id = 0;
1062 mac_vap_init_wme_param(mac_vap);
1063 mac_vap_init_mib_11i(mac_vap);
1064 /* 默认11n 11ac使能关闭,配置协议模式时打开 */
1065 mac_vap_init_mib_11n(mac_vap);
1066 mib_info->wlan_mib_sta_config.dot11_power_management_mode = WLAN_MIB_PWR_MGMT_MODE_ACTIVE;
1067 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
1068 mac_vap_init_mib_mesh(mac_vap);
1069 #endif
1070 }
1071
1072 /* ****************************************************************************
1073 功能描述 : 依据VAP 协议模式,初始化vap HT/VHT 相应 MIB 能力
1074 输入参数 : pst_mac_vap: 指向vap
1075 修改历史 :
1076 1.日 期 : 2013年12月28日
1077 作 者 : HiSilicon
1078 修改内容 : 新生成函数
1079 **************************************************************************** */
mac_vap_config_vht_ht_mib_by_protocol(const mac_vap_stru * mac_vap)1080 WIFI_ROM_TEXT hi_u32 mac_vap_config_vht_ht_mib_by_protocol(const mac_vap_stru *mac_vap)
1081 {
1082 if (mac_vap->mib_info == HI_NULL) {
1083 oam_error_log3(mac_vap->vap_id, OAM_SF_ASSOC,
1084 "{mac_vap_config_vht_ht_mib_by_protocol::pst_mib_info null,vap mode[%d] state[%d] user num[%d].}",
1085 mac_vap->vap_mode, mac_vap->vap_state, mac_vap->user_nums);
1086 return HI_FAIL;
1087 }
1088 if ((mac_vap->protocol == WLAN_HT_MODE) || (mac_vap->protocol == WLAN_HT_ONLY_MODE)) {
1089 mac_vap->mib_info->wlan_mib_sta_config.dot11_high_throughput_option_implemented = HI_TRUE;
1090 } else {
1091 mac_vap->mib_info->wlan_mib_sta_config.dot11_high_throughput_option_implemented = HI_FALSE;
1092 }
1093 return HI_SUCCESS;
1094 }
1095
1096 /* ****************************************************************************
1097 功能描述 : 依据协议初始化vap相应能力
1098 输入参数 : pst_mac_vap: 指向vap
1099 en_protocol: 协议枚举 调用函数 :
1100 修改历史 :
1101 1.日 期 : 2013年11月18日
1102 作 者 : HiSilicon
1103 修改内容 : 新生成函数
1104 **************************************************************************** */
mac_vap_init_by_protocol(mac_vap_stru * mac_vap,wlan_protocol_enum_uint8 protocol)1105 WIFI_ROM_TEXT hi_u32 mac_vap_init_by_protocol(mac_vap_stru *mac_vap, wlan_protocol_enum_uint8 protocol)
1106 {
1107 mac_vap->protocol = protocol;
1108 if (protocol < WLAN_HT_MODE) {
1109 mac_vap_cap_init_legacy(mac_vap);
1110 } else {
1111 mac_vap_cap_init_htvht(mac_vap);
1112 }
1113 /* 根据协议模式更新mib值 */
1114 if (mac_vap_config_vht_ht_mib_by_protocol(mac_vap) != HI_SUCCESS) {
1115 return HI_FAIL;
1116 }
1117 return HI_SUCCESS;
1118 }
1119
1120 /* ****************************************************************************
1121 功能描述 : 根据带宽更改vap的mib值
1122 修改历史 :
1123 1.日 期 : 2014年5月20日
1124 作 者 : HiSilicon
1125 修改内容 : 新生成函数
1126 **************************************************************************** */
mac_vap_change_mib_by_bandwidth(const mac_vap_stru * mac_vap,wlan_channel_bandwidth_enum_uint8 bandwidth)1127 WIFI_ROM_TEXT hi_void mac_vap_change_mib_by_bandwidth(const mac_vap_stru *mac_vap,
1128 wlan_channel_bandwidth_enum_uint8 bandwidth)
1129 {
1130 wlan_mib_ieee802dot11_stru *mib_info = HI_NULL;
1131
1132 mib_info = mac_vap->mib_info;
1133 if (mib_info == HI_NULL) {
1134 oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{mac_vap_change_mib_by_bandwidth::pst_mib_info null.}");
1135 return;
1136 }
1137
1138 /* 更新short gi使能mib, 默认全使能,根据带宽信息更新 */
1139 mib_info->phy_ht.dot11_short_gi_option_in_twenty_implemented = HI_TRUE;
1140 if (WLAN_BAND_WIDTH_20M == bandwidth) {
1141 mac_mib_set_forty_mhz_operation_implemented(mac_vap, HI_FALSE);
1142 mac_mib_set_shortgi_option_in_forty_implemented(mac_vap, HI_FALSE);
1143 }
1144 }
1145
mac_vap_stru_mesh_info(mac_vap_stru * mac_vap)1146 WIFI_ROM_TEXT static hi_void mac_vap_stru_mesh_info(mac_vap_stru *mac_vap)
1147 {
1148 mac_vap->cap_flag.hide_meshid = HI_TRUE;
1149 mac_vap->report_times_limit = MAC_MAX_REPORT_TIME;
1150 mac_vap->report_tx_cnt_limit = MAC_MAX_REPORT_TX_CNT;
1151 mac_vap->priority = 0x0; /* 初始化为最低优先级 */
1152 mac_vap->mnid = MAC_MESH_INVALID_ID; /* 初始化为无效值 */
1153 mac_vap->is_mbr = HI_FALSE;
1154 mac_vap->mesh_accept_sta = HI_FALSE; /* 初始Mesh未加入组网,不支持STA加入 */
1155 mac_vap->mesh_tbtt_adjusting = HI_FALSE; /* 初始Mesh未在调整tbtt */
1156 }
1157
mac_vap_init_mode(mac_vap_stru * mac_vap,const mac_cfg_add_vap_param_stru * param)1158 WIFI_ROM_TEXT static hi_u32 mac_vap_init_mode(mac_vap_stru *mac_vap, const mac_cfg_add_vap_param_stru *param)
1159 {
1160 switch (mac_vap->vap_mode) {
1161 case WLAN_VAP_MODE_CONFIG:
1162 return HI_SUCCESS;
1163 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
1164 case WLAN_VAP_MODE_MESH:
1165 mac_vap_stru_mesh_info(mac_vap);
1166 #endif
1167 /* fall-through */
1168 case WLAN_VAP_MODE_BSS_STA:
1169 case WLAN_VAP_MODE_BSS_AP:
1170 mac_vap->assoc_vap_id = 0xff;
1171 mac_vap->tx_power = WLAN_MAX_TXPOWER;
1172 mac_vap->protection.protection_mode = WLAN_PROT_NO;
1173 mac_vap->cap_flag.dsss_cck_mode_40mhz = HI_FALSE;
1174 mac_vap->cap_flag.uapsd = HI_FALSE;
1175 #ifdef _PRE_WLAN_FEATURE_UAPSD
1176 if ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP)
1177 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
1178 || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
1179 #endif
1180 ) {
1181 mac_vap->cap_flag.uapsd = param->uapsd_enable;
1182 }
1183 #endif
1184 /* 初始化dpd能力 */
1185 mac_vap->cap_flag.dpd_enbale = HI_TRUE;
1186 mac_vap->cap_flag.keepalive = HI_TRUE;
1187 mac_vap->channel.band = WLAN_BAND_BUTT;
1188 mac_vap->channel.en_bandwidth = WLAN_BAND_WIDTH_BUTT;
1189 mac_vap->protocol = WLAN_PROTOCOL_BUTT;
1190 /* 设置自动保护开启 */
1191 mac_vap->protection.auto_protection = HI_SWITCH_ON;
1192 /* 设置VAP状态为初始状态INIT */
1193 mac_vap_state_change(mac_vap, MAC_VAP_STATE_INIT);
1194 /* 清mac vap下的uapsd的状态,否则状态会有残留,导致host device uapsd信息不同步 */
1195 #ifdef _PRE_WLAN_FEATURE_STA_PM
1196 /* 安全编程规则6.6例外(1) 对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
1197 memset_s(&(mac_vap->sta_uapsd_cfg), sizeof(mac_cfg_uapsd_sta_stru), 0, sizeof(mac_cfg_uapsd_sta_stru));
1198 #endif
1199 break;
1200 default:
1201 oam_warning_log1(0, OAM_SF_ANY, "{mac_vap_init_mode::invalid vap mode[%d].}", mac_vap->vap_mode);
1202 return HI_ERR_CODE_INVALID_CONFIG;
1203 }
1204 return HI_SUCCESS;
1205 }
1206
mac_vap_init_mib(mac_vap_stru * mac_vap,hi_u8 vap_id)1207 WIFI_ROM_TEXT static hi_u32 mac_vap_init_mib(mac_vap_stru *mac_vap, hi_u8 vap_id)
1208 {
1209 mac_device_stru *mac_dev = mac_res_get_dev();
1210 wlan_mib_ieee802dot11_stru *mib_info = HI_NULL;
1211
1212 /* 申请MIB内存空间,配置VAP没有MIB */
1213 if ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) || (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP) ||
1214 (mac_vap->vap_mode == WLAN_VAP_MODE_WDS)
1215 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
1216 || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
1217 #endif
1218 ) {
1219 mac_vap->mib_info = oal_mem_alloc(OAL_MEM_POOL_ID_MIB, sizeof(wlan_mib_ieee802dot11_stru));
1220 if (mac_vap->mib_info == HI_NULL) {
1221 oam_error_log1(mac_vap->vap_id, OAM_SF_ANY, "{mac_vap_init_mib::pst_mib_info alloc null, size[%d].}",
1222 sizeof(wlan_mib_ieee802dot11_stru));
1223 return HI_ERR_CODE_ALLOC_MEM_FAIL;
1224 }
1225 mib_info = mac_vap->mib_info;
1226 /* 安全编程规则6.6例外(3)从堆中分配内存后,赋予初值 */
1227 memset_s(mib_info, sizeof(wlan_mib_ieee802dot11_stru), 0, sizeof(wlan_mib_ieee802dot11_stru));
1228 if (memcpy_s(mib_info->wlan_mib_sta_config.auc_dot11_station_id, WLAN_MAC_ADDR_LEN, mac_dev->auc_hw_addr,
1229 WLAN_MAC_ADDR_LEN) != EOK) {
1230 mac_vap_free_mib(mac_vap);
1231 return HI_FAIL;
1232 }
1233 /* VAP的mac地址为device地址的最后一个值+vap id */
1234 mib_info->wlan_mib_sta_config.auc_dot11_station_id[WLAN_MAC_ADDR_LEN - 1] += vap_id;
1235 mac_init_mib(mac_vap);
1236 /* sta以最大能力启用 */
1237 if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
1238 mac_vap->protocol = WLAN_HT_MODE;
1239 mac_vap->channel.en_bandwidth = WLAN_BAND_WIDTH_20M;
1240 mac_vap->channel.band = WLAN_BAND_2G;
1241 if (HI_SUCCESS != mac_vap_init_by_protocol(mac_vap, WLAN_HT_MODE)) {
1242 mac_vap_free_mib(mac_vap);
1243 return HI_ERR_CODE_INVALID_CONFIG;
1244 }
1245 mac_vap_init_rates(mac_vap);
1246 }
1247 }
1248 return HI_SUCCESS;
1249 }
1250
1251 /* ****************************************************************************
1252 功能描述 : mac vap init
1253 修改历史 :
1254 1.日 期 : 2013年5月29日
1255 作 者 : HiSilicon
1256 修改内容 : 新生成函数
1257 **************************************************************************** */
mac_vap_init(mac_vap_stru * mac_vap,hi_u8 vap_id,const mac_cfg_add_vap_param_stru * param)1258 WIFI_ROM_TEXT hi_u32 mac_vap_init(mac_vap_stru *mac_vap, hi_u8 vap_id, const mac_cfg_add_vap_param_stru *param)
1259 {
1260 hi_u32 loop;
1261 hi_u32 ret;
1262
1263 if (memset_s(mac_vap, sizeof(mac_vap_stru), 0, sizeof(mac_vap_stru)) != EOK) {
1264 return HI_FAIL;
1265 }
1266
1267 mac_vap->vap_id = vap_id;
1268 mac_vap->vap_mode = param->vap_mode;
1269 mac_vap->cap_flag.disable_2ght40 = HI_TRUE;
1270 mac_vap->ch_switch_info.new_bandwidth = WLAN_BAND_WIDTH_BUTT;
1271
1272 for (loop = 0; loop < MAC_VAP_USER_HASH_MAX_VALUE; loop++) {
1273 hi_list_init(&(mac_vap->ast_user_hash[loop]));
1274 }
1275 hi_list_init(&mac_vap->mac_user_list_head);
1276
1277 ret = mac_vap_init_mode(mac_vap, param);
1278 if (ret != HI_SUCCESS) {
1279 oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{mac_vap_init_mode fail.}");
1280 return ret;
1281 }
1282
1283 ret = mac_vap_init_mib(mac_vap, vap_id);
1284 if (ret != HI_SUCCESS) {
1285 oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{mac_vap_init_mib fail.}");
1286 return ret;
1287 }
1288 oal_spin_lock_init(&mac_vap->cache_user_lock);
1289 return HI_SUCCESS;
1290 }
1291
1292 /* ****************************************************************************
1293 功能描述 : add wep key逻辑,抛事件到DMAC
1294 输入参数 : mac_vap_stru *pst_mac_vap, hi_u16 us_len, hi_u8 *puc_param
1295 修改历史 :
1296 1.日 期 : 2014年11月21日
1297 作 者 : HiSilicon
1298 修改内容 : 新生成函数
1299 2.日 期 : 2015年5月12日
1300 作 者 : HiSilicon
1301 修改内容 : wep密钥保存在组播用户中
1302 **************************************************************************** */
mac_vap_add_wep_key(const mac_vap_stru * mac_vap,hi_u16 us_len,hi_u8 * puc_param)1303 WIFI_ROM_TEXT static hi_u32 mac_vap_add_wep_key(const mac_vap_stru *mac_vap, hi_u16 us_len, hi_u8 *puc_param)
1304 {
1305 mac_wep_key_param_stru *wep_addkey_params = HI_NULL;
1306 mac_user_stru *multi_user = HI_NULL;
1307 wlan_priv_key_param_stru *wep_key = HI_NULL;
1308 hi_u32 cipher_type = WLAN_CIPHER_SUITE_WEP40;
1309 hi_u8 wep_cipher_type = WLAN_80211_CIPHER_SUITE_WEP_40;
1310
1311 hi_unref_param(us_len);
1312
1313 wep_addkey_params = (mac_wep_key_param_stru *)puc_param;
1314 /* wep 密钥最大为4个 */
1315 if (wep_addkey_params->key_index >= WLAN_MAX_WEP_KEY_COUNT) {
1316 return HI_ERR_CODE_SECURITY_KEY_ID;
1317 }
1318 switch (wep_addkey_params->key_len) {
1319 case WLAN_WEP40_KEY_LEN:
1320 wep_cipher_type = WLAN_80211_CIPHER_SUITE_WEP_40;
1321 cipher_type = WLAN_CIPHER_SUITE_WEP40;
1322 break;
1323 case WLAN_WEP104_KEY_LEN:
1324 wep_cipher_type = WLAN_80211_CIPHER_SUITE_WEP_104;
1325 cipher_type = WLAN_CIPHER_SUITE_WEP104;
1326 break;
1327 default:
1328 return HI_ERR_CODE_SECURITY_KEY_LEN;
1329 }
1330 /* WEP密钥信息记录到组播用户中 */
1331 multi_user = mac_user_get_user_stru(mac_vap->multi_user_idx);
1332 if (multi_user == HI_NULL) {
1333 return HI_ERR_CODE_SECURITY_USER_INVAILD;
1334 }
1335 mac_mib_set_privacyinvoked(mac_vap, HI_TRUE);
1336 /* 初始化组播用户的安全信息 */
1337 if (wep_addkey_params->default_key) {
1338 multi_user->key_info.cipher_type = wep_cipher_type;
1339 multi_user->key_info.default_index = wep_addkey_params->key_index;
1340 multi_user->key_info.igtk_key_index = 0xff; /* wep时设置为无效 */
1341 multi_user->key_info.gtk = 0;
1342 }
1343
1344 wep_key = &multi_user->key_info.ast_key[wep_addkey_params->key_index];
1345 wep_key->cipher = cipher_type;
1346 wep_key->key_len = (hi_u32)wep_addkey_params->key_len;
1347
1348 /* 安全编程规则6.6例外(1) 对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
1349 memset_s(wep_key->auc_key, WLAN_WPA_KEY_LEN, 0, WLAN_WPA_KEY_LEN);
1350 if (memcpy_s(wep_key->auc_key, WLAN_WPA_KEY_LEN, wep_addkey_params->auc_wep_key,
1351 wep_addkey_params->key_len) != EOK) {
1352 return HI_FAIL;
1353 }
1354 multi_user->user_tx_info.security.cipher_key_type = wep_addkey_params->key_index + HAL_KEY_TYPE_PTK;
1355 multi_user->user_tx_info.security.cipher_protocol_type = wep_cipher_type;
1356 return HI_SUCCESS;
1357 }
1358
1359 #ifdef _PRE_WLAN_FEATURE_PMF
1360 /* ****************************************************************************
1361 功能描述 : 获取pmf的配置能力
1362 修改历史 :
1363 1.日 期 : 2015年2月7日
1364 作 者 : HiSilicon
1365 修改内容 : 新生成函数
1366 **************************************************************************** */
mac_vap_init_pmf(mac_vap_stru * mac_vap,const mac_cfg80211_connect_security_stru * mac_security_param)1367 WIFI_ROM_TEXT static hi_u32 mac_vap_init_pmf(mac_vap_stru *mac_vap,
1368 const mac_cfg80211_connect_security_stru *mac_security_param)
1369 {
1370 if (!mac_mib_get_rsnaactivated(mac_vap)) {
1371 return HI_TRUE;
1372 }
1373 switch (mac_security_param->pmf_cap) {
1374 case MAC_PMF_DISABLED: {
1375 mac_mib_set_dot11_rsnamfpc(mac_vap, HI_FALSE);
1376 mac_mib_set_dot11_rsnamfpr(mac_vap, HI_FALSE);
1377 } break;
1378 case MAC_PMF_ENABLED: {
1379 mac_mib_set_dot11_rsnamfpc(mac_vap, HI_TRUE);
1380 mac_mib_set_dot11_rsnamfpr(mac_vap, HI_FALSE);
1381 } break;
1382 case MAC_PME_REQUIRED: {
1383 mac_mib_set_dot11_rsnamfpc(mac_vap, HI_TRUE);
1384 mac_mib_set_dot11_rsnamfpr(mac_vap, HI_TRUE);
1385 } break;
1386 default: {
1387 return HI_FALSE;
1388 }
1389 }
1390
1391 if (MAC_NL80211_MFP_REQUIRED == mac_security_param->mgmt_proteced) {
1392 mac_vap->user_pmf_cap = HI_TRUE;
1393 } else {
1394 mac_vap->user_pmf_cap = HI_FALSE;
1395 }
1396 return HI_SUCCESS;
1397 }
1398 #endif
1399
mac_vap_init_crypto_suites(mac_vap_stru * mac_vap,const mac_cfg80211_crypto_settings_stru * crypto)1400 WIFI_ROM_TEXT hi_void mac_vap_init_crypto_suites(mac_vap_stru *mac_vap, const mac_cfg80211_crypto_settings_stru *crypto)
1401 {
1402 hi_u8 loop = 0;
1403
1404 /* 初始化单播密钥套件 */
1405 if (crypto->wpa_versions == WITP_WPA_VERSION_1) {
1406 mac_vap->cap_flag.wpa = HI_TRUE;
1407 for (loop = 0; loop < crypto->n_ciphers_pairwise; loop++) {
1408 mac_mib_set_rsnaconfig_wpa_pairwise_cipher_implemented(mac_vap, crypto->ciphers_pairwise[loop]);
1409 }
1410 } else if (crypto->wpa_versions == WITP_WPA_VERSION_2) {
1411 mac_vap->cap_flag.wpa2 = HI_TRUE;
1412 for (loop = 0; loop < crypto->n_ciphers_pairwise; loop++) {
1413 mac_mib_set_rsnaconfig_wpa2_pairwise_cipher_implemented(mac_vap, crypto->ciphers_pairwise[loop]);
1414 }
1415 }
1416
1417 /* 初始化认证套件 */
1418 for (loop = 0; loop < crypto->n_akm_suites; loop++) {
1419 mac_mib_set_rsnaconfig_authentication_suite_implemented(mac_vap, crypto->akm_suites[loop], loop);
1420 }
1421 }
1422
1423 /* ****************************************************************************
1424 功能描述 : 根据内核下发的关联能力,赋值加密相关的mib 值
1425 输入参数 : mac_vap_stru *pst_mac_vap
1426 mac_cfg80211_connect_param_stru *pst_mac_connect_param
1427 修改历史 :
1428 1.日 期 : 2014年1月26日
1429 作 者 : HiSilicon
1430 修改内容 : 新生成函数
1431 **************************************************************************** */
mac_vap_init_privacy(mac_vap_stru * mac_vap,mac_cfg80211_connect_security_stru * mac_sec_param)1432 WIFI_ROM_TEXT hi_u32 mac_vap_init_privacy(mac_vap_stru *mac_vap, mac_cfg80211_connect_security_stru *mac_sec_param)
1433 {
1434 mac_wep_key_param_stru wep_key = { 0 };
1435 mac_cfg80211_crypto_settings_stru *crypto = HI_NULL;
1436 hi_u32 ret;
1437
1438 mac_mib_set_privacyinvoked(mac_vap, HI_FALSE);
1439 #if defined(_PRE_WLAN_FEATURE_WPA) || defined(_PRE_WLAN_FEATURE_WPA2)
1440 /* 初始化 RSNActive 为FALSE */
1441 mac_mib_set_rsnaactivated(mac_vap, HI_FALSE);
1442 #endif
1443 /* 清除加密套件信息 */
1444 mac_mib_set_rsnaclear_wpa_pairwise_cipher_implemented(mac_vap);
1445 mac_mib_set_rsnaclear_wpa2_pairwise_cipher_implemented(mac_vap);
1446 mac_vap->cap_flag.wpa = HI_FALSE;
1447 mac_vap->cap_flag.wpa2 = HI_FALSE;
1448
1449 /* 不加密 */
1450 if (!mac_sec_param->privacy) {
1451 return HI_SUCCESS;
1452 }
1453
1454 /* WEP加密 */
1455 if (mac_sec_param->wep_key_len != 0) {
1456 wep_key.key_len = mac_sec_param->wep_key_len;
1457 wep_key.key_index = mac_sec_param->wep_key_index;
1458 wep_key.default_key = HI_TRUE;
1459 if (memcpy_s(wep_key.auc_wep_key, WLAN_WEP104_KEY_LEN, mac_sec_param->auc_wep_key, WLAN_WEP104_KEY_LEN) !=
1460 EOK) {
1461 return HI_FAIL;
1462 }
1463 ret = mac_vap_add_wep_key(mac_vap, sizeof(mac_wep_key_param_stru), (hi_u8 *)&wep_key);
1464 if (ret != HI_SUCCESS) {
1465 oam_error_log1(mac_vap->vap_id, OAM_SF_WPA, "{mac_vap_init_privacy::wep_key failed[%d].}", ret);
1466 }
1467 return ret;
1468 }
1469
1470 /* WPA/WPA2加密 */
1471 crypto = &(mac_sec_param->crypto);
1472 if ((crypto->n_ciphers_pairwise > WLAN_PAIRWISE_CIPHER_SUITES) ||
1473 (crypto->n_akm_suites > MAC_AUTHENTICATION_SUITE_NUM)) {
1474 oam_error_log2(mac_vap->vap_id, OAM_SF_WPA, "{mac_vap_init_privacy::cipher[%d] akm[%d] unexpected.}",
1475 crypto->n_ciphers_pairwise, crypto->n_akm_suites);
1476 return HI_ERR_CODE_SECURITY_CHIPER_TYPE;
1477 }
1478
1479 /* 初始化RSNA mib 为 TRUR */
1480 mac_mib_set_privacyinvoked(mac_vap, HI_TRUE);
1481 mac_mib_set_rsnaactivated(mac_vap, HI_TRUE);
1482
1483 /* 初始化组播密钥套件 */
1484 mac_mib_set_rsnacfggroupcipher(mac_vap, (hi_u8)(crypto->cipher_group));
1485
1486 #ifdef _PRE_WLAN_FEATURE_PMF
1487 ret = mac_vap_init_pmf(mac_vap, mac_sec_param);
1488 if (ret != HI_SUCCESS) {
1489 oam_error_log1(mac_vap->vap_id, OAM_SF_WPA, "{mac_11i_init_privacy::mac_11w_init_privacy failed[%d].}", ret);
1490 return ret;
1491 }
1492 #endif
1493 /* 初始化单播密钥套件和认证套件 */
1494 mac_vap_init_crypto_suites(mac_vap, crypto);
1495 return HI_SUCCESS;
1496 }
1497
1498 /* ****************************************************************************
1499 功能描述 : 根据mac地址获取mac_user指针
1500 **************************************************************************** */
mac_vap_get_user_by_addr(mac_vap_stru * mac_vap,const hi_u8 * mac_addr)1501 WIFI_ROM_TEXT mac_user_stru *mac_vap_get_user_by_addr(mac_vap_stru *mac_vap, const hi_u8 *mac_addr)
1502 {
1503 hi_u32 ret;
1504 hi_u8 user_idx = 0xff;
1505 mac_user_stru *mac_user = HI_NULL;
1506
1507 /* 根据mac addr找到sta索引 */
1508 ret = mac_vap_find_user_by_macaddr(mac_vap, mac_addr, WLAN_MAC_ADDR_LEN, &user_idx);
1509 if (ret != HI_SUCCESS) {
1510 oam_info_log1(0, OAM_SF_ANY, "{mac_vap_get_user_by_addr::find_user_by_macaddr failed[%d].}", ret);
1511 if (mac_addr != HI_NULL) {
1512 oam_info_log3(0, OAM_SF_ANY, "{mac_vap_get_user_by_addr::mac[%x:XX:XX:XX:%x:%x] cant be found!}",
1513 mac_addr[0], mac_addr[4], mac_addr[5]); /* 维测记录[0]、[4]、[5] */
1514 }
1515 return HI_NULL;
1516 }
1517 /* 根据sta索引找到user内存区域 */
1518 mac_user = mac_user_get_user_stru(user_idx);
1519 if (mac_user == HI_NULL) {
1520 oam_error_log0(0, OAM_SF_ANY, "{mac_vap_get_user_by_addr::user ptr null.}");
1521 }
1522 return mac_user;
1523 }
1524
mac_vap_config_group_cipher(const mac_vap_stru * mac_vap,const mac_beacon_param_stru * beacon_param,wlan_mib_dot11_rsna_config_entry_stru * mib_rsna_cfg)1525 WIFI_ROM_TEXT static hi_u32 mac_vap_config_group_cipher(const mac_vap_stru *mac_vap,
1526 const mac_beacon_param_stru *beacon_param, wlan_mib_dot11_rsna_config_entry_stru *mib_rsna_cfg)
1527 {
1528 switch (beacon_param->group_crypto) {
1529 case WLAN_80211_CIPHER_SUITE_TKIP:
1530 mib_rsna_cfg->dot11_rsna_config_group_cipher_size = WLAN_TKIP_KEY_LEN * 8; /* 乘8转成bit数 */
1531 break;
1532 case WLAN_80211_CIPHER_SUITE_CCMP:
1533 mib_rsna_cfg->dot11_rsna_config_group_cipher_size = WLAN_CCMP_KEY_LEN * 8; /* 乘8转成bit数 */
1534 break;
1535 default:
1536 if (mac_vap != HI_NULL) {
1537 oam_error_log1(mac_vap->vap_id, OAM_SF_CFG,
1538 "{mac_vap_config_group_cipher::UNEXPECTED group_crypto[%d].}", beacon_param->group_crypto);
1539 }
1540
1541 return HI_ERR_CODE_SECURITY_CHIPER_TYPE;
1542 }
1543 mib_rsna_cfg->dot11_rsna_config_group_cipher = beacon_param->group_crypto;
1544
1545 return HI_SUCCESS;
1546 }
1547
1548 /* 清除之前的加密配置信息
1549 */
mac_vap_clear_auth_suite(mac_vap_stru * mac_vap)1550 WIFI_ROM_TEXT static hi_void mac_vap_clear_auth_suite(mac_vap_stru *mac_vap)
1551 {
1552 mac_mib_set_rsnaclear_wpa_pairwise_cipher_implemented(mac_vap);
1553 mac_mib_set_rsnaclear_wpa2_pairwise_cipher_implemented(mac_vap);
1554 mac_mib_set_privacyinvoked(mac_vap, HI_FALSE);
1555 mac_mib_set_rsnaactivated(mac_vap, HI_FALSE);
1556 mac_vap->cap_flag.wpa = HI_FALSE;
1557 mac_vap->cap_flag.wpa2 = HI_FALSE;
1558 mac_mib_clear_rsna_auth_suite(mac_vap);
1559 }
1560
1561 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
mac_vap_config_mesh_group_cipher(const mac_vap_stru * mac_vap,const mac_beacon_param_stru * beacon_param,wlan_mib_dot11_rsna_config_entry_stru * mib_rsna_cfg)1562 WIFI_ROM_TEXT static hi_u32 mac_vap_config_mesh_group_cipher(const mac_vap_stru *mac_vap,
1563 const mac_beacon_param_stru *beacon_param, wlan_mib_dot11_rsna_config_entry_stru *mib_rsna_cfg)
1564 {
1565 if (mac_vap->mib_info->wlan_mib_sta_config.dot11_mesh_activated == HI_TRUE) {
1566 if (beacon_param->group_crypto != WLAN_80211_CIPHER_SUITE_CCMP) {
1567 oam_error_log1(mac_vap->vap_id, OAM_SF_CFG,
1568 "{mac_vap_config_mesh_group_cipher::[MESH]UNEXPECTED group_crypto[%d].}", beacon_param->group_crypto);
1569 return HI_ERR_CODE_SECURITY_CHIPER_TYPE;
1570 }
1571 mib_rsna_cfg->dot11_rsna_config_group_cipher = beacon_param->group_crypto;
1572 mib_rsna_cfg->dot11_rsna_config_group_cipher_size = WLAN_CCMP_KEY_LEN * 8; /* 乘8 转成bit数 */
1573 }
1574
1575 return HI_SUCCESS;
1576 }
1577
mac_mesh_vap_config_beacon(const mac_vap_stru * mac_vap,mac_beacon_operation_type_uint8 operation_type,const mac_beacon_param_stru * beacon_param,wlan_mib_dot11_rsna_config_entry_stru * mib_rsna_cfg)1578 WIFI_ROM_TEXT static hi_u32 mac_mesh_vap_config_beacon(const mac_vap_stru *mac_vap,
1579 mac_beacon_operation_type_uint8 operation_type, const mac_beacon_param_stru *beacon_param,
1580 wlan_mib_dot11_rsna_config_entry_stru *mib_rsna_cfg)
1581 {
1582 hi_u32 ret;
1583 if (operation_type == MAC_SET_BEACON) {
1584 ret = mac_vap_config_mesh_group_cipher(mac_vap, beacon_param, mib_rsna_cfg);
1585 if (ret != HI_SUCCESS) {
1586 return ret;
1587 }
1588 } else {
1589 ret = mac_vap_config_group_cipher(mac_vap, beacon_param, mib_rsna_cfg);
1590 if (ret != HI_SUCCESS) {
1591 return ret;
1592 }
1593 }
1594 return ret;
1595 }
1596 #endif
1597
mac_vap_authentication_suite_config(mac_vap_stru * mac_vap,wlan_mib_dot11_rsna_config_entry_stru * mib_rsna_cfg,const mac_beacon_param_stru * beacon_param)1598 WIFI_ROM_TEXT static hi_void mac_vap_authentication_suite_config(mac_vap_stru *mac_vap,
1599 wlan_mib_dot11_rsna_config_entry_stru *mib_rsna_cfg, const mac_beacon_param_stru *beacon_param)
1600 {
1601 hi_u32 loop;
1602
1603 /* 配置认证套件 */
1604 for (loop = 0; loop < MAC_AUTHENTICATION_SUITE_NUM; loop++) {
1605 if (beacon_param->auc_auth_type[loop] == 0xff) {
1606 continue;
1607 }
1608 mac_mib_set_rsna_auth_suite(mac_vap, beacon_param->auc_auth_type[loop]);
1609 }
1610
1611 if (beacon_param->crypto_mode & WLAN_WPA_BIT) {
1612 mac_vap->cap_flag.wpa = HI_TRUE;
1613 /* 配置WPA单播密钥套件 */
1614 for (loop = 0; loop < MAC_PAIRWISE_CIPHER_SUITES_NUM; loop++) {
1615 if (beacon_param->auc_pairwise_crypto_wpa[loop] == 0xff) {
1616 continue;
1617 }
1618 mac_mib_set_rsnaconfig_wpa_pairwise_cipher_implemented(mac_vap,
1619 beacon_param->auc_pairwise_crypto_wpa[loop]);
1620 }
1621 }
1622
1623 if (beacon_param->crypto_mode & WLAN_WPA2_BIT) {
1624 mac_vap->cap_flag.wpa2 = HI_TRUE;
1625 /* 配置WPA2单播密钥套件 */
1626 for (loop = 0; loop < MAC_PAIRWISE_CIPHER_SUITES_NUM; loop++) {
1627 if (beacon_param->auc_pairwise_crypto_wpa2[loop] == 0xff) {
1628 continue;
1629 }
1630 mac_mib_set_rsnaconfig_wpa2_pairwise_cipher_implemented(mac_vap,
1631 beacon_param->auc_pairwise_crypto_wpa2[loop]);
1632 }
1633
1634 /* RSN 能力 */
1635 mac_vap->mib_info->wlan_mib_privacy.dot11_rsnamfpr =
1636 (beacon_param->us_rsn_capability & BIT6) ? HI_TRUE : HI_FALSE;
1637 mac_vap->mib_info->wlan_mib_privacy.dot11_rsnamfpc =
1638 (beacon_param->us_rsn_capability & BIT7) ? HI_TRUE : HI_FALSE;
1639 mac_vap->mib_info->wlan_mib_privacy.dot11_rsna_preauthentication_activated =
1640 beacon_param->us_rsn_capability & BIT0;
1641 mib_rsna_cfg->dot11_rsna_config_number_of_ptksa_replay_counters_implemented =
1642 (beacon_param->us_rsn_capability & 0x0C) >> 2; /* 右移2 bit */
1643 mib_rsna_cfg->dot11_rsna_config_number_of_gtksa_replay_counters_implemented =
1644 (beacon_param->us_rsn_capability & 0x30) >> 4; /* 右移4 bit */
1645 }
1646 }
1647
1648 /* ****************************************************************************
1649 功能描述 : 复位11X端口
1650 修改历史 :
1651 1.日 期 : 2014年11月21日
1652 作 者 : HiSilicon
1653 修改内容 : 新生成函数
1654 **************************************************************************** */
mac_vap_config_beacon(mac_vap_stru * mac_vap,mac_beacon_operation_type_uint8 operation_type,const mac_beacon_param_stru * beacon_param)1655 WIFI_ROM_TEXT static hi_u32 mac_vap_config_beacon(mac_vap_stru *mac_vap,
1656 mac_beacon_operation_type_uint8 operation_type, const mac_beacon_param_stru *beacon_param)
1657 {
1658 mac_user_stru *multi_user = HI_NULL;
1659 wlan_mib_dot11_rsna_config_entry_stru *mib_rsna_cfg = HI_NULL;
1660 hi_u32 ret;
1661
1662 if (operation_type >= MAC_BEACON_OPERATION_BUTT) {
1663 oam_error_log2(mac_vap->vap_id, OAM_SF_CFG, "{mac_vap_add_beacon::en_operation_type:%d error [idx:%d]}",
1664 operation_type, mac_vap->multi_user_idx);
1665 }
1666
1667 /* 清除之前的加密配置信息 */
1668 mac_vap_clear_auth_suite(mac_vap);
1669
1670 mac_vap->mib_info->wlan_mib_privacy.dot11_rsnamfpr = HI_FALSE;
1671 mac_vap->mib_info->wlan_mib_privacy.dot11_rsnamfpc = HI_FALSE;
1672
1673 if (operation_type == MAC_ADD_BEACON) {
1674 /* 清除组播密钥信息 */
1675 multi_user = mac_user_get_user_stru(mac_vap->multi_user_idx);
1676 if (multi_user == HI_NULL) {
1677 oam_error_log1(mac_vap->vap_id, OAM_SF_CFG, "{mac_vap_add_beacon::pst_multi_user null [idx:%d] .}",
1678 mac_vap->multi_user_idx);
1679 return HI_ERR_CODE_PTR_NULL;
1680 }
1681 }
1682
1683 if (!beacon_param->privacy) {
1684 return HI_SUCCESS;
1685 }
1686 /* 使能加密 */
1687 mac_mib_set_privacyinvoked(mac_vap, HI_TRUE);
1688 mib_rsna_cfg = &mac_vap->mib_info->wlan_mib_rsna_cfg;
1689 if ((beacon_param->crypto_mode & (WLAN_WPA_BIT | WLAN_WPA2_BIT)) == 0) {
1690 return HI_SUCCESS;
1691 }
1692 /* WEP加密时,在addbeacon流程之前,已经通过add key配置了密钥。 */
1693 if (operation_type == MAC_ADD_BEACON) {
1694 mac_user_init_key(multi_user);
1695 /* 本函数前面的if语句已经判断了multi_user非空,误报告警,lin_t e613告警屏蔽 */
1696 multi_user->user_tx_info.security.cipher_key_type = WLAN_KEY_TYPE_TX_GTK;
1697 }
1698 mac_mib_set_rsnaactivated(mac_vap, HI_TRUE);
1699
1700 /* 配置组播套件 */
1701 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
1702 ret = mac_mesh_vap_config_beacon(mac_vap, operation_type, beacon_param, mib_rsna_cfg);
1703 if (ret != HI_SUCCESS) {
1704 return ret;
1705 }
1706 #else
1707 ret = mac_vap_config_group_cipher(mac_vap, beacon_param, mib_rsna_cfg);
1708 if (ret != HI_SUCCESS) {
1709 return ret;
1710 }
1711 #endif
1712 /* 配置认证套件 */
1713 mac_vap_authentication_suite_config(mac_vap, mib_rsna_cfg, beacon_param);
1714 return HI_SUCCESS;
1715 }
1716 /* mac_vap_add_beacon->mac_vap_config_beacon->mac_vap_clear_auth_suite,作了修改,lin_t e818告警屏蔽 */
mac_vap_add_beacon(mac_vap_stru * mac_vap,const mac_beacon_param_stru * beacon_param)1717 WIFI_ROM_TEXT hi_u32 mac_vap_add_beacon(mac_vap_stru *mac_vap, const mac_beacon_param_stru *beacon_param)
1718 {
1719 return mac_vap_config_beacon(mac_vap, MAC_ADD_BEACON, beacon_param);
1720 }
1721
1722 /* ****************************************************************************
1723 功能描述 : 根据en_key_type,调用相应的函数,更新vap信息
1724 修改历史 :
1725 1.日 期 : 2014年11月21日
1726 作 者 : HiSilicon
1727 修改内容 : 新生成函数
1728 **************************************************************************** */
mac_vap_add_key(const mac_vap_stru * mac_vap,mac_user_stru * mac_user,hi_u8 key_id,const mac_key_params_stru * key)1729 WIFI_ROM_TEXT hi_u32 mac_vap_add_key(const mac_vap_stru *mac_vap, mac_user_stru *mac_user, hi_u8 key_id,
1730 const mac_key_params_stru *key)
1731 {
1732 hi_u32 ret;
1733
1734 if (((hi_u8)key->cipher == WLAN_80211_CIPHER_SUITE_WEP_40) ||
1735 ((hi_u8)key->cipher == WLAN_80211_CIPHER_SUITE_WEP_104)) {
1736 /* 设置mib */
1737 mac_mib_set_privacyinvoked(mac_vap, HI_TRUE);
1738 mac_mib_set_rsnaactivated(mac_vap, HI_FALSE);
1739 mac_mib_set_rsnacfggroupcipher(mac_vap, (hi_u8)key->cipher);
1740 ret = mac_user_add_wep_key(mac_user, key_id, key);
1741 } else if (((hi_u8)key->cipher == WLAN_80211_CIPHER_SUITE_TKIP) ||
1742 ((hi_u8)key->cipher == WLAN_80211_CIPHER_SUITE_CCMP)) {
1743 ret = mac_user_add_rsn_key(mac_user, key_id, key);
1744 } else if ((hi_u8)key->cipher == WLAN_80211_CIPHER_SUITE_BIP) {
1745 ret = mac_user_add_bip_key(mac_user, key_id, key);
1746 } else {
1747 return HI_ERR_CODE_SECURITY_CHIPER_TYPE;
1748 }
1749
1750 return ret;
1751 }
1752
1753 /* ****************************************************************************
1754 功能描述 : 获取mac加密属性default_key_id
1755 修改历史 :
1756 1.日 期 : 2015年5月12日
1757 作 者 : HiSilicon
1758 修改内容 : 新生成函数
1759 **************************************************************************** */
mac_vap_get_default_key_id(const mac_vap_stru * mac_vap)1760 WIFI_ROM_TEXT hi_u8 mac_vap_get_default_key_id(const mac_vap_stru *mac_vap)
1761 {
1762 mac_user_stru *multi_user = HI_NULL;
1763 hi_u8 default_key_id;
1764
1765 /* 根据索引,从组播用户密钥信息中查找密钥 */
1766 multi_user = mac_user_get_user_stru(mac_vap->multi_user_idx);
1767 if (multi_user == HI_NULL) {
1768 oam_error_log1(mac_vap->vap_id, OAM_SF_WPA, "{mac_vap_get_default_key_id::multi_user[%d] NULL}",
1769 mac_vap->multi_user_idx);
1770 return 0;
1771 }
1772
1773 if ((multi_user->key_info.cipher_type != WLAN_80211_CIPHER_SUITE_WEP_40) &&
1774 (multi_user->key_info.cipher_type != WLAN_80211_CIPHER_SUITE_WEP_104)) {
1775 oam_error_log1(mac_vap->vap_id, OAM_SF_WPA, "{mac_vap_get_default_key_id::unexpected cipher_type[%d]}",
1776 multi_user->key_info.cipher_type);
1777 return 0;
1778 }
1779 default_key_id = multi_user->key_info.default_index;
1780 if (default_key_id >= WLAN_NUM_TK) {
1781 oam_error_log1(mac_vap->vap_id, OAM_SF_WPA, "{mac_vap_get_default_key_id::unexpected keyid[%d]}",
1782 default_key_id);
1783 return 0;
1784 }
1785 return default_key_id;
1786 }
1787
1788 /* ****************************************************************************
1789 功能描述 : 更新hmac加密属性default_key
1790 修改历史 :
1791 1.日 期 : 2014年11月21日
1792 作 者 : HiSilicon
1793 修改内容 : 新生成函数
1794 **************************************************************************** */
mac_vap_set_default_key(const mac_vap_stru * mac_vap,hi_u8 key_index)1795 WIFI_ROM_TEXT hi_u32 mac_vap_set_default_key(const mac_vap_stru *mac_vap, hi_u8 key_index)
1796 {
1797 wlan_priv_key_param_stru *wep_key = HI_NULL;
1798 mac_user_stru *multi_user = HI_NULL;
1799
1800 /* 1.1 如果非wep 加密,则直接返回 */
1801 if (!mac_is_wep_enabled(mac_vap)) {
1802 return HI_SUCCESS;
1803 }
1804
1805 /* 2.1 根据索引,从组播用户密钥信息中查找密钥 */
1806 multi_user = mac_user_get_user_stru(mac_vap->multi_user_idx);
1807 if (multi_user == HI_NULL) {
1808 return HI_ERR_CODE_SECURITY_USER_INVAILD;
1809 }
1810 wep_key = &multi_user->key_info.ast_key[key_index];
1811 if (wep_key->cipher != WLAN_CIPHER_SUITE_WEP40 && wep_key->cipher != WLAN_CIPHER_SUITE_WEP104) {
1812 return HI_ERR_CODE_SECURITY_CHIPER_TYPE;
1813 }
1814
1815 /* 3.1 更新密钥类型及default id */
1816 multi_user->key_info.cipher_type = (hi_u8)(wep_key->cipher);
1817 multi_user->key_info.default_index = key_index;
1818 /* 4.1 设置mib属性 */
1819 mac_mib_set_wep_default_keyid(mac_vap, key_index);
1820 return HI_SUCCESS;
1821 }
1822
1823 /* ****************************************************************************
1824 功能描述 : 设置管理帧密钥
1825 修改历史 :
1826 1.日 期 : 2014年11月21日
1827 作 者 : HiSilicon
1828 修改内容 : 新生成函数
1829 **************************************************************************** */
mac_vap_set_default_mgmt_key(const mac_vap_stru * mac_vap,hi_u8 key_index)1830 WIFI_ROM_TEXT hi_u32 mac_vap_set_default_mgmt_key(const mac_vap_stru *mac_vap, hi_u8 key_index)
1831 {
1832 mac_user_stru *multi_user = HI_NULL;
1833
1834 /* 管理帧加密信息保存在组播用户中 */
1835 multi_user = mac_user_get_user_stru(mac_vap->multi_user_idx);
1836 if (multi_user == HI_NULL) {
1837 return HI_ERR_CODE_SECURITY_USER_INVAILD;
1838 }
1839 /* keyid校验 */
1840 if (key_index < WLAN_NUM_TK || key_index > WLAN_MAX_IGTK_KEY_INDEX) {
1841 return HI_ERR_CODE_SECURITY_KEY_ID;
1842 }
1843 if ((hi_u8)multi_user->key_info.ast_key[key_index].cipher != WLAN_80211_CIPHER_SUITE_BIP) {
1844 return HI_ERR_CODE_SECURITY_CHIPER_TYPE;
1845 }
1846 /* 更新IGTK的keyid */
1847 multi_user->key_info.igtk_key_index = key_index;
1848 return HI_SUCCESS;
1849 }
1850
1851 /* ****************************************************************************
1852 功能描述 : 初始化STA 加密情况下,数据过滤的参数。
1853 修改历史 :
1854 1.日 期 : 2013年9月11日
1855 作 者 : HiSilicon
1856 修改内容 : 新生成函数
1857 **************************************************************************** */
mac_vap_init_user_security_port(const mac_vap_stru * mac_vap,mac_user_stru * mac_user)1858 WIFI_ROM_TEXT hi_void mac_vap_init_user_security_port(const mac_vap_stru *mac_vap, mac_user_stru *mac_user)
1859 {
1860 mac_user->port_valid = HI_TRUE;
1861 if (!mac_vap->mib_info->wlan_mib_privacy.dot11_rsna_activated) {
1862 return;
1863 }
1864 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
1865 if ((mac_vap->vap_mode == WLAN_VAP_MODE_MESH) && (mac_user->is_mesh_user == HI_TRUE)) {
1866 if (mac_vap->mib_info->wlan_mib_mesh_sta_cfg.dot11_mesh_security_activated != HI_TRUE) {
1867 oam_warning_log0(0, OAM_SF_WPA, "{mac_vap_init_user_security_port::dot11MeshSecurityActivated is FALSE!.}");
1868 return;
1869 }
1870 if (mac_vap->mib_info->wlan_mib_mesh_sta_cfg.dot11_mesh_active_authentication_protocol !=
1871 MAC_MESH_AUTH_PROTO_SAE) {
1872 oam_warning_log0(0, OAM_SF_WPA,
1873 "{mac_vap_init_user_security_port::dot11MeshActiveAuthenticationProtocol isn't SAE!.}");
1874 return;
1875 }
1876 mac_user->port_valid = HI_FALSE;
1877 mac_user_init_key(mac_user);
1878 return;
1879 }
1880 #endif
1881
1882 /* 是否采用WPA 或WPA2 加密方式 */
1883 if (!(mac_vap->cap_flag.wpa) && !(mac_vap->cap_flag.wpa2)) {
1884 return;
1885 }
1886 /* STA需要检测是否采用802.1X 认证方式 */
1887 if ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA &&
1888 mac_check_auth_policy(mac_vap->mib_info, WLAN_AUTH_SUITE_1X) == HI_TRUE) ||
1889 ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP)
1890 #ifdef _PRE_WLAN_FEATURE_MESH_ROM
1891 || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
1892 #endif
1893 )) {
1894 mac_user->port_valid = HI_FALSE;
1895 }
1896 mac_user_init_key(mac_user);
1897 }
1898
1899 /* ****************************************************************************
1900 功能描述 : 复位11X端口
1901 修改历史 :
1902 1.日 期 : 2015年6月24日
1903 作 者 : HiSilicon
1904 修改内容 : 新生成函数
1905 **************************************************************************** */
1906 /* mac_vap_set_beacon->mac_vap_config_beacon->mac_vap_clear_auth_suite,作了修改,lin_t e818告警屏蔽 */
mac_vap_set_beacon(mac_vap_stru * mac_vap,const mac_beacon_param_stru * beacon_param)1907 WIFI_ROM_TEXT hi_u32 mac_vap_set_beacon(mac_vap_stru *mac_vap, const mac_beacon_param_stru *beacon_param)
1908 {
1909 return mac_vap_config_beacon(mac_vap, MAC_SET_BEACON, beacon_param);
1910 }
1911
1912 /* ****************************************************************************
1913 功能描述 : 获取vap的带宽运行信息获取vap带宽能力
1914 修改历史 :
1915 1.日 期 : 2014年4月26日
1916 作 者 : HiSilicon
1917 修改内容 : 新生成函数
1918 **************************************************************************** */
mac_vap_get_bandwidth_cap(mac_vap_stru * mac_vap,wlan_bw_cap_enum_uint8 * pen_cap)1919 WIFI_ROM_TEXT hi_void mac_vap_get_bandwidth_cap(mac_vap_stru *mac_vap, wlan_bw_cap_enum_uint8 *pen_cap)
1920 {
1921 mac_channel_stru *channel = HI_NULL;
1922 wlan_bw_cap_enum_uint8 band_cap = WLAN_BW_CAP_20M;
1923
1924 channel = &(mac_vap->channel);
1925 if (WLAN_BAND_WIDTH_40PLUS == channel->en_bandwidth || WLAN_BAND_WIDTH_40MINUS == channel->en_bandwidth) {
1926 band_cap = WLAN_BW_CAP_40M;
1927 } else if (channel->en_bandwidth >= WLAN_BAND_WIDTH_80PLUSPLUS) {
1928 band_cap = WLAN_BW_CAP_80M;
1929 }
1930 *pen_cap = band_cap;
1931 }
1932
1933 /* ****************************************************************************
1934 功能描述 : 判断是否允许WEP加密
1935 **************************************************************************** */
mac_is_wep_allowed(const mac_vap_stru * mac_vap)1936 WIFI_ROM_TEXT hi_u8 mac_is_wep_allowed(const mac_vap_stru *mac_vap)
1937 {
1938 hi_u8 grp_policy;
1939
1940 if (mac_mib_get_rsnaactivated(mac_vap) != 0) {
1941 grp_policy = mac_mib_get_rsnacfggroupcipher(mac_vap);
1942 if ((grp_policy == WLAN_80211_CIPHER_SUITE_WEP_40) || (grp_policy == WLAN_80211_CIPHER_SUITE_WEP_104)) {
1943 return HI_TRUE;
1944 }
1945 return HI_FALSE;
1946 } else {
1947 return mac_is_wep_enabled(mac_vap);
1948 }
1949 }
1950
1951 /* ****************************************************************************
1952 功能描述 : 获取保护模式类型
1953 输入参数 : mac_vap_stru : mac VAP结构体, 保存sta信息
1954 pst_mac_sta : mac user结构体, 保存ap信息
1955 修改历史 :
1956 1.日 期 : 2014年1月18日
1957 作 者 : HiSilicon
1958 修改内容 : 新生成函数
1959 **************************************************************************** */
mac_vap_get_user_protection_mode(const mac_vap_stru * mac_vap,const mac_user_stru * mac_user)1960 WIFI_ROM_TEXT wlan_prot_mode_enum_uint8 mac_vap_get_user_protection_mode(const mac_vap_stru *mac_vap,
1961 const mac_user_stru *mac_user)
1962 {
1963 wlan_prot_mode_enum_uint8 protection_mode = WLAN_PROT_NO;
1964
1965 if ((mac_vap == HI_NULL) || (mac_user == HI_NULL)) {
1966 return protection_mode;
1967 }
1968
1969 /* 在2G频段下,如果AP发送的beacon帧ERP ie中Use Protection bit置为1,则将保护级别设置为ERP保护 */
1970 if ((WLAN_BAND_2G == mac_vap->channel.band) && (mac_user->cap_info.erp_use_protect == HI_TRUE)) {
1971 protection_mode = WLAN_PROT_ERP;
1972 } else if ((mac_user->ht_hdl.ht_protection == WLAN_MIB_HT_NON_HT_MIXED) ||
1973 (mac_user->ht_hdl.ht_protection == WLAN_MIB_HT_NONMEMBER_PROTECTION)) {
1974 /* 如果AP发送的beacon帧ht operation ie中ht protection字段为mixed或non-member,则将保护级别设置为HT保护 */
1975 protection_mode = WLAN_PROT_HT;
1976 } else if (mac_user->ht_hdl.nongf_sta_present == HI_TRUE) {
1977 /* 如果AP发送的beacon帧ht operation ie中non-gf sta present字段为1,则将保护级别设置为GF保护 */
1978 protection_mode = WLAN_PROT_GF;
1979 } else {
1980 /* 剩下的情况不做保护 */
1981 protection_mode = WLAN_PROT_NO;
1982 }
1983
1984 return protection_mode;
1985 }
1986
1987 /* ****************************************************************************
1988 功能描述 : 查询是否可以使用lsigtxop保护
1989 输入参数 : pst_mac_vap : mac vap结构体指针
1990 输出参数 : 无
1991 返 回 值 : hi_bool : 0: 不可以使用lsig txop保护
1992 1: 可以使用lsig txop保护
1993 修改历史 :
1994 1.日 期 : 2014年4月18日
1995 作 者 : HiSilicon
1996 修改内容 : 新生成函数
1997 **************************************************************************** */
mac_protection_lsigtxop_check(const mac_vap_stru * mac_vap)1998 WIFI_ROM_TEXT hi_bool mac_protection_lsigtxop_check(const mac_vap_stru *mac_vap)
1999 {
2000 mac_user_stru *mac_user = HI_NULL;
2001
2002 /* 如果不是11n站点,则不支持lsigtxop保护 */
2003 if ((mac_vap->protocol != WLAN_HT_MODE) && (mac_vap->protocol != WLAN_HT_ONLY_MODE) &&
2004 (mac_vap->protocol != WLAN_HT_11G_MODE)) {
2005 return HI_FALSE;
2006 }
2007
2008 if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
2009 mac_user = (mac_user_stru *)mac_user_get_user_stru(mac_vap->assoc_vap_id); /* user保存的是AP的信息 */
2010 if ((mac_user == HI_NULL) || (mac_user->ht_hdl.lsig_txop_protection_full_support == HI_FALSE)) {
2011 return HI_FALSE;
2012 } else {
2013 return HI_TRUE;
2014 }
2015 }
2016 /* BSS 中所有站点都支持Lsig txop protection, 则使用Lsig txop protection机制,开销小, AP和STA采用不同的判断 */
2017 if ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP) &&
2018 mac_mib_get_lsig_txop_full_protection_activated(mac_vap) == HI_TRUE) {
2019 return HI_TRUE;
2020 } else {
2021 return HI_FALSE;
2022 }
2023 }
2024
2025 /* ****************************************************************************
2026 功能描述 : 设置rts 发送参数,host,device共用,
2027 输入参数 : pst_hmac_vap : hmac vap结构体指针
2028 en_flag : 0:关闭lsig txop保护机制 / 1: 打开lsig txop保护机制
2029 修改历史 :
2030 1.日 期 : 2014年1月18日
2031 作 者 : HiSilicon
2032 修改内容 : 新生成函数
2033 **************************************************************************** */
mac_protection_set_rts_tx_param(mac_vap_stru * mac_vap,hi_u8 flag,wlan_prot_mode_enum_uint8 prot_mode,mac_cfg_rts_tx_param_stru * rts_tx_param)2034 WIFI_ROM_TEXT hi_void mac_protection_set_rts_tx_param(mac_vap_stru *mac_vap, hi_u8 flag,
2035 wlan_prot_mode_enum_uint8 prot_mode, mac_cfg_rts_tx_param_stru *rts_tx_param)
2036 {
2037 if ((mac_vap == HI_NULL) || (rts_tx_param == HI_NULL)) {
2038 oam_error_log2(0, OAM_SF_ASSOC,
2039 "{mac_protection_set_rts_tx_param_etc::param null,pst_mac_vap[%p] pst_rts_tx_param[%p]}",
2040 (uintptr_t)mac_vap, (uintptr_t)rts_tx_param);
2041 return;
2042 }
2043 /* 设置窄带的RTS速率参数 */
2044 if ((mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_5M) ||
2045 (mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_10M)) {
2046 rts_tx_param->band = WLAN_BAND_2G;
2047 rts_tx_param->auc_protocol_mode[0] = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE;
2048 rts_tx_param->auc_rate[0] = WLAN_LEGACY_OFDM_24M_BPS;
2049 rts_tx_param->auc_protocol_mode[1] = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE;
2050 rts_tx_param->auc_rate[1] = WLAN_LEGACY_OFDM_6M_BPS;
2051 rts_tx_param->auc_protocol_mode[2] = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE; /* 设置auc_protocol_mode[2] */
2052 rts_tx_param->auc_rate[2] = WLAN_LEGACY_OFDM_6M_BPS; /* 设置auc_rate[2] */
2053 rts_tx_param->auc_protocol_mode[3] = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE; /* 设置auc_protocol_mode[3] */
2054 rts_tx_param->auc_rate[3] = WLAN_LEGACY_OFDM_6M_BPS; /* 设置auc_rate[3] */
2055 return;
2056 }
2057
2058 /* 只有启用erp保护时候,RTS[0~2]速率才设为5.5Mpbs(11b), 其余时候都为24Mpbs(leagcy ofdm) */
2059 if ((prot_mode == WLAN_PROT_ERP) && (flag == HI_SWITCH_ON)) {
2060 rts_tx_param->band = WLAN_BAND_2G;
2061
2062 /* RTS[0~2]设为5.5Mbps, RTS[3]设为1Mbps */
2063 rts_tx_param->auc_protocol_mode[0] = WLAN_11B_PHY_PROTOCOL_MODE;
2064 rts_tx_param->auc_rate[0] = WLAN_LONG_11B_5_HALF_M_BPS;
2065 rts_tx_param->auc_protocol_mode[1] = WLAN_11B_PHY_PROTOCOL_MODE;
2066 rts_tx_param->auc_rate[1] = WLAN_LONG_11B_5_HALF_M_BPS;
2067 rts_tx_param->auc_protocol_mode[2] = WLAN_11B_PHY_PROTOCOL_MODE; /* 设置auc_protocol_mode[2] */
2068 rts_tx_param->auc_rate[2] = WLAN_LONG_11B_5_HALF_M_BPS; /* 设置auc_rate[2] */
2069 rts_tx_param->auc_protocol_mode[3] = WLAN_11B_PHY_PROTOCOL_MODE; /* 设置auc_protocol_mode[3] */
2070 rts_tx_param->auc_rate[3] = WLAN_LONG_11B_1_M_BPS; /* 设置auc_rate[3] */
2071 } else {
2072 rts_tx_param->band = mac_vap->channel.band;
2073
2074 /* RTS[0~2]设为24Mbps */
2075 rts_tx_param->auc_protocol_mode[0] = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE;
2076 rts_tx_param->auc_rate[0] = WLAN_LEGACY_OFDM_24M_BPS;
2077 rts_tx_param->auc_protocol_mode[1] = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE;
2078 rts_tx_param->auc_rate[1] = WLAN_LEGACY_OFDM_24M_BPS;
2079 rts_tx_param->auc_protocol_mode[2] = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE; /* 设置auc_protocol_mode[2] */
2080 rts_tx_param->auc_rate[2] = WLAN_LEGACY_OFDM_24M_BPS; /* 设置auc_rate[2] */
2081
2082 /* 2G的RTS[3]设为1Mbps */
2083 if (WLAN_BAND_2G == rts_tx_param->band) {
2084 rts_tx_param->auc_protocol_mode[3] = WLAN_11B_PHY_PROTOCOL_MODE; /* 设置auc_protocol_mode[3] */
2085 rts_tx_param->auc_rate[3] = WLAN_LONG_11B_1_M_BPS; /* 设置auc_rate[3] */
2086 } else {
2087 /* 5G的RTS[3]设为24Mbps */
2088 rts_tx_param->auc_protocol_mode[3] = WLAN_LEGACY_OFDM_PHY_PROTOCOL_MODE; /* 设置auc_protocol_mode[3] */
2089 rts_tx_param->auc_rate[3] = WLAN_LEGACY_OFDM_24M_BPS; /* 设置auc_rate[3] */
2090 }
2091 }
2092 }
2093
2094
2095 /* 代码ROM段结束位置 新增ROM代码请放在SECTION中 */
2096 #undef __WIFI_ROM_SECTION__
2097
2098 /* ****************************************************************************
2099 功能描述 : 根据user MAC地址查找user对象
2100 输入参数 : vap对象指针,以及user MAC地址
2101 输出参数 : user对象指针
2102 修改历史 :
2103 1.日 期 : 2012年10月22日
2104 作 者 : HiSilicon
2105 修改内容 : 新生成函数
2106 **************************************************************************** */
mac_device_find_user_by_macaddr(const mac_vap_stru * mac_vap,const hi_u8 * sta_mac_addr,hi_u8 addr_len,hi_u8 * puc_user_idx)2107 hi_u32 mac_device_find_user_by_macaddr(const mac_vap_stru *mac_vap, const hi_u8 *sta_mac_addr, hi_u8 addr_len,
2108 hi_u8 *puc_user_idx)
2109 {
2110 mac_device_stru *mac_dev = HI_NULL;
2111 mac_vap_stru *mac_vap_temp = HI_NULL;
2112 hi_u8 vap_id;
2113 hi_u8 vap_idx;
2114 hi_u32 ret;
2115
2116 /* 获取device */
2117 mac_dev = mac_res_get_dev();
2118 /* 对device下的所有vap进行遍历 */
2119 for (vap_idx = 0; vap_idx < mac_dev->vap_num; vap_idx++) {
2120 vap_id = mac_dev->auc_vap_id[vap_idx];
2121 /* 配置vap不需要处理 */
2122 if (vap_id == WLAN_CFG_VAP_ID) {
2123 continue;
2124 }
2125 /* 本vap不需要处理 */
2126 if (vap_id == mac_vap->vap_id) {
2127 continue;
2128 }
2129 mac_vap_temp = mac_vap_get_vap_stru(vap_id);
2130 if (mac_vap_temp == HI_NULL) {
2131 continue;
2132 }
2133 /* 只处理AP模式 */
2134 if ((mac_vap_temp->vap_mode != WLAN_VAP_MODE_BSS_AP)
2135 #ifdef _PRE_WLAN_FEATURE_MESH
2136 && (mac_vap_temp->vap_mode != WLAN_VAP_MODE_MESH)
2137 #endif
2138 ) {
2139 continue;
2140 }
2141 ret = mac_vap_find_user_by_macaddr(mac_vap_temp, sta_mac_addr, addr_len, puc_user_idx);
2142 if (ret == HI_SUCCESS) {
2143 return HI_SUCCESS;
2144 }
2145 }
2146
2147 return HI_FAIL;
2148 }
2149
2150 /* ****************************************************************************
2151 功能描述 : 设置mib信息中当前信道
2152 输入参数 : 频段:wlan_channel_band_enum_uint8 en_band,
2153 信道:hi_u8 uc_channel
2154 修改历史 :
2155 1.日 期 : 2013年7月4日
2156 作 者 : HiSilicon
2157 修改内容 : 新生成函数
2158 **************************************************************************** */
mac_vap_set_current_channel(mac_vap_stru * mac_vap,wlan_channel_band_enum_uint8 band,hi_u8 channel)2159 hi_u32 mac_vap_set_current_channel(mac_vap_stru *mac_vap, wlan_channel_band_enum_uint8 band, hi_u8 channel)
2160 {
2161 hi_u8 channel_idx = 0;
2162 hi_u32 ret;
2163
2164 /* 检查信道号 */
2165 ret = mac_is_channel_num_valid(band, channel);
2166 if (ret != HI_SUCCESS) {
2167 return ret;
2168 }
2169 /* 根据信道号找到索引号 */
2170 ret = mac_get_channel_idx_from_num(band, channel, &channel_idx);
2171 if (ret != HI_SUCCESS) {
2172 return ret;
2173 }
2174 mac_vap->channel.chan_number = channel;
2175 mac_vap->channel.band = band;
2176 mac_vap->channel.idx = channel_idx;
2177 return HI_SUCCESS;
2178 }
2179
2180 /* ****************************************************************************
2181 功能描述 : 获取某个基本速率
2182 修改历史 :
2183 1.日 期 : 2013年7月9日
2184 作 者 : HiSilicon
2185 修改内容 : 新生成函数
2186 **************************************************************************** */
mac_vap_get_curr_baserate(mac_vap_stru * mac_vap,hi_u8 br_idx)2187 hi_u8 mac_vap_get_curr_baserate(mac_vap_stru *mac_vap, hi_u8 br_idx)
2188 {
2189 hi_u8 loop;
2190 hi_u8 found_br_num = 0;
2191 hi_u8 rate_num;
2192 mac_rateset_stru *rate = HI_NULL;
2193
2194 rate = &(mac_vap->curr_sup_rates.rate);
2195 rate_num = rate->rs_nrates;
2196 /* 查找base rate 并记录查找到的个数,与所以比较并返回 */
2197 for (loop = 0; loop < rate_num; loop++) {
2198 if (((rate->ast_rs_rates[loop].mac_rate) & 0x80) != 0) {
2199 if (br_idx == found_br_num) {
2200 return rate->ast_rs_rates[loop].mac_rate;
2201 }
2202 found_br_num++;
2203 }
2204 }
2205 /* 未找到,返回错误 */
2206 return HI_FALSE;
2207 }
2208
2209 /* ****************************************************************************
2210 功能描述 : 检查能力信息中与PHY相关的信息
2211 输出参数 : 无check_bss_capability_phy
2212 修改历史 :
2213 1.日 期 : 2013年7月11日
2214 作 者 : HiSilicon
2215 修改内容 : 新生成函数
2216 修改历史 :
2217 2.日 期 : 2013年12月6日
2218 作 者 : HiSilicon
2219 修改内容 : 修改函数名,转换为AP和STA公共函数
2220 **************************************************************************** */
mac_vap_check_bss_cap_info_phy_ap(hi_u16 us_cap_info,const mac_vap_stru * mac_vap)2221 hi_void mac_vap_check_bss_cap_info_phy_ap(hi_u16 us_cap_info, const mac_vap_stru *mac_vap)
2222 {
2223 mac_cap_info_stru *cap_info = (mac_cap_info_stru *)(&us_cap_info);
2224
2225 if (mac_vap->channel.band != WLAN_BAND_2G) {
2226 return;
2227 }
2228 /* PBCC */
2229 if ((mac_vap->mib_info->phy_hrdsss.dot11_pbcc_option_implemented == HI_FALSE) && (cap_info->pbcc == 1)) {
2230 oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{mac_vap_check_bss_cap_info_phy_ap::PBCC is different.}");
2231 }
2232 /* Channel Agility */
2233 if ((mac_vap->mib_info->phy_hrdsss.dot11_channel_agility_present == HI_FALSE) &&
2234 (cap_info->channel_agility == 1)) {
2235 oam_error_log0(mac_vap->vap_id, OAM_SF_ANY,
2236 "{mac_vap_check_bss_cap_info_phy_ap::Channel Agility is different.}");
2237 }
2238 /* DSSS-OFDM Capabilities 31h不支持 对方支持则报错 */
2239 if (cap_info->dsss_ofdm == 1) {
2240 oam_error_log0(mac_vap->vap_id, OAM_SF_ANY,
2241 "{mac_vap_check_bss_cap_info_phy_ap::DSSS-OFDM Capabilities is different.}");
2242 }
2243 }
2244
2245 /* ****************************************************************************
2246 功能描述 : 设置发送描述符的user_idx
2247 输入参数 : pst_mac_vap :mac vap结构指针
2248 pst_cb_ctrl:接收帧的控制字段
2249 puc_data:表明是目的MAC地址
2250 修改历史 :
2251 1.日 期 : 2017年8月11日
2252 作 者 : HiSilicon
2253 修改内容 : 新生成函数
2254 **************************************************************************** */
mac_vap_set_cb_tx_user_idx(mac_vap_stru * mac_vap,hi_void * tx_ctl,const hi_u8 * mac_addr)2255 hi_void mac_vap_set_cb_tx_user_idx(mac_vap_stru *mac_vap, hi_void *tx_ctl, const hi_u8 *mac_addr)
2256 {
2257 hmac_tx_ctl_stru *tx_ctl_temp = (hmac_tx_ctl_stru *)tx_ctl;
2258 hi_u8 user_idx = MAC_INVALID_USER_ID;
2259 hi_u32 ret;
2260
2261 ret = mac_vap_find_user_by_macaddr(mac_vap, mac_addr, WLAN_MAC_ADDR_LEN, &user_idx);
2262 if (ret != HI_SUCCESS) {
2263 oam_warning_log4(mac_vap->vap_id, OAM_SF_ANY,
2264 "{mac_vap_set_cb_tx_user_idx:: cannot find user_idx from xx:xx:xx:%x:%x:%x, set TX_USER_IDX %d.}",
2265 mac_addr[3], mac_addr[4], mac_addr[5], MAC_INVALID_USER_ID); /* 维测记录[3]、[4]、[5] */
2266 tx_ctl_temp->us_tx_user_idx = MAC_INVALID_USER_ID;
2267 return;
2268 }
2269
2270 tx_ctl_temp->us_tx_user_idx = user_idx;
2271 }
2272
2273 #ifdef __cplusplus
2274 #if __cplusplus
2275 }
2276 #endif
2277 #endif
2278