• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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