• 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 /* ****************************************************************************
20   1 头文件包含
21 **************************************************************************** */
22 #include "hcc_hmac_if.h"
23 #include "frw_timer.h"
24 #include "hmac_config.h"
25 #include "hmac_user.h"
26 #include "hmac_vap.h"
27 #include "hmac_mgmt_classifier.h"
28 #include "mac_ie.h"
29 #include "mac_pm_driver.h"
30 #include "hmac_rx_filter.h"
31 #include "hmac_device.h"
32 #include "plat_pm_wlan.h"
33 #include "hmac_fsm.h"
34 #include "hmac_mgmt_bss_comm.h"
35 #include "hmac_mgmt_ap.h"
36 #include "hmac_mgmt_sta.h"
37 #include "hmac_tx_data.h"
38 #include "hmac_scan.h"
39 #include "hmac_sme_sta.h"
40 #include "hmac_blockack.h"
41 #include "hmac_p2p.h"
42 
43 #ifdef __cplusplus
44 #if __cplusplus
45 extern "C" {
46 #endif
47 #endif
48 
49 
50 /* ****************************************************************************
51   2 内部函数声明
52 **************************************************************************** */
53 #ifdef _PRE_WLAN_FEATURE_BTCOEX
54 hi_u32 hmac_btcoex_delba_foreach_user(mac_vap_stru *mac_vap);
55 #endif
56 
57 /* ****************************************************************************
58   3 全局变量定义
59 **************************************************************************** */
60 hi_bool g_wlan_pm_on = HI_FALSE;
61 frw_timeout_stru g_pm_apdown_timer = { 0 };
62 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
63 hmac_reg_info_receive_event g_hmac_reg_info_receive_event = { 0 };
64 #endif
65 
66 typedef struct {
67     wlan_protocol_enum_uint8 protocol_mode; /* wid枚举 */
68 } hmac_protocol_stru;
69 
70 #define PM_APDOWN_ENTERY_TIME 200000
71 
72 #ifdef _PRE_WLAN_FEATURE_INTRF_MODE
73 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
74 static hi_bool g_hist_ampdu_tx_on = HI_TRUE; /* 缓存聚合开关标志 */
75 #endif
76 #endif
77 /* ****************************************************************************
78   3 函数定义
79 **************************************************************************** */
80 /* ****************************************************************************
81  功能描述  : 删除BA会话的配置命令(相当于接收到DELBA帧)
82 **************************************************************************** */
hmac_config_delba_req(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)83 hi_u32 hmac_config_delba_req(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
84 {
85     mac_cfg_delba_req_param_stru *delba_req = HI_NULL;
86     hmac_user_stru *hmac_user = HI_NULL;
87     hmac_vap_stru *hmac_vap = HI_NULL;
88     mac_action_mgmt_args_stru action_args; /* 用于填写ACTION帧的参数 */
89     hmac_tid_stru *hmac_tid = HI_NULL;
90     hi_u32 ret;
91 
92     hi_unref_param(us_len);
93 
94     delba_req = (mac_cfg_delba_req_param_stru *)puc_param;
95     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
96     /* 获取用户对应的索引 */
97     hmac_user = mac_vap_get_hmac_user_by_addr(mac_vap, delba_req->auc_mac_addr, WLAN_MAC_ADDR_LEN);
98     if (hmac_vap == HI_NULL || hmac_user == HI_NULL) {
99         oam_error_log2(mac_vap->vap_id, OAM_SF_CFG,
100             "{hmac_config_delba_req::hmac_vap/hmac_user null! hmac_vap=%p, hmac_user=%p}", (uintptr_t)hmac_vap,
101             (uintptr_t)hmac_user);
102         return HI_ERR_CODE_PTR_NULL;
103     }
104 
105     hmac_tid = &(hmac_user->ast_tid_info[delba_req->tidno]);
106 
107     /* 查看会话是否存在 */
108     if (delba_req->direction == MAC_RECIPIENT_DELBA) {
109         if (hmac_tid->ba_rx_info == HI_NULL) {
110             oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_delba_req::the rx hdl is not exist.}");
111             return HI_SUCCESS;
112         }
113     } else {
114         if (hmac_tid->ba_tx_info == HI_NULL) {
115             oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_delba_req::the tx hdl is not exist.}");
116             return HI_SUCCESS;
117         }
118     }
119 
120     /*
121        建立BA会话时,st_action_args(DELBA_REQ)结构各个成员意义如下
122        (1)uc_category:action的类别
123        (2)uc_action:BA action下的类别
124        (3)ul_arg1:BA会话对应的TID
125        (4)ul_arg2:删除ba会话的发起端
126        (5)ul_arg3:删除ba会话的原因
127        (6)ul_arg5:ba会话对应的用户
128      */
129     action_args.category = MAC_ACTION_CATEGORY_BA;
130     action_args.action = MAC_BA_ACTION_DELBA;
131     action_args.arg1 = delba_req->tidno;            /* 该数据帧对应的TID号 */
132     action_args.arg2 = delba_req->direction;        /* ADDBA_REQ中,buffer_size的默认大小 */
133     action_args.arg3 = MAC_UNSPEC_REASON;           /* BA会话的确认策略 */
134     action_args.puc_arg5 = delba_req->auc_mac_addr; /* ba会话对应的user */
135 
136     /* 建立BA会话 */
137     ret = hmac_mgmt_tx_action(hmac_vap, hmac_user, &action_args);
138     if (ret != HI_SUCCESS) {
139         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "hmac_mgmt_tx_action return NON SUCCESS. ");
140     }
141 
142     return HI_SUCCESS;
143 }
144 
145 #if defined(_PRE_WLAN_FEATURE_SIGMA) || defined(_PRE_DEBUG_MODE)
146 /* ****************************************************************************
147  功能描述  : 建立BA会话的配置命令
148 **************************************************************************** */
hmac_config_addba_req(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)149 hi_u32 hmac_config_addba_req(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
150 {
151     mac_cfg_addba_req_param_stru *addba_req = HI_NULL;
152     hmac_user_stru *hmac_user = HI_NULL;
153     hmac_vap_stru *hmac_vap = HI_NULL;
154     mac_action_mgmt_args_stru action_args; /* 用于填写ACTION帧的参数 */
155     hi_u8 ampdu_support;
156     hi_u32 ret;
157 
158     hi_unref_param(us_len);
159 
160     addba_req = (mac_cfg_addba_req_param_stru *)puc_param;
161     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
162     /* 获取用户对应的索引 */
163     hmac_user = mac_vap_get_hmac_user_by_addr(mac_vap, addba_req->auc_mac_addr, WLAN_MAC_ADDR_LEN);
164     if (hmac_vap == HI_NULL || hmac_user == HI_NULL) {
165         oam_error_log2(mac_vap->vap_id, OAM_SF_CFG,
166             "{hmac_config_addba_req::hmac_vap/hmac_user null! hmac_vap=%p, hmac_user=%p}", (uintptr_t)hmac_vap,
167             (uintptr_t)hmac_user);
168         return HI_ERR_CODE_PTR_NULL;
169     }
170 
171     /* 建立BA会话,是否需要判断VAP的AMPDU的支持情况,因为需要实现建立BA会话时,一定发AMPDU */
172     ampdu_support = hmac_user_xht_support(hmac_user);
173     /* 手动创建ba会话,不受其他额外限制 */
174     if (ampdu_support) {
175         /*
176            建立BA会话时,st_action_args(ADDBA_REQ)结构各个成员意义如下
177            (1)uc_category:action的类别
178            (2)uc_action:BA action下的类别
179            (3)ul_arg1:BA会话对应的TID
180            (4)ul_arg2:BUFFER SIZE大小
181            (5)ul_arg3:BA会话的确认策略
182            (6)ul_arg4:TIMEOUT时间
183          */
184         action_args.category = MAC_ACTION_CATEGORY_BA;
185         action_args.action = MAC_BA_ACTION_ADDBA_REQ;
186         action_args.arg1 = addba_req->tidno;        /* 该数据帧对应的TID号 */
187         action_args.arg2 = addba_req->us_buff_size; /* ADDBA_REQ中,buffer_size的默认大小 */
188         action_args.arg3 = addba_req->ba_policy;    /* BA会话的确认策略 */
189         action_args.arg4 = addba_req->us_timeout;   /* BA会话的超时时间设置为0 */
190 
191         /* 建立BA会话 */
192         ret = hmac_mgmt_tx_action(hmac_vap, hmac_user, &action_args);
193         if (ret != HI_SUCCESS) {
194             oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "hmac_mgmt_tx_action return NON SUCCESS. ");
195         }
196     }
197     return HI_SUCCESS;
198 }
199 #endif
200 
201 /*****************************************************************************
202  功能描述  : 将带宽枚举值转换为对应的字符信息 供VAPinfo命令打印
203 **************************************************************************** */
hmac_config_bw2string(hi_u32 bw)204 static hi_u32 hmac_config_bw2string(hi_u32 bw)
205 {
206     switch (bw) {
207         case WLAN_BAND_WIDTH_20M:
208             return 0x20;
209         case WLAN_BAND_WIDTH_40PLUS:
210             return 0x40B;
211         case WLAN_BAND_WIDTH_40MINUS:
212             return 0x40A;
213         case WLAN_BAND_WIDTH_80PLUSPLUS:
214             return 0x80AA;
215         case WLAN_BAND_WIDTH_80PLUSMINUS:
216             return 0x80AB;
217         case WLAN_BAND_WIDTH_80MINUSPLUS:
218             return 0x80BA;
219         case WLAN_BAND_WIDTH_80MINUSMINUS:
220             return 0x80BB;
221         case WLAN_BAND_WIDTH_5M:
222             return 0x5;
223         case WLAN_BAND_WIDTH_10M:
224             return 0x10;
225         default:
226             return 0xFFFF;
227     }
228 }
229 
230 /* ****************************************************************************
231  功能描述  : 打印vap参数信息
232 **************************************************************************** */
hmac_config_vap_info(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)233 hi_u32 hmac_config_vap_info(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
234 {
235     hmac_vap_stru   *hmac_vap = HI_NULL;
236     mac_user_stru   *mac_user = HI_NULL;
237     hi_u8           loop;
238 
239     hi_unref_param(us_len);
240     hi_unref_param(puc_param);
241 
242     if (mac_vap->vap_mode == WLAN_VAP_MODE_CONFIG) {
243         oam_warning_log0(0, 0, "{hmac_config_vap_info::this is config vap! can't get info.}");
244         return HI_FAIL;
245     }
246 
247     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
248     if (hmac_vap == HI_NULL) {
249         oam_error_log0(0, 0, "{hmac_config_vap_info::pst_hmac_vap null.}");
250         return HI_ERR_CODE_PTR_NULL;
251     }
252     oam_warning_log4(0, 0, "vap id: %d, vap state: %d, vap mode: %d, P2P mode:%d", mac_vap->vap_id, mac_vap->vap_state,
253         mac_vap->vap_mode, mac_vap->p2p_mode);
254     /* AP/STA信息显示 */
255     mac_user = mac_user_get_user_stru(mac_vap->assoc_vap_id);
256     if ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) && (mac_user != HI_NULL)) {
257         oam_warning_log3(0, 0, "available protocol: %d, current protocol: %d, channel number:%d.", mac_vap->protocol,
258             mac_user->cur_protocol_mode, mac_vap->channel.chan_number);
259     } else if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP
260 #ifdef _PRE_WLAN_FEATURE_MESH
261         || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
262 
263 #endif
264     ) {
265         oam_warning_log4(0, 0, "protocol:%d, channel number:%d, associated user number:%d, beacon interval:%d.",
266             mac_vap->protocol, mac_vap->channel.chan_number, mac_vap->user_nums,
267             mac_vap->mib_info->wlan_mib_sta_config.dot11_beacon_period);
268         oam_warning_log1(0, 0, "hide_ssid :%d", mac_vap->cap_flag.hide_ssid);
269     } else {
270         oam_warning_log1(0, 0, "protocol: %d.", mac_vap->protocol);
271     }
272     hi_u32 bandwidth = hmac_config_bw2string(mac_vap->channel.en_bandwidth);
273     hi_unref_param(bandwidth);
274     oam_warning_log0(0, 0, "0-11a, 1-11b, 3-11bg, 4-11g, 5-11bgn, 6-11ac, 7-11nonly, 8-11aconly, 9-11ng, other-error.");
275     oam_warning_log2(0, 0, "band: %x G, bandwidth: %x M[80A=80+,80B=80-,80AB=80+-]",
276         (mac_vap->channel.band == WLAN_BAND_2G) ? 2 : 0xFF, bandwidth); /* 只支持2G,其他返回异常值0XFF */
277     oam_warning_log4(0, 0, "amsdu=%d, uapsd=%d, wpa=%d, wpa2=%d.", hmac_vap->amsdu_active, mac_vap->cap_flag.uapsd,
278         mac_vap->cap_flag.wpa, mac_vap->cap_flag.wpa2);
279     oam_warning_log4(0, 0, "wps=%d, keepalive=%d, shortgi=%d, tx power=%d.", hmac_vap->wps_active,
280         mac_vap->cap_flag.keepalive, mac_vap->mib_info->phy_ht.dot11_short_gi_option_in_twenty_implemented,
281         mac_vap->tx_power);
282     /* APP IE 信息 */
283     for (loop = 0; loop < OAL_APP_IE_NUM; loop++) {
284         oam_warning_log3(0, 0, "APP IE:type= %d, addr = %p, len = %d.", loop,
285             (uintptr_t)mac_vap->ast_app_ie[loop].puc_ie, mac_vap->ast_app_ie[loop].ie_len);
286     }
287 
288     return HI_SUCCESS;
289 }
290 
291 #ifdef _PRE_WLAN_FEATURE_HIPRIV
292 /* ****************************************************************************
293  功能描述  : 开启AMPDU配置命令
294 **************************************************************************** */
hmac_config_ampdu_start(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)295 hi_u32 hmac_config_ampdu_start(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
296 {
297     mac_cfg_ampdu_start_param_stru *ampdu_start = HI_NULL;
298     hmac_user_stru *hmac_user = HI_NULL;
299     hmac_vap_stru *hmac_vap = HI_NULL;
300     mac_action_mgmt_args_stru action_args;
301     hi_u8 ret;
302     hi_u32 result;
303 
304     hi_unref_param(us_len);
305 
306     ampdu_start = (mac_cfg_ampdu_start_param_stru *)puc_param;
307     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
308     /* 获取用户对应的索引 */
309     hmac_user = mac_vap_get_hmac_user_by_addr(mac_vap, ampdu_start->auc_mac_addr, WLAN_MAC_ADDR_LEN);
310     if (hmac_vap == HI_NULL || hmac_user == HI_NULL) {
311         oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG,
312             "{hmac_config_ampdu_start::hmac_vap/hmac_user null! hmac_vap=%p, hmac_user=%p}", (uintptr_t)hmac_vap,
313             (uintptr_t)hmac_user);
314         return HI_ERR_CODE_PTR_NULL;
315     }
316 
317     ret = hmac_tid_need_ba_session(hmac_vap, hmac_user, ampdu_start->tidno, HI_NULL);
318     if (ret == HI_TRUE) {
319         /*
320            建立BA会话时,st_action_args结构各个成员意义如下
321            (1)uc_category:action的类别
322            (2)uc_action:BA action下的类别
323            (3)ul_arg1:BA会话对应的TID
324            (4)ul_arg2:BUFFER SIZE大小
325            (5)ul_arg3:BA会话的确认策略
326            (6)ul_arg4:TIMEOUT时间
327          */
328         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_ampdu_start::uc_tidno=%d.}", ampdu_start->tidno);
329         action_args.category = MAC_ACTION_CATEGORY_BA;
330         action_args.action = MAC_BA_ACTION_ADDBA_REQ;
331         action_args.arg1 = ampdu_start->tidno;         /* 该数据帧对应的TID号 */
332         action_args.arg2 = WLAN_AMPDU_TX_MAX_BUF_SIZE; /* ADDBA_REQ中,buffer_size的默认大小 */
333         action_args.arg3 = MAC_BA_POLICY_IMMEDIATE;    /* BA会话的确认策略 */
334         action_args.arg4 = 0;                          /* BA会话的超时时间设置为0 */
335 
336         /* 建立BA会话 */
337         result = hmac_mgmt_tx_action(hmac_vap, hmac_user, &action_args);
338         if (result != HI_SUCCESS) {
339             oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "hmac_mgmt_tx_action return NON SUCCESS. ");
340         }
341     }
342 
343     return HI_SUCCESS;
344 }
345 
346 /* ****************************************************************************
347  功能描述  : 设置amsdu+ampdu联合聚合的开关
348 **************************************************************************** */
hmac_config_amsdu_ampdu_switch(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)349 hi_u32 hmac_config_amsdu_ampdu_switch(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
350 {
351     hmac_vap_stru *hmac_vap = HI_NULL;
352     hi_s32 l_value;
353 
354     hi_unref_param(us_len);
355 
356     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
357     if (hmac_vap == HI_NULL) {
358         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_amsdu_ampdu_switch::pst_hmac_vap null.}");
359         return HI_ERR_CODE_PTR_NULL;
360     }
361 
362     l_value = *((hi_s32 *)puc_param);
363     hmac_vap->amsdu_ampdu_active = (hi_u8)l_value;
364     oam_warning_log1(0, 0, "hmac_config_amsdu_ampdu_switch:: switch_value[%d]", hmac_vap->amsdu_ampdu_active);
365     return HI_SUCCESS;
366 }
367 
368 #endif
369 
370 /* ****************************************************************************
371  功能描述  : 打印user信息
372 **************************************************************************** */
hmac_config_user_info(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)373 hi_u32 hmac_config_user_info(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
374 {
375     hi_u32 ret;
376     /* **************************************************************************
377         抛事件到DMAC层, 同步DMAC数据
378     ************************************************************************** */
379     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_USER_INFO, us_len, puc_param);
380     if (oal_unlikely(ret != HI_SUCCESS)) {
381         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_user_info::hmac_config_send_event failed[%d].}", ret);
382     }
383     return ret;
384 }
385 
386 /* ****************************************************************************
387  功能描述  : 设置发送描述符信息
388 **************************************************************************** */
hmac_config_set_dscr_param(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)389 hi_u32 hmac_config_set_dscr_param(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
390 {
391     hi_u32 ret;
392     /* **************************************************************************
393         抛事件到DMAC层, 同步DMAC数据
394     ************************************************************************** */
395     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_DSCR, us_len, puc_param);
396     if (oal_unlikely(ret != HI_SUCCESS)) {
397         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_set_dscr_param:: send_event failed[%d].}", ret);
398     }
399     return ret;
400 }
401 
402 /* ****************************************************************************
403  功能描述  : 删除hmac ba超时定时器,调用函数超50行拆分
404  **************************************************************************** */
hmac_proc_dev_sleep_req_del_ba_timer(const hmac_vap_stru * hmac_vap,hi_u32 pm_wlan_state)405 hi_u32 hmac_proc_dev_sleep_req_del_ba_timer(const hmac_vap_stru *hmac_vap, hi_u32 pm_wlan_state)
406 {
407     hi_list *entry = HI_NULL;
408     hi_list *user_list_head = HI_NULL;
409     mac_user_stru *mac_user = HI_NULL;
410     hmac_user_stru *hmac_user = HI_NULL;
411     hi_u8 tid_num;
412 
413     /* 遍历该 VAP 下所有用户 */
414     if (hmac_vap->base_vap == HI_NULL) {
415         oam_warning_log0(0, OAM_SF_ANY, "{hmac_proc_dev_sleep_req_del_ba_timer::hmac_vap->base_vap is null.}");
416         return HI_FAIL;
417     }
418 
419     user_list_head = &(hmac_vap->base_vap->mac_user_list_head);
420     for (entry = user_list_head->next; entry != user_list_head; entry = entry->next) {
421         mac_user = hi_list_entry(entry, mac_user_stru, user_dlist);
422         /*lint -e774*/
423         if (mac_user == HI_NULL) {
424             oam_warning_log0(0, OAM_SF_ANY, "{hmac_proc_dev_sleep_req_del_ba_timer::mac user is null.}");
425             return HI_FAIL;
426         }
427         /*lint +e774*/
428         hmac_user = (hmac_user_stru *)hmac_user_get_user_stru(mac_user->us_assoc_id);
429         if (hmac_user == HI_NULL) {
430             oam_warning_log0(0, OAM_SF_ANY, "{hmac_proc_dev_sleep_req_del_ba_timer::hmac user is null.}");
431             return HI_FAIL;
432         }
433 
434         for (tid_num = 0; tid_num < WLAN_TID_MAX_NUM; tid_num++) {
435             hmac_ba_rx_stru *rx_ba = hmac_user->ast_tid_info[tid_num].ba_rx_info;
436             if ((rx_ba == HI_NULL) || (rx_ba->ba_timer.is_registerd == HI_FALSE)) {
437                 continue;
438             }
439             if ((pm_wlan_state == WLAN_PM_WORK) && (rx_ba->ba_timer.func != HI_NULL)) {
440                 if (rx_ba->ba_timer.timeout_arg == HI_NULL) {
441                     continue;
442                 }
443                 /* work中直接调用超时回调函数 */
444                 rx_ba->ba_timer.func(rx_ba->ba_timer.timeout_arg);
445             } else if (pm_wlan_state == WLAN_PM_DEEP_SLEEP) {
446                 /* 深睡下直接禁用定时器 */
447                 frw_timer_stop_timer(&(rx_ba->ba_timer));
448             }
449             /* 其他场景不需要处理 */
450         }
451     }
452 
453     return HI_SUCCESS;
454 }
455 
hmac_proc_dev_sleep_req(const frw_event_mem_stru * event_mem)456 hi_u32 hmac_proc_dev_sleep_req(const frw_event_mem_stru *event_mem)
457 {
458     frw_event_stru *event = HI_NULL;
459     hmac_vap_stru *hmac_vap = HI_NULL;
460     hi_u32 sleep_type;
461     hi_u32 *data = HI_NULL;
462     hi_u32 pm_wlan_state;
463     hi_u8 *pm_wlan_need_stop_ba = mac_get_pm_wlan_need_stop_ba();
464     hi_u32 ret;
465 
466     event = (frw_event_stru *)(event_mem->puc_data);
467     data = (hi_u32 *)(event->auc_event_data);
468     sleep_type = *data;
469     hmac_vap = hmac_vap_get_vap_stru(event->event_hdr.vap_id);
470     if (hmac_vap == HI_NULL) {
471         oam_warning_log0(0, OAM_SF_ANY, "{hmac_proc_dev_sleep_req::hmac vap is null.}");
472         return HI_ERR_CODE_PTR_NULL;
473     }
474 
475     if (sleep_type == WLAN_PM_LIGHT_SLEEP) {
476         pm_wlan_state = WLAN_PM_LIGHT_SLEEP;
477     } else if (sleep_type == WLAN_PM_DEEP_SLEEP) {
478         *pm_wlan_need_stop_ba = HI_TRUE;
479         pm_wlan_state = WLAN_PM_DEEP_SLEEP;
480     } else if (sleep_type == WLAN_PM_WORK) {
481         *pm_wlan_need_stop_ba = HI_FALSE;
482         pm_wlan_state = WLAN_PM_WORK;
483     } else {
484         oam_warning_log0(0, OAM_SF_ANY, "{hmac_proc_dev_sleep_req::state is wrong.}");
485         return HI_FAIL;
486     }
487 
488     /* 删除hmac ba超时定时器 */
489     ret = hmac_proc_dev_sleep_req_del_ba_timer(hmac_vap, pm_wlan_state);
490     if (ret != HI_SUCCESS) {
491         oam_warning_log1(0, OAM_SF_ANY, "{hmac_proc_dev_sleep_req::del ba timeout timer not succ[%d]}", ret);
492         return ret;
493     }
494 
495     return HI_SUCCESS;
496 }
497 
498 /* ****************************************************************************
499  功能描述  : 处理协议模式同步事件
500  修改历史      :
501   1.日    期   : 2015年4月9日
502     作    者   : HiSilicon
503     修改内容   : 新生成函数
504 **************************************************************************** */
hmac_syn_info_event(frw_event_mem_stru * event_mem)505 hi_u32 hmac_syn_info_event(frw_event_mem_stru *event_mem)
506 {
507     frw_event_stru *event = HI_NULL;
508     hmac_user_stru *hmac_user = HI_NULL;
509     mac_vap_stru *mac_vap = HI_NULL;
510     hi_u32 relt;
511     dmac_to_hmac_syn_info_event_stru *syn_info_event = HI_NULL;
512 
513     event = (frw_event_stru *)event_mem->puc_data;
514     syn_info_event = (dmac_to_hmac_syn_info_event_stru *)event->auc_event_data;
515     hmac_user = (hmac_user_stru *)hmac_user_get_user_stru(syn_info_event->user_index);
516     if ((hmac_user == HI_NULL) || (hmac_user->base_user == HI_NULL)) {
517         oam_warning_log1(0, OAM_SF_ANY, "{hmac_syn_info_event: pst_hmac_user null,user_idx=%d.}",
518             syn_info_event->user_index);
519         return HI_ERR_CODE_PTR_NULL;
520     }
521 
522     mac_vap = mac_vap_get_vap_stru(hmac_user->base_user->vap_id);
523     if (mac_vap == HI_NULL) {
524         oam_warning_log2(0, OAM_SF_ANY, "{hmac_syn_info_event: pst_mac_vap null! vap_idx=%d, user_idx=%d.}",
525             hmac_user->base_user->vap_id, syn_info_event->user_index);
526         return HI_ERR_CODE_PTR_NULL;
527     }
528 
529     hmac_user->base_user->cur_protocol_mode = syn_info_event->cur_protocol;
530     hmac_user->base_user->cur_bandwidth = syn_info_event->cur_bandwidth;
531     relt = hmac_config_user_info_syn(mac_vap, hmac_user->base_user);
532     return relt;
533 }
534 
535 /* ****************************************************************************
536  功能描述  : 处理Voice聚合同步事件
537  修改历史      :
538   1.日    期   : 2015年4月9日
539     作    者   : HiSilicon
540     修改内容   : 新生成函数
541 **************************************************************************** */
hmac_voice_aggr_event(frw_event_mem_stru * event_mem)542 hi_u32 hmac_voice_aggr_event(frw_event_mem_stru *event_mem)
543 {
544     frw_event_stru *event = HI_NULL;
545     mac_vap_stru *mac_vap = HI_NULL;
546     dmac_to_hmac_voice_aggr_event_stru *voice_aggr_event = HI_NULL;
547     if (event_mem == HI_NULL) {
548         oam_error_log0(0, OAM_SF_P2P, "{hmac_voice_aggr_event::event_mem null.}");
549         return HI_ERR_CODE_PTR_NULL;
550     }
551     event = (frw_event_stru *)event_mem->puc_data;
552     voice_aggr_event = (dmac_to_hmac_voice_aggr_event_stru *)event->auc_event_data;
553 
554     mac_vap = mac_vap_get_vap_stru(voice_aggr_event->vap_id);
555     if (mac_vap == HI_NULL) {
556         oam_error_log1(0, OAM_SF_ANY, "{hmac_voice_aggr_event: pst_mac_vap null! vap_idx=%d}",
557             voice_aggr_event->vap_id);
558         return HI_ERR_CODE_PTR_NULL;
559     }
560     mac_vap->voice_aggr = voice_aggr_event->voice_aggr;
561     return HI_SUCCESS;
562 }
563 
564 /* ****************************************************************************
565  功能描述  : 分配事件内存
566  输入参数  : pst_mac_vap: 指向vap
567              en_syn_type: 事件的subtype, 即同步消息类型
568              ppst_syn_msg  : 指向同步消息payload的指针
569              ppst_event_mem: 指向事件内存的指针
570  返 回 值  : 错误码
571  修改历史      :
572   1.日    期   : 2013年1月18日
573     作    者   : HiSilicon
574     修改内容   : 新生成函数
575 **************************************************************************** */
hmac_config_alloc_event(const mac_vap_stru * mac_vap,hmac_to_dmac_syn_type_enum_uint8 syn_type,hmac_to_dmac_cfg_msg_stru ** syn_msg,frw_event_mem_stru ** event_mem,hi_u16 us_len)576 static hi_u32 hmac_config_alloc_event(const mac_vap_stru *mac_vap, hmac_to_dmac_syn_type_enum_uint8 syn_type,
577     hmac_to_dmac_cfg_msg_stru **syn_msg, frw_event_mem_stru **event_mem, hi_u16 us_len)
578 {
579     frw_event_mem_stru *event_mem_value = HI_NULL;
580     frw_event_stru *event = HI_NULL;
581 
582     event_mem_value = frw_event_alloc(us_len + sizeof(hmac_to_dmac_cfg_msg_stru) - 4); /* 4 用于计算 */
583     if (oal_unlikely(event_mem_value == HI_NULL)) {
584         oam_error_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_alloc_event::event_mem null, us_len = %d }", us_len);
585         return HI_ERR_CODE_ALLOC_MEM_FAIL;
586     }
587 
588     event = (frw_event_stru *)event_mem_value->puc_data;
589 
590     /* 填充事件头 */
591     frw_event_hdr_init(&(event->event_hdr), FRW_EVENT_TYPE_HOST_CRX, syn_type,
592         (us_len + sizeof(hmac_to_dmac_cfg_msg_stru) - 4), /* 4 用于计算 */
593         FRW_EVENT_PIPELINE_STAGE_1, mac_vap->vap_id);
594     /* 出参赋值 */
595     *event_mem = event_mem_value;
596     *syn_msg = (hmac_to_dmac_cfg_msg_stru *)event->auc_event_data;
597 
598     return HI_SUCCESS;
599 }
600 
601 /* ****************************************************************************
602  功能描述  : 抛事件到DMAC层, 同步DMAC数据
603  输入参数  : pst_mac_vap  : VAP
604              en_cfg_id: 配置id
605              us_len: 消息长度
606              puc_param: 参数
607  返 回 值  : 错误码
608  修改历史      :
609   1.日    期   : 2013年1月18日
610     作    者   : HiSilicon
611     修改内容   : 新生成函数
612 **************************************************************************** */
hmac_config_send_event(const mac_vap_stru * mac_vap,wlan_cfgid_enum_uint16 cfg_id,hi_u16 us_len,const hi_u8 * puc_param)613 hi_u32 hmac_config_send_event(const mac_vap_stru *mac_vap, wlan_cfgid_enum_uint16 cfg_id, hi_u16 us_len,
614     const hi_u8 *puc_param)
615 {
616     hi_u32 ret;
617     frw_event_mem_stru *event_mem = HI_NULL;
618     hmac_to_dmac_cfg_msg_stru *syn_msg = HI_NULL;
619 
620     ret = hmac_config_alloc_event(mac_vap, HMAC_TO_DMAC_SYN_CFG, &syn_msg, &event_mem, us_len);
621     if (oal_unlikely(ret != HI_SUCCESS)) {
622         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
623                          "{hmac_config_send_event::hmac_config_alloc_event failed[%d].}", ret);
624         return ret;
625     }
626     syn_msg->syn_id = cfg_id;
627     syn_msg->us_len = us_len;
628     /* 填写配置同步消息内容 */
629     if (puc_param != HI_NULL) {
630         if (memcpy_s(syn_msg->auc_msg_body, syn_msg->us_len, puc_param, (hi_u32)us_len) != EOK) {
631             frw_event_free(event_mem);
632             oam_error_log0(0, OAM_SF_CFG, "hmac_config_send_event:: puc_param memcpy_s fail.");
633             return HI_FAIL;
634         }
635     }
636     /* 抛出事件 */
637     ret = hcc_hmac_tx_control_event(event_mem,
638         us_len + (hi_u16)oal_offset_of(hmac_to_dmac_cfg_msg_stru, auc_msg_body));
639     if (oal_unlikely(ret != HI_SUCCESS)) {
640         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
641                          "{hmac_config_send_event::frw_event_dispatch_event failed[%d].}", ret);
642         frw_event_free(event_mem);
643         return ret;
644     }
645 
646     frw_event_free(event_mem);
647 
648     return HI_SUCCESS;
649 }
650 
651 /* ****************************************************************************
652  功能描述  : 抛start vap事件
653  修改历史      :
654   1.日    期   : 2015年8月27日
655     作    者   : HiSilicon
656     修改内容   : 新生成函数
657 **************************************************************************** */
hmac_config_start_vap_event(const mac_vap_stru * mac_vap,hi_u8 mgmt_rate_init_flag)658 hi_u32 hmac_config_start_vap_event(const mac_vap_stru *mac_vap, hi_u8 mgmt_rate_init_flag)
659 {
660     hi_u32 ret;
661     mac_cfg_start_vap_param_stru start_vap_param;
662 
663     /* DMAC不使用netdev成员 */
664     start_vap_param.net_dev = HI_NULL;
665     start_vap_param.mgmt_rate_init_flag = mgmt_rate_init_flag;
666 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
667     start_vap_param.protocol = mac_vap->protocol;
668     start_vap_param.band = mac_vap->channel.band;
669     start_vap_param.uc_bandwidth = mac_vap->channel.en_bandwidth;
670 #endif
671 #ifdef _PRE_WLAN_FEATURE_P2P
672     start_vap_param.p2p_mode = mac_vap->p2p_mode;
673 #endif
674 
675     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_START_VAP, sizeof(mac_cfg_start_vap_param_stru),
676         (hi_u8 *)&start_vap_param);
677     if (oal_unlikely(ret != HI_SUCCESS)) {
678         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap_event::Start_vap failed[%d].}", ret);
679     }
680     return ret;
681 }
682 
683 /* ****************************************************************************
684  功能描述  : 获取g_wlan_pm_switch结构
685 **************************************************************************** */
hmac_get_wlan_pm_switch(hi_void)686 hi_bool hmac_get_wlan_pm_switch(hi_void)
687 {
688     return g_wlan_pm_on;
689 }
690 
691 /* ****************************************************************************
692  功能描述  : 设置g_wlan_pm_switch结构
693 **************************************************************************** */
hmac_set_wlan_pm_switch(hi_bool wlan_pm_switch)694 hi_void hmac_set_wlan_pm_switch(hi_bool wlan_pm_switch)
695 {
696     g_wlan_pm_on = wlan_pm_switch;
697 }
698 
699 /* ****************************************************************************
700  功能描述  : 设置模式事件,抛事件给dmac侧
701  修改历史      :
702   1.日    期   : 2015年8月27日
703     作    者   : HiSilicon
704     修改内容   : 新生成函数
705 **************************************************************************** */
hmac_set_mode_event(const mac_vap_stru * mac_vap)706 hi_u32 hmac_set_mode_event(const mac_vap_stru *mac_vap)
707 {
708     hi_u32 ret;
709     mac_cfg_mode_param_stru prot_param;
710 
711     /* 设置带宽模式,直接抛事件到DMAC配置寄存器 */
712     prot_param.protocol = mac_vap->protocol;
713     prot_param.band = mac_vap->channel.band;
714     prot_param.en_bandwidth = mac_vap->channel.en_bandwidth;
715 
716     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_MODE, sizeof(mac_cfg_mode_param_stru), (hi_u8 *)&prot_param);
717     if (oal_unlikely(ret != HI_SUCCESS)) {
718         oam_warning_log4(mac_vap->vap_id, OAM_SF_CFG,
719                          "{hmac_set_mode_event::mode_set failed[%d],protocol[%d], band[%d], bandwidth[%d].}", ret,
720                          mac_vap->protocol, mac_vap->channel.band,
721                          mac_vap->channel.en_bandwidth);
722     }
723     return ret;
724 }
725 
726 #ifdef _PRE_WLAN_FEATURE_OPMODE_NOTIFY
727 /* ****************************************************************************
728  功能描述  : 同步模式通知相关信息
729  返 回 值  : hi_u32
730  修改历史      :
731   1.日    期   : 2015年8月27日
732     作    者   : HiSilicon
733     修改内容   : 新生成函数
734 **************************************************************************** */
hmac_config_update_opmode_event(mac_vap_stru * mac_vap,mac_user_stru * mac_user,hi_u8 mgmt_frm_type)735 hi_u32 hmac_config_update_opmode_event(mac_vap_stru *mac_vap, mac_user_stru *mac_user, hi_u8 mgmt_frm_type)
736 {
737     hi_u32 relt;
738     mac_user_opmode_stru user_opmode;
739     /* opmode息同步dmac */
740     user_opmode.avail_num_spatial_stream = mac_user->avail_num_spatial_stream;
741     user_opmode.avail_bf_num_spatial_stream = mac_user->avail_bf_num_spatial_stream;
742     user_opmode.avail_bandwidth = mac_user->avail_bandwidth;
743     user_opmode.cur_bandwidth = mac_user->cur_bandwidth;
744     user_opmode.user_idx = (hi_u8)mac_user->us_assoc_id;
745     user_opmode.frame_type = mgmt_frm_type;
746 
747     relt = hmac_config_send_event(mac_vap, WLAN_CFGID_UPDATE_OPMODE, sizeof(mac_user_opmode_stru),
748         (hi_u8 *)(&user_opmode));
749     if (oal_unlikely(relt != HI_SUCCESS)) {
750         oam_warning_log1(mac_user->vap_id, OAM_SF_CFG,
751             "{hmac_config_update_opmode_event::opmode_event send failed[%d].}", relt);
752     }
753     return relt;
754 }
755 #endif
756 
757 /* ****************************************************************************
758  功能描述  : 通用的从hmac同步命令到dmac函数
759  修改历史      :
760   1.日    期   : 2013年5月31日
761     作    者   : HiSilicon
762     修改内容   : 新生成函数
763 **************************************************************************** */
hmac_config_sync_cmd_common(const mac_vap_stru * mac_vap,wlan_cfgid_enum_uint16 cfg_id,hi_u16 us_len,const hi_u8 * puc_param)764 hi_u32 hmac_config_sync_cmd_common(const mac_vap_stru *mac_vap, wlan_cfgid_enum_uint16 cfg_id, hi_u16 us_len,
765     const hi_u8 *puc_param)
766 {
767     hi_u32 ret;
768 
769     /* **************************************************************************
770         抛事件到DMAC层, 同步DMAC数据
771     ************************************************************************** */
772     ret = hmac_config_send_event(mac_vap, cfg_id, us_len, puc_param);
773     if (oal_unlikely(ret != HI_SUCCESS)) {
774         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
775             "{hmac_config_sync_cmd_common::hmac_config_send_event failed[%d].}", ret);
776     }
777 
778     return ret;
779 }
780 
781 /* ****************************************************************************
782  功能描述  :
783  修改历史      :
784   1.日    期   : 2014年5月13日
785     作    者   : HiSilicon
786     修改内容   : 新生成函数
787 **************************************************************************** */
hmac_config_normal_check_vap_num(const mac_device_stru * mac_dev,const mac_cfg_add_vap_param_stru * param)788 static hi_u32 hmac_config_normal_check_vap_num(const mac_device_stru *mac_dev, const mac_cfg_add_vap_param_stru *param)
789 {
790     if (param == HI_NULL) {
791         oam_error_log0(0, OAM_SF_ANY, "{hmac_config_normal_check_vap_num::param is null.}");
792         return HI_FAIL;
793     }
794 
795 #ifdef _PRE_WLAN_FEATURE_P2P
796     if (param->p2p_mode != WLAN_LEGACY_VAP_MODE) {
797         /* P2P VAP数量校验 */
798         return hmac_p2p_check_vap_num(mac_dev, param->p2p_mode);
799     }
800 #endif
801 
802     if ((param->vap_mode == WLAN_VAP_MODE_BSS_AP)
803 #ifdef _PRE_WLAN_FEATURE_MESH
804         || (param->vap_mode == WLAN_VAP_MODE_MESH)
805 #endif
806     ) {
807         /* AP数量不超过1 */
808         if ((mac_dev->vap_num - mac_dev->sta_num) >= WLAN_AP_NUM_PER_DEVICE) {
809             oam_warning_log0(0, OAM_SF_CFG,
810                 "{hmac_config_normal_check_vap_num::create vap fail, because at least 1 ap exist.}");
811             return HI_ERR_CODE_CONFIG_EXCEED_SPEC;
812         }
813     } else if (param->vap_mode == WLAN_VAP_MODE_BSS_STA) {
814         if (mac_dev->sta_num >= WLAN_STA_NUM_PER_DEVICE) {
815             /* 已创建的STA个数达到最大值 */
816             oam_warning_log1(0, OAM_SF_CFG,
817                 "{hmac_config_normal_check_vap_num::create vap fail, because sta num [%d] is more than 2.}",
818                 mac_dev->sta_num);
819             return HI_ERR_CODE_CONFIG_EXCEED_SPEC;
820         }
821     }
822 
823     return HI_SUCCESS;
824 }
825 
826 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
827 /* ****************************************************************************
828  功能描述  : 创建配置vap抛事件
829  修改历史      :
830   1.日    期   : 2013年5月29日
831     作    者   : HiSilicon
832     修改内容   : 新生成函数
833 **************************************************************************** */
hmac_cfg_vap_send_event(const mac_device_stru * mac_dev)834 hi_u32 hmac_cfg_vap_send_event(const mac_device_stru *mac_dev)
835 {
836     hi_unref_param(mac_dev);
837     frw_event_mem_stru *event_mem = HI_NULL;
838     frw_event_stru *event = HI_NULL;
839     hi_u32 ret;
840 
841     /* 抛事件给DMAC,让DMAC完成配置VAP创建 */
842     event_mem = frw_event_alloc(0);
843     if (oal_unlikely(event_mem == HI_NULL)) {
844         oam_error_log0(0, OAM_SF_ANY, "{hmac_cfg_vap_send_event::event_mem null.}");
845         return HI_FAIL;
846     }
847 
848     event = (frw_event_stru *)event_mem->puc_data;
849 
850     /* 填写事件头 */
851     frw_event_hdr_init(&(event->event_hdr), FRW_EVENT_TYPE_HOST_CRX, HMAC_TO_DMAC_SYN_CREATE_CFG_VAP, 0,
852         FRW_EVENT_PIPELINE_STAGE_1, WLAN_CFG_VAP_ID);
853 
854     ret = hcc_hmac_tx_control_event(event_mem, sizeof(hi_u16));
855     if (ret != HI_SUCCESS) {
856         oam_warning_log1(0, OAM_SF_ANY, "{hmac_cfg_vap_send_event::frw_event_dispatch_event failed[%d].}", ret);
857     }
858 
859     /* 释放事件 */
860     frw_event_free(event_mem);
861 
862     return ret;
863 }
864 #endif
865 
866 /* ****************************************************************************
867  功能描述      : 配置系统低功耗开关
868  修改历史      :
869   1.日    期   : 2018年12月11日
870     作    者   : HiSilicon
871     修改内容   : 新生成函数
872 **************************************************************************** */
hmac_config_set_pm_switch(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)873 hi_u32 hmac_config_set_pm_switch(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
874 {
875     hi_u32 ret;
876     hi_u32 pm_cfg;
877     hmac_vap_stru *hmac_vap = HI_NULL;
878     mac_vap_stru *vap = HI_NULL; /* 业务vap */
879     mac_device_stru *mac_dev = mac_res_get_dev();
880     hi_u8 vap_idx;
881 
882     pm_cfg = *(hi_u32 *)puc_param;
883     /* 寻找STA */
884     for (vap_idx = 0; vap_idx < mac_dev->vap_num; vap_idx++) {
885         vap = mac_vap_get_vap_stru(mac_dev->auc_vap_id[vap_idx]);
886         if (vap == HI_NULL) {
887             continue;
888         }
889         if (vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
890             break;
891         }
892     }
893 
894     if (vap != HI_NULL) {
895         hmac_vap = hmac_vap_get_vap_stru(vap->vap_id);
896         if (hmac_vap == HI_NULL) {
897             oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_pm_switch::pst_hmac_vap null.}");
898             return HI_ERR_CODE_PTR_NULL;
899         }
900 
901         if ((pm_cfg & BIT0) == MAC_STA_PM_SWITCH_OFF) {
902             if (hmac_vap->ps_sw_timer.is_registerd == HI_TRUE) {
903                 frw_timer_immediate_destroy_timer(&(hmac_vap->ps_sw_timer));
904             }
905         }
906     }
907 
908     /*
909      * PM_SWITCH 和 DTIM_TIMES 复用参数
910      * PM_SWITCH BIT[0]
911      * DTIM_TIMES BIT[31:1]
912      */
913     if ((pm_cfg & BIT0) == MAC_STA_PM_SWITCH_ON) {
914         hmac_set_wlan_pm_switch(HI_TRUE);
915     } else {
916         hmac_set_wlan_pm_switch(HI_FALSE);
917         if (g_pm_apdown_timer.is_registerd == HI_TRUE) {
918             frw_timer_immediate_destroy_timer(&g_pm_apdown_timer);
919         }
920     }
921 
922     /* **************************************************************************
923     抛事件到DMAC层, 同步DMAC数据
924     ************************************************************************** */
925     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_PM_SWITCH, us_len, puc_param);
926     if (oal_unlikely(ret != HI_SUCCESS)) {
927         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
928             "{hmac_config_set_pm_switch::hmac_config_send_event failed[%d].}", ret);
929     }
930     return ret;
931 }
932 
hmac_config_init_hmac_vap(hi_u8 vap_id,hmac_vap_stru * hmac_vap,mac_device_stru * mac_dev,mac_cfg_add_vap_param_stru * param)933 static hi_u32 hmac_config_init_hmac_vap(hi_u8 vap_id, hmac_vap_stru *hmac_vap, mac_device_stru *mac_dev,
934     mac_cfg_add_vap_param_stru *param)
935 {
936     hi_u32 ret;
937     param->vap_id = vap_id;
938     /* 初始化HMAC VAP */
939     ret = hmac_vap_init(hmac_vap, vap_id, param);
940     if (oal_unlikely(ret != HI_SUCCESS)) {
941         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_init_hmac_vap::hmac_vap_init failed[%d].}", ret);
942         if (hmac_vap->base_vap->mib_info != HI_NULL) {
943             oal_mem_free(hmac_vap->base_vap->mib_info);
944         }
945 
946         /* 异常处理,释放内存 */
947         mac_vap_free_vap_res(vap_id);
948         return ret;
949     }
950 
951     /* 设置反挂的net_device指针 */
952 #ifdef _PRE_WLAN_FEATURE_P2P
953     if (param->p2p_mode == WLAN_P2P_DEV_MODE) {
954         /* p2p0 DEV 模式vap,采用pst_p2p0_net_device 成员指向对应的net_device */
955         hmac_vap->p2p0_net_device = param->net_dev;
956         mac_dev->p2p_info.p2p0_vap_idx = hmac_vap->base_vap->vap_id;
957     }
958 #endif
959     hmac_vap->net_device = param->net_dev;
960 
961     /* 将申请到的mac_vap空间挂到net_device ml_priv指针上去 */
962     oal_net_dev_priv(param->net_dev) = hmac_vap->base_vap;
963     /* 申请hmac组播用户 */
964     hmac_user_add_multi_user(hmac_vap->base_vap, &param->muti_user_id);
965     mac_vap_set_multi_user_idx(hmac_vap->base_vap, param->muti_user_id);
966     mac_device_set_vap_id(mac_dev, hmac_vap->base_vap, param, vap_id, HI_TRUE);
967 
968     if (param->vap_mode == WLAN_VAP_MODE_BSS_AP
969 #ifdef _PRE_WLAN_FEATURE_MESH
970         || param->vap_mode == WLAN_VAP_MODE_MESH
971 #endif
972     ) {
973         param->uapsd_enable = hmac_vap->base_vap->cap_flag.uapsd;
974     }
975     return HI_SUCCESS;
976 }
977 
hmac_config_set_station_id(const hmac_vap_stru * hmac_vap,mac_device_stru * mac_dev,hi_u8 vap_id,const mac_cfg_add_vap_param_stru * param)978 static hi_u32 hmac_config_set_station_id(const hmac_vap_stru *hmac_vap, mac_device_stru *mac_dev, hi_u8 vap_id,
979     const mac_cfg_add_vap_param_stru *param)
980 {
981     mac_cfg_staion_id_param_stru station_id_param = { 0 };
982     hi_u32 ret;
983     /* 设置mac地址 */
984     if (memcpy_s(station_id_param.auc_station_id, WLAN_MAC_ADDR_LEN,
985         param->net_dev->macAddr, WLAN_MAC_ADDR_LEN) != EOK) {
986         /* 此处回退有误,需要对应mac_device_set_vap_id,做回退操作 */
987         mac_device_set_vap_id(mac_dev, hmac_vap->base_vap, param, vap_id, HI_FALSE);
988 
989         /* 异常处理,释放内存 */
990         oal_mem_free(hmac_vap->base_vap->mib_info);
991 
992         mac_vap_free_vap_res(vap_id);
993         oam_error_log0(0, OAM_SF_CFG, "{hmac_config_set_station_id::mem safe function err!}");
994         return HI_FAIL;
995     }
996     station_id_param.p2p_mode = param->p2p_mode;
997     ret = hmac_config_set_mac_addr(hmac_vap->base_vap, sizeof(mac_cfg_staion_id_param_stru),
998         (hi_u8 *)(&station_id_param));
999     if (oal_unlikely(ret != HI_SUCCESS)) {
1000         /* 此处回退有误,需要对应mac_device_set_vap_id,做回退操作 */
1001         mac_device_set_vap_id(mac_dev, hmac_vap->base_vap, param, vap_id, HI_FALSE);
1002 
1003         /* 异常处理,释放内存 */
1004         oal_mem_free(hmac_vap->base_vap->mib_info);
1005 
1006         mac_vap_free_vap_res(vap_id);
1007         oam_error_log1(0, OAM_SF_CFG, "{hmac_config_set_station_id::hmac_config_set_mac_addr failed[%d].}", ret);
1008         return ret;
1009     }
1010 
1011     return HI_SUCCESS;
1012 }
1013 /* ****************************************************************************
1014  功能描述  : 创建HMAC 业务VAP
1015  输入参数  : pst_vap   : 指向配置vap
1016              us_len    : 参数长度
1017              puc_param : 参数
1018  返 回 值  : HI_SUCCESS 或其它错误码
1019  修改历史      :
1020   1.日    期   : 2012年11月21日
1021     作    者   : HiSilicon
1022     修改内容   : 新生成函数
1023 **************************************************************************** */
hmac_config_add_vap(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)1024 hi_u32 hmac_config_add_vap(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
1025 {
1026     hi_u32 ret;
1027     mac_device_stru *mac_dev = mac_res_get_dev();
1028 
1029     if (oal_unlikely((mac_vap == HI_NULL) || (puc_param == HI_NULL))) {
1030         oam_error_log2(0, OAM_SF_CFG, "{hmac_config_add_vap::param null,pst_vap=%p puc_param=%p.}",
1031                        (uintptr_t)mac_vap, (uintptr_t)puc_param);
1032         return HI_ERR_CODE_PTR_NULL;
1033     }
1034     mac_cfg_add_vap_param_stru *param = (mac_cfg_add_vap_param_stru *)puc_param;
1035 #ifdef _PRE_WLAN_FEATURE_P2P
1036     if (param->p2p_mode == WLAN_P2P_CL_MODE) {
1037         return hmac_p2p_add_gc_vap(mac_dev, us_len, puc_param);
1038     }
1039 #endif
1040     /* VAP个数判断 */
1041     ret = hmac_config_normal_check_vap_num(mac_dev, param);
1042     if (ret != HI_SUCCESS) {
1043         return ret;
1044     }
1045 
1046     /* 从资源池申请 vap id */
1047     hi_u8 vap_id = mac_vap_alloc_vap_res();
1048     if (oal_unlikely(vap_id == MAC_VAP_RES_ID_INVALID)) {
1049         return HI_FAIL;
1050     }
1051     /* 从资源池获取新申请到的hmac vap */
1052     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(vap_id);
1053     if (hmac_vap == HI_NULL) {
1054         return HI_ERR_CODE_PTR_NULL;
1055     }
1056 
1057     ret = hmac_config_init_hmac_vap(vap_id, hmac_vap, mac_dev, param);
1058     if (ret != HI_SUCCESS) {
1059         return ret;
1060     }
1061 
1062     /* **************************************************************************
1063         抛事件到DMAC层, 同步DMAC数据
1064     ************************************************************************** */
1065     ret = hmac_config_send_event(hmac_vap->base_vap, WLAN_CFGID_ADD_VAP, us_len, puc_param);
1066     if (oal_unlikely(ret != HI_SUCCESS)) {
1067         /* 此处回退有误,需要对应mac_device_set_vap_id,做回退操作 */
1068         mac_device_set_vap_id(mac_dev, hmac_vap->base_vap, param, vap_id, HI_FALSE);
1069 
1070         /* 异常处理,释放内存 */
1071         oal_mem_free(hmac_vap->base_vap->mib_info);
1072 
1073         mac_vap_free_vap_res(vap_id);
1074 
1075         oam_error_log1(0, OAM_SF_CFG, "{hmac_config_add_vap::hmac_config_alloc_event failed[%d].}", ret);
1076         return ret;
1077     }
1078     /* 设置帧过滤 */
1079     hmac_set_rx_filter_value(hmac_vap->base_vap);
1080 
1081     /* 设置station id */
1082     ret = hmac_config_set_station_id(hmac_vap, mac_dev, vap_id, param);
1083     if (ret != HI_SUCCESS) {
1084         return ret;
1085     }
1086 
1087     oam_warning_log2(vap_id, OAM_SF_ANY, "{hmac_config_add_vap::add vap [%d] success! vap_id is %d", param->vap_mode,
1088         param->vap_id);
1089 
1090     return HI_SUCCESS;
1091 }
1092 
hmac_config_del_timer_user_vap(hmac_vap_stru * hmac_vap)1093 hi_void hmac_config_del_timer_user_vap(hmac_vap_stru *hmac_vap)
1094 {
1095     /* 清理所有的timer */
1096     if (hmac_vap->mgmt_timer.is_registerd == HI_TRUE) {
1097         frw_timer_immediate_destroy_timer(&(hmac_vap->mgmt_timer));
1098         hmac_vap->mgmt_timer.is_registerd = HI_FALSE;
1099     }
1100     if (hmac_vap->scan_timeout.is_registerd == HI_TRUE) {
1101         frw_timer_immediate_destroy_timer(&(hmac_vap->scan_timeout));
1102         hmac_vap->scan_timeout.is_registerd = HI_FALSE;
1103     }
1104     if (hmac_vap->scanresult_clean_timeout.is_registerd == HI_TRUE) {
1105         frw_timer_immediate_destroy_timer(&(hmac_vap->scanresult_clean_timeout));
1106         hmac_vap->scanresult_clean_timeout.is_registerd = HI_FALSE;
1107     }
1108 #ifdef _PRE_WLAN_FEATURE_STA_PM
1109     if (hmac_vap->ps_sw_timer.is_registerd == HI_TRUE) {
1110         frw_timer_immediate_destroy_timer(&(hmac_vap->ps_sw_timer));
1111         hmac_vap->ps_sw_timer.is_registerd = HI_FALSE;
1112     }
1113 #endif
1114 }
1115 
hmac_config_del_timer_user(mac_vap_stru * mac_vap,hmac_vap_stru * hmac_vap)1116 hi_u32 hmac_config_del_timer_user(mac_vap_stru *mac_vap, hmac_vap_stru *hmac_vap)
1117 {
1118 #ifdef _PRE_WLAN_FEATURE_EDCA_OPT_AP
1119     if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP
1120 #ifdef _PRE_WLAN_FEATURE_MESH
1121         || (mac_vap->vap_mode == (hi_u8)WLAN_VAP_MODE_MESH)
1122 #endif
1123     ) {
1124         hmac_vap->edca_opt_flag_ap = 0;
1125         frw_timer_immediate_destroy_timer(&(hmac_vap->edca_opt_timer));
1126     } else if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
1127         hmac_vap->edca_opt_flag_sta = 0;
1128     }
1129 #endif
1130 
1131     /* 如果是配置VAP, 去注册配置vap对应的net_device, 释放,返回 */
1132     if (mac_vap->vap_mode == WLAN_VAP_MODE_CONFIG) {
1133         /* 在注销netdevice之前先将指针赋为空 */
1134         oal_net_device_stru *netdev = hmac_vap->net_device;
1135         hmac_vap->net_device = HI_NULL;
1136         oal_net_unregister_netdev(netdev);
1137         oal_net_free_netdev(netdev);
1138         mac_vap_free_vap_res(mac_vap->vap_id);
1139         return HI_SUCCESS;
1140     }
1141 
1142     /* 业务vap net_device已在WAL释放,此处置为null */
1143 #ifdef _PRE_WLAN_FEATURE_P2P
1144     /* 针对p2p0,需要删除hmac 中对应的p2p0 netdevice 指针 */
1145     hmac_vap->p2p0_net_device = (mac_vap->p2p_mode == WLAN_P2P_DEV_MODE) ? HI_NULL : hmac_vap->p2p0_net_device;
1146 #endif
1147     hmac_vap->net_device = HI_NULL;
1148     if (hmac_vap->puc_asoc_req_ie_buff != HI_NULL) {
1149         oal_mem_free(hmac_vap->puc_asoc_req_ie_buff);
1150         hmac_vap->puc_asoc_req_ie_buff = HI_NULL;
1151     }
1152     hmac_config_del_timer_user_vap(hmac_vap);
1153 
1154     mac_vap_exit(mac_vap);
1155 
1156     return HI_CONTINUE;
1157 }
1158 
1159 /* ****************************************************************************
1160  功能描述  : 删除vap
1161  输入参数  : pst_vap   : 指向vap的指针
1162              us_len    : 参数长度
1163              puc_param : 参数
1164  返 回 值  : HI_SUCCESS 或其它错误码
1165  修改历史      :
1166   1.日    期   : 2013年5月14日
1167     作    者   : HiSilicon
1168     修改内容   : 新生成函数
1169 **************************************************************************** */
hmac_config_del_vap(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * param)1170 hi_u32 hmac_config_del_vap(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *param)
1171 {
1172     if (oal_unlikely((mac_vap == HI_NULL) || (param == HI_NULL))) {
1173         oam_error_log2(0, OAM_SF_CFG, "{hmac_config_del_vap:vap=%p,param=%p}", (uintptr_t)mac_vap, (uintptr_t)param);
1174         return HI_ERR_CODE_PTR_NULL;
1175     }
1176 
1177     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
1178     if (hmac_vap == HI_NULL) {
1179         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_del_vap::hmac_vap_get_vap_stru failed.}");
1180         return HI_FAIL;
1181     }
1182 
1183 #ifdef _PRE_WLAN_FEATURE_P2P
1184     if (mac_vap->p2p_mode == WLAN_P2P_CL_MODE) {
1185         return hmac_p2p_del_gc_vap(mac_vap, us_len, param);
1186     }
1187 #endif
1188 
1189     if (mac_vap->vap_state != MAC_VAP_STATE_INIT) {
1190         oam_warning_log2(0, 0, "{hmac_config_del_vap:state=%d,mode=%d}", mac_vap->vap_state, mac_vap->vap_mode);
1191         return HI_FAIL;
1192     }
1193 
1194     hi_u32 ret = hmac_config_del_timer_user(mac_vap, hmac_vap);
1195     if (ret != HI_CONTINUE) {
1196         return ret;
1197     }
1198 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
1199     /* liteos需要超时下发睡眠指令到device侧 */
1200     if (((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP) || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)) &&
1201         g_wlan_pm_on == HI_TRUE) {
1202         if (g_pm_apdown_timer.is_registerd == HI_TRUE) {
1203             frw_timer_immediate_destroy_timer(&g_pm_apdown_timer);
1204         }
1205         frw_timer_create_timer(&g_pm_apdown_timer, hmac_set_psm_timeout,
1206                                PM_APDOWN_ENTERY_TIME, (hi_void *)hmac_vap, HI_FALSE);
1207     }
1208 #endif
1209     mac_vap_free_vap_res(mac_vap->vap_id);
1210 
1211     /* **************************************************************************
1212                           抛事件到DMAC层, 同步DMAC数据
1213     ************************************************************************** */
1214     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_DEL_VAP, us_len, param);
1215     if (oal_unlikely(ret != HI_SUCCESS)) {
1216         /* 不退出,保证Devce挂掉的情况下可以下电 */
1217         oam_error_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_del_vap::hmac_config_send_event failed[%d].}", ret);
1218     }
1219 
1220     oam_warning_log3(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_del_vap:Del succ.vap_mode=%d,p2p_mode=%d,user idx[%d]}",
1221         mac_vap->vap_mode, mac_vap->p2p_mode, mac_vap->multi_user_idx);
1222     /* 等dmac清理完组播用户数据之后再释放组播用户 */
1223     hmac_user_del_multi_user(mac_vap->multi_user_idx);
1224 
1225     /* 业务vap已删除,从device上去掉 */
1226     mac_device_stru *mac_dev = mac_res_get_dev();
1227     oam_warning_log1(0, OAM_SF_ANY, "uc_vap_num = %d", mac_dev->vap_num);
1228     if (mac_dev->vap_num == 0) {
1229         hmac_config_host_dev_exit(mac_vap, 0, HI_NULL);
1230         wlan_pm_close();
1231     }
1232 
1233     return ret;
1234 }
1235 
1236 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
1237 /* ****************************************************************************
1238  功能描述  : 配置默认频带,信道,带宽
1239  输入参数  : pst_mac_vap : 指向vap
1240  返 回 值  : HI_SUCCESS 或其它错误码
1241  修改历史      :
1242   1.日    期   : 2015年3月37日
1243     作    者   : HiSilicon
1244     修改内容   : 新生成函数
1245 **************************************************************************** */
hmac_config_def_chan(mac_vap_stru * mac_vap)1246 hi_u32 hmac_config_def_chan(mac_vap_stru *mac_vap)
1247 {
1248     hi_u8 channel;
1249     mac_cfg_mode_param_stru param;
1250 
1251     if (((mac_vap->channel.band == WLAN_BAND_BUTT) ||
1252          (mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_BUTT) ||
1253          (mac_vap->protocol == WLAN_PROTOCOL_BUTT)) &&
1254         (!is_p2p_go(mac_vap))) {
1255         param.band = WLAN_BAND_2G;
1256         param.en_bandwidth = WLAN_BAND_WIDTH_20M;
1257         param.protocol = WLAN_HT_MODE;
1258         hmac_config_set_mode(mac_vap, sizeof(param), (hi_u8 *)&param);
1259     }
1260 
1261     if ((mac_vap->channel.chan_number == 0) && (!is_p2p_go(mac_vap))) {
1262         mac_vap->channel.chan_number = 6; /* number 赋值为 6 */
1263         channel = mac_vap->channel.chan_number;
1264         hmac_config_set_freq(mac_vap, sizeof(hi_u32), &channel);
1265     }
1266 
1267     return HI_SUCCESS;
1268 }
1269 
1270 #endif /* #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE) */
1271 
hmac_config_ap_mesh_start(mac_vap_stru * mac_vap,hmac_vap_stru * hmac_vap)1272 hi_u32 hmac_config_ap_mesh_start(mac_vap_stru *mac_vap, hmac_vap_stru *hmac_vap)
1273 {
1274     /* P2P GO 创建后,未设置ssid 信息,设置为up 状态不需要检查ssid 参数 */
1275     hi_u8 *puc_ssid = mac_vap->mib_info->wlan_mib_sta_config.auc_dot11_desired_ssid;
1276     if ((strlen((const hi_char *)puc_ssid) == 0) && (!is_p2p_go(mac_vap))) {
1277         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::ssid length=0.}");
1278         return HI_FAIL; /* 没设置SSID,则不启动VAP */
1279     }
1280 
1281 #ifdef _PRE_WLAN_FEATURE_MESH
1282     hi_u8 *puc_meshid = mac_vap->mib_info->wlan_mib_mesh_sta_cfg.auc_dot11_mesh_id;
1283     if ((mac_vap->vap_mode == WLAN_VAP_MODE_MESH) && (strlen((const hi_char *)puc_meshid) == 0)) {
1284         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::mesh vap meshid length=0.}");
1285         return HI_FAIL; /* 没设置Meshid,则不启动VAP */
1286     }
1287 #endif
1288 
1289     /* 设置AP侧状态机为 WAIT_START */
1290     hmac_fsm_change_state(hmac_vap, MAC_VAP_STATE_AP_WAIT_START);
1291 
1292     if (is_legacy_vap(hmac_vap->base_vap)) {
1293 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
1294         hmac_config_def_chan(mac_vap);
1295 #endif
1296     }
1297 
1298     /* 这里 en_status 等于 MAC_CHNL_AV_CHK_NOT_REQ(无需检测) 或者 MAC_CHNL_AV_CHK_COMPLETE(检测完成) */
1299     /* 检查协议 频段 带宽是否设置 */
1300     if ((mac_vap->channel.band == WLAN_BAND_BUTT) || (mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_BUTT) ||
1301         (mac_vap->protocol == WLAN_PROTOCOL_BUTT)) {
1302         hmac_fsm_change_state(hmac_vap, MAC_VAP_STATE_INIT);
1303 
1304         if (is_p2p_go(mac_vap)) {
1305             /* wpa_supplicant 会先设置vap up, 此时并未给vap 配置信道、带宽和协议模式信息,
1306                wpa_supplicant 在cfg80211_start_ap 接口配置GO 信道、带宽和协议模式信息,
1307                故此处如果没有设置信道、带宽和协议模式,直接返回成功,不返回失败。 */
1308             oam_warning_log3(mac_vap->vap_id, OAM_SF_CFG,
1309                 "{hmac_config_start_vap::set band bandwidth protocol first.band[%d], bw[%d], protocol[%d]}",
1310                 mac_vap->channel.band, mac_vap->channel.en_bandwidth, mac_vap->protocol);
1311             return HI_SUCCESS;
1312         } else {
1313             oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::set bandwidth protocol first}");
1314             return HI_FAIL;
1315         }
1316     }
1317 
1318     /* 检查信道号是否设置 */
1319     if ((mac_vap->channel.chan_number == 0) && (!is_p2p_go(mac_vap))) {
1320         hmac_fsm_change_state(hmac_vap, MAC_VAP_STATE_INIT);
1321         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::set channel number first.}");
1322         return HI_FAIL;
1323     }
1324 
1325     /* 设置bssid */
1326     mac_vap_set_bssid(mac_vap, mac_vap->mib_info->wlan_mib_sta_config.auc_dot11_station_id, WLAN_MAC_ADDR_LEN);
1327 
1328     /* 入网优化,不同频段下的能力不一样 */
1329     if (mac_vap->channel.band == WLAN_BAND_2G) {
1330         mac_mib_set_short_preamble_option_implemented(mac_vap, WLAN_LEGACY_11B_MIB_SHORT_PREAMBLE);
1331         mac_mib_set_spectrum_management_required(mac_vap, HI_FALSE);
1332     } else {
1333         mac_mib_set_short_preamble_option_implemented(mac_vap, WLAN_LEGACY_11B_MIB_LONG_PREAMBLE);
1334         mac_mib_set_spectrum_management_required(mac_vap, HI_TRUE);
1335     }
1336 
1337     /* 设置AP侧状态机为 UP */
1338     hmac_fsm_change_state(hmac_vap, MAC_VAP_STATE_UP);
1339 
1340     /* allow sleep when ap up */
1341     wlan_pm_add_vote(HI_PM_ID_AP);
1342 
1343     return HI_CONTINUE;
1344 }
1345 
1346 /* ****************************************************************************
1347  函 数 名  : hmac_config_start_vap
1348  功能描述  : hmac启用VAP
1349  输入参数  : pst_mac_vap : 指向vap
1350              us_len      : 参数长度
1351              puc_param   : 参数
1352  返 回 值  : HI_SUCCESS 或其它错误码
1353  修改历史      :
1354   1.日    期   : 2012年12月11日
1355     作    者   : HiSilicon
1356     修改内容   : 新生成函数
1357 **************************************************************************** */
hmac_config_start_vap(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * param)1358 hi_u32 hmac_config_start_vap(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *param)
1359 {
1360     mac_cfg_start_vap_param_stru *start_vap_param = (mac_cfg_start_vap_param_stru *)param;
1361 
1362     if (oal_unlikely((mac_vap == HI_NULL) || (param == HI_NULL) || (us_len != us_len))) {
1363         oam_error_log2(0, OAM_SF_CFG, "{hmac_config_start_vap:vap=%p param=%p}", (uintptr_t)mac_vap, (uintptr_t)param);
1364         return HI_ERR_CODE_PTR_NULL;
1365     }
1366 
1367     mac_vap_state_enum_uint8 state = mac_vap->vap_state;
1368     if (state == MAC_VAP_STATE_BUTT) {
1369         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::the vap has been deleted.}");
1370         return HI_FAIL;
1371     }
1372 
1373     /* 如果已经在up状态,则返回成功 */
1374     if ((state == MAC_VAP_STATE_UP) || (state == MAC_VAP_STATE_AP_WAIT_START) || (state == MAC_VAP_STATE_STA_FAKE_UP)) {
1375         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::state=%d,duplicate start}", state);
1376         return HI_SUCCESS;
1377     }
1378 
1379     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
1380     if (hmac_vap == HI_NULL) {
1381         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::pst_hmac_vap null.}");
1382         return HI_ERR_CODE_PTR_NULL;
1383     }
1384 
1385     if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP
1386 #ifdef _PRE_WLAN_FEATURE_MESH
1387         || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
1388 #endif
1389     ) {
1390         hi_u32 ap_ret = hmac_config_ap_mesh_start(mac_vap, hmac_vap);
1391         if (ap_ret != HI_CONTINUE) {
1392             return ap_ret;
1393         }
1394     } else if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
1395 #ifdef _PRE_WLAN_FEATURE_P2P
1396         /* p2p0和p2p-p2p0 共VAP 结构,对于p2p cl不用修改vap 状态 */
1397         if (start_vap_param->p2p_mode != WLAN_P2P_CL_MODE) {
1398             hmac_fsm_change_state(hmac_vap, MAC_VAP_STATE_STA_FAKE_UP);
1399         }
1400 #else
1401         hmac_fsm_change_state(hmac_vap, MAC_VAP_STATE_STA_FAKE_UP);
1402 #endif
1403     } else {
1404         /* 其它分支 暂不支持 待开发 */
1405         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::mode[%d]Err}", mac_vap->vap_mode);
1406     }
1407 
1408     mac_vap_init_rates(mac_vap);
1409 
1410     hi_u32 ret = hmac_config_start_vap_event(mac_vap, start_vap_param->mgmt_rate_init_flag);
1411     if (oal_unlikely(ret != HI_SUCCESS)) {
1412         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap::hmac_config_send_event Err=%d}", ret);
1413         return ret;
1414     }
1415 
1416     oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_start_vap:host start vap ok}");
1417 
1418     return HI_SUCCESS;
1419 }
1420 
1421 /* ****************************************************************************
1422  功能描述  : 按照指定的协议模式更新VAP速率集
1423  输入参数  : pst_mac_vap : 指向vap
1424              pst_cfg_mode: 协议模式相关参数
1425  返 回 值  : HI_SUCCESS 或其它错误码
1426  修改历史      :
1427   1.日    期   : 2014年8月22日
1428     作    者   : HiSilicon
1429     修改内容   : 新生成函数
1430 **************************************************************************** */
hmac_config_sta_update_rates(mac_vap_stru * mac_vap,const mac_cfg_mode_param_stru * cfg_mode)1431 hi_u32 hmac_config_sta_update_rates(mac_vap_stru *mac_vap, const mac_cfg_mode_param_stru *cfg_mode)
1432 {
1433     hi_u32 ret;
1434     hmac_vap_stru *hmac_vap = HI_NULL;
1435 
1436     if (mac_vap->vap_state == MAC_VAP_STATE_BUTT) {
1437         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_sta_update_rates::the vap has been deleted.}");
1438 
1439         return HI_FAIL;
1440     }
1441 
1442     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
1443     if (hmac_vap == HI_NULL) {
1444         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_sta_update_rates::pst_hmac_vap null.}");
1445         return HI_ERR_CODE_PTR_NULL;
1446     }
1447 
1448     if (cfg_mode->protocol >= WLAN_HT_MODE) {
1449         hmac_vap->tx_aggr_on = HI_TRUE;
1450     } else {
1451         hmac_vap->tx_aggr_on = HI_FALSE;
1452     }
1453 
1454     mac_vap_init_by_protocol(mac_vap, cfg_mode->protocol);
1455     mac_vap->channel.band = cfg_mode->band;
1456     mac_vap->channel.en_bandwidth = cfg_mode->en_bandwidth;
1457     /* **************************************************************************
1458         抛事件到DMAC层, 同步DMAC数据
1459     ************************************************************************** */
1460     ret = hmac_config_start_vap_event(mac_vap, HI_FALSE);
1461     if (oal_unlikely(ret != HI_SUCCESS)) {
1462         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
1463             "{hmac_config_sta_update_rates::hmac_config_send_event failed[%d].}", ret);
1464         mac_vap_init_by_protocol(mac_vap, hmac_vap->preset_para.protocol);
1465         mac_vap->channel.band = hmac_vap->preset_para.band;
1466         mac_vap->channel.en_bandwidth = hmac_vap->preset_para.en_bandwidth;
1467         return ret;
1468     }
1469 
1470     return HI_SUCCESS;
1471 }
1472 
hmac_config_del_user(mac_vap_stru * mac_vap,const hmac_vap_stru * hmac_vap)1473 hi_u32 hmac_config_del_user(mac_vap_stru *mac_vap, const hmac_vap_stru *hmac_vap)
1474 {
1475     hi_list *user_list_head = &(mac_vap->mac_user_list_head);
1476     hi_list *entry = HI_NULL;
1477 
1478     for (entry = user_list_head->next; entry != user_list_head;) {
1479         mac_user_stru *user_tmp = hi_list_entry(entry, mac_user_stru, user_dlist);
1480         hmac_user_stru *hmac_user = (hmac_user_stru *)hmac_user_get_user_stru((hi_u8)user_tmp->us_assoc_id);
1481         if (hmac_user == HI_NULL) {
1482             continue;
1483         }
1484 
1485         /* 指向双向链表下一个 */
1486         entry = entry->next;
1487 
1488         /* 管理帧加密是否开启 */
1489         hi_u8 is_protected = user_tmp->cap_info.pmf_active;
1490 #ifdef _PRE_WLAN_FEATURE_MESH
1491         if (user_tmp->is_mesh_user == HI_TRUE) {
1492             hmac_handle_close_peer_mesh(hmac_vap, hmac_user->base_user->user_mac_addr, WLAN_MAC_ADDR_LEN,
1493                 HMAC_REPORT_DISASSOC, MAC_DISAS_LV_SS);
1494             /* 删除用户 (先在驱动删除) */
1495             hmac_user_del(mac_vap, hmac_user);
1496         } else {
1497 #endif
1498             /* 发去关联帧 */
1499             hmac_mgmt_send_disassoc_frame(mac_vap, user_tmp->user_mac_addr, MAC_DISAS_LV_SS, is_protected);
1500 
1501             /* 删除用户事件上报给上层 */
1502             if (is_ap(mac_vap)) {
1503                 hmac_handle_disconnect_rsp_ap(hmac_vap, hmac_user);
1504             } else if (is_sta(mac_vap)) {
1505                 hmac_sta_disassoc_rsp(hmac_vap, MAC_DISAS_LV_SS, DMAC_DISASOC_MISC_KICKUSER);
1506             }
1507 
1508             /* 删除用户 */
1509             hmac_user_del(mac_vap, hmac_user);
1510 #ifdef _PRE_WLAN_FEATURE_MESH
1511         }
1512 #endif
1513     }
1514 
1515     /* VAP下user链表应该为空 */
1516     if (hi_is_list_empty_optimize(&mac_vap->mac_user_list_head) == HI_FALSE) {
1517         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_down_vap::st_mac_user_list_head is not empty.}");
1518         return HI_FAIL;
1519     }
1520 
1521     return HI_SUCCESS;
1522 }
1523 
1524 /* ****************************************************************************
1525  功能描述  : 停用vap
1526  输入参数  : pst_mac_vap : 指向vap
1527              us_len      : 参数长度
1528              puc_param   : 参数
1529  返 回 值  : HI_SUCCESS 或其它错误码
1530  修改历史      :
1531   1.日    期   : 2013年5月14日
1532     作    者   : HiSilicon
1533     修改内容   : 新生成函数
1534 **************************************************************************** */
hmac_config_down_vap(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * param)1535 hi_u32 hmac_config_down_vap(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *param)
1536 {
1537     if (oal_unlikely((mac_vap == HI_NULL) || (param == HI_NULL))) {
1538         oam_error_log2(0, OAM_SF_CFG, "{hmac_config_down_vap:vap=%p param=%p}", (uintptr_t)mac_vap, (uintptr_t)param);
1539         return HI_ERR_CODE_PTR_NULL;
1540     }
1541 
1542     mac_cfg_down_vap_param_stru *param_tmp = (mac_cfg_down_vap_param_stru *)param;
1543 
1544     /* 如果vap已经在down的状态,直接返回 */
1545     if (mac_vap->vap_state == MAC_VAP_STATE_INIT) {
1546         /* 设置net_device里flags标志 */
1547         if ((param_tmp->net_dev != HI_NULL) && (oal_netdevice_flags(param_tmp->net_dev) & OAL_IFF_RUNNING)) {
1548             oal_netdevice_flags(param_tmp->net_dev) &= (~OAL_IFF_RUNNING);
1549         }
1550 
1551         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_down_vap::vap already down.}");
1552         return HI_SUCCESS;
1553     }
1554 
1555     mac_device_stru *mac_dev    = mac_res_get_dev();
1556     hmac_vap_stru   *hmac_vap   = hmac_vap_get_vap_stru(mac_vap->vap_id);
1557     mac_user_stru   *multi_user = mac_user_get_user_stru(mac_vap->multi_user_idx);
1558     if ((hmac_vap == HI_NULL) || (multi_user == HI_NULL)) {
1559         oam_error_log2(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_down_vap::hmac_vap[%p]/multi_user[%p] null}",
1560             (uintptr_t)hmac_vap, (uintptr_t)multi_user);
1561         return HI_ERR_CODE_PTR_NULL;
1562     }
1563 
1564     /* 设置net_device里flags标志 */
1565     if (param_tmp->net_dev != HI_NULL) {
1566         oal_netdevice_flags(param_tmp->net_dev) &= (~OAL_IFF_RUNNING);
1567     }
1568 
1569     /* 遍历vap下所有用户, 删除用户 */
1570     if (hmac_config_del_user(mac_vap, hmac_vap) != HI_SUCCESS) {
1571         return HI_FAIL;
1572     }
1573 
1574     /* 初始化组播用户的安全信息 */
1575     mac_user_init_key(multi_user);
1576     multi_user->user_tx_info.security.cipher_key_type = WLAN_KEY_TYPE_TX_GTK;
1577 
1578     /* sta模式时 将desired ssid MIB项置空 */
1579     if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
1580         if (memset_s(mac_vap->mib_info->wlan_mib_sta_config.auc_dot11_desired_ssid, WLAN_SSID_MAX_LEN, 0,
1581             WLAN_SSID_MAX_LEN) != EOK) {
1582             return HI_FAIL;
1583         }
1584     } else if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP) { /* AP down状态需要投sleep票 */
1585         wlan_pm_remove_vote(HI_PM_ID_AP);
1586     }
1587 
1588     /* **************************************************************************
1589                          抛事件到DMAC层, 同步DMAC数据
1590     ************************************************************************** */
1591     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_DOWN_VAP, us_len, param);
1592     if (oal_unlikely(ret != HI_SUCCESS)) {
1593         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_down_vap::hmac_config_send_event Err[%d].}", ret);
1594         return ret;
1595     }
1596 
1597     mac_vap_state_enum_uint8 vap_state = MAC_VAP_STATE_INIT;
1598 #ifdef _PRE_WLAN_FEATURE_P2P
1599     vap_state = (param_tmp->p2p_mode == WLAN_P2P_CL_MODE) ? MAC_VAP_STATE_STA_SCAN_COMP : vap_state;
1600 #endif
1601     mac_vap_state_change(mac_vap, vap_state);
1602 
1603     hmac_vap->auth_mode = WLAN_WITP_AUTH_OPEN_SYSTEM;
1604     hmac_set_rx_filter_value(mac_vap);
1605 
1606     oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_down_vap::SUCC!Now remaining%d vap}", mac_dev->vap_num);
1607 
1608     return HI_SUCCESS;
1609 }
1610 
1611 /* ****************************************************************************
1612  功能描述  : 获取模式 包括协议 频段 带宽
1613  输入参数  : pst_mac_vap: 指向vap的指针
1614  输出参数  : pus_len    : 参数长度
1615              puc_param  : 参数
1616  返 回 值  : HI_SUCCESS 或其它错误码
1617  修改历史      :
1618   1.日    期   : 2012年12月24日
1619     作    者   : HiSilicon
1620     修改内容   : 新生成函数
1621 **************************************************************************** */
hmac_config_get_mode(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)1622 hi_u32 hmac_config_get_mode(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
1623 {
1624     mac_cfg_mode_param_stru *prot_param = HI_NULL;
1625 
1626     prot_param = (mac_cfg_mode_param_stru *)puc_param;
1627 
1628     prot_param->protocol = mac_vap->protocol;
1629     prot_param->band = mac_vap->channel.band;
1630     prot_param->en_bandwidth = mac_vap->channel.en_bandwidth;
1631 
1632     *pus_len = sizeof(mac_cfg_mode_param_stru);
1633 
1634     return HI_SUCCESS;
1635 }
1636 
1637 /* ****************************************************************************
1638  功能描述  : 设置mode时,协议 频段 带宽参数检查
1639  输入参数  : pst_mac_device: device结构体
1640              pst_prot_param: pst_prot_param配置命令下发的参数
1641  修改历史      :
1642   1.日    期   : 2013年7月29日
1643     作    者   : HiSilicon
1644     修改内容   : 新生成函数
1645 **************************************************************************** */
hmac_config_device_check_param(const mac_device_stru * mac_dev,wlan_protocol_enum_uint8 protocol)1646 static hi_u32 hmac_config_device_check_param(const mac_device_stru *mac_dev, wlan_protocol_enum_uint8 protocol)
1647 {
1648     switch (protocol) {
1649         case WLAN_LEGACY_11A_MODE:
1650         case WLAN_LEGACY_11B_MODE:
1651         case WLAN_LEGACY_11G_MODE:
1652         case WLAN_MIXED_ONE_11G_MODE:
1653         case WLAN_MIXED_TWO_11G_MODE:
1654             break;
1655 
1656         case WLAN_HT_MODE:
1657         case WLAN_HT_ONLY_MODE:
1658         case WLAN_HT_11G_MODE:
1659             if (mac_dev->protocol_cap < WLAN_PROTOCOL_CAP_HT) {
1660                 /* 设置11n协议,但device不支持HT模式 */
1661                 oam_warning_log2(0, OAM_SF_CFG,
1662                     "{hmac_config_device_check_param::not support HT mode,en_protocol=%d en_protocol_cap=%d.}",
1663                     protocol, mac_dev->protocol_cap);
1664                 return HI_ERR_CODE_CONFIG_EXCEED_SPEC;
1665             }
1666             break;
1667 
1668         case WLAN_VHT_MODE:
1669         case WLAN_VHT_ONLY_MODE:
1670             if (mac_dev->protocol_cap < WLAN_PROTOCOL_CAP_VHT) {
1671                 /* 设置11ac协议,但device不支持VHT模式 */
1672                 oam_warning_log2(0, OAM_SF_CFG,
1673                     "{hmac_config_device_check_param::not support VHT mode,en_protocol=%d en_protocol_cap=%d.}",
1674                     protocol, mac_dev->protocol_cap);
1675                 return HI_ERR_CODE_CONFIG_EXCEED_SPEC;
1676             }
1677             break;
1678 
1679         default:
1680             oam_warning_log0(0, OAM_SF_CFG, "{hmac_config_device_check_param::mode param does not in the list.}");
1681             break;
1682     }
1683     return HI_SUCCESS;
1684 }
1685 
1686 /* ****************************************************************************
1687  功能描述  : 设置mode时,协议 频段 带宽参数检查
1688  输入参数  : pst_mac_device: device结构体
1689              pst_prot_param: pst_prot_param配置命令下发的参数
1690  修改历史      :
1691   1.日    期   : 2013年7月29日
1692     作    者   : HiSilicon
1693     修改内容   : 新生成函数
1694 **************************************************************************** */
hmac_config_check_mode_param(const mac_device_stru * mac_dev,const mac_cfg_mode_param_stru * prot_param)1695 static hi_u32 hmac_config_check_mode_param(const mac_device_stru *mac_dev, const mac_cfg_mode_param_stru *prot_param)
1696 {
1697     /* 根据device能力对参数进行检查 */
1698     hi_u32 ret = hmac_config_device_check_param(mac_dev, prot_param->protocol);
1699     if (ret != HI_SUCCESS) {
1700         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_check_mode_param::check_param Err=%d}", ret);
1701         return ret;
1702     }
1703 
1704     if ((prot_param->en_bandwidth > WLAN_BAND_WIDTH_40MINUS) && (mac_dev->bandwidth_cap < WLAN_BW_CAP_80M)) {
1705         /* 设置80M带宽,但device能力不支持80M,返回错误码 */
1706         oam_warning_log2(0, OAM_SF_CFG,
1707             "{hmac_config_check_mode_param::not support 80MHz bandwidth,en_protocol=%d en_protocol_cap=%d.}",
1708             prot_param->en_bandwidth, mac_dev->bandwidth_cap);
1709         return HI_ERR_CODE_CONFIG_EXCEED_SPEC;
1710     }
1711 
1712     if ((WLAN_BAND_2G != prot_param->band) || (WLAN_BAND_CAP_2G != mac_dev->band_cap)) {
1713         /* 设置2G频带,但device不支持2G */
1714         oam_warning_log2(0, OAM_SF_CFG,
1715             "{hmac_config_check_mode_param::not support 5GHz band,en_protocol=%d en_protocol_cap=%d.}",
1716             prot_param->band, mac_dev->band_cap);
1717         return HI_ERR_CODE_CONFIG_EXCEED_SPEC;
1718     }
1719 
1720     return HI_SUCCESS;
1721 }
1722 
1723 /* ****************************************************************************
1724  功能描述  : 非首次设置带宽时根据已配置带宽检查新配置带宽参数
1725  输入参数  : en_bw_device: 首次配置的带宽
1726              en_bw_config: 本次配置命令配置的带宽
1727  修改历史      :
1728   1.日    期   : 2013年11月18日
1729     作    者   : HiSilicon
1730     修改内容   : 新生成函数
1731 **************************************************************************** */
hmac_config_set_mode_check_bandwith(wlan_channel_bandwidth_enum_uint8 bw_device,wlan_channel_bandwidth_enum_uint8 bw_config)1732 static hi_u32 hmac_config_set_mode_check_bandwith(wlan_channel_bandwidth_enum_uint8 bw_device,
1733     wlan_channel_bandwidth_enum_uint8 bw_config)
1734 {
1735     /* 要配置带宽是20M */
1736     if (WLAN_BAND_WIDTH_20M == bw_config) {
1737         return HI_SUCCESS;
1738     }
1739 
1740     /* 要配置带宽与首次配置带宽相同 */
1741     if (bw_device == bw_config) {
1742         return HI_SUCCESS;
1743     }
1744 
1745     switch (bw_device) {
1746         case WLAN_BAND_WIDTH_80PLUSPLUS:
1747         case WLAN_BAND_WIDTH_80PLUSMINUS:
1748             if (WLAN_BAND_WIDTH_40PLUS == bw_config) {
1749                 return HI_SUCCESS;
1750             }
1751             break;
1752 
1753         case WLAN_BAND_WIDTH_80MINUSPLUS:
1754         case WLAN_BAND_WIDTH_80MINUSMINUS:
1755             if (WLAN_BAND_WIDTH_40MINUS == bw_config) {
1756                 return HI_SUCCESS;
1757             }
1758             break;
1759 
1760         default:
1761             break;
1762     }
1763 
1764     return HI_FAIL;
1765 }
1766 
hmac_config_mac_vap_dev(mac_vap_stru * mac_vap,mac_device_stru * mac_dev,const mac_cfg_mode_param_stru * prot_param)1767 hi_u32 hmac_config_mac_vap_dev(mac_vap_stru *mac_vap, mac_device_stru *mac_dev,
1768     const mac_cfg_mode_param_stru *prot_param)
1769 {
1770     /* 根据协议更新vap能力 */
1771     mac_vap_init_by_protocol(mac_vap, prot_param->protocol);
1772     mac_vap_init_rates(mac_vap);
1773 
1774     /* 根据带宽信息更新Mib */
1775     mac_vap_change_mib_by_bandwidth(mac_vap, prot_param->en_bandwidth);
1776 
1777     /* 更新device的频段及最大带宽信息 */
1778     if (mac_dev->max_bandwidth == WLAN_BAND_WIDTH_BUTT) {
1779         mac_dev->max_bandwidth = prot_param->en_bandwidth;
1780         mac_dev->max_band      = prot_param->band;
1781     }
1782 
1783     /* **************************************************************************
1784      抛事件到DMAC层, 配置寄存器
1785     ************************************************************************** */
1786     hi_u32 ret = hmac_set_mode_event(mac_vap);
1787     if (oal_unlikely(ret != HI_SUCCESS)) {
1788         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_mode::hmac_config_send_event failed[%d]}", ret);
1789     }
1790 
1791     return ret;
1792 }
1793 
1794 /* ****************************************************************************
1795  功能描述  : 设置模式 包括协议 频段 带宽
1796  输入参数  : pst_mac_vap: 指向VAP的指针
1797              us_len     : 参数长度
1798              puc_param  : 参数
1799  返 回 值  : HI_SUCCESS 或其它错误码
1800  修改历史      :
1801   1.日    期   : 2012年12月24日
1802     作    者   : HiSilicon
1803     修改内容   : 新生成函数
1804   2.日    期   : 2015年5月5日
1805     作    者   : HiSilicon
1806     修改内容   : 函数整改,hmac配置流程应该是
1807                            1、参数校验并设置hmac vap下的信息
1808                            2、设置mac vap下的信息及mib信息
1809                            3、设置mac device下的信息
1810                            4、抛配置事件到dmac
1811 **************************************************************************** */
hmac_config_set_mode(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)1812 hi_u32 hmac_config_set_mode(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
1813 {
1814     hi_unref_param(us_len);
1815 
1816     /* 获取device ,设置模式时,device下必须至少有一个vap */
1817     mac_device_stru *mac_dev = mac_res_get_dev();
1818     if (mac_dev->vap_num == 0) {
1819         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_mode::no vap in device.}");
1820         return HI_ERR_CODE_MAC_DEVICE_NULL;
1821     }
1822 
1823     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
1824     if (hmac_vap == HI_NULL) {
1825         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_mode::pst_hmac_vap null.}");
1826         return HI_ERR_CODE_PTR_NULL;
1827     }
1828 
1829     /* 检查配置参数是否在device能力内 */
1830     mac_cfg_mode_param_stru *prot_param = (mac_cfg_mode_param_stru *)puc_param;
1831     hi_u32 ret = hmac_config_check_mode_param(mac_dev, prot_param);
1832     if (ret != HI_SUCCESS) {
1833         return ret;
1834     }
1835 
1836     /* device已经配置时,需要校验下频段、带宽是否一致 */
1837     if ((mac_dev->max_bandwidth != WLAN_BAND_WIDTH_BUTT) && (!mac_dev->dbac_enabled)) {
1838         if (mac_dev->max_band != prot_param->band) {
1839             oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_mode::previous vapBand=%d,mismatchWith=%d}",
1840                 mac_dev->max_band, prot_param->band);
1841             return HI_FAIL;
1842         }
1843 
1844         ret = hmac_config_set_mode_check_bandwith(mac_dev->max_bandwidth, prot_param->en_bandwidth);
1845         if (ret != HI_SUCCESS) {
1846             oam_warning_log3(mac_vap->vap_id, OAM_SF_CFG,
1847                 "{hmac_config_set_mode::config_set_mode_check_bandwith Err=%d,previous vap bandwidth[%d,current=%d]}",
1848                 ret, mac_dev->max_bandwidth, prot_param->en_bandwidth);
1849             return ret;
1850         }
1851     }
1852 
1853     hmac_vap->tx_aggr_on = (prot_param->protocol >= WLAN_HT_MODE) ? HI_TRUE : HI_FALSE;
1854 
1855     wlan_channel_bandwidth_enum_uint8 cur_bw = mac_vap->channel.en_bandwidth;
1856     /* 更新STA协议配置标志位 */
1857     if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
1858         hmac_vap->preset_para.protocol = prot_param->protocol;
1859         if ((cur_bw != WLAN_BAND_WIDTH_5M) && (cur_bw != WLAN_BAND_WIDTH_10M)) {
1860             hmac_vap->preset_para.en_bandwidth = prot_param->en_bandwidth;
1861         }
1862         hmac_vap->preset_para.band = prot_param->band;
1863     }
1864 
1865     /* 记录协议模式, band, bandwidth到mac_vap下 */
1866     mac_vap->protocol     = prot_param->protocol;
1867     mac_vap->channel.band = prot_param->band;
1868 
1869     mac_vap->channel.en_bandwidth = ((cur_bw != WLAN_BAND_WIDTH_5M) && (cur_bw != WLAN_BAND_WIDTH_10M)) ?
1870         prot_param->en_bandwidth : cur_bw;
1871 
1872     oam_info_log3(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_mode::protocol=%d, band=%d, bandwidth=%d.}",
1873         mac_vap->protocol, mac_vap->channel.band, mac_vap->channel.en_bandwidth);
1874 
1875     ret = hmac_config_mac_vap_dev(mac_vap, mac_dev, prot_param);
1876     return ret;
1877 }
1878 
1879 /* ****************************************************************************
1880  功能描述  : 设置stationID值,即MAC地址
1881  输入参数  : event_hdr:事件头
1882              pst_param    :参数
1883  返 回 值  : HI_SUCCESS 或其它错误码
1884  修改历史      :
1885   1.日    期   : 2012年12月24日
1886     作    者   : HiSilicon
1887     修改内容   : 新生成函数
1888 **************************************************************************** */
hmac_config_set_mac_addr(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)1889 hi_u32 hmac_config_set_mac_addr(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
1890 {
1891 #ifdef _PRE_WLAN_FEATURE_P2P
1892     mac_cfg_staion_id_param_stru *station_id_param = HI_NULL;
1893     wlan_p2p_mode_enum_uint8 p2p_mode;
1894 #endif
1895     hi_u32 ret;
1896 
1897 #ifdef _PRE_WLAN_FEATURE_P2P
1898     /* P2P 设置MAC 地址mib 值需要区分P2P DEV 或P2P_CL/P2P_GO,P2P_DEV MAC 地址设置到p2p0 MIB 中 */
1899     station_id_param = (mac_cfg_staion_id_param_stru *)puc_param;
1900     p2p_mode = station_id_param->p2p_mode;
1901     if (p2p_mode == WLAN_P2P_DEV_MODE) {
1902         /* 如果是p2p0 device,则配置MAC 地址到auc_p2p0_dot11StationID 成员中 */
1903         if (memcpy_s(mac_vap->mib_info->wlan_mib_sta_config.auc_p2p0_dot11_station_id, WLAN_MAC_ADDR_LEN,
1904             station_id_param->auc_station_id, WLAN_MAC_ADDR_LEN) != EOK) {
1905             oam_error_log0(0, 0, "{hmac_config_set_mac_addr::memcpy_s fail.}");
1906             return HI_FAIL;
1907         }
1908     } else {
1909         /* 设置mib值, Station_ID */
1910         mac_mib_set_station_id(mac_vap, (hi_u8)us_len, puc_param);
1911     }
1912 #else
1913     /* 设置mib值, Station_ID */
1914     mac_mib_set_station_id(mac_vap, (hi_u8)us_len, puc_param);
1915 #endif
1916 
1917     /* **************************************************************************
1918         抛事件到DMAC层, 同步DMAC数据
1919     ************************************************************************** */
1920     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_STATION_ID, us_len, puc_param);
1921     if (oal_unlikely(ret != HI_SUCCESS)) {
1922         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
1923                          "{hmac_config_set_mac_addr::hmac_config_send_event failed[%d].}", ret);
1924     }
1925 
1926     return ret;
1927 }
1928 
1929 /* ****************************************************************************
1930  功能描述  : hmac读SSID
1931  输入参数  : event_hdr: 事件头
1932  输出参数  : pus_len      : 参数长度
1933              puc_param    : 参数
1934  返 回 值  : 错误码
1935  修改历史      :
1936   1.日    期   : 2013年1月15日
1937     作    者   : HiSilicon
1938     修改内容   : 新生成函数
1939 **************************************************************************** */
hmac_config_get_ssid(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)1940 hi_u32 hmac_config_get_ssid(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
1941 {
1942     /* 读取mib值 */
1943     return mac_mib_get_ssid(mac_vap, (hi_u8 *)pus_len, puc_param);
1944 }
1945 
1946 /* ****************************************************************************
1947  功能描述  : hmac设SSID
1948  输入参数  : event_hdr: 事件头
1949              us_len       : 参数长度
1950              puc_param    : 参数
1951  返 回 值  : 错误码
1952  修改历史      :
1953   1.日    期   : 2013年1月15日
1954     作    者   : HiSilicon
1955     修改内容   : 新生成函数
1956 **************************************************************************** */
hmac_config_set_ssid(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)1957 hi_u32 hmac_config_set_ssid(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
1958 {
1959     /* 设置mib值 */
1960     mac_mib_set_ssid(mac_vap, (hi_u8)us_len, puc_param);
1961 
1962 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
1963     return hmac_config_send_event(mac_vap, WLAN_CFGID_SSID, us_len, puc_param);
1964 #else
1965     return HI_SUCCESS;
1966 #endif
1967 }
1968 
1969 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
1970 /* ****************************************************************************
1971  功能描述  : 设置短前导码能力位
1972  修改历史      :
1973   1.日    期   : 2013年1月21日
1974     作    者   : HiSilicon
1975     修改内容   : 新生成函数
1976 **************************************************************************** */
hmac_config_set_shpreamble(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)1977 hi_u32 hmac_config_set_shpreamble(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
1978 {
1979     /* 设置mib值 */
1980     mac_mib_set_shpreamble(mac_vap, (hi_u8)us_len, puc_param);
1981 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
1982     /* **************************************************************************
1983         抛事件到DMAC层, 同步DMAC数据
1984     ************************************************************************** */
1985     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SHORT_PREAMBLE, us_len, puc_param);
1986     if (oal_unlikely(ret != HI_SUCCESS)) {
1987         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
1988             "{hmac_config_set_shpreamble::hmac_config_send_event failed[%d].}", ret);
1989     }
1990     return ret;
1991 #else
1992     return HI_SUCCESS;
1993 #endif
1994 }
1995 
1996 /* ****************************************************************************
1997  功能描述  : 读前导码能力位
1998  输入参数  : event_hdr: 事件头
1999  输出参数  : pus_len      : 参数长度
2000              puc_param    : 参数
2001  返 回 值  : 错误码
2002  修改历史      :
2003   1.日    期   : 2013年1月15日
2004     作    者   : HiSilicon
2005     修改内容   : 新生成函数
2006 **************************************************************************** */
hmac_config_get_shpreamble(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)2007 hi_u32 hmac_config_get_shpreamble(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
2008 {
2009     /* 读mib值 */
2010     return mac_mib_get_shpreamble(mac_vap, (hi_u8 *)pus_len, puc_param);
2011 }
2012 #endif
2013 
2014 /* ****************************************************************************
2015  功能描述  : 20M short gi能力设置
2016  输入参数  : event_hdr: 事件头
2017              us_len       : 参数长度
2018              puc_param    : 参数
2019  返 回 值  : 错误码
2020  修改历史      :
2021   1.日    期   : 2013年1月15日
2022     作    者   : HiSilicon
2023     修改内容   : 新生成函数
2024 **************************************************************************** */
hmac_config_set_shortgi20(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2025 hi_u32 hmac_config_set_shortgi20(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2026 {
2027     hi_s32 l_value;
2028     hi_unref_param(us_len);
2029 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2030     shortgi_cfg_stru shortgi_cfg;
2031 
2032     shortgi_cfg.type = SHORTGI_20_CFG_ENUM;
2033 #endif
2034     l_value = *((hi_s32 *)puc_param);
2035 
2036     if (l_value != 0) {
2037 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2038         shortgi_cfg.enable = HI_TRUE;
2039 #endif
2040         mac_vap->mib_info->phy_ht.dot11_short_gi_option_in_twenty_implemented = HI_TRUE;
2041     } else {
2042 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2043         shortgi_cfg.enable = HI_FALSE;
2044 #endif
2045         mac_vap->mib_info->phy_ht.dot11_short_gi_option_in_twenty_implemented = HI_FALSE;
2046     }
2047 
2048     /* hi1131-cb : Need to send to Dmac via sdio */
2049 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2050     /* 配置事件的子事件 WLAN_CFGID_SHORTGI 通过新加的接口函数取出关键数据存入skb后通过sdio发出 */
2051     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SHORTGI, SHORTGI_CFG_STRU_LEN, (hi_u8 *)&shortgi_cfg);
2052     if (ret != HI_SUCCESS) {
2053         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_set_shortgi20::hmac_config_send_event failed[%u].}", ret);
2054     }
2055     return ret;
2056 #else
2057     return HI_SUCCESS;
2058 #endif
2059 }
2060 
2061 /* ****************************************************************************
2062  功能描述  : 读取20M short gi
2063  输入参数  : event_hdr: 事件头
2064  输出参数  : pus_len      : 参数长度
2065              puc_param    : 参数
2066  返 回 值  : 错误码
2067  修改历史      :
2068   1.日    期   : 2013年1月15日
2069     作    者   : HiSilicon
2070     修改内容   : 新生成函数
2071 **************************************************************************** */
hmac_config_get_shortgi20(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)2072 hi_u32 hmac_config_get_shortgi20(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
2073 {
2074     hi_s32 l_value;
2075 
2076     l_value = mac_vap->mib_info->phy_ht.dot11_short_gi_option_in_twenty_implemented;
2077 
2078     *((hi_s32 *)puc_param) = l_value;
2079 
2080     *pus_len = sizeof(l_value);
2081 
2082     return HI_SUCCESS;
2083 }
2084 
2085 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2086 /* ****************************************************************************
2087  功能描述  : 设置保护模式
2088  输入参数  : event_hdr: 事件头
2089              us_len       : 参数长度
2090              puc_param    : 参数
2091  返 回 值  : 错误码
2092  修改历史      :
2093   1.日    期   : 2013年1月15日
2094     作    者   : HiSilicon
2095     修改内容   : 新生成函数
2096 **************************************************************************** */
hmac_config_set_prot_mode(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2097 hi_u32 hmac_config_set_prot_mode(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2098 {
2099     hi_s32 l_value;
2100 
2101     l_value = *((hi_s32 *)puc_param);
2102     if (oal_unlikely(l_value >= WLAN_PROT_BUTT)) {
2103         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_prot_mode::invalid value[%d].}", l_value);
2104         return HI_ERR_CODE_INVALID_CONFIG;
2105     }
2106     mac_vap->protection.protection_mode = (hi_u8)l_value;
2107 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2108     /* **************************************************************************
2109         抛事件到DMAC层, 同步DMAC数据
2110     ************************************************************************** */
2111     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_PROT_MODE, us_len, puc_param);
2112     if (oal_unlikely(ret != HI_SUCCESS)) {
2113         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
2114                          "{hmac_config_set_prot_mode::hmac_config_send_event failed[%d].}", ret);
2115     }
2116     return ret;
2117 #else
2118     hi_unref_param(us_len);
2119     return HI_SUCCESS;
2120 #endif
2121 }
2122 
2123 /* ****************************************************************************
2124  功能描述  : 读取保护模式
2125  输入参数  : event_hdr: 事件头
2126  输出参数  : pus_len      : 参数长度
2127              puc_param    : 参数
2128  返 回 值  : 错误码
2129  修改历史      :
2130   1.日    期   : 2013年1月15日
2131     作    者   : HiSilicon
2132     修改内容   : 新生成函数
2133 **************************************************************************** */
hmac_config_get_prot_mode(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)2134 hi_u32 hmac_config_get_prot_mode(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
2135 {
2136     *((hi_s32 *)puc_param) = mac_vap->protection.protection_mode;
2137     *pus_len = sizeof(hi_s32);
2138 
2139     return HI_SUCCESS;
2140 }
2141 
2142 /* ****************************************************************************
2143  功能描述  : 设置认证模式
2144  输入参数  : event_hdr: 事件头
2145              us_len       : 参数长度
2146              puc_param    : 参数
2147  返 回 值  : 错误码
2148  修改历史      :
2149   1.日    期   : 2013年1月15日
2150     作    者   : HiSilicon
2151     修改内容   : 新生成函数
2152 **************************************************************************** */
hmac_config_set_auth_mode(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2153 hi_u32 hmac_config_set_auth_mode(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2154 {
2155     hi_u32 value;
2156     hmac_vap_stru *hmac_vap = HI_NULL;
2157 
2158     hi_unref_param(us_len);
2159 
2160     value = *((hi_u32 *)puc_param);
2161     /* 默认OPEN */
2162     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
2163     if (hmac_vap == HI_NULL) {
2164         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_auth_mode::pst_hmac_vap null.}");
2165         return HI_ERR_CODE_PTR_NULL;
2166     }
2167 
2168     hmac_vap->auth_mode = WLAN_WITP_AUTH_OPEN_SYSTEM;
2169     if (value & BIT1) {
2170         hmac_vap->auth_mode = WLAN_WITP_AUTH_SHARED_KEY;
2171     }
2172     /* 支持OPEN跟SHARE KEY */
2173     if ((value & BIT0) && (value & BIT1)) {
2174         hmac_vap->auth_mode = WLAN_WITP_ALG_AUTH_BUTT;
2175     }
2176 
2177     oam_info_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_auth_mode::set auth mode[%d] succ.}",
2178         hmac_vap->auth_mode);
2179     return HI_SUCCESS;
2180 }
2181 
2182 /* ****************************************************************************
2183  功能描述  : 读取认证模式
2184  输入参数  : event_hdr: 事件头
2185  输出参数  : pus_len      : 参数长度
2186              puc_param    : 参数
2187  返 回 值  : 错误码
2188  修改历史      :
2189   1.日    期   : 2013年1月15日
2190     作    者   : HiSilicon
2191     修改内容   : 新生成函数
2192 **************************************************************************** */
hmac_config_get_auth_mode(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)2193 hi_u32 hmac_config_get_auth_mode(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
2194 {
2195     hmac_vap_stru *hmac_vap = HI_NULL;
2196 
2197     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
2198     if (hmac_vap == HI_NULL) {
2199         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_get_auth_mode::pst_hmac_vap null.}");
2200         return HI_ERR_CODE_PTR_NULL;
2201     }
2202 
2203     *((hi_s32 *)puc_param) = hmac_vap->auth_mode;
2204     *pus_len = sizeof(hi_s32);
2205 
2206     return HI_SUCCESS;
2207 }
2208 
2209 /* ****************************************************************************
2210  功能描述  : 设置beacon interval
2211  输入参数  : event_hdr: 事件头
2212              us_len       : 参数长度
2213              puc_param    : 参数
2214  返 回 值  : 错误码
2215  修改历史      :
2216   1.日    期   : 2013年1月15日
2217     作    者   : HiSilicon
2218     修改内容   : 新生成函数
2219 **************************************************************************** */
hmac_config_set_bintval(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2220 hi_u32 hmac_config_set_bintval(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2221 {
2222     hi_u32 ret;
2223     mac_device_stru *mac_dev = HI_NULL;
2224     hi_u8 vap_idx;
2225     mac_vap_stru *mac_vap_tmp = HI_NULL;
2226 
2227     mac_dev = mac_res_get_dev();
2228     /* 设置device下的值 */
2229     mac_dev->beacon_interval = *((hi_u32 *)puc_param);
2230     /* 遍历device下所有vap */
2231     for (vap_idx = 0; vap_idx < mac_dev->vap_num; vap_idx++) {
2232         mac_vap_tmp = mac_vap_get_vap_stru(mac_dev->auc_vap_id[vap_idx]);
2233         if (mac_vap_tmp == HI_NULL) {
2234             continue;
2235         }
2236 
2237         /* 只有AP VAP需要beacon interval */
2238         if ((mac_vap_tmp->vap_mode == WLAN_VAP_MODE_BSS_AP)
2239 #ifdef _PRE_WLAN_FEATURE_MESH
2240             || (mac_vap_tmp->vap_mode == WLAN_VAP_MODE_MESH)
2241 #endif
2242         ) {
2243             /* 设置mib值 */
2244             mac_mib_set_beacon_period(mac_vap_tmp, (hi_u8)us_len, puc_param);
2245         }
2246     }
2247 
2248     /* **************************************************************************
2249         抛事件到DMAC层, 同步DMAC数据
2250     ************************************************************************** */
2251     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_BEACON_INTERVAL, us_len, puc_param);
2252     if (oal_unlikely(ret != HI_SUCCESS)) {
2253         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
2254                          "{hmac_config_set_bintval::hmac_config_send_event failed[%d].}", ret);
2255     }
2256 
2257     return ret;
2258 }
2259 
2260 /* ****************************************************************************
2261  功能描述  : 读取beacon interval
2262  输入参数  : event_hdr: 事件头
2263  输出参数  : pus_len      : 参数长度
2264              puc_param    : 参数
2265  返 回 值  : 错误码
2266  修改历史      :
2267   1.日    期   : 2013年1月15日
2268     作    者   : HiSilicon
2269     修改内容   : 新生成函数
2270 **************************************************************************** */
hmac_config_get_bintval(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)2271 hi_u32 hmac_config_get_bintval(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
2272 {
2273     /* 读取mib值 */
2274     return mac_mib_get_beacon_period(mac_vap, (hi_u8 *)pus_len, puc_param);
2275 }
2276 
2277 /* ****************************************************************************
2278  功能描述  : 设置dtim period
2279  修改历史      :
2280   1.日    期   : 2013年9月17日
2281     作    者   : HiSilicon
2282     修改内容   : 新生成函数
2283 **************************************************************************** */
hmac_config_set_dtimperiod(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2284 hi_u32 hmac_config_set_dtimperiod(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2285 {
2286     /* 设置mib值 */
2287     mac_mib_set_dtim_period(mac_vap, (hi_u8)us_len, puc_param);
2288 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2289     /* **************************************************************************
2290         抛事件到DMAC层, 同步DMAC数据
2291     ************************************************************************** */
2292     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_DTIM_PERIOD, us_len, puc_param);
2293     if (oal_unlikely(ret != HI_SUCCESS)) {
2294         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
2295                          "{hmac_config_set_bintval::hmac_config_send_event failed[%d].}", ret);
2296     }
2297     return ret;
2298 #else
2299     return HI_SUCCESS;
2300 #endif
2301 }
2302 
2303 /* ****************************************************************************
2304  功能描述  : 读取dtim period
2305  输出参数  : pus_len      : 参数长度
2306              puc_param    : 参数
2307  返 回 值  : 错误码
2308  修改历史      :
2309   1.日    期   : 2013年9月17日
2310     作    者   : HiSilicon
2311     修改内容   : 新生成函数
2312 **************************************************************************** */
hmac_config_get_dtimperiod(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)2313 hi_u32 hmac_config_get_dtimperiod(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
2314 {
2315     /* 读取mib值 */
2316     return mac_mib_get_dtim_period(mac_vap, (hi_u8 *)pus_len, puc_param);
2317 }
2318 #endif
2319 
2320 /* ****************************************************************************
2321  功能描述  : 设置发送功率
2322  输入参数  : event_hdr: 事件头
2323              us_len       : 参数长度
2324              puc_param    : 参数
2325  返 回 值  : 错误码
2326  修改历史      :
2327   1.日    期   : 2013年1月15日
2328     作    者   : HiSilicon
2329     修改内容   : 新生成函数
2330 **************************************************************************** */
hmac_config_set_txpower(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2331 hi_u32 hmac_config_set_txpower(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2332 {
2333     hi_s32 l_value;
2334     hi_u32 ret;
2335 
2336     l_value = *((hi_s32 *)puc_param);
2337 
2338     mac_vap_set_tx_power(mac_vap, (hi_u8)l_value);
2339 
2340     /* **************************************************************************
2341         抛事件到DMAC层, 同步DMAC数据
2342     ************************************************************************** */
2343     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_TX_POWER, us_len, puc_param);
2344     if (oal_unlikely(ret != HI_SUCCESS)) {
2345         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
2346                          "{hmac_config_set_txpower::hmac_config_send_event failed[%d].}", ret);
2347     }
2348 
2349     return ret;
2350 }
2351 
2352 /* ****************************************************************************
2353  功能描述  : 读取发送功率
2354  输入参数  : event_hdr: 事件头
2355  输出参数  : pus_len      : 参数长度
2356              puc_param    : 参数
2357  返 回 值  : 错误码
2358  修改历史      :
2359   1.日    期   : 2013年1月15日
2360     作    者   : HiSilicon
2361     修改内容   : 新生成函数
2362 **************************************************************************** */
hmac_config_get_txpower(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)2363 hi_u32 hmac_config_get_txpower(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
2364 {
2365     *((hi_s32 *)puc_param) = mac_vap->tx_power;
2366     *pus_len = sizeof(hi_s32);
2367 
2368     return HI_SUCCESS;
2369 }
2370 
2371 /* ****************************************************************************
2372  功能描述  : 设置频率
2373  输入参数  : event_hdr: 事件头
2374              us_len       : 参数长度
2375              puc_param    : 参数
2376  返 回 值  : 错误码
2377  修改历史      :
2378   1.日    期   : 2013年1月15日
2379     作    者   : HiSilicon
2380     修改内容   : 新生成函数
2381 **************************************************************************** */
hmac_config_set_freq(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * channel)2382 hi_u32 hmac_config_set_freq(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *channel)
2383 {
2384     mac_cfg_channel_param_stru  l_channel_param;
2385     mac_device_stru            *mac_dev = mac_res_get_dev();
2386 
2387     hi_u32 ret = mac_is_channel_num_valid(mac_vap->channel.band, (*channel));
2388     if (ret != HI_SUCCESS) {
2389         oam_error_log2(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_freq::channel=%d,Err=%d}", (*channel), ret);
2390         return HI_ERR_CODE_INVALID_CONFIG;
2391     }
2392 
2393 #ifdef _PRE_WLAN_FEATURE_11D
2394     /* 信道14特殊处理,只在11b协议模式下有效 */
2395     if (((*channel) == 14) && (mac_vap->protocol != WLAN_LEGACY_11B_MODE)) {
2396         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_freq::protocol=%d}", mac_vap->protocol);
2397         return HI_ERR_CODE_INVALID_CONFIG;
2398     }
2399 #endif
2400 
2401     mac_vap->channel.chan_number = (*channel);
2402     ret = mac_get_channel_idx_from_num(mac_vap->channel.band, (*channel), &(mac_vap->channel.idx));
2403     if (ret != HI_SUCCESS) {
2404         oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_freq::get Channel Err.band=%u,channel=%u}",
2405             mac_vap->channel.band, mac_vap->channel.idx);
2406         return ret;
2407     }
2408 
2409     /* 非DBAC时,首次配置信道时设置到硬件 */
2410     if ((mac_dev->vap_num == 1) || (mac_dev->max_channel == 0)) {
2411         mac_device_get_channel(mac_dev, &l_channel_param);
2412         l_channel_param.channel = (*channel);
2413         mac_device_set_channel(mac_dev, &l_channel_param);
2414 
2415         /* **************************************************************************
2416             抛事件到DMAC层, 同步DMAC数据
2417         ************************************************************************** */
2418         ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CURRENT_CHANEL, us_len, channel);
2419         if (oal_unlikely(ret != HI_SUCCESS)) {
2420             oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_freq::hmac_config_send_event Err=%d}", ret);
2421             return ret;
2422         }
2423 #ifdef _PRE_WLAN_FEATURE_DBAC
2424     } else if (mac_dev->dbac_enabled) {
2425         /* **************************************************************************
2426             抛事件到DMAC层, 同步DMAC数据
2427         ************************************************************************** */
2428         ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CURRENT_CHANEL, us_len, channel);
2429         if (oal_unlikely(ret != HI_SUCCESS)) {
2430             oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_freq::hmac_config_send_event Err=%d}", ret);
2431             return ret;
2432         }
2433 
2434         oam_info_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_freq::do not check channel while DBAC enabled.}");
2435 #endif
2436     } else if (mac_dev->max_channel != (*channel)) {
2437         oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_freq::previous vap channel=%d,mismatch=%d}",
2438             mac_dev->max_channel, (*channel));
2439 
2440         return HI_FAIL;
2441     }
2442 
2443     return HI_SUCCESS;
2444 }
2445 
2446 /* ****************************************************************************
2447  功能描述  : 读取频率
2448  输入参数  : event_hdr: 事件头
2449  输出参数  : pus_len      : 参数长度
2450              puc_param    : 参数
2451  返 回 值  : 错误码
2452  修改历史      :
2453   1.日    期   : 2013年1月15日
2454     作    者   : HiSilicon
2455     修改内容   : 新生成函数
2456 **************************************************************************** */
hmac_config_get_freq(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)2457 hi_u32 hmac_config_get_freq(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
2458 {
2459     *((hi_u32 *)puc_param) = mac_vap->channel.chan_number;
2460 
2461     *pus_len = sizeof(hi_u32);
2462 
2463     return HI_SUCCESS;
2464 }
2465 
2466 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2467 /* ****************************************************************************
2468  功能描述  : 设置WMM参数
2469  输入参数  : event_hdr: 事件头
2470              us_len       : 参数长度
2471              puc_param    : 参数
2472  修改历史      :
2473   1.日    期   : 2013年5月8日
2474     作    者   : HiSilicon
2475     修改内容   : 新生成函数
2476 **************************************************************************** */
2477 /* 规则5.1 避免函数过长,函数不超过50行(非空非注释),申请例外: 功能内聚,且被包含的宏没有打开, 建议屏蔽 */
hmac_config_set_wmm_params(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2478 hi_u32 hmac_config_set_wmm_params(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2479 {
2480     hi_u32 ret = HI_SUCCESS;
2481     hi_u8 syn_flag; /* 默认不需要同步到dmac */
2482 
2483     syn_flag = HI_FALSE;
2484 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2485     /* offload模式下均需要同步到dmac */
2486     syn_flag = HI_TRUE;
2487 #endif
2488 
2489     hmac_config_wmm_para_stru *cfg_stru = (hmac_config_wmm_para_stru *)puc_param;
2490 
2491     hi_u32 ac = cfg_stru->ac;
2492     hi_u32 value = cfg_stru->value;
2493     wlan_cfgid_enum_uint16 cfg_id = (hi_u16)cfg_stru->cfg_id;
2494 
2495     if (ac >= WLAN_WME_AC_BUTT) {
2496         oam_warning_log3(mac_vap->vap_id, OAM_SF_CFG,
2497             "{hmac_config_set_wmm_params::invalid param,en_cfg_id=%d, ul_ac=%d, ul_value=%d.}", cfg_id, ac, value);
2498         return HI_FAIL;
2499     }
2500 
2501     /* 根据sub-ioctl id填写WID */
2502     switch (cfg_id) {
2503         case WLAN_CFGID_EDCA_TABLE_CWMIN:
2504             if ((value > WLAN_QEDCA_TABLE_CWMIN_MAX) || (value < WLAN_QEDCA_TABLE_CWMIN_MIN)) {
2505                 return HI_FAIL;
2506             }
2507             mac_vap->mib_info->ast_wlan_mib_edca[ac].dot11_edca_table_c_wmin = value;
2508             break;
2509         case WLAN_CFGID_EDCA_TABLE_CWMAX:
2510             if ((value > WLAN_QEDCA_TABLE_CWMAX_MAX) || (value < WLAN_QEDCA_TABLE_CWMAX_MIN)) {
2511                 return HI_FAIL;
2512             }
2513             mac_vap->mib_info->ast_wlan_mib_edca[ac].dot11_edca_table_c_wmax = value;
2514             break;
2515         case WLAN_CFGID_EDCA_TABLE_AIFSN:
2516             if ((value < WLAN_QEDCA_TABLE_AIFSN_MIN) || (value > WLAN_QEDCA_TABLE_AIFSN_MAX)) {
2517                 return HI_FAIL;
2518             }
2519             mac_vap->mib_info->ast_wlan_mib_edca[ac].dot11_edca_table_aifsn = value;
2520             break;
2521         case WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT:
2522             if (value > WLAN_QEDCA_TABLE_TXOP_LIMIT_MAX) {
2523                 return HI_FAIL;
2524             }
2525             mac_vap->mib_info->ast_wlan_mib_edca[ac].dot11_edca_table_txop_limit = value;
2526             break;
2527         case WLAN_CFGID_EDCA_TABLE_MSDU_LIFETIME:
2528             if (value > WLAN_QEDCA_TABLE_MSDU_LIFETIME_MAX) {
2529                 return HI_FAIL;
2530             }
2531             mac_vap->mib_info->ast_wlan_mib_edca[ac].dot11_edca_table_msdu_lifetime = value;
2532             break;
2533         case WLAN_CFGID_EDCA_TABLE_MANDATORY:
2534             if ((value != HI_TRUE) && (value != HI_FALSE)) {
2535                 return HI_FAIL;
2536             }
2537             mac_vap->mib_info->ast_wlan_mib_edca[ac].dot11_edca_table_mandatory = (hi_u8)value;
2538             break;
2539         case WLAN_CFGID_QEDCA_TABLE_CWMIN:
2540             if ((value > WLAN_QEDCA_TABLE_CWMIN_MAX) || (value < WLAN_QEDCA_TABLE_CWMIN_MIN)) {
2541                 return HI_FAIL;
2542             }
2543             mac_vap->mib_info->wlan_mib_qap_edac[ac].dot11_qapedca_table_c_wmin = value;
2544             syn_flag = HI_TRUE;
2545             break;
2546         case WLAN_CFGID_QEDCA_TABLE_CWMAX:
2547             if ((value > WLAN_QEDCA_TABLE_CWMAX_MAX) || (value < WLAN_QEDCA_TABLE_CWMAX_MIN)) {
2548                 return HI_FAIL;
2549             }
2550             mac_vap->mib_info->wlan_mib_qap_edac[ac].dot11_qapedca_table_c_wmax = value;
2551             syn_flag = HI_TRUE;
2552             break;
2553         case WLAN_CFGID_QEDCA_TABLE_AIFSN:
2554             if ((value < WLAN_QEDCA_TABLE_AIFSN_MIN) || (value > WLAN_QEDCA_TABLE_AIFSN_MAX)) {
2555                 return HI_FAIL;
2556             }
2557             mac_vap->mib_info->wlan_mib_qap_edac[ac].dot11_qapedca_table_aifsn = value;
2558             syn_flag = HI_TRUE;
2559             break;
2560         case WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT:
2561             if (value > WLAN_QEDCA_TABLE_TXOP_LIMIT_MAX) {
2562                 return HI_FAIL;
2563             }
2564             mac_vap->mib_info->wlan_mib_qap_edac[ac].dot11_qapedca_table_txop_limit = value;
2565             syn_flag = HI_TRUE;
2566             break;
2567         case WLAN_CFGID_QEDCA_TABLE_MSDU_LIFETIME:
2568             if (value > WLAN_QEDCA_TABLE_MSDU_LIFETIME_MAX) {
2569                 return HI_FAIL;
2570             }
2571             mac_vap->mib_info->wlan_mib_qap_edac[ac].dot11_qapedca_table_msdu_lifetime = value;
2572             syn_flag = HI_TRUE;
2573             break;
2574         case WLAN_CFGID_QEDCA_TABLE_MANDATORY:
2575             /* offload模式下 才需要同步到dmac */
2576             if ((value != HI_TRUE) && (value != HI_FALSE)) {
2577                 return HI_FAIL;
2578             }
2579             mac_vap->mib_info->wlan_mib_qap_edac[ac].dot11_qapedca_table_mandatory = (hi_u8)value;
2580             break;
2581         default:
2582             return HI_FAIL;
2583     }
2584 
2585     /* **************************************************************************
2586         抛事件到DMAC层, 同步DMAC数据
2587     ************************************************************************** */
2588     if (syn_flag) {
2589         ret = hmac_config_send_event(mac_vap, cfg_id, us_len, puc_param);
2590         if (oal_unlikely(ret != HI_SUCCESS)) {
2591             oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_wmm_params::send_event failed[%d].}", ret);
2592         }
2593     }
2594     return ret;
2595 }
2596 
2597 /* ****************************************************************************
2598  功能描述  : 读取EDCA参数
2599  输入参数  : event_hdr: 事件头
2600  输出参数  : pus_len      : 参数长度
2601              puc_param    : 参数
2602  修改历史      :
2603   1.日    期   : 2013年1月15日
2604     作    者   : HiSilicon
2605     修改内容   : 新生成函数
2606 **************************************************************************** */
hmac_config_get_wmm_params(mac_vap_stru * mac_vap,hi_u16 * us_len,hi_u8 * puc_param)2607 hi_u32 hmac_config_get_wmm_params(mac_vap_stru *mac_vap, hi_u16 *us_len, hi_u8 *puc_param)
2608 {
2609     hmac_config_wmm_para_stru *cfg_stru = (hmac_config_wmm_para_stru *)puc_param;
2610     hi_u32                     value    = 0xFFFFFFFF;
2611 
2612     *us_len = sizeof(hmac_config_wmm_para_stru);
2613 
2614     if (cfg_stru->ac >= WLAN_WME_AC_BUTT) {
2615         oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG,
2616             "{hmac_config_get_wmm_params::cfg_id=%d,ac=%d}", cfg_stru->cfg_id, cfg_stru->ac);
2617         return HI_FALSE;
2618     }
2619 
2620     /* 根据sub-ioctl id填写WID */
2621     if (cfg_stru->cfg_id == WLAN_CFGID_EDCA_TABLE_CWMIN) {
2622         value = mac_vap->mib_info->ast_wlan_mib_edca[cfg_stru->ac].dot11_edca_table_c_wmin;
2623     } else if (cfg_stru->cfg_id == WLAN_CFGID_EDCA_TABLE_CWMAX) {
2624         value = mac_vap->mib_info->ast_wlan_mib_edca[cfg_stru->ac].dot11_edca_table_c_wmax;
2625     } else if (cfg_stru->cfg_id == WLAN_CFGID_EDCA_TABLE_AIFSN) {
2626         value = mac_vap->mib_info->ast_wlan_mib_edca[cfg_stru->ac].dot11_edca_table_aifsn;
2627     } else if (cfg_stru->cfg_id == WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT) {
2628         value = mac_vap->mib_info->ast_wlan_mib_edca[cfg_stru->ac].dot11_edca_table_txop_limit;
2629     } else if (cfg_stru->cfg_id == WLAN_CFGID_EDCA_TABLE_MSDU_LIFETIME) {
2630         value = mac_vap->mib_info->ast_wlan_mib_edca[cfg_stru->ac].dot11_edca_table_msdu_lifetime;
2631     } else if (cfg_stru->cfg_id == WLAN_CFGID_EDCA_TABLE_MANDATORY) {
2632         value = mac_vap->mib_info->ast_wlan_mib_edca[cfg_stru->ac].dot11_edca_table_mandatory;
2633     } else if (cfg_stru->cfg_id == WLAN_CFGID_QEDCA_TABLE_CWMIN) {
2634         value = mac_vap->mib_info->wlan_mib_qap_edac[cfg_stru->ac].dot11_qapedca_table_c_wmin;
2635     } else if (cfg_stru->cfg_id == WLAN_CFGID_QEDCA_TABLE_CWMAX) {
2636         value = mac_vap->mib_info->wlan_mib_qap_edac[cfg_stru->ac].dot11_qapedca_table_c_wmax;
2637     } else if (cfg_stru->cfg_id == WLAN_CFGID_QEDCA_TABLE_AIFSN) {
2638         value = mac_vap->mib_info->wlan_mib_qap_edac[cfg_stru->ac].dot11_qapedca_table_aifsn;
2639     } else if (cfg_stru->cfg_id == WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT) {
2640         value = mac_vap->mib_info->wlan_mib_qap_edac[cfg_stru->ac].dot11_qapedca_table_txop_limit;
2641     } else if (cfg_stru->cfg_id == WLAN_CFGID_QEDCA_TABLE_MSDU_LIFETIME) {
2642         value = mac_vap->mib_info->wlan_mib_qap_edac[cfg_stru->ac].dot11_qapedca_table_msdu_lifetime;
2643     } else if (cfg_stru->cfg_id == WLAN_CFGID_QEDCA_TABLE_MANDATORY) {
2644         value = mac_vap->mib_info->wlan_mib_qap_edac[cfg_stru->ac].dot11_qapedca_table_mandatory;
2645     }
2646 
2647     cfg_stru->value = value;
2648     return HI_SUCCESS;
2649 }
2650 #endif
2651 
2652 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
hmac_config_set_reset_state(mac_vap_stru * mac_vap,hi_u16 us_len,hi_u8 * puc_param)2653 hi_u32 hmac_config_set_reset_state(mac_vap_stru *mac_vap, hi_u16 us_len, hi_u8 *puc_param)
2654 {
2655     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
2656         oam_error_log2(0, OAM_SF_ANY, "{hmac_config_set_reset_state::pst_mac_vap[%p] NULL or pst_puc_param[%p] NULL!}",
2657             (uintptr_t)mac_vap, (uintptr_t)puc_param);
2658         return HI_ERR_CODE_PTR_NULL;
2659     }
2660     hi_unref_param(mac_vap);
2661     hi_unref_param(us_len);
2662     hi_u32 ret = HI_SUCCESS;
2663     mac_reset_sys_stru *reset_sys = HI_NULL;
2664     mac_device_stru *mac_dev = HI_NULL;
2665 
2666     reset_sys = (mac_reset_sys_stru *)puc_param;
2667     mac_dev = mac_res_get_dev();
2668     mac_dev->reset_in_progress = reset_sys->value;
2669     return ret;
2670 }
2671 #endif
2672 
2673 /* ****************************************************************************
2674  功能描述  : 设置Channnel时,协议 频段 带宽参数检查
2675  输入参数  : pst_mac_device: device结构体
2676              pst_prot_param: pst_prot_param配置命令下发的参数
2677  被调函数  :hmac_config_set_channel
2678  修改历史      :
2679   1.日    期   : 2014年8月15日
2680     作    者   : HiSilicon
2681     修改内容   : 新生成函数
2682 **************************************************************************** */
hmac_config_set_channel_check_param(const mac_device_stru * mac_dev,const mac_cfg_channel_param_stru * prot_param)2683 static hi_u32 hmac_config_set_channel_check_param(const mac_device_stru *mac_dev,
2684     const mac_cfg_channel_param_stru *prot_param)
2685 {
2686     /* 根据device能力对参数进行检查 */
2687     if ((prot_param->en_bandwidth > WLAN_BAND_WIDTH_40MINUS) && (mac_dev->bandwidth_cap < WLAN_BW_CAP_80M)) {
2688         /* 设置80M带宽,但device能力不支持80M,返回错误码 */
2689         oam_warning_log2(0, OAM_SF_CFG,
2690             "{hmac_config_set_channel_check_param::not support 80MHz bandwidth,en_protocol=%d en_protocol_cap=%d.}",
2691             prot_param->en_bandwidth, mac_dev->bandwidth_cap);
2692         return HI_ERR_CODE_CONFIG_EXCEED_SPEC;
2693     }
2694 
2695     if ((WLAN_BAND_2G != prot_param->band) || (WLAN_BAND_CAP_2G != mac_dev->band_cap)) {
2696         oam_warning_log2(0, OAM_SF_CFG,
2697             "{hmac_config_set_channel_check_param::not support 5GHz band,en_protocol=%d en_protocol_cap=%d.}",
2698             prot_param->band, mac_dev->band_cap);
2699         return HI_ERR_CODE_CONFIG_EXCEED_SPEC;
2700     }
2701     return HI_SUCCESS;
2702 }
2703 
hmac_config_vap_set_channel(mac_vap_stru * mac_vap,const mac_cfg_channel_param_stru * channel_param,const mac_device_stru * mac_dev,hi_u8 * set_reg)2704 hi_u32 hmac_config_vap_set_channel(mac_vap_stru *mac_vap, const mac_cfg_channel_param_stru *channel_param,
2705     const mac_device_stru *mac_dev, hi_u8 *set_reg)
2706 {
2707     hi_u32 ret;
2708     hi_u8 vap_idx;
2709 
2710 #ifdef _PRE_WLAN_FEATURE_DBAC
2711     if (mac_dev->dbac_enabled) {
2712         mac_vap->channel.chan_number  = channel_param->channel;
2713         mac_vap->channel.band         = channel_param->band;
2714         mac_vap->channel.en_bandwidth = channel_param->en_bandwidth;
2715         ret = mac_get_channel_idx_from_num(channel_param->band, channel_param->channel, &(mac_vap->channel.idx));
2716         if (ret != HI_SUCCESS) {
2717             oam_warning_log3(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_channel:get chl Err=%d,band=%d,channel=%d}",
2718                 ret, channel_param->band, channel_param->channel);
2719             return HI_FAIL;
2720         }
2721 
2722         /* 根据带宽信息更新Mib */
2723         mac_vap_change_mib_by_bandwidth(mac_vap, channel_param->en_bandwidth);
2724 
2725         *set_reg = HI_TRUE;
2726     } else {
2727 #endif /* _PRE_WLAN_FEATURE_DBAC */
2728         for (vap_idx = 0; vap_idx < mac_dev->vap_num; vap_idx++) {
2729             mac_vap_stru *mac_vap_tmp = mac_vap_get_vap_stru(mac_dev->auc_vap_id[vap_idx]);
2730             if (mac_vap_tmp == HI_NULL) {
2731                 continue;
2732             }
2733             mac_vap_tmp->channel.chan_number  = channel_param->channel;
2734             mac_vap_tmp->channel.band         = channel_param->band;
2735             mac_vap_tmp->channel.en_bandwidth = channel_param->en_bandwidth;
2736 
2737             ret = mac_get_channel_idx_from_num(channel_param->band, channel_param->channel,
2738                                                &(mac_vap_tmp->channel.idx));
2739             if (ret != HI_SUCCESS) {
2740                 oam_warning_log3(mac_vap_tmp->vap_id, OAM_SF_CFG, "{hmac_config_set_channel:Err=%d,band=%d,channel=%d}",
2741                     ret, channel_param->band, channel_param->channel);
2742                 continue;
2743             }
2744 
2745             /* 根据带宽信息更新Mib */
2746             mac_vap_change_mib_by_bandwidth(mac_vap_tmp, channel_param->en_bandwidth);
2747         }
2748 #ifdef _PRE_WLAN_FEATURE_DBAC
2749     }
2750 #endif
2751 
2752     return HI_SUCCESS;
2753 }
2754 
2755 /* ****************************************************************************
2756  功能描述  : HMAC 层设置信道信息
2757  输入参数  : [1]mac_vap
2758              [2]us_len
2759              [3]puc_param
2760  输出参数  : 无
2761  返 回 值  : hi_u32
2762 **************************************************************************** */
hmac_config_set_channel(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2763 hi_u32 hmac_config_set_channel(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2764 {
2765     hi_u8 set_reg = HI_FALSE;
2766     mac_cfg_channel_param_stru *channel_param = (mac_cfg_channel_param_stru *)puc_param;
2767     mac_device_stru            *mac_dev       = mac_res_get_dev();
2768 
2769     /* 检查配置参数是否在device能力内 */
2770     hi_u32 ret = hmac_config_set_channel_check_param(mac_dev, channel_param);
2771     if (ret != HI_SUCCESS) {
2772         return ret;
2773     }
2774 
2775     /* 仅在没有VAP up的情况下,配置硬件频带、带宽寄存器 */
2776     hi_u32 up_vap_cnt = hmac_calc_up_vap_num(mac_dev);
2777     if (up_vap_cnt <= 1) {
2778         /* 记录首次配置的带宽值 */
2779         mac_device_set_channel(mac_dev, channel_param);
2780 
2781         /* **************************************************************************
2782          抛事件到DMAC层, 配置寄存器  置标志位
2783         ************************************************************************** */
2784         set_reg = HI_TRUE;
2785 #ifdef _PRE_WLAN_FEATURE_DBAC
2786     } else if (mac_dev->dbac_enabled) {
2787         /* 开启DBAC不进行信道判断 */
2788         /* 信道设置只针对AP模式,非AP模式则跳出 */
2789 #endif /* _PRE_WLAN_FEATURE_DBAC */
2790     } else {
2791         /* 信道不是当前信道 */
2792         if (mac_dev->max_channel != channel_param->channel) {
2793             oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_channel::previous channel=%d mismatch[%d]}",
2794                 mac_dev->max_channel, channel_param->channel);
2795 
2796             return HI_FAIL;
2797         }
2798 
2799         /* 带宽不能超出已配置的带宽 */
2800         ret = hmac_config_set_mode_check_bandwith(mac_dev->max_bandwidth, channel_param->en_bandwidth);
2801         if (ret != HI_SUCCESS) {
2802             oam_warning_log3(mac_vap->vap_id, OAM_SF_CFG,
2803                 "{hmac_config_set_channel:hmac_config_set_mode_check_bandwith Err=%d,previous bandwidth=%d,current=%d}",
2804                 ret, mac_dev->max_bandwidth, channel_param->en_bandwidth);
2805             return HI_FAIL;
2806         }
2807     }
2808 
2809     ret = hmac_config_vap_set_channel(mac_vap, channel_param, mac_dev, &set_reg);
2810     if (ret != HI_SUCCESS) {
2811         return ret;
2812     }
2813 
2814     /* **************************************************************************
2815      抛事件到DMAC层, 同步DMAC数据
2816     ************************************************************************** */
2817     if (set_reg == HI_TRUE) {
2818         ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CFG80211_SET_CHANNEL, us_len, puc_param);
2819         if (oal_unlikely(ret != HI_SUCCESS)) {
2820             oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_channel::send_event failed[%d]}", ret);
2821             return ret;
2822         }
2823     }
2824 
2825     return HI_SUCCESS;
2826 }
2827 
2828 /* ****************************************************************************
2829  功能描述  : 设置mode时,协议 频段 带宽参数检查
2830  输入参数  : pst_mac_device: device结构体
2831              pst_prot_param: pst_prot_param配置命令下发的参数
2832  修改历史      :
2833   1.日    期   : 2015年6月24日
2834     作    者   : HiSilicon
2835     修改内容   : 新生成函数
2836 **************************************************************************** */
hmac_config_set_beacon_check_param(const mac_device_stru * mac_dev,const mac_beacon_param_stru * prot_param)2837 static hi_u32 hmac_config_set_beacon_check_param(const mac_device_stru *mac_dev,
2838     const mac_beacon_param_stru *prot_param)
2839 {
2840     /* 根据device能力对参数进行检查 */
2841     return hmac_config_device_check_param(mac_dev, prot_param->protocol);
2842 }
2843 
2844 /* ****************************************************************************
2845  功能描述  : HMAC 层设置AP 信息
2846  输入参数  : [1]mac_vap
2847              [2]us_len
2848              [3]puc_param
2849  输出参数  : 无
2850  返 回 值  : hi_u32
2851 **************************************************************************** */
hmac_config_set_beacon(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2852 hi_u32 hmac_config_set_beacon(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2853 {
2854     /* 获取device */
2855     mac_device_stru *mac_dev = mac_res_get_dev();
2856     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
2857     if (puc_param == HI_NULL || hmac_vap == HI_NULL) {
2858         oam_error_log2(mac_vap->vap_id, OAM_SF_CFG,
2859             "{hmac_config_set_beacon::puc_param/hmac_vap null! puc_param=%p, hmac_vap=%p.}", (uintptr_t)puc_param,
2860             (uintptr_t)hmac_vap);
2861         return HI_ERR_CODE_PTR_NULL;
2862     }
2863 
2864     mac_beacon_param_stru *beacon_param = (mac_beacon_param_stru *)puc_param;
2865 
2866     /* 检查协议配置参数是否在device能力内 */
2867     hi_u32 ret = hmac_config_set_beacon_check_param(mac_dev, beacon_param);
2868     if (ret != HI_SUCCESS) {
2869         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
2870             "{hmac_config_set_beacon::hmac_config_add_beacon_check_param failed[%d].}", ret);
2871         return ret;
2872     }
2873     hmac_vap->tx_aggr_on = (beacon_param->protocol >= WLAN_HT_MODE) ? HI_TRUE : HI_FALSE;
2874 
2875     /* 设置协议模式 */
2876     if ((beacon_param->privacy == HI_TRUE) && (beacon_param->crypto_mode & (WLAN_WPA_BIT | WLAN_WPA2_BIT))) {
2877         hmac_vap->auth_mode = WLAN_WITP_AUTH_OPEN_SYSTEM; /* 强制设置VAP 认证方式为OPEN */
2878     }
2879     mac_vap_set_hide_ssid(mac_vap, beacon_param->hidden_ssid);
2880 
2881     /* 1102适配新内核start ap和change beacon接口复用此接口,不同的是change beacon时,不再设置beacon周期
2882        和dtim周期,因此,change beacon时,interval和dtim period参数为全零,此时不应该被设置到mib中 */
2883     /* 设置VAP beacon interval, dtim_period */
2884     if ((beacon_param->l_dtim_period != 0) || (beacon_param->l_interval != 0)) {
2885         mac_vap->mib_info->wlan_mib_sta_config.dot11_dtim_period = (hi_u32)beacon_param->l_dtim_period;
2886         mac_vap->mib_info->wlan_mib_sta_config.dot11_beacon_period = (hi_u32)beacon_param->l_interval;
2887     }
2888 
2889     /* 设置short gi */
2890     mac_vap->mib_info->phy_ht.dot11_short_gi_option_in_twenty_implemented = beacon_param->shortgi_20;
2891     mac_mib_set_shortgi_option_in_forty_implemented(mac_vap, beacon_param->shortgi_40);
2892 
2893     if (beacon_param->operation_type == MAC_ADD_BEACON) {
2894         mac_vap_add_beacon(mac_vap, beacon_param);
2895     } else {
2896         mac_vap_set_beacon(mac_vap, beacon_param);
2897     }
2898 
2899     mac_vap_init_by_protocol(mac_vap, beacon_param->protocol);
2900 
2901     mac_vap_init_rates(mac_vap);
2902 
2903 #ifdef _PRE_WLAN_FEATURE_MESH
2904     if (mac_vap->vap_mode == WLAN_VAP_MODE_MESH) {
2905         mac_vap_set_mib_mesh(mac_vap, beacon_param->mesh_auth_protocol);
2906     }
2907 #endif
2908 
2909     /* **************************************************************************
2910      抛事件到DMAC层, 同步DMAC数据
2911     ************************************************************************** */
2912     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CFG80211_CONFIG_BEACON, us_len, puc_param);
2913     if (oal_unlikely(ret != HI_SUCCESS)) {
2914         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_beacon::hmac_config_send_event fail[%d]}", ret);
2915     }
2916 
2917     return ret;
2918 }
2919 
2920 #ifdef _PRE_WLAN_FEATURE_BTCOEX
hmac_config_set_btcoex_en(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2921 hi_u32 hmac_config_set_btcoex_en(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2922 {
2923     hi_u32           ret;
2924     mac_device_stru *mac_dev = HI_NULL;
2925 
2926     /* BT共存不支持多VAP和AP模式 */
2927     mac_dev = mac_res_get_dev();
2928     if ((hmac_calc_up_vap_num(mac_dev) > 1) || hmac_find_is_ap_up(mac_dev)) {
2929         hi_diag_log_msg_w0(0, "hmac_config_set_btcoex_en:: there is a up ap, don't support btcoex.");
2930         return HI_FAIL;
2931     }
2932     /* **************************************************************************
2933         抛事件到DMAC层, 同步DMAC数据
2934     ************************************************************************** */
2935     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_BTCOEX_ENABLE, us_len, puc_param);
2936     if (oal_unlikely(ret != HI_SUCCESS)) {
2937         hi_diag_log_msg_w1(0, "{hmac_config_set_btcoex_en::send event return err code [%d].}", ret);
2938     }
2939 
2940     return ret;
2941 }
2942 #endif
2943 
2944 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
2945 #ifdef _PRE_WLAN_FEATURE_HIPRIV
2946 /* ****************************************************************************
2947  函 数 名  : hmac_config_report_vap_info
2948  功能描述  : 根据flags位上报对应的vap信息
2949  输入参数  : [1]mac_vap
2950              [2]us_len
2951              [3]puc_param
2952  输出参数  : 无
2953  返 回 值  : hi_u32
2954 **************************************************************************** */
hmac_config_report_vap_info(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2955 hi_u32 hmac_config_report_vap_info(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2956 {
2957     hi_u32 ret;
2958 
2959     /* **************************************************************************
2960         抛事件到DMAC层, 同步DMAC数据
2961     ************************************************************************** */
2962     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_REPORT_VAP_INFO, us_len, puc_param);
2963     if (oal_unlikely(ret != HI_SUCCESS)) {
2964         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_report_vap_info::hmac_config_send_event fail[%d].", ret);
2965         return ret;
2966     }
2967 
2968     return HI_SUCCESS;
2969 }
2970 #endif
2971 #endif
2972 
2973 #ifdef _PRE_WLAN_FEATURE_REKEY_OFFLOAD
2974 /* ****************************************************************************
2975  功能描述  : rekey offload信息下发,抛事件到DMAC
2976  输入参数  : mac_vap_stru *pst_mac_vap, hi_u16 us_len, hi_u8 *puc_param
2977  输出参数  : hi_u32
2978  返 回 值  : 0:成功,其他:失败
2979  修改历史      :
2980   1.日    期   : 2016年8月11日
2981     作    者   : HiSilicon
2982     修改内容   : 新生成函数
2983 **************************************************************************** */
hmac_config_set_rekey_info(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)2984 hi_u32 hmac_config_set_rekey_info(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
2985 {
2986     hi_u32 ret;
2987     /* **************************************************************************
2988     抛事件到DMAC层, 同步DMAC数据
2989     ************************************************************************** */
2990     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_REKEY, us_len, puc_param);
2991     if (oal_unlikely(ret != HI_SUCCESS)) {
2992         oam_warning_log1(mac_vap->vap_id, OAM_SF_WPA,
2993             "{hmac_config_set_rekey_info::hmac_config_send_event failed[%d].}", ret);
2994     }
2995     return ret;
2996 }
2997 #endif
2998 
2999 #ifdef _PRE_WLAN_RF_110X_CALI_DPD
3000 #ifdef _PRE_WLAN_FEATURE_HIPRIV
hmac_config_start_dpd(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3001 hi_u32 hmac_config_start_dpd(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3002 {
3003     hi_u32 ret;
3004 
3005     /* **************************************************************************
3006        抛事件到DMAC层, 同步DMAC数据
3007      ************************************************************************** */
3008     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_START_DPD, us_len, puc_param);
3009     if (oal_unlikely(ret != HI_SUCCESS)) {
3010         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_start_dpd::hmac_config_send_event fail[%d].", ret);
3011     }
3012 
3013     return ret;
3014 }
3015 #endif
3016 
hmac_dpd_data_processed_send(mac_vap_stru * mac_vap,hi_void * param)3017 hi_u32 hmac_dpd_data_processed_send(mac_vap_stru *mac_vap, hi_void *param)
3018 {
3019     if (oal_unlikely((mac_vap == HI_NULL) || (param == HI_NULL))) {
3020         oam_error_log2(0, OAM_SF_CALIBRATE, "{hmac_dpd_data_processed_send::param null, %p %p.}", mac_vap, param);
3021         return HI_ERR_CODE_PTR_NULL;
3022     }
3023 
3024     frw_event_mem_stru *event_mem = frw_event_alloc(sizeof(dmac_tx_event_stru));
3025     if (event_mem == HI_NULL) {
3026         oam_error_log0(mac_vap->vap_id, OAM_SF_CALIBRATE, "{hmac_scan_proc_scan_req_event::event_mem null.}");
3027         return HI_ERR_CODE_PTR_NULL;
3028     }
3029 
3030     oal_netbuf_stru *netbuf_dpd_data = oal_netbuf_alloc(WLAN_LARGE_NETBUF_SIZE, 0, 4); /* align 4 */
3031     if (netbuf_dpd_data == HI_NULL) {
3032         frw_event_free(event_mem);
3033         oam_error_log0(0, OAM_SF_CALIBRATE, "{hmac_dpd_data_processed_send::pst_netbuf_scan_result null.}");
3034         return HI_ERR_CODE_ALLOC_MEM_FAIL;
3035     }
3036 
3037     frw_event_stru *event = (frw_event_stru *)event_mem->puc_data;
3038     frw_event_hdr_init(&(event->event_hdr), FRW_EVENT_TYPE_WLAN_CTX, DMAC_WLAN_CTX_EVENT_SUB_TYPE_DPD_DATA_PROCESSED,
3039         sizeof(dmac_tx_event_stru), FRW_EVENT_PIPELINE_STAGE_1, mac_vap->vap_id);
3040 
3041     if (memset_s(oal_netbuf_cb(netbuf_dpd_data), OAL_TX_CB_LEN, 0, OAL_TX_CB_LEN) != EOK) {
3042         oal_netbuf_free(netbuf_dpd_data);
3043         frw_event_free(event_mem);
3044         return HI_FALSE;
3045     }
3046 
3047     hmac_tx_ctl_stru *tx_ctl = (hmac_tx_ctl_stru *)oal_netbuf_cb(netbuf_dpd_data);
3048     tx_ctl->frame_header_length = 0;
3049     tx_ctl->mac_head_type = 1;
3050     tx_ctl->frame_header = HI_NULL;
3051 
3052     dpd_cali_data_stru *dpd_cali_data = (dpd_cali_data_stru *)(oal_netbuf_data(netbuf_dpd_data));
3053     if (memcpy_s(dpd_cali_data, sizeof(dpd_cali_data_stru), param, sizeof(dpd_cali_data_stru)) != EOK) {
3054         oal_netbuf_free(netbuf_dpd_data);
3055         frw_event_free(event_mem);
3056         oam_error_log0(0, OAM_SF_CFG, "hmac_dpd_data_processed_send::p_param memcpy_s fail.");
3057         return HI_FALSE;
3058     }
3059 
3060     dmac_tx_event_stru *dpd_event = (dmac_tx_event_stru *)event->auc_event_data;
3061     dpd_event->netbuf = netbuf_dpd_data;
3062     dpd_event->us_frame_len = sizeof(dpd_cali_data_stru);
3063     netbuf_dpd_data->data_len = sizeof(dpd_cali_data_stru);
3064 
3065     hi_u32 ret = hcc_hmac_tx_data_event(event_mem, netbuf_dpd_data, HI_FALSE);
3066     if (ret != HI_SUCCESS) {
3067         oal_netbuf_free(netbuf_dpd_data);
3068         oam_error_log1(mac_vap->vap_id, OAM_SF_BA, "{hmac_mgmt_tx_delba::frw_event_dispatch_event failed[%d].}", ret);
3069         frw_event_free(event_mem);
3070         return ret;
3071     }
3072 
3073     frw_event_free(event_mem);
3074     return HI_SUCCESS;
3075 }
3076 
hmac_dpd_cali_data_recv(const frw_event_mem_stru * event_mem)3077 hi_u32 hmac_dpd_cali_data_recv(const frw_event_mem_stru *event_mem)
3078 {
3079     frw_event_stru *event = HI_NULL;
3080     oal_netbuf_stru *dpd_data_netbuf = HI_NULL;
3081     dpd_cali_data_stru *dpd_cali_data_read = HI_NULL;
3082     dpd_cali_data_stru dpd_cali_data_calc;
3083     mac_vap_stru *mac_vap = HI_NULL;
3084     dmac_tx_event_stru *dtx_event = HI_NULL;
3085     hi_u32 ret;
3086 
3087     if (oal_unlikely(event_mem == HI_NULL)) {
3088         oam_error_log0(0, OAM_SF_CALIBRATE, "{hmac_dpd_cali_data_recv::event_mem null.}");
3089         return HI_ERR_CODE_PTR_NULL;
3090     }
3091 
3092     event = (frw_event_stru *)event_mem->puc_data;
3093     dtx_event = (dmac_tx_event_stru *)event->auc_event_data;
3094     dpd_data_netbuf = dtx_event->netbuf;
3095 
3096     mac_vap = mac_vap_get_vap_stru(event->event_hdr.vap_id);
3097 
3098     dpd_cali_data_read = (dpd_cali_data_stru *)oal_netbuf_data(dpd_data_netbuf);
3099 
3100     oam_warning_log0(0, OAM_SF_CALIBRATE, "{hmac_dpd_cali_data_recv DPD cali data}\r\n");
3101 
3102     oal_print_hex_dump((hi_u8 *)dpd_cali_data_read->us_dpd_data, DPD_CALI_LUT_LENGTH, 32, "  "); /* size为32 */
3103 
3104     /* dpd_cali_data_calc.us_dpd_data是函数入参,未初始化dpd_cali_data_calc -g- lin_t !e603 */
3105     if (HI_SUCCESS != hmac_rf_cali_dpd_corr_calc(dpd_cali_data_read->us_dpd_data, dpd_cali_data_calc.us_dpd_data)) {
3106         dpd_cali_data_calc.us_data_len = 0;
3107     } else {
3108         dpd_cali_data_calc.us_data_len = DPD_CALI_LUT_LENGTH;
3109     }
3110 
3111     ret = hmac_dpd_data_processed_send(mac_vap, &dpd_cali_data_calc);
3112     if (ret != HI_SUCCESS) {
3113         oam_warning_log0(0, OAM_SF_CALIBRATE, "hmac_dpd_data_processed_send return NON SUCCESS. ");
3114     }
3115 
3116     oal_netbuf_free(dpd_data_netbuf);
3117 
3118     return HI_SUCCESS;
3119 }
3120 
3121 #endif
3122 
3123 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3124 /* ****************************************************************************
3125  功能描述  : 设置随机mac addr扫描开关, 0关闭,1打开
3126  修改历史      :
3127   1.日    期   : 2015年5月18日
3128     作    者   : HiSilicon
3129     修改内容   : 新生成函数
3130 **************************************************************************** */
hmac_config_set_random_mac_addr_scan(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3131 hi_u32 hmac_config_set_random_mac_addr_scan(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3132 {
3133     hmac_device_stru *hmac_dev = HI_NULL;
3134     hi_u8 random_mac_addr_scan_switch;
3135 
3136     hi_unref_param(mac_vap);
3137     hi_unref_param(us_len);
3138 
3139     random_mac_addr_scan_switch = *((hi_u8 *)puc_param);
3140 
3141     /* 获取hmac device结构体 */
3142     hmac_dev = hmac_get_device_stru();
3143     hmac_dev->scan_mgmt.is_random_mac_addr_scan = random_mac_addr_scan_switch;
3144     oam_info_log1(0, OAM_SF_SCAN, "{set set_random_mac_addr_scan SUCC[%d]!}",
3145         hmac_dev->scan_mgmt.is_random_mac_addr_scan);
3146     return HI_SUCCESS;
3147 }
3148 #endif
3149 
3150 #ifdef _PRE_WLAN_FEATURE_REKEY_OFFLOAD
3151 /* ****************************************************************************
3152  功能描述  : 设置rekey offload开关
3153  返 回 值  : 错误码
3154  修改历史      :
3155   1.日    期   : 2019年10月17日
3156     作    者   : HiSilicon
3157     修改内容   : 新生成函数
3158 **************************************************************************** */
hmac_config_rekey_offload_set_switch(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3159 hi_u32 hmac_config_rekey_offload_set_switch(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3160 {
3161     hi_u32 ret;
3162 
3163     /* **************************************************************************
3164         抛事件到DMAC层, 同步DMAC数据
3165     ************************************************************************** */
3166     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_REKEY_OFFLOAD_SET_SWITCH, us_len, puc_param);
3167     if (oal_unlikely(ret != HI_SUCCESS)) {
3168         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
3169             "{hmac_config_rekey_offload_set_switch::hmac_config_send_event failed[%d].}", ret);
3170     }
3171 
3172     return ret;
3173 }
3174 #endif
3175 
hmac_config_kick_user_disassoc(mac_vap_stru * mac_vap,const mac_cfg_kick_user_param_stru * kick_user_param,hmac_vap_stru * hmac_vap,hmac_user_stru * hmac_user)3176 hi_void hmac_config_kick_user_disassoc(mac_vap_stru *mac_vap, const mac_cfg_kick_user_param_stru *kick_user_param,
3177     hmac_vap_stru *hmac_vap, hmac_user_stru *hmac_user)
3178 {
3179 #if defined(_PRE_WLAN_FEATURE_ARP_OFFLOAD) || defined(_PRE_WLAN_FEATURE_DHCP_OFFLOAD)
3180     mac_ip_addr_config_stru ip_addr_cfg = {
3181         .type = MAC_CONFIG_IPV4,
3182         .oper = MAC_IP_ADDR_DEL
3183     };
3184 #endif
3185 
3186     /* 发去认证帧 */
3187     hmac_mgmt_send_disassoc_frame(mac_vap, hmac_user->base_user->user_mac_addr, kick_user_param->us_reason_code,
3188         (hi_u8)hmac_user->base_user->cap_info.pmf_active);
3189 
3190     /* 修改 state & 删除 user */
3191     hmac_handle_disconnect_rsp(hmac_vap, hmac_user, HMAC_REPORT_DISASSOC);
3192     /* 删除用户 */
3193     hmac_user_del(mac_vap, hmac_user);
3194 
3195     /* 关闭arp offload功能 */
3196 #ifdef _PRE_WLAN_FEATURE_ARP_OFFLOAD
3197     hmac_config_arp_offload_setting(mac_vap, sizeof(mac_ip_addr_config_stru), (const hi_u8 *)&ip_addr_cfg);
3198 #endif
3199     /* 关闭dhcp offload功能 */
3200 #ifdef _PRE_WLAN_FEATURE_DHCP_OFFLOAD
3201     hmac_config_dhcp_offload_setting(mac_vap, sizeof(mac_ip_addr_config_stru), (const hi_u8 *)&ip_addr_cfg);
3202 #endif
3203     /* 关闭rekey offload功能 */
3204 #ifdef _PRE_WLAN_FEATURE_REKEY_OFFLOAD
3205     hi_u8 rekey_offload = HI_FALSE;
3206     hmac_config_rekey_offload_set_switch(mac_vap, sizeof(hi_u8), (const hi_u8 *)&rekey_offload);
3207 #endif
3208 }
3209 
hmac_config_kick_user_vap(mac_vap_stru * mac_vap,const mac_cfg_kick_user_param_stru * kick_user_param,hmac_vap_stru * hmac_vap)3210 static hi_u32 hmac_config_kick_user_vap(mac_vap_stru *mac_vap, const mac_cfg_kick_user_param_stru *kick_user_param,
3211     hmac_vap_stru *hmac_vap)
3212 {
3213     hi_u8 uidx = 0;
3214 
3215     if (mac_vap_find_user_by_macaddr(mac_vap, kick_user_param->auc_mac_addr, WLAN_MAC_ADDR_LEN, &uidx) != HI_SUCCESS) {
3216         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_kick_user::mac_vap_find_user_by_macaddr}");
3217         if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
3218             hmac_fsm_change_state(hmac_vap, MAC_VAP_STATE_STA_FAKE_UP);
3219         }
3220         return HI_FAIL;
3221     }
3222 
3223     hmac_user_stru *hmac_user = (hmac_user_stru *)hmac_user_get_user_stru(uidx);
3224     if ((hmac_user == HI_NULL) || (hmac_user->base_user == HI_NULL)) {
3225         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_kick_user::hmac_user null,user_idx:%d}", uidx);
3226         if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) {
3227             hmac_fsm_change_state(hmac_vap, MAC_VAP_STATE_STA_FAKE_UP);
3228         }
3229         return HI_ERR_CODE_PTR_NULL;
3230     }
3231 
3232     if (hmac_user->base_user->user_asoc_state != MAC_USER_STATE_ASSOC) {
3233         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_kick_user:user unassociate,user_idx:%d}", uidx);
3234     }
3235 #ifdef _PRE_WLAN_FEATURE_MESH
3236     if (hmac_user->base_user->is_mesh_user == HI_TRUE) {
3237         /* 如果是由wpa发起的删除用户,则直接将用户删掉即可 */
3238         if (kick_user_param->us_reason_code == MAC_WPA_KICK_MESH_USER) {
3239             /* 删除用户 */
3240             hmac_user_del(mac_vap, hmac_user);
3241             oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_kick_user::the mesh user is del}");
3242             return HI_SUCCESS;
3243         }
3244         hmac_handle_close_peer_mesh(hmac_vap, hmac_user->base_user->user_mac_addr, WLAN_MAC_ADDR_LEN,
3245             HMAC_REPORT_DISASSOC, DMAC_DISASOC_MISC_KICKUSER);
3246 
3247         return HI_SUCCESS;
3248     }
3249 #endif
3250 
3251     hmac_config_kick_user_disassoc(mac_vap, kick_user_param, hmac_vap, hmac_user);
3252 
3253     return HI_SUCCESS;
3254 }
3255 
3256 /* ****************************************************************************
3257  功能描述  : 配置命令去关联1个用户
3258  修改历史      :
3259   1.日    期   : 2013年8月27日
3260     作    者   : HiSilicon
3261     修改内容   : 新生成函数
3262   2.日    期   : 2014年5月29日
3263     作    者   : HiSilicon
3264     修改内容   : 增加踢掉全部user的功能
3265 **************************************************************************** */
hmac_config_kick_user(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3266 hi_u32 hmac_config_kick_user(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3267 {
3268     mac_user_stru                *user_tmp = HI_NULL;
3269     hmac_user_stru               *hmac_user_tmp = HI_NULL;
3270     hi_list                      *entry = HI_NULL;
3271 
3272     hi_unref_param(us_len);
3273 
3274     if (oal_unlikely(mac_vap == HI_NULL || puc_param == HI_NULL)) {
3275         oam_error_log2(0, OAM_SF_CFG, "{hmac_config_kick_user:vap=%p pa=%p}", (uintptr_t)mac_vap, (uintptr_t)puc_param);
3276         return HI_ERR_CODE_PTR_NULL;
3277     }
3278 
3279     if (mac_vap->vap_mode == WLAN_VAP_MODE_CONFIG) {
3280         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_kick_user::en_vap_mode is WLAN_VAP_MODE_CONFIG.}");
3281         return HI_ERR_CODE_INVALID_CONFIG;
3282     }
3283 
3284     mac_cfg_kick_user_param_stru *kick_user_param = (mac_cfg_kick_user_param_stru *)puc_param;
3285     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
3286     if (oal_unlikely(hmac_vap == HI_NULL)) {
3287         oam_error_log1(0, OAM_SF_CFG, "{hmac_config_kick_user::null param,pst_hmac_vap[%d].}", mac_vap->vap_id);
3288         return HI_ERR_CODE_PTR_NULL;
3289     }
3290 
3291     oam_warning_log4(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_kick_user: user mac[XX:XX:XX:%02X:%02X:%02X]code %d}",
3292         kick_user_param->auc_mac_addr[3], kick_user_param->auc_mac_addr[4], /* 3 4 元素索引 */
3293         kick_user_param->auc_mac_addr[5], kick_user_param->us_reason_code); /* 5 元素索引 */
3294 
3295     /* 踢掉全部user (mesh不支持) */
3296     if (oal_is_broadcast_ether_addr(kick_user_param->auc_mac_addr)
3297 #ifdef _PRE_WLAN_FEATURE_MESH
3298         && (mac_vap->vap_mode != WLAN_VAP_MODE_MESH)
3299 #endif
3300     ) {
3301         hmac_mgmt_send_disassoc_frame(mac_vap, kick_user_param->auc_mac_addr,
3302                                       kick_user_param->us_reason_code, HI_FALSE);
3303 
3304         /* 遍历vap下所有用户, 删除用户 */
3305         hi_list *user_list_head = &(mac_vap->mac_user_list_head);
3306         for (entry = user_list_head->next; entry != user_list_head;) {
3307             user_tmp = hi_list_entry(entry, mac_user_stru, user_dlist);
3308             hmac_user_tmp = (hmac_user_stru *)hmac_user_get_user_stru((hi_u8)user_tmp->us_assoc_id);
3309             if (oal_unlikely(hmac_user_tmp == HI_NULL)) {
3310                 oam_error_log1(0, OAM_SF_CFG, "{hmac_config_kick_user::null param,user_tmp %d}", user_tmp->us_assoc_id);
3311                 continue;
3312             }
3313 
3314             /* 指向双向链表下一个 */
3315             entry = entry->next;
3316 
3317             /* 修改 state & 删除 user */
3318             hmac_handle_disconnect_rsp(hmac_vap, hmac_user_tmp, HMAC_REPORT_DISASSOC);
3319 
3320             /* 删除用户 */
3321             hmac_user_del(mac_vap, hmac_user_tmp);
3322         }
3323 
3324         /* VAP下user头指针不应该为空 */
3325         if (hi_is_list_empty_optimize(&mac_vap->mac_user_list_head) == HI_FALSE) {
3326             oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_kick_user::st_mac_user_list_head is not empty.}");
3327         }
3328         return HI_SUCCESS;
3329     }
3330 
3331     return hmac_config_kick_user_vap(mac_vap, kick_user_param, hmac_vap);
3332 }
3333 
3334 /* ****************************************************************************
3335  功能描述  : 发送设置non-HT速率命令到dmac
3336  修改历史      :
3337   1.日    期   : 2014年3月12日
3338     作    者   : HiSilicon
3339     修改内容   : 新生成函数
3340 **************************************************************************** */
hmac_config_set_rate(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3341 hi_u32 hmac_config_set_rate(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3342 {
3343     hi_u32 ret;
3344 
3345     /* **************************************************************************
3346         抛事件到DMAC层, 同步DMAC数据
3347     ************************************************************************** */
3348     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_RATE, us_len, puc_param);
3349     if (oal_unlikely(ret != HI_SUCCESS)) {
3350         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
3351                          "{hmac_config_set_rate::hmac_config_send_event failed[%d].}", ret);
3352     }
3353 
3354     return ret;
3355 }
3356 
3357 /* ****************************************************************************
3358  功能描述  : 发送设置HT速率命令到dmac
3359  修改历史      :
3360   1.日    期   : 2014年3月12日
3361     作    者   : HiSilicon
3362     修改内容   : 新生成函数
3363 **************************************************************************** */
hmac_config_set_mcs(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3364 hi_u32 hmac_config_set_mcs(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3365 {
3366     hi_u32 ret;
3367 
3368     /* **************************************************************************
3369         抛事件到DMAC层, 同步DMAC数据
3370     ************************************************************************** */
3371     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_MCS, us_len, puc_param);
3372     if (oal_unlikely(ret != HI_SUCCESS)) {
3373         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
3374                          "{hmac_config_set_mcs::hmac_config_send_event failed[%d].}", ret);
3375     }
3376 
3377     return ret;
3378 }
3379 
3380 /* ****************************************************************************
3381  功能描述  : 发送设置带宽命令到dmac
3382  修改历史      :
3383   1.日    期   : 2014年3月12日
3384     作    者   : HiSilicon
3385     修改内容   : 新生成函数
3386 **************************************************************************** */
hmac_config_set_bw(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3387 hi_u32 hmac_config_set_bw(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3388 {
3389     hi_u32                              ret;
3390     mac_cfg_tx_comp_stru                *event_set_bw = HI_NULL;
3391     wlan_channel_bandwidth_enum_uint8   bandwidth      = WLAN_BAND_ASSEMBLE_20M;
3392     hmac_vap_stru                       *hmac_vap     = HI_NULL;
3393 
3394     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
3395     if (hmac_vap == HI_NULL) {
3396         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_bw::pst_hmac_vap null.}");
3397         return HI_ERR_CODE_PTR_NULL;
3398     }
3399     event_set_bw = (mac_cfg_tx_comp_stru *)puc_param;
3400     if (event_set_bw->param == WLAN_BAND_ASSEMBLE_5M) {
3401         bandwidth = WLAN_BAND_WIDTH_5M;
3402     } else if (event_set_bw->param == WLAN_BAND_ASSEMBLE_10M) {
3403         bandwidth = WLAN_BAND_WIDTH_10M;
3404     } else if (event_set_bw->param == WLAN_BAND_ASSEMBLE_20M) {
3405         bandwidth = WLAN_BAND_WIDTH_20M;
3406     }
3407     hmac_vap->preset_para.en_bandwidth = bandwidth;
3408     mac_vap->channel.en_bandwidth = bandwidth;
3409 
3410     /* **************************************************************************
3411         抛事件到DMAC层, 同步DMAC数据
3412     ************************************************************************** */
3413     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_BW, us_len, puc_param);
3414     if (oal_unlikely(ret != HI_SUCCESS)) {
3415         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_bw::hmac_config_send_event failed[%d].}", ret);
3416     }
3417 
3418     return ret;
3419 }
3420 
3421 /* ****************************************************************************
3422  功能描述  : 获取带宽信息
3423 **************************************************************************** */
hmac_config_get_bw(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)3424 hi_u32 hmac_config_get_bw(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
3425 {
3426     mac_cfg_tx_comp_stru *set_bw_param = HI_NULL;
3427 
3428     set_bw_param = (mac_cfg_tx_comp_stru *)puc_param;
3429     if (mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_5M) {
3430         set_bw_param->param = WLAN_BAND_ASSEMBLE_5M;
3431     } else if (mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_10M) {
3432         set_bw_param->param = WLAN_BAND_ASSEMBLE_10M;
3433     } else if (mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_20M) {
3434         set_bw_param->param = WLAN_BAND_ASSEMBLE_20M;
3435     }
3436 
3437     *pus_len = sizeof(mac_cfg_tx_comp_stru);
3438 
3439     return HI_SUCCESS;
3440 }
3441 
3442 
3443 /* ****************************************************************************
3444  功能描述  : 发送设置常发模式命令到dmac
3445  修改历史      :
3446   1.日    期   : 2015年1月14日
3447     作    者   : HiSilicon
3448     修改内容   : 新生成函数
3449 **************************************************************************** */
hmac_config_always_tx(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3450 hi_u32 hmac_config_always_tx(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3451 {
3452     hi_u32 ret;
3453     mac_cfg_tx_comp_stru *event_set_bcast = HI_NULL;
3454 
3455     /* 使能常发 */
3456     event_set_bcast = (mac_cfg_tx_comp_stru *)puc_param;
3457     mac_vap->al_tx_flag = (event_set_bcast->param == HI_SWITCH_OFF) ? HI_SWITCH_OFF : HI_SWITCH_ON;
3458     if (mac_vap->al_tx_flag) {
3459         mac_vap->cap_flag.keepalive = HI_FALSE;
3460         /* 常发打开时关闭低功耗 */
3461         hmac_set_wlan_pm_switch(HI_FALSE);
3462     } else {
3463         mac_vap_set_al_tx_first_run(mac_vap, HI_FALSE);
3464     }
3465     mac_vap_set_al_tx_payload_flag(mac_vap, event_set_bcast->payload_flag);
3466 
3467     /* **************************************************************************
3468         抛事件到DMAC层, 同步DMAC数据
3469     ************************************************************************** */
3470     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_ALWAYS_TX, us_len, puc_param);
3471     if (oal_unlikely(ret != HI_SUCCESS)) {
3472         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
3473                          "{hmac_config_always_tx::hmac_config_send_event failed[%d].}", ret);
3474     }
3475     return ret;
3476 }
3477 
3478 #ifdef _PRE_WLAN_FEATURE_CSI
3479 /* ***************************************************************************
3480  功能描述  : hmac接收wal抛下来的CSI开关设置事件,并将事件继续抛到dmac
3481  修改历史      :
3482   1.日    期   : 2019年1月30日
3483     作    者   : HiSilicon
3484     修改内容   : 新生成函数
3485 **************************************************************************** */
hmac_config_csi_set_switch(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3486 hi_u32 hmac_config_csi_set_switch(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3487 {
3488     hi_u32 send_event_ret;
3489 
3490     /* **************************************************************************
3491      抛事件到DMAC层, 同步DMAC数据
3492     ************************************************************************** */
3493     send_event_ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CSI_SWITCH, us_len, puc_param);
3494     if (send_event_ret != HI_SUCCESS) {
3495         oam_warning_log1(mac_vap->vap_id, OAM_SF_CSI,
3496             "{hmac_config_csi_set_switch::hmac_config_send_event failed[%d].}", send_event_ret);
3497         return send_event_ret;
3498     }
3499     return HI_SUCCESS;
3500 }
3501 
3502 /* ***************************************************************************
3503  功能描述  : hmac接收wal抛下来的CSI参数配置事件,并将事件继续抛到dmac
3504  修改历史      :
3505   1.日    期   : 2019年1月30日
3506     作    者   : HiSilicon
3507     修改内容   : 新生成函数
3508 **************************************************************************** */
hmac_config_csi_set_config(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3509 hi_u32 hmac_config_csi_set_config(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3510 {
3511     hi_u32 send_event_ret;
3512 
3513     /* **************************************************************************
3514      抛事件到DMAC层, 同步DMAC数据
3515     ************************************************************************** */
3516     send_event_ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CSI_SET_CONFIG, us_len, puc_param);
3517     if (send_event_ret != HI_SUCCESS) {
3518         oam_warning_log1(mac_vap->vap_id, OAM_SF_CSI,
3519             "{hmac_config_csi_set_config::hmac_config_send_event failed[%d].}", send_event_ret);
3520         return send_event_ret;
3521     }
3522     return HI_SUCCESS;
3523 }
3524 
3525 /* ***************************************************************************
3526  功能描述  : HMAC层处理DMAC模块产生CSI上报事件函数
3527  修改历史      :
3528   1.日    期   : 2019年1月30日
3529     作    者   : HiSilicon
3530     修改内容   : 新生成函数
3531 **************************************************************************** */
hmac_csi_data_report_event(frw_event_mem_stru * event_mem)3532 hi_u32 hmac_csi_data_report_event(frw_event_mem_stru *event_mem)
3533 {
3534     frw_event_stru *event = HI_NULL;
3535     mac_vap_stru *mac_vap = HI_NULL;
3536     hi_u32 send_event_ret;
3537 
3538     if (event_mem == HI_NULL) {
3539         oam_error_log0(0, OAM_SF_CSI, "{hmac_csi_data_report_event::event_mem null.}");
3540         return HI_ERR_CODE_PTR_NULL;
3541     }
3542     /* **************************************************************************
3543      抛事件到WAL层, 同步WAL数据
3544     ************************************************************************** */
3545     /* 获得事件指针 */
3546     event = (frw_event_stru *)event_mem->puc_data;
3547     mac_vap = mac_vap_get_vap_stru(event->event_hdr.vap_id);
3548     if (mac_vap == HI_NULL) {
3549         oam_error_log0(0, OAM_SF_CSI, "{hmac_csi_data_report_event::pst_mac_vap null.}");
3550         return HI_FAIL;
3551     }
3552 
3553     /* 填写事件头 */
3554     frw_event_hdr_init(&(event->event_hdr), FRW_EVENT_TYPE_HOST_CTX, HMAC_HOST_CTX_EVENT_SUB_TYPE_CSI_REPORT,
3555         sizeof(mac_csi_data_stru), FRW_EVENT_PIPELINE_STAGE_0, mac_vap->vap_id);
3556 
3557     /* 分发事件到WAL层 */
3558     send_event_ret = frw_event_dispatch_event(event_mem);
3559     if (send_event_ret != HI_SUCCESS) {
3560         oam_warning_log1(mac_vap->vap_id, OAM_SF_CSI,
3561             "{hmac_csi_data_report_event::frw_event_dispatch_event fail[%d].}", send_event_ret);
3562         return send_event_ret;
3563     }
3564     return HI_SUCCESS;
3565 }
3566 #endif
3567 
3568 /* ****************************************************************************
3569  功能描述  : 发送设置常收模式命令到dmac
3570  修改历史      :
3571   1.日    期   : 2014年3月12日
3572     作    者   : HiSilicon
3573     修改内容   : 新生成函数
3574 **************************************************************************** */
hmac_config_always_rx(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3575 hi_u32 hmac_config_always_rx(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3576 {
3577     hi_u32 ret;
3578 
3579     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
3580     if (hmac_vap == HI_NULL) {
3581         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_always_rx::hmac_vap null.}");
3582         return HI_ERR_CODE_PTR_NULL;
3583     }
3584 
3585     hmac_vap->hmac_al_rx_flag = puc_param[0];
3586     hmac_vap->mac_filter_flag = puc_param[1];
3587 
3588     if (hmac_vap->hmac_al_rx_flag == HI_SWITCH_ON) {
3589         /* 常收打开时关闭低功耗 */
3590         hmac_set_wlan_pm_switch(HI_FALSE);
3591     }
3592 
3593     /* **************************************************************************
3594         抛事件到DMAC层, 同步DMAC数据
3595     ************************************************************************** */
3596     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_ALWAYS_RX, us_len, puc_param);
3597     if (oal_unlikely(ret != HI_SUCCESS)) {
3598         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
3599                          "{hmac_config_always_rx::hmac_config_send_event failed[%d].}", ret);
3600         return ret;
3601     }
3602 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
3603     /* 设置帧过滤 */
3604     ret = hmac_set_rx_filter_value(mac_vap);
3605 #endif
3606     return ret;
3607 }
3608 
3609 #ifdef _PRE_DEBUG_MODE
3610 /* ****************************************************************************
3611  功能描述  : 发送设置动态功率校准命令到dmac
3612  输入参数  : [1]mac_vap
3613              [2]us_len
3614              [3]puc_param
3615  返 回 值  : hi_u32
3616 **************************************************************************** */
hmac_config_dync_txpower(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3617 hi_u32 hmac_config_dync_txpower(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3618 {
3619     hi_u32 ret;
3620 
3621     /* **************************************************************************
3622         抛事件到DMAC层, 同步DMAC数据
3623     ************************************************************************** */
3624     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_DYNC_TXPOWER, us_len, puc_param);
3625     if (oal_unlikely(ret != HI_SUCCESS)) {
3626         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
3627                          "{hmac_config_dync_txpower::hmac_config_send_event failed[%d].}", ret);
3628     }
3629 
3630     return ret;
3631 }
3632 
3633 #ifdef _PRE_WLAN_FEATURE_HIPRIV
3634 /* ****************************************************************************
3635  功能描述  : 上报某一个vap下的收发包统计
3636  修改历史      :
3637   1.日    期   : 2014年7月10日
3638     作    者   : HiSilicon
3639     修改内容   : 新生成函数
3640 **************************************************************************** */
hmac_config_vap_pkt_stat(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3641 hi_u32 hmac_config_vap_pkt_stat(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3642 {
3643     hi_unref_param(mac_vap);
3644     hi_unref_param(us_len);
3645     hi_unref_param(puc_param);
3646     return HI_SUCCESS;
3647 }
3648 #endif
3649 #endif
3650 
3651 /* ****************************************************************************
3652  功能描述  : hmac设置国家码
3653  修改历史      :
3654   1.日    期   : 2013年10月18日
3655     作    者   : HiSilicon
3656     修改内容   : 新生成函数
3657 **************************************************************************** */
hmac_config_set_country(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3658 hi_u32 hmac_config_set_country(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3659 {
3660     mac_cfg_country_stru      *country_param = HI_NULL;
3661     mac_regdomain_info_stru   *mac_regdom = HI_NULL;
3662     mac_regdomain_info_stru   *regdomain_info = HI_NULL;
3663 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
3664     hi_u32 ret;
3665 #endif
3666     hi_u32 size;
3667 
3668     hi_unref_param(us_len);
3669 
3670     country_param = (mac_cfg_country_stru *)puc_param;
3671     mac_regdom = (mac_regdomain_info_stru *)country_param->mac_regdom;
3672     size = sizeof(mac_regdomain_info_stru);
3673     /* 获取管制域全局变量 */
3674     regdomain_info = mac_get_regdomain_info();
3675     /* 更新管制域信息 */
3676     if (mac_regdom != HI_NULL) {
3677         if (memcpy_s(regdomain_info, sizeof(mac_regdomain_info_stru), mac_regdom, size) != EOK) {
3678             oam_error_log0(0, OAM_SF_CFG, "hmac_config_set_country::pst_mac_regdom memcpy_s fail.");
3679             return HI_FAIL;
3680         }
3681     }
3682     /* 更新信道的管制域信息 */
3683     mac_init_channel_list();
3684 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
3685     /* **************************************************************************
3686         抛事件到DMAC层, 同步DMAC数据
3687     ************************************************************************** */
3688     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_COUNTRY, (hi_u16)size, (hi_u8 *)mac_regdom);
3689     if (oal_unlikely(ret != HI_SUCCESS)) {
3690         oal_mem_free(mac_regdom);
3691         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_country::hmac_config_send_event failed[%d].}",
3692             ret);
3693         return ret;
3694     }
3695 #else
3696     hi_unref_param(mac_vap);
3697 #endif
3698     /* WAL层抛内存下来,此处释放 */
3699     oal_mem_free(mac_regdom);
3700     return HI_SUCCESS;
3701 }
3702 
3703 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
3704 /* ****************************************************************************
3705  功能描述  : hmac设置ampdu tx 开关
3706  修改历史      :
3707   1.日    期   : 2015年5月6日
3708     作    者   : HiSilicon
3709     修改内容   : 新生成函数
3710 **************************************************************************** */
hmac_config_set_ampdu_tx_on_sub(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3711 hi_u32 hmac_config_set_ampdu_tx_on_sub(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3712 {
3713     mac_cfg_ampdu_tx_on_param_stru *ampdu_tx_on_param = HI_NULL;
3714     hmac_vap_stru *hmac_vap = HI_NULL;
3715 
3716     hi_unref_param(us_len);
3717 
3718     if (oal_unlikely(mac_vap == HI_NULL || puc_param == HI_NULL)) {
3719         oam_error_log0(0, OAM_SF_CFG, "{hmac_config_set_ampdu_tx_on:: param null!}\r\n");
3720         return HI_ERR_CODE_PTR_NULL;
3721     }
3722 
3723     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
3724     if (hmac_vap == HI_NULL) {
3725         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_ampdu_tx_on::pst_hmac_vap null.}");
3726         return HI_ERR_CODE_PTR_NULL;
3727     }
3728 
3729     ampdu_tx_on_param = (mac_cfg_ampdu_tx_on_param_stru *)puc_param;
3730 #if defined(_PRE_WLAN_FEATURE_HIPRIV) && defined(_PRE_WLAN_FEATURE_INTRF_MODE)
3731     if (ampdu_tx_on_param->aggr_tx_on == 2) { /* 2:恢复历史值 */
3732         hmac_vap->ampdu_tx_on_switch = g_hist_ampdu_tx_on;
3733     } else { /* 设置并保存旧值 */
3734         g_hist_ampdu_tx_on = (hi_bool)hmac_vap->ampdu_tx_on_switch;
3735         hmac_vap->ampdu_tx_on_switch = ampdu_tx_on_param->aggr_tx_on;
3736     }
3737 #else
3738     hmac_vap->ampdu_tx_on_switch = ampdu_tx_on_param->aggr_tx_on;
3739 #endif
3740     oam_info_log1(0, OAM_SF_CFG, "{hmac_config_set_ampdu_tx_on:: ampdu_tx_on_switch[%d]!}\r\n",
3741         hmac_vap->ampdu_tx_on_switch);
3742 
3743     return HI_SUCCESS;
3744 }
3745 
hmac_config_set_ampdu_tx_on(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3746 hi_u32 hmac_config_set_ampdu_tx_on(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3747 {
3748     return hmac_config_set_ampdu_tx_on_sub(mac_vap, us_len, puc_param);
3749 }
3750 
hmac_config_set_ampdu_tx_on_from_dmac(mac_vap_stru * mac_vap,hi_u8 us_len,const hi_u8 * puc_param)3751 hi_u32 hmac_config_set_ampdu_tx_on_from_dmac(mac_vap_stru *mac_vap, hi_u8 us_len, const hi_u8 *puc_param)
3752 {
3753     return hmac_config_set_ampdu_tx_on_sub(mac_vap, us_len, puc_param);
3754 }
3755 #endif
3756 
3757 /* ****************************************************************************
3758  功能描述  : 获取对端RSSI
3759 **************************************************************************** */
hmac_config_query_rssi(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3760 hi_u32 hmac_config_query_rssi(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3761 {
3762     hi_u32 ret;
3763 
3764     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_RSSI, us_len, puc_param);
3765     if (oal_unlikely(ret != HI_SUCCESS)) {
3766         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
3767                          "{hmac_config_query_rssi::hmac_config_send_event failed[%d].}", ret);
3768     }
3769 
3770     return ret;
3771 }
3772 
3773 /* ****************************************************************************
3774  功能描述  : 发送用户定制报文
3775  输入参数  : pst_mac_vap:  MAC VAP
3776              puc_param   : 上层参数信息
3777              us_len      : 上层参数长度
3778  返 回 值  : HI_SUCCESS 上报成功,其它错误码 上报失败
3779 **************************************************************************** */
hmac_send_custom_pkt(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3780 hi_u32 hmac_send_custom_pkt(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3781 {
3782     oal_netbuf_stru *pkt_buf = HI_NULL;
3783     hi_u16 us_pkt_len;
3784     hi_u8 *puc_data = HI_NULL;
3785     hmac_tx_ctl_stru *tx_ctl = HI_NULL;
3786     wlan_custom_pkt_stru *pkt_param = (wlan_custom_pkt_stru *)puc_param;
3787 
3788     hi_unref_param(us_len);
3789 
3790     if (pkt_param->puc_data == HI_NULL) {
3791         return HI_ERR_CODE_PTR_NULL;
3792     }
3793 
3794     /* 复制用户数据到帧中 */
3795     if (pkt_param->us_len > WLAN_LARGE_NETBUF_SIZE) {
3796         oam_error_log0(0, OAM_SF_CFG, "{hmac_send_custom_pkt::pkt_param is null or pkt len too long.}");
3797         hi_free(HI_MOD_ID_WIFI_DRV, pkt_param->puc_data);
3798         return HI_FAIL;
3799     }
3800 
3801     /* 申请报文内存 */
3802     pkt_buf = (oal_netbuf_stru *)oal_netbuf_alloc(pkt_param->us_len, 0, 4); /* align 4 */
3803     if (pkt_buf == HI_NULL) {
3804         oam_error_log0(0, OAM_SF_CFG, "{hmac_send_custom_pkt::alloc netbuf failed.}");
3805         hi_free(HI_MOD_ID_WIFI_DRV, pkt_param->puc_data);
3806         return HI_ERR_CODE_PTR_NULL;
3807     }
3808 
3809     if (memset_s(oal_netbuf_cb(pkt_buf), oal_netbuf_cb_size(), 0, oal_netbuf_cb_size()) != EOK) {
3810         hi_free(HI_MOD_ID_WIFI_DRV, pkt_param->puc_data);
3811         oal_netbuf_free(pkt_buf);
3812         return HI_FAIL;
3813     }
3814     puc_data = (hi_u8 *)oal_netbuf_header(pkt_buf);
3815     tx_ctl = (hmac_tx_ctl_stru *)oal_netbuf_cb(pkt_buf);
3816 
3817     if (memcpy_s(puc_data, (hi_u32)pkt_param->us_len, pkt_param->puc_data, (hi_u32)pkt_param->us_len) != EOK) {
3818         oal_netbuf_free(pkt_buf);
3819         hi_free(HI_MOD_ID_WIFI_DRV, pkt_param->puc_data);
3820         return HI_FAIL;
3821     }
3822     us_pkt_len = (hi_u16)pkt_param->us_len;
3823     hi_free(HI_MOD_ID_WIFI_DRV, pkt_param->puc_data);
3824 
3825     tx_ctl->frame_header_length = MAC_80211_FRAME_LEN;
3826     tx_ctl->frame_header = (mac_ieee80211_frame_stru *)oal_netbuf_header(pkt_buf);
3827     tx_ctl->mac_head_type = 1;
3828     tx_ctl->us_tx_user_idx = 0xF;
3829     tx_ctl->us_mpdu_len = us_pkt_len;
3830     oal_netbuf_put(pkt_buf, (hi_u32)us_pkt_len);
3831 
3832     /* 调用发送管理帧接口 */
3833     if (hmac_tx_mgmt_send_event(mac_vap, pkt_buf, us_pkt_len) != HI_SUCCESS) {
3834         oal_netbuf_free(pkt_buf);
3835         oam_warning_log0(0, OAM_SF_CFG, "{hmac_send_custom_pkt::hmac_tx_mgmt_send_event failed.}");
3836         return HI_FAIL;
3837     }
3838 
3839     return HI_SUCCESS;
3840 }
3841 
3842 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
3843 /* ****************************************************************************
3844  功能描述  : 降SAR
3845  修改历史      :
3846   1.日    期   : 2014年8月27日
3847     作    者   : HiSilicon
3848     修改内容   : 新生成函数
3849 **************************************************************************** */
hmac_config_reduce_sar(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)3850 hi_u32 hmac_config_reduce_sar(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
3851 {
3852     hi_u32 ret;
3853     /* **************************************************************************
3854         抛事件到DMAC层, 同步DMAC数据
3855     ************************************************************************** */
3856     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_REDUCE_SAR, us_len, puc_param);
3857     if (oal_unlikely(ret != HI_SUCCESS)) {
3858         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
3859             "hmac_config_reduce_sar::hmac_config_send_event failed, error no[%d]!", ret);
3860         return ret;
3861     }
3862     return HI_SUCCESS;
3863 }
3864 #endif
3865 
3866 /* ****************************************************************************
3867  功能描述  : hmac读取国际码
3868  修改历史      :
3869   1.日    期   : 2013年10月18日
3870     作    者   : HiSilicon
3871     修改内容   : 新生成函数
3872 **************************************************************************** */
hmac_config_get_country(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)3873 hi_u32 hmac_config_get_country(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
3874 {
3875     hi_unref_param(pus_len);
3876     hi_unref_param(mac_vap);
3877     mac_cfg_get_country_stru *param = (mac_cfg_get_country_stru *)puc_param;
3878 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
3879     mac_regdomain_info_stru *regdomain_info = mac_get_regdomain_info();
3880     param->ac_country[0] = regdomain_info->ac_country[0];
3881     param->ac_country[1] = regdomain_info->ac_country[1]; /* 1 元素索引 */
3882     param->ac_country[2] = regdomain_info->ac_country[2]; /* 2 元素索引 */
3883 #else
3884     hi_char *pc_curr_cntry = mac_regdomain_get_country();
3885     param->ac_country[0] = pc_curr_cntry[0];
3886     param->ac_country[1] = pc_curr_cntry[1]; /* 1 元素索引 */
3887     param->ac_country[2] = pc_curr_cntry[2]; /* 2 元素索引 */
3888 #endif
3889 
3890     oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG, "hmac_config_get_country:: country[%C%C]\r\n", param->ac_country[0],
3891         param->ac_country[1]);
3892     *pus_len = sizeof(mac_cfg_get_country_stru);
3893     return HI_SUCCESS;
3894 }
3895 
hmac_config_connect_ie(mac_vap_stru * mac_vap,hmac_scanned_bss_info * scanned_bss_info,const mac_cfg80211_connect_param_stru * connect_param,const mac_bss_dscr_stru * bss_dscr,mac_cfg80211_connect_security_stru * conn_sec)3896 static hi_u32 hmac_config_connect_ie(mac_vap_stru *mac_vap, hmac_scanned_bss_info *scanned_bss_info,
3897     const mac_cfg80211_connect_param_stru *connect_param, const mac_bss_dscr_stru *bss_dscr,
3898     mac_cfg80211_connect_security_stru *conn_sec)
3899 {
3900     hi_unref_param(scanned_bss_info);
3901 
3902     oal_app_ie_stru *app_ie = (oal_app_ie_stru *)oal_memalloc(sizeof(oal_app_ie_stru));
3903     if (app_ie == HI_NULL) {
3904         oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_connect:: failed alloc app_ie}\r\n");
3905         return HI_ERR_CODE_PTR_NULL;
3906     }
3907     app_ie->ie_len = connect_param->ie_len;
3908     if ((connect_param->puc_ie != HI_NULL) &&
3909         (memcpy_s(app_ie->auc_ie, WLAN_WPS_IE_MAX_SIZE, connect_param->puc_ie, app_ie->ie_len) != EOK)) {
3910         oam_warning_log0(0, 0, "hmac_config_connect:puc_ie mem error");
3911         oal_free(app_ie);
3912         return HI_FAIL;
3913     }
3914     app_ie->app_ie_type = OAL_APP_ASSOC_REQ_IE;
3915     if (hmac_config_set_app_ie_to_vap(mac_vap, app_ie, app_ie->app_ie_type) != HI_SUCCESS) {
3916         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "hmac_config_set_app_ie_to_vap return NON SUCCESS. ");
3917     }
3918     oal_free(app_ie);
3919 
3920     /* 设置有效 dot11DTIMPeriod */
3921     if (bss_dscr->dtim_period > 0) {
3922         mac_vap->mib_info->wlan_mib_sta_config.dot11_dtim_period = bss_dscr->dtim_period;
3923     }
3924     /* 设置关联用户的能力信息 */
3925     mac_vap->us_assoc_user_cap_info = bss_dscr->us_cap_info;
3926 
3927 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
3928     /* 入网选择的热点rssi,同步到dmac传给tpc算法做管理报文tpc */
3929     conn_sec->rssi = scanned_bss_info->bss_dscr_info.rssi;
3930 #endif /* _PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE */
3931 
3932     hi_u32 ret = mac_vap_init_privacy(mac_vap, conn_sec);
3933     if (ret != HI_SUCCESS) {
3934         oam_error_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_connect::mac_11i_init_privacy failed[%d]!}\r\n", ret);
3935         return ret;
3936     }
3937 
3938     if (!conn_sec->privacy) {
3939         mac_vap->user_pmf_cap = HI_FALSE;
3940     }
3941 
3942     return HI_SUCCESS;
3943 }
3944 
hmac_config_connect_dev(const mac_vap_stru * mac_vap,mac_cfg80211_connect_param_stru * connect_param,hmac_vap_stru * hmac_vap,hmac_bss_mgmt_stru * bss_mgmt)3945 static hi_u32 hmac_config_connect_dev(const mac_vap_stru *mac_vap, mac_cfg80211_connect_param_stru *connect_param,
3946     hmac_vap_stru *hmac_vap, hmac_bss_mgmt_stru *bss_mgmt)
3947 {
3948     hi_unref_param(mac_vap);
3949     hi_unref_param(connect_param);
3950     hi_unref_param(bss_mgmt);
3951 
3952     /* 解决重关联请求问题后打开 */
3953     hmac_vap->reassoc_flag = HI_FALSE;
3954 #ifdef _PRE_WLAN_FEATURE_WAPI
3955     bss_dscr->wapi = connect_param->wapi;
3956     if (bss_dscr->wapi) {
3957         mac_device_stru *mac_dev = mac_res_get_dev();
3958         if (mac_device_is_p2p_connected(mac_dev) == HI_SUCCESS) {
3959             oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{wapi connect failed for p2p having been connected!.}");
3960             oal_spin_unlock_bh(&(bss_mgmt->st_lock));
3961             return HI_FAIL;
3962         }
3963     }
3964 #endif
3965 
3966     /* 解锁 */
3967     oal_spin_unlock_bh(&(bss_mgmt->st_lock));
3968 
3969 #ifdef _PRE_WLAN_FEATURE_P2P
3970     /* 设置P2P/WPS IE 信息到 vap 结构体中 */
3971     if (is_legacy_vap(mac_vap)) {
3972         hmac_p2p_del_ie(connect_param->puc_ie, &(connect_param->ie_len));
3973     }
3974 #endif
3975 
3976     return HI_SUCCESS;
3977 }
3978 
hmac_config_connect_conn_init(const mac_cfg80211_connect_param_stru * connect_param,mac_cfg80211_connect_security_stru * conn_sec)3979 static hi_u32 hmac_config_connect_conn_init(const mac_cfg80211_connect_param_stru *connect_param,
3980     mac_cfg80211_connect_security_stru *conn_sec)
3981 {
3982     /* 根据内核下发的关联能力,赋值加密相关的mib 值 */
3983     /* 根据下发的join,提取出安全相关的内容 */
3984     conn_sec->wep_key_len = connect_param->wep_key_len;
3985     conn_sec->auth_type = connect_param->auth_type;
3986     conn_sec->privacy = connect_param->privacy;
3987     conn_sec->crypto = connect_param->crypto;
3988     conn_sec->wep_key_index = connect_param->wep_key_index;
3989     conn_sec->mgmt_proteced = connect_param->mfp;
3990     if (conn_sec->wep_key_len > WLAN_WEP104_KEY_LEN) {
3991         oam_error_log1(0, OAM_SF_ANY, "{hmac_config_connect:key_len[%d] > WLAN_WEP104_KEY_LEN}\r\n",
3992             conn_sec->wep_key_len);
3993         conn_sec->wep_key_len = WLAN_WEP104_KEY_LEN;
3994     }
3995     if ((connect_param->puc_wep_key != HI_NULL) && (memcpy_s(conn_sec->auc_wep_key, WLAN_WEP104_KEY_LEN,
3996         connect_param->puc_wep_key, conn_sec->wep_key_len) != EOK)) {
3997         oam_warning_log1(0, 0, "hmac_config_connect:mem error :: %p", (uintptr_t)connect_param->puc_wep_key);
3998         return HI_FAIL;
3999     }
4000 
4001     return HI_SUCCESS;
4002 }
4003 
hmac_config_connect_hmac(mac_vap_stru * mac_vap,mac_cfg80211_connect_security_stru * conn_sec,mac_cfg80211_connect_param_stru * connect_param,hmac_vap_stru * hmac_vap)4004 hi_u32 hmac_config_connect_hmac(mac_vap_stru *mac_vap, mac_cfg80211_connect_security_stru *conn_sec,
4005     mac_cfg80211_connect_param_stru *connect_param, hmac_vap_stru *hmac_vap)
4006 {
4007     hmac_device_stru *hmac_dev = hmac_get_device_stru();
4008     /* 获取管理扫描的bss结果的结构体 */
4009     hmac_bss_mgmt_stru *bss_mgmt = &(hmac_dev->scan_mgmt.scan_record_mgmt.bss_mgmt); /* 管理扫描的bss结果的结构体 */
4010     /* 对链表删操作前加锁 */
4011     oal_spin_lock_bh(&(bss_mgmt->st_lock));
4012     hmac_scanned_bss_info *scanned_bss_info = hmac_scan_find_scanned_bss_by_bssid(bss_mgmt, connect_param->puc_bssid);
4013     if (scanned_bss_info == HI_NULL) {
4014         oam_warning_log3(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_connect:find bss fail bssid::XX:XX:%02X:%02X:%02X}",
4015             connect_param->puc_bssid[3], connect_param->puc_bssid[4], connect_param->puc_bssid[5]); /* 3 4 5 元素索引 */
4016 
4017         /* 解锁 */
4018         oal_spin_unlock_bh(&(bss_mgmt->st_lock));
4019         return HI_FAIL;
4020     }
4021 
4022     if (memcmp(connect_param->puc_ssid, scanned_bss_info->bss_dscr_info.ac_ssid, (hi_u32)connect_param->ssid_len)) {
4023         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_connect::find the bss failed by ssid.}");
4024         /* 解锁 */
4025         oal_spin_unlock_bh(&(bss_mgmt->st_lock));
4026         return HI_FAIL;
4027     }
4028 
4029     mac_bss_dscr_stru *bss_dscr = &(scanned_bss_info->bss_dscr_info);
4030 
4031     if (hmac_config_connect_dev(mac_vap, connect_param, hmac_vap, bss_mgmt) != HI_SUCCESS) {
4032         return HI_FAIL;
4033     }
4034 
4035     hi_u32 ret = hmac_config_connect_ie(mac_vap, scanned_bss_info, connect_param, bss_dscr, conn_sec);
4036     if (ret != HI_SUCCESS) {
4037         return ret;
4038     }
4039 
4040     hmac_vap->wps_active = conn_sec->wps_enable;
4041     ret = hmac_check_capability_mac_phy_supplicant(mac_vap, bss_dscr);
4042     if (ret != HI_SUCCESS) {
4043         oam_warning_log1(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_connect:check mac phy capability fail[%d]}\n", ret);
4044     }
4045 
4046     /* **************************************************************************
4047     抛事件到DMAC层, 同步DMAC数据
4048     ************************************************************************** */
4049     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CONNECT_REQ, sizeof(mac_cfg80211_connect_security_stru),
4050         (hi_u8 *)conn_sec);
4051     if (oal_unlikely(ret != HI_SUCCESS)) {
4052         oam_error_log1(mac_vap->vap_id, OAM_SF_WPA, "{hmac_config_connect::hmac_config_send_event failed[%d].}", ret);
4053         return ret;
4054     }
4055 
4056     return hmac_sta_initiate_join(mac_vap, bss_dscr);
4057 }
4058 
4059 /* ****************************************************************************
4060  功能描述  : hmac连接
4061  修改历史      :
4062   1.日    期   : 2015年5月5日
4063     作    者   : HiSilicon
4064     修改内容   : 新生成函数
4065 **************************************************************************** */
hmac_config_connect(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4066 hi_u32 hmac_config_connect(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4067 {
4068     mac_cfg80211_connect_security_stru conn_sec;
4069 
4070     if (oal_unlikely(mac_vap == HI_NULL) || oal_unlikely(puc_param == HI_NULL)) {
4071         oam_error_log0(0, OAM_SF_ANY, "{hmac_config_connect:: connect failed, null ptr!}\r\n");
4072         return HI_ERR_CODE_PTR_NULL;
4073     }
4074 
4075     if (us_len != sizeof(mac_cfg80211_connect_param_stru)) {
4076         oam_error_log1(0, OAM_SF_ANY, "{hmac_config_connect:: connect failed,unexpected param len![%x]!}\r\n", us_len);
4077         return HI_ERR_CODE_INVALID_CONFIG;
4078     }
4079 
4080     /* 先判断其他VAP 的状态是否允许本VAP 入网连接 */
4081     /* 如果允许本VAP 入网,则返回设备忙状态           */
4082     mac_cfg80211_connect_param_stru *connect_param = (mac_cfg80211_connect_param_stru *)puc_param;
4083 
4084     if (hmac_config_connect_conn_init(connect_param, &conn_sec) != HI_SUCCESS) {
4085         return HI_FAIL;
4086     }
4087 
4088 #ifdef _PRE_WLAN_FEATURE_PMF
4089     conn_sec.pmf_cap = mac_get_pmf_cap(connect_param->puc_ie, connect_param->ie_len);
4090 #endif
4091     conn_sec.wps_enable = HI_FALSE;
4092     if (mac_find_vendor_ie(MAC_WLAN_OUI_MICROSOFT, MAC_WLAN_OUI_TYPE_MICROSOFT_WPS, connect_param->puc_ie,
4093         (hi_s32)(connect_param->ie_len))) {
4094         conn_sec.wps_enable = HI_TRUE;
4095     }
4096 
4097     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
4098     if (hmac_vap == HI_NULL) {
4099         oam_error_log1(0, OAM_SF_CFG, "{hmac_config_connect:connect failed,hmac_vap null.vap_id[%d]}", mac_vap->vap_id);
4100         return HI_ERR_CODE_PTR_NULL;
4101     }
4102 
4103     hmac_vap->auth_mode = conn_sec.auth_type;
4104 
4105     return hmac_config_connect_hmac(mac_vap, &conn_sec, connect_param, hmac_vap);
4106 }
4107 
4108 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
4109 /* ****************************************************************************
4110  功能描述  : 获取最新数据帧的tid
4111  修改历史      :
4112   1.日    期   : 2013年10月18日
4113     作    者   : HiSilicon
4114     修改内容   : 新生成函数
4115 **************************************************************************** */
hmac_config_get_tid(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)4116 hi_u32 hmac_config_get_tid(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
4117 {
4118     mac_device_stru *mac_dev = HI_NULL;
4119     mac_cfg_get_tid_stru *tid = HI_NULL;
4120     hi_unref_param(mac_vap);
4121 
4122     tid = (mac_cfg_get_tid_stru *)puc_param;
4123     mac_dev = mac_res_get_dev();
4124     tid->tid = mac_dev->tid;
4125     *pus_len = sizeof(tid->tid);
4126 
4127     oam_info_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_get_tid::en_tid=%d.}", tid->tid);
4128     return HI_SUCCESS;
4129 }
4130 #endif
4131 
4132 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4133 /* ****************************************************************************
4134  功能描述  : 输出设备支持的信道列表
4135  输入参数  : [1]mac_vap
4136              [2]us_len
4137              [3]puc_param
4138  返 回 值  : hi_u32
4139 **************************************************************************** */
hmac_config_list_channel(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4140 hi_u32 hmac_config_list_channel(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4141 {
4142     hi_u8 chan_num;
4143     hi_u8 chan_idx;
4144     hi_u32 ret;
4145     hi_unref_param(us_len);
4146 
4147     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
4148         oam_error_log2(0, OAM_SF_CFG, "{hmac_config_list_channel::null param,pst_mac_vap=%p puc_param=%p.}",
4149             (uintptr_t)mac_vap, (uintptr_t)puc_param);
4150         return HI_FAIL;
4151     }
4152 
4153     for (chan_idx = 0; chan_idx < MAC_CHANNEL_FREQ_2_BUTT; chan_idx++) {
4154         ret = mac_is_channel_idx_valid(MAC_RC_START_FREQ_2, chan_idx, HI_NULL);
4155         if (ret == HI_SUCCESS) {
4156             mac_get_channel_num_from_idx(MAC_RC_START_FREQ_2, chan_idx, &chan_num);
4157 
4158             /* 输出2G信道号 */
4159             oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_list_channel::2gCHA.NO=%d}\n", chan_num);
4160         }
4161     }
4162 
4163     return HI_SUCCESS;
4164 }
4165 #endif
4166 
4167 /* ****************************************************************************
4168  功能描述  : 将用户态 IE 信息拷贝到内核态中
4169  输入参数  : mac_vap_stru *pst_mac_vap
4170              oal_net_dev_ioctl_data_stru *pst_ioctl_data
4171              enum WPS_IE_TYPE en_type
4172  返 回 值  : static hi_u8*
4173  修改历史      :
4174   1.日    期   : 2014年4月15日
4175     作    者   : HiSilicon
4176     修改内容   : 新生成函数
4177 **************************************************************************** */
hmac_config_set_app_ie_to_vap(mac_vap_stru * mac_vap,oal_app_ie_stru * app_ie,en_app_ie_type_uint8 type)4178 hi_u32 hmac_config_set_app_ie_to_vap(mac_vap_stru *mac_vap, oal_app_ie_stru *app_ie, en_app_ie_type_uint8 type)
4179 {
4180     hi_u32 ret;
4181 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
4182     oal_app_ie_stru tmp_app_ie;
4183 #endif
4184     hi_u8 *puc_ie = HI_NULL;
4185     hi_u32 remain_len;
4186 
4187     if ((mac_vap == HI_NULL) || (app_ie == HI_NULL)) {
4188         oam_error_log2(0, OAM_SF_CFG, "{hmac_config_set_app_ie_to_vap::scan failed, set ie null ptr, %p, %p.}",
4189             (uintptr_t)mac_vap, (uintptr_t)app_ie);
4190 
4191         return HI_ERR_CODE_PTR_NULL;
4192     }
4193 
4194     /* 移除驱动侧重复MAC_EID_EXT_CAPS */
4195     puc_ie = mac_find_ie(MAC_EID_EXT_CAPS, app_ie->auc_ie, app_ie->ie_len);
4196     if (puc_ie != HI_NULL) {
4197         app_ie->ie_len -= (hi_u32)(puc_ie[1] + MAC_IE_HDR_LEN);
4198         remain_len = app_ie->ie_len - (hi_u32)(puc_ie - app_ie->auc_ie);
4199         if (memmove_s(puc_ie, remain_len, puc_ie + (hi_u32)(puc_ie[1] + MAC_IE_HDR_LEN), remain_len) != EOK) {
4200             return HI_FAIL;
4201         }
4202     }
4203 
4204     ret = mac_vap_save_app_ie(mac_vap, app_ie, type);
4205     if (ret != HI_SUCCESS) {
4206         oam_error_log3(mac_vap->vap_id, OAM_SF_CFG,
4207             "{hmac_config_set_app_ie_to_vap::mac_vap_save_app_ie failed[%d], en_type[%d], len[%d].}", ret, type,
4208             app_ie->ie_len);
4209         return ret;
4210     }
4211 
4212 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
4213     if (app_ie->app_ie_type >= OAL_APP_ASSOC_REQ_IE) {
4214         /* 只有OAL_APP_BEACON_IE、OAL_APP_PROBE_REQ_IE、OAL_APP_PROBE_RSP_IE 才需要保存到device */
4215         return HI_SUCCESS;
4216     }
4217     tmp_app_ie.app_ie_type = app_ie->app_ie_type;
4218     tmp_app_ie.ie_len = app_ie->ie_len;
4219 
4220     /* 将下发的ie类型和长度保存到auc_buffer 中,再下抛事件下发给DMAC */
4221     if (memcpy_s(tmp_app_ie.auc_ie, WLAN_WPS_IE_MAX_SIZE, app_ie->auc_ie, app_ie->ie_len) != EOK) {
4222         oam_error_log0(0, OAM_SF_CFG, "hmac_config_set_app_ie_to_vap::pst_app_ie->auc_ie memcpy_s fail.");
4223         return HI_FAIL;
4224     }
4225     /* **************************************************************************
4226      抛事件到DMAC层, 同步DMAC数据
4227     ************************************************************************** */
4228     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_WPS_P2P_IE, sizeof(oal_app_ie_stru), (hi_u8 *)&tmp_app_ie);
4229     if (oal_unlikely(ret != HI_SUCCESS)) {
4230         oam_warning_log2(0, OAM_SF_CFG,
4231             "{hmac_config_set_app_ie_to_vap::hmac_config_send_event failed[%d], vap id[%d].}", ret, mac_vap->vap_id);
4232     }
4233 #endif
4234 
4235     return ret; /* app_ie在本函数中不涉及释放,误报告警,lin_t e429告警屏蔽 */
4236 }
4237 
4238 /* ****************************************************************************
4239  功能描述  : 设置分片门限
4240  修改历史      :
4241   1.日    期   : 2014年8月20日
4242     作    者   : HiSilicon
4243     修改内容   : 新生成函数
4244 **************************************************************************** */
hmac_config_rts_threshold(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4245 hi_u32 hmac_config_rts_threshold(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4246 {
4247     mac_cfg_rts_threshold_stru *rts_threshold = HI_NULL;
4248     hi_unref_param(us_len);
4249 
4250     if (oal_unlikely(mac_vap == HI_NULL || puc_param == HI_NULL || mac_vap->mib_info == HI_NULL)) {
4251         oam_error_log2(0, OAM_SF_CFG,
4252             "{hmac_config_rts_threshold:: mac_vap/puc_param/mib_info is null ptr %p, %p!}\r\n", (uintptr_t)mac_vap,
4253             (uintptr_t)puc_param);
4254         return HI_ERR_CODE_PTR_NULL;
4255     }
4256 
4257     rts_threshold = (mac_cfg_rts_threshold_stru *)puc_param;
4258     mac_mib_set_rts_threshold(mac_vap, rts_threshold->rts_threshold);
4259 
4260     oam_info_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_rts_threshold: mib rts %d!}\r\n",
4261         mac_vap->mib_info->wlan_mib_operation.dot11_rts_threshold);
4262 
4263     return HI_SUCCESS;
4264 }
4265 
4266 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
4267 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4268 /* ****************************************************************************
4269  功能描述  : 读取寄存器值
4270  修改历史      :
4271   1.日    期   : 2013年5月31日
4272     作    者   : HiSilicon
4273     修改内容   : 新生成函数
4274 **************************************************************************** */
hmac_config_reg_info(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4275 hi_u32 hmac_config_reg_info(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4276 {
4277     hi_u32 ret;
4278 
4279     /* **************************************************************************
4280         抛事件到DMAC层, 同步DMAC数据
4281     ************************************************************************** */
4282     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_REG_INFO, us_len, puc_param);
4283     if (oal_unlikely(ret != HI_SUCCESS)) {
4284         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4285                          "{hmac_config_reg_info::hmac_config_send_event failed[%d].}", ret);
4286     }
4287     return ret;
4288 }
4289 #endif
4290 #endif
4291 
4292 #ifdef _PRE_WLAN_FEATURE_WOW
4293 /* ****************************************************************************
4294  功能描述  :
4295  输入参数  : [1]mac_vap
4296              [2]us_len
4297              [3]puc_param
4298  返 回 值  : hi_u32
4299 **************************************************************************** */
hmac_config_wow_set_param(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4300 hi_u32 hmac_config_wow_set_param(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4301 {
4302     hi_u32 ret;
4303     hi_unref_param(us_len);
4304     hi_unref_param(puc_param);
4305 
4306     if (oal_unlikely(mac_vap == HI_NULL)) {
4307         oam_error_log0(0, OAM_SF_ANY, "{hmac_config_wow_set_param:oal_net_dev_priv(pst_net_dev) is null ptr!}\r\n");
4308         return HI_ERR_WIFI_HMAC_INVALID_PARAMETER;
4309     }
4310 
4311     ret = hmac_wow_set_dmac_cfg();
4312     if (ret != HI_SUCCESS) {
4313         oam_warning_log0(0, OAM_SF_ANY, "hmac_wow_set_dmac_cfg return NON SUCCESS. ");
4314     }
4315 
4316     return HI_SUCCESS;
4317 }
4318 
4319 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4320 /* ****************************************************************************
4321  功能描述  : hmac set FW no send any frame to driver
4322  输入参数  : [1]mac_vap
4323              [2]us_len
4324              [3]puc_param
4325  返 回 值  : hi_u32
4326 **************************************************************************** */
hmac_config_host_sleep_switch(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4327 hi_u32 hmac_config_host_sleep_switch(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4328 {
4329     hi_u32 is_host_sleep;
4330     hi_unref_param(us_len);
4331     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
4332         oam_error_log0(0, OAM_SF_CFG, "{hmac_config_host_sleep_switch::param null.}");
4333         return HI_ERR_CODE_PTR_NULL;
4334     }
4335 
4336     is_host_sleep = *(hi_u32 *)puc_param;
4337 
4338     hmac_wow_host_sleep_cmd(mac_vap, is_host_sleep);
4339 
4340     return HI_SUCCESS;
4341 }
4342 
4343 /* ****************************************************************************
4344  功能描述  : Hmac Enable/disable WOW events
4345  输入参数  : [1]mac_vap
4346              [2]us_len
4347              [3]puc_param
4348  返 回 值  : hi_u32
4349 **************************************************************************** */
hmac_config_set_wow(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4350 hi_u32 hmac_config_set_wow(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4351 {
4352     hi_u32 wow_event;
4353     hi_unref_param(us_len);
4354 
4355     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
4356         oam_error_log0(0, OAM_SF_CFG, "{hmac_config_set_wow::param null.}");
4357         return HI_ERR_CODE_PTR_NULL;
4358     }
4359 
4360     wow_event = *(hi_u32 *)puc_param;
4361 
4362     hisi_wlan_set_wow_event(wow_event);
4363 
4364     return HI_SUCCESS;
4365 }
4366 
4367 /* ****************************************************************************
4368  功能描述  : Hmac activate/deactivate wow hipriv
4369  输入参数  : [1]mac_vap
4370              [2]us_len
4371              [3]puc_param
4372  返 回 值  : hi_u32
4373 **************************************************************************** */
hmac_config_wow_activate_switch(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4374 hi_u32 hmac_config_wow_activate_switch(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4375 {
4376     hi_u32 wow_en;
4377     mac_vap_stru *vap = HI_NULL;
4378     mac_device_stru *mac_dev = mac_res_get_dev();
4379     hi_unref_param(us_len);
4380     hi_u8 vap_idx;
4381 
4382     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
4383         oam_error_log0(0, OAM_SF_CFG, "{hmac_config_wow_en::param null.}");
4384         return HI_ERR_CODE_PTR_NULL;
4385     }
4386 
4387     for (vap_idx = 0; vap_idx < mac_dev->vap_num; vap_idx++) {
4388         vap = mac_vap_get_vap_stru(mac_dev->auc_vap_id[vap_idx]);
4389         if (vap == HI_NULL) {
4390             continue;
4391         }
4392         if ((vap->vap_mode == WLAN_VAP_MODE_BSS_AP) && (vap->vap_state == MAC_VAP_STATE_UP)) {
4393             oam_warning_log0(0, 0, "hmac_config_wow_activate_switch:: AP EXIST, don't support wowEn");
4394             return HI_FAIL;
4395         }
4396     }
4397 
4398     wow_en = *(hi_u32 *)puc_param;
4399 
4400     hmac_wow_set_wow_en_cmd(wow_en);
4401 
4402     return HI_SUCCESS;
4403 }
4404 
4405 /* ****************************************************************************
4406  功能描述  : Hmac set wow pattern
4407  输入参数  : [1]mac_vap
4408              [2]us_len
4409              [3]puc_param
4410  返 回 值  : hi_u32
4411 **************************************************************************** */
hmac_config_set_wow_pattern(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4412 hi_u32 hmac_config_set_wow_pattern(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4413 {
4414     hmac_cfg_wow_pattern_param_stru *pattern = HI_NULL;
4415     hi_u32 ret;
4416 
4417     hi_unref_param(us_len);
4418 
4419     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
4420         oam_error_log0(0, OAM_SF_CFG, "{hmac_config_set_wow_pattern::param null.}");
4421         return HI_ERR_CODE_PTR_NULL;
4422     }
4423 
4424     pattern = (hmac_cfg_wow_pattern_param_stru *)puc_param;
4425 
4426     if (pattern->us_pattern_option == MAC_WOW_PATTERN_PARAM_OPTION_ADD) {
4427         ret = hisi_wlan_add_netpattern((hi_u32)pattern->us_pattern_index, &pattern->auc_pattern_value[0],
4428             pattern->pattern_len);
4429         if (ret != HI_SUCCESS) {
4430             oam_warning_log0(0, OAM_SF_CFG, "hisi_wlan_add_netpattern return NON SUCCESS. ");
4431         }
4432     } else if (pattern->us_pattern_option == MAC_WOW_PATTERN_PARAM_OPTION_DEL) {
4433         hisi_wlan_del_netpattern((hi_u32)pattern->us_pattern_index);
4434     } else {
4435         hmac_wow_set_pattern_cmd(pattern);
4436     }
4437 
4438     return HI_SUCCESS;
4439 }
4440 #endif /* end of _PRE_WLAN_FEATURE_WOW */
4441 #endif
4442 
4443 #ifdef _PRE_WLAN_FEATURE_PROMIS
4444 /* ****************************************************************************
4445  功能描述  :
4446  修改历史      :
4447   1.日    期   : 2016年3月14日
4448     作    者   : HiSilicon
4449     修改内容   : 新生成函数
4450 **************************************************************************** */
hmac_config_set_monitor_switch(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4451 hi_u32 hmac_config_set_monitor_switch(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4452 {
4453     hi_u32 ret;
4454 
4455 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
4456     hi_u8 value = puc_param[0];
4457 
4458     mac_device_stru *mac_dev = mac_res_get_dev();
4459     if (value == 0) {
4460         mac_dev->promis_switch = HI_FALSE;
4461     } else {
4462         mac_dev->promis_switch = HI_TRUE;
4463     }
4464 #endif
4465 
4466     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_MONITOR_EN, us_len, puc_param);
4467     if (oal_unlikely(ret != HI_SUCCESS)) {
4468         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4469             "{hmac_config_set_monitor_switch::hmac_config_send_event failed[%d].}", ret);
4470     }
4471     return ret;
4472 }
4473 #endif
4474 
4475 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4476 /* ****************************************************************************
4477  功能描述  : 指定用户的指定tid发送bar
4478  返 回 值  : 错误码
4479  修改历史      :
4480   1.日    期   : 2013年1月15日
4481     作    者   : HiSilicon
4482     修改内容   : 新生成函数
4483 **************************************************************************** */
hmac_config_send_bar(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4484 hi_u32 hmac_config_send_bar(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4485 {
4486     hi_u32 ret;
4487 
4488     /* **************************************************************************
4489         抛事件到DMAC层, 同步DMAC数据
4490     ************************************************************************** */
4491     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SEND_BAR, us_len, puc_param);
4492     if (oal_unlikely(ret != HI_SUCCESS)) {
4493         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4494                          "{hmac_config_send_bar::hmac_config_send_event failed[%d].}", ret);
4495     }
4496 
4497     return ret;
4498 }
4499 
4500 /* ****************************************************************************
4501  功能描述  :
4502  修改历史      :
4503   1.日    期   : 2013年9月6日
4504     作    者   : HiSilicon
4505     修改内容   : 新生成函数
4506 **************************************************************************** */
hmac_config_reg_write(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4507 hi_u32 hmac_config_reg_write(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4508 {
4509     hi_u32 ret;
4510 
4511     /* **************************************************************************
4512         抛事件到DMAC层, 同步DMAC数据
4513     ************************************************************************** */
4514     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_REG_WRITE, us_len, puc_param);
4515     if (oal_unlikely(ret != HI_SUCCESS)) {
4516         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4517                          "{hmac_config_reg_write::hmac_config_send_event failed[%d].}", ret);
4518     }
4519 
4520     return ret;
4521 }
4522 #endif
4523 
4524 /* ****************************************************************************
4525  功能描述  : hmac, 算法配置命令示例
4526  修改历史      :
4527   1.日    期   : 2013年10月11日
4528     作    者   : HiSilicon
4529     修改内容   : 新生成函数
4530 **************************************************************************** */
hmac_config_alg_param(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4531 hi_u32 hmac_config_alg_param(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4532 {
4533     hi_u32 ret;
4534     frw_event_mem_stru *event_mem = HI_NULL;
4535     hmac_to_dmac_cfg_msg_stru *syn_msg = HI_NULL;
4536 
4537     ret = hmac_config_alloc_event(mac_vap, HMAC_TO_DMAC_SYN_ALG, &syn_msg, &event_mem, us_len);
4538     if (oal_unlikely(ret != HI_SUCCESS)) {
4539         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4540             "{hmac_config_alg_send_event::hmac_config_alloc_event failed[%d].}", ret);
4541         return ret;
4542     }
4543     syn_msg->syn_id = WLAN_CFGID_ALG_PARAM;
4544     syn_msg->us_len = us_len;
4545     /* 填写配置同步消息内容 */
4546     if (puc_param != HI_NULL) {
4547         if (memcpy_s(syn_msg->auc_msg_body, us_len, puc_param, us_len) != EOK) {
4548             frw_event_free(event_mem);
4549             oam_error_log0(0, OAM_SF_CFG, "dmac_join_set_reg_event_process:: hmac_config_alloc_event memcpy_s fail.");
4550             return HI_FAIL;
4551         }
4552     }
4553     /* 抛出事件 */
4554     hcc_hmac_tx_control_event(event_mem, us_len + (hi_u16)oal_offset_of(hmac_to_dmac_cfg_msg_stru, auc_msg_body));
4555     frw_event_free(event_mem);
4556     return HI_SUCCESS;
4557 }
4558 
4559 /* ****************************************************************************
4560  功能描述  :
4561  修改历史      :
4562   1.日    期   : 2014年6月5日
4563     作    者   : HiSilicon
4564     修改内容   : 新生成函数
4565 **************************************************************************** */
hmac_config_set_forty_mhz_intolerant(const mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4566 hi_u32 hmac_config_set_forty_mhz_intolerant(const mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4567 {
4568     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
4569         oam_error_log2(0, OAM_SF_ANY, "{hmac_config_set_forty_mhz_intolerant::mac_vap[%p] NULL or puc_param[%p] NULL!}",
4570             (uintptr_t)mac_vap, (uintptr_t)puc_param);
4571         return HI_ERR_CODE_PTR_NULL;
4572     }
4573     hi_unref_param(us_len);
4574 
4575     if ((*puc_param != 0) && (*puc_param != 1)) {
4576         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_FortyMHzIntolerant::invalid param[%d].",
4577             *puc_param);
4578         return HI_ERR_CODE_INVALID_CONFIG;
4579     }
4580 
4581     mac_mib_set_forty_mhz_intolerant(mac_vap, (hi_u8)(*puc_param));
4582 
4583     oam_info_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_FortyMHzIntolerant::end func,puc_param=%d.}",
4584         *puc_param);
4585     return HI_SUCCESS;
4586 }
4587 
4588 #if defined(_PRE_WLAN_FEATURE_HIPRIV) || defined(_PRE_WLAN_FEATURE_SIGMA)
4589 /* ****************************************************************************
4590  功能描述  : 设置分片门限
4591  修改历史      :
4592   1.日    期   : 2014年2月28日
4593     作    者   : HiSilicon
4594     修改内容   : 新生成函数
4595 **************************************************************************** */
hmac_config_frag_threshold(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4596 hi_u32 hmac_config_frag_threshold(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4597 {
4598     mac_cfg_frag_threshold_stru *frag_threshold = HI_NULL;
4599 
4600     hi_unref_param(us_len);
4601 
4602     if (oal_unlikely(mac_vap == HI_NULL || puc_param == HI_NULL)) {
4603         oam_error_log2(0, OAM_SF_ANY, "{wal_config_frag_threshold:: pst_mac_vap/puc_param is null ptr %p, %p!}\r\n",
4604             (uintptr_t)mac_vap, (uintptr_t)puc_param);
4605         return HI_ERR_CODE_PTR_NULL;
4606     }
4607 
4608 #ifdef _PRE_WLAN_FEATURE_MESH
4609     if (mac_vap->vap_mode == WLAN_VAP_MODE_MESH) {
4610         oam_warning_log0(0, OAM_SF_ANY,
4611             "{hmac_config_frag_threshold::[MESH]pst_mac_vap is mesh,not support set frag threshold}\r\n");
4612         return HI_FAIL;
4613     }
4614 #endif
4615 
4616     frag_threshold = (mac_cfg_frag_threshold_stru *)puc_param;
4617 
4618     if (mac_vap->mib_info == HI_NULL) {
4619         oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{wal_config_frag_threshold:pst_mib_info is null!}");
4620         return HI_ERR_CODE_PTR_NULL;
4621     }
4622     mac_mib_set_frag_threshold(mac_vap, frag_threshold->frag_threshold);
4623     return HI_SUCCESS;
4624 }
4625 #endif
4626 
4627 /* ****************************************************************************
4628  功能描述  : 打印接收帧的FCS信息
4629  修改历史      :
4630   1.日    期   : 2014年3月8日
4631     作    者   : HiSilicon
4632     修改内容   : 新生成函数
4633 **************************************************************************** */
hmac_config_rx_fcs_info(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4634 hi_u32 hmac_config_rx_fcs_info(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4635 {
4636     hi_u32 ret;
4637 
4638     /* **************************************************************************
4639         抛事件到DMAC层, 同步DMAC数据
4640     ************************************************************************** */
4641     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_RX_FCS_INFO, us_len, puc_param);
4642     if (oal_unlikely(ret != HI_SUCCESS)) {
4643         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4644                          "{hmac_config_rx_fcs_info::hmac_config_send_event failed[%d].}", ret);
4645         return ret;
4646     }
4647 
4648     return HI_SUCCESS;
4649 }
4650 
4651 #ifdef _PRE_WLAN_FEATURE_EDCA_OPT_AP_DEBUG
4652 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4653 /* ****************************************************************************
4654  功能描述  : 打开edca参数调数开关
4655  返 回 值  : 错误码
4656  修改历史      :
4657   1.日    期   : 2014年12月2日
4658     作    者   : HiSilicon
4659     修改内容   : 新生成函数
4660 **************************************************************************** */
hmac_config_set_edca_opt_switch_sta(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4661 hi_u32 hmac_config_set_edca_opt_switch_sta(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4662 {
4663     hi_u8 flag;
4664     hi_u32 ret;
4665     hmac_vap_stru *hmac_vap = HI_NULL;
4666 
4667     /* 获取hmac_vap */
4668     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
4669     if (hmac_vap == HI_NULL) {
4670         oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_edca_opt_switch_sta, hmac_vap_get_vap_stru fail.vap_id = %u",
4671             mac_vap->vap_id);
4672         return HI_ERR_CODE_PTR_NULL;
4673     }
4674 
4675     /* 获取配置参数 */
4676     flag = *puc_param;
4677 
4678     /* 参数没有更改,不需要重新配置 */
4679     if (flag == hmac_vap->edca_opt_flag_sta) {
4680         oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_edca_opt_switch_sta, change nothing to flag:%d",
4681             hmac_vap->edca_opt_flag_sta);
4682         return HI_SUCCESS;
4683     }
4684 
4685     /* 设置参数,并启动或者停止edca参数调整定时器 */
4686     hmac_vap->edca_opt_flag_sta = flag;
4687 
4688     if (hmac_vap->edca_opt_flag_sta == 0) {
4689         mac_vap_init_wme_param(mac_vap);
4690     } else {
4691         oam_warning_log0(0, OAM_SF_ANY, "hmac_edca_opt_adj_param_sta succ");
4692     }
4693 
4694     /* 更新EDCA相关的MAC寄存器 */
4695     ret = hmac_sta_up_update_edca_params_machw(hmac_vap, MAC_WMM_SET_PARAM_TYPE_UPDATE_EDCA);
4696     if (ret != HI_SUCCESS) {
4697         oam_warning_log0(0, OAM_SF_ANY,
4698             "hmac_config_set_edca_opt_switch_sta: hmac_sta_up_update_edca_params_machw failed");
4699         return ret;
4700     }
4701 
4702     oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_edca_opt_switch_sta,config sucess, %d",
4703         hmac_vap->edca_opt_flag_sta);
4704 
4705     return HI_SUCCESS;
4706 }
4707 
4708 /* ****************************************************************************
4709  功能描述  : 打开edca参数调数开关
4710  返 回 值  : 错误码
4711  修改历史      :
4712   1.日    期   : 2014年12月2日
4713     作    者   : HiSilicon
4714     修改内容   : 新生成函数
4715 **************************************************************************** */
hmac_config_set_edca_opt_switch_ap(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4716 hi_u32 hmac_config_set_edca_opt_switch_ap(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4717 {
4718     hi_u8 flag;
4719     hmac_vap_stru *hmac_vap = HI_NULL;
4720 
4721     /* 获取hmac_vap */
4722     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
4723     if (hmac_vap == HI_NULL) {
4724         oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_edca_opt_switch_ap, hmac_vap_get_vap_stru fail.vap_id = %u",
4725             mac_vap->vap_id);
4726         return HI_ERR_CODE_PTR_NULL;
4727     }
4728 
4729     /* 获取配置参数 */
4730     flag = *puc_param;
4731 
4732     /* 参数没有更改,不需要重新配置 */
4733     if (flag == hmac_vap->edca_opt_flag_ap) {
4734         oam_warning_log1(0, OAM_SF_ANY, "wal_hipriv_set_edca_opt_switch_ap, change nothing to flag:%d",
4735             hmac_vap->edca_opt_flag_ap);
4736         return HI_SUCCESS;
4737     }
4738 
4739     /* 设置参数,并启动或者停止edca参数调整定时器 */
4740     if (flag == 1) {
4741         hmac_vap->edca_opt_flag_ap = 1;
4742         frw_timer_restart_timer(&(hmac_vap->edca_opt_timer), hmac_vap->us_edca_opt_time_ms, HI_TRUE);
4743     } else {
4744         hmac_vap->edca_opt_flag_ap = 0;
4745         frw_timer_stop_timer(&(hmac_vap->edca_opt_timer));
4746     }
4747 
4748     oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_edca_opt_switch_ap succ, flag = %d", hmac_vap->edca_opt_flag_ap);
4749 
4750     return HI_SUCCESS;
4751 }
4752 #endif
4753 
4754 /* ****************************************************************************
4755  功能描述  : 设置edca调整周期
4756  返 回 值  : 错误码
4757  修改历史      :
4758   1.日    期   : 2014年12月2日
4759     作    者   : HiSilicon
4760     修改内容   : 新生成函数
4761 **************************************************************************** */
hmac_config_set_edca_opt_cycle_ap(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4762 hi_u32 hmac_config_set_edca_opt_cycle_ap(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4763 {
4764     hi_u16 us_cycle_ms;
4765     hmac_vap_stru *hmac_vap = HI_NULL;
4766 
4767     /* 获取hmac_vap */
4768     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
4769     if (hmac_vap == HI_NULL) {
4770         oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_edca_opt_cycle_ap, hmac_vap_get_vap_stru fail.vap_id = %u",
4771             mac_vap->vap_id);
4772         return HI_ERR_CODE_PTR_NULL;
4773     }
4774 
4775     us_cycle_ms = *((hi_u16 *)puc_param);
4776 
4777     /* 判断edca调整周期是否有更新 */
4778     if (us_cycle_ms == hmac_vap->us_edca_opt_time_ms) {
4779         oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_edca_opt_cycle_ap, change nothing to cycle:%d",
4780             hmac_vap->us_edca_opt_time_ms);
4781         return HI_SUCCESS;
4782     }
4783 
4784     /* 如果edca调整定时器正在运行,则需要先停止后,再根据新的参数restart */
4785     hmac_vap->us_edca_opt_time_ms = us_cycle_ms;
4786     if (hmac_vap->edca_opt_flag_ap == 1) {
4787         frw_timer_stop_timer(&(hmac_vap->edca_opt_timer));
4788         FRW_TIMER_RESTART_TIMER(&(hmac_vap->edca_opt_timer), hmac_vap->us_edca_opt_time_ms, HI_TRUE);
4789     }
4790 
4791     oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_edca_opt_cycle_ap succ, cycle = %d",
4792         hmac_vap->us_edca_opt_time_ms);
4793 
4794     return HI_SUCCESS;
4795 }
4796 
4797 #endif
4798 
4799 #ifdef _PRE_WLAN_FEATURE_STA_PM
4800 /* ****************************************************************************
4801  功能描述  : 120S低功耗定时器超时处理函数
4802 **************************************************************************** */
hmac_set_psm_timeout(hi_void * puc_para)4803 hi_u32 hmac_set_psm_timeout(hi_void *puc_para)
4804 {
4805     hmac_vap_stru *hmac_vap = (hmac_vap_stru *)puc_para;
4806     hi_u32 auto_powersave_val = 0;
4807 
4808     auto_powersave_val |= PM_SWITCH_ON;
4809     auto_powersave_val |= PM_SWITCH_AUTO_FLAG << 16; /* 左移16位 */
4810 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE) && (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
4811     wlan_pm_set_timeout(WLAN_SLEEP_DEFAULT_CHECK_CNT);
4812 #endif
4813 
4814     if (g_wlan_pm_on == HI_FALSE) {
4815         oam_warning_log0(0, OAM_SF_CFG, "{hmac_set_psm_timeout::pm off.}");
4816         return HI_FALSE;
4817     }
4818     oam_warning_log0(0, OAM_SF_CFG, "{hmac_set_psm_timeout::set pm}");
4819     /* **************************************************************************
4820     抛事件到DMAC层, 同步DMAC数据
4821     ************************************************************************** */
4822     return hmac_config_send_event(hmac_vap->base_vap, WLAN_CFGID_SET_PM_SWITCH, sizeof(auto_powersave_val),
4823         (hi_u8 *)&auto_powersave_val);
4824 }
4825 
4826 /* ****************************************************************************
4827  功能描述  : 低功耗控制接口
4828  输入参数  : [1]mac_vap
4829              [2]pm_ctrl_type
4830              [3]pm_enable
4831  返 回 值  : hi_u32
4832 **************************************************************************** */
hmac_config_set_pm_by_module(mac_vap_stru * mac_vap,mac_pm_ctrl_type_enum pm_ctrl_type,mac_pm_switch_enum pm_enable)4833 hi_u32 hmac_config_set_pm_by_module(mac_vap_stru *mac_vap, mac_pm_ctrl_type_enum pm_ctrl_type,
4834     mac_pm_switch_enum pm_enable)
4835 {
4836     hi_u32 ret;
4837     mac_cfg_ps_open_stru ps_open = { 0 };
4838 
4839     if (pm_enable >= MAC_STA_PM_SWITCH_BUTT || pm_ctrl_type >= MAC_STA_PM_CTRL_TYPE_BUTT || mac_vap == HI_NULL) {
4840         oam_error_log3(0, OAM_SF_ANY,
4841             "hmac_config_set_pm_by_module, PARAM ERROR! pst_mac_vap = %p, pm_ctrl_type = %d, pm_enable = %d ",
4842             (uintptr_t)mac_vap, pm_ctrl_type, pm_enable);
4843         return HI_FAIL;
4844     }
4845 
4846     ps_open.pm_enable = pm_enable;
4847     ps_open.pm_ctrl_type = pm_ctrl_type;
4848 
4849     ret = hmac_config_set_sta_pm_on(mac_vap, sizeof(mac_cfg_ps_open_stru), (hi_u8 *)&ps_open);
4850     oam_warning_log3(0, OAM_SF_PWR, "hmac_config_set_pm_by_module, pm_module = %d, pm_enable = %d, cfg ret = %d ",
4851         pm_ctrl_type, pm_enable, ret);
4852 
4853     return ret;
4854 }
4855 #endif
4856 
4857 #if (_PRE_MULTI_CORE_MODE == _PRE_MULTI_CORE_MODE_OFFLOAD_DMAC)
4858 /* ****************************************************************************
4859  函 数 名  : hmac_config_set_obss_scan_param
4860  功能描述  : 整体同步obss scan相关的mib值
4861  输入参数  : mac_vap_stru *pst_mac_vap
4862  输出参数  : 无
4863  返 回 值  :
4864  调用函数  :
4865  被调函数  :
4866 
4867  修改历史      :
4868   1.日    期   : 2015年3月28日
4869     作    者   : HiSilicon
4870     修改内容   : 新生成函数
4871 **************************************************************************** */
hmac_config_set_obss_scan_param(const mac_vap_stru * mac_vap)4872 hi_u32 hmac_config_set_obss_scan_param(const mac_vap_stru *mac_vap)
4873 {
4874     hi_u32 ret;
4875 
4876     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_OBSS_MIB, sizeof(wlan_mib_dot11_operation_entry_stru),
4877         (hi_u8 *)&mac_vap->mib_info->wlan_mib_operation);
4878     if (oal_unlikely(ret != HI_SUCCESS)) {
4879         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4880             "{hmac_config_set_obss_scan_param::hmac_config_send_event failed[%d].}", ret);
4881     }
4882 
4883     return ret;
4884 }
4885 
4886 /* ****************************************************************************
4887  功能描述  : dmac_offload架构下同步user关联状态到device侧
4888  修改历史      :
4889   1.日    期   : 2014年12月9日
4890     作    者   : HiSilicon
4891     修改内容   : 新生成函数
4892 **************************************************************************** */
hmac_config_user_asoc_state_syn(const mac_vap_stru * mac_vap,const mac_user_stru * mac_user)4893 hi_u32 hmac_config_user_asoc_state_syn(const mac_vap_stru *mac_vap, const mac_user_stru *mac_user)
4894 {
4895     hi_u32 ret;
4896     mac_h2d_user_asoc_state_stru h2d_user_asoc_state_stru;
4897 
4898     h2d_user_asoc_state_stru.user_idx = (hi_u8)mac_user->us_assoc_id;
4899     h2d_user_asoc_state_stru.asoc_state = mac_user->user_asoc_state;
4900     /* **************************************************************************
4901         抛事件到DMAC层, 同步user关联状态到device侧
4902     ************************************************************************** */
4903     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_USER_ASOC_STATE_SYN, sizeof(mac_h2d_user_asoc_state_stru),
4904         (hi_u8 *)(&h2d_user_asoc_state_stru));
4905     if (oal_unlikely(ret != HI_SUCCESS)) {
4906         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4907                          "{hmac_config_user_asoc_state_syn::send_event failed[%d].}", ret);
4908     }
4909     return ret;
4910 }
4911 
4912 /* ****************************************************************************
4913  功能描述  : dmac_offload架构下同步user速率信息到device侧
4914  修改历史      :
4915   1.日    期   : 2015年3月26日
4916     作    者   : HiSilicon
4917     修改内容   : 新生成函数
4918 **************************************************************************** */
hmac_config_user_rate_info_syn(const mac_vap_stru * mac_vap,const mac_user_stru * mac_user)4919 hi_u32 hmac_config_user_rate_info_syn(const mac_vap_stru *mac_vap, const mac_user_stru *mac_user)
4920 {
4921     hi_u32 ret;
4922     mac_h2d_usr_rate_info_stru mac_h2d_usr_rate_info;
4923 
4924     mac_h2d_usr_rate_info.user_idx = (hi_u8)mac_user->us_assoc_id;
4925     mac_h2d_usr_rate_info.protocol_mode = mac_user->protocol_mode;
4926     /* legacy速率集信息,同步到dmac */
4927     mac_h2d_usr_rate_info.avail_rs_nrates = mac_user->avail_op_rates.rs_nrates;
4928     if (memcpy_s(mac_h2d_usr_rate_info.auc_avail_rs_rates, WLAN_MAX_SUPP_RATES, mac_user->avail_op_rates.auc_rs_rates,
4929         WLAN_MAX_SUPP_RATES) != EOK) {
4930         oam_error_log0(0, OAM_SF_CFG, "hmac_config_user_rate_info_syn:: auc_rs_rates memcpy_s fail.");
4931         return HI_FAIL;
4932     }
4933     /* ht速率集信息,同步到dmac */
4934     mac_user_get_ht_hdl(mac_user, &mac_h2d_usr_rate_info.ht_hdl);
4935     /* **************************************************************************
4936         抛事件到DMAC层, 同步user关联状态到device侧
4937     ************************************************************************** */
4938     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_USER_RATE_SYN, sizeof(mac_h2d_usr_rate_info_stru),
4939         (hi_u8 *)(&mac_h2d_usr_rate_info));
4940     if (oal_unlikely(ret != HI_SUCCESS)) {
4941         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4942             "{hmac_config_user_rate_info_syn::hmac_config_send_event failed[%d].}", ret);
4943     }
4944     return ret;
4945 }
4946 
4947 /* ****************************************************************************
4948  功能描述  : dmac_offload架构下同步sta vap信息到 dmac
4949  修改历史      :
4950   1.日    期   : 2014年12月31日
4951     作    者   : HiSilicon
4952     修改内容   : 新生成函数
4953 **************************************************************************** */
hmac_config_sta_vap_info_syn(const mac_vap_stru * mac_vap)4954 hi_u32 hmac_config_sta_vap_info_syn(const mac_vap_stru *mac_vap)
4955 {
4956     hi_u32 ret;
4957     mac_h2d_vap_info_stru mac_h2d_vap_info;
4958 
4959     mac_h2d_vap_info.us_sta_aid = mac_vap->us_sta_aid;
4960     mac_h2d_vap_info.uapsd_cap = mac_vap->uapsd_cap;
4961     /* **************************************************************************
4962         抛事件到DMAC层, 同步VAP最新状态到DMAC
4963     ************************************************************************** */
4964     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_STA_VAP_INFO_SYN, sizeof(mac_h2d_vap_info_stru),
4965         (hi_u8 *)(&mac_h2d_vap_info));
4966     if (oal_unlikely(ret != HI_SUCCESS)) {
4967         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
4968             "{hmac_config_sta_vap_info_syn::hmac_config_sta_vap_info_syn failed[%d].}", ret);
4969     }
4970     return ret;
4971 }
4972 
4973 #endif /* #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE) */
4974 
4975 #ifdef _PRE_WLAN_FEATURE_HIPRIV
4976 /* ****************************************************************************
4977  功能描述  : 设置VAP mib值
4978  输入参数  : [1]mac_vap
4979              [2]us_len
4980              [3]puc_param
4981  返 回 值  : hi_u32
4982 **************************************************************************** */
_hmac_config_set_mib(const mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)4983 hi_u32 _hmac_config_set_mib(const mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
4984 {
4985     /* 如果是配置VAP, 直接返回 */
4986     if (mac_vap->vap_mode == WLAN_VAP_MODE_CONFIG) {
4987         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{_hmac_config_set_mib::this is config vap! can't set.}");
4988         return HI_FAIL;
4989     }
4990 
4991     mac_config_set_mib(mac_vap, us_len, puc_param);
4992 
4993 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
4994     /* **************************************************************************
4995         抛事件到DMAC层, 同步DMAC数据
4996     ************************************************************************** */
4997     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_MIB, us_len, puc_param);
4998     if (oal_unlikely(ret != HI_SUCCESS)) {
4999         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
5000                          "{_hmac_config_set_mib::hmac_config_send_event failed[%d].}", ret);
5001     }
5002     return ret;
5003 #else
5004     return HI_SUCCESS;
5005 #endif
5006 }
5007 
5008 /* ****************************************************************************
5009  功能描述  : 获取VAP mib值
5010  输入参数  : [1]mac_vap
5011              [2]us_len
5012              [3]puc_param
5013  返 回 值  : hi_u32
5014 **************************************************************************** */
_hmac_config_get_mib(const mac_vap_stru * mac_vap,const hi_u8 * puc_param)5015 hi_u32 _hmac_config_get_mib(const mac_vap_stru *mac_vap, const hi_u8 *puc_param)
5016 {
5017     hi_u32 mib_value;
5018     hi_u32 mib_idx = *((hi_u32 *)puc_param);
5019 
5020     switch (mib_idx) {
5021         case WLAN_MIB_INDEX_SPEC_MGMT_IMPLEMENT:
5022             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_sta_config.dot11_spectrum_management_implemented;
5023             break;
5024 
5025         case WLAN_MIB_INDEX_FORTY_MHZ_OPERN_IMPLEMENT:
5026             mib_value = (hi_u32)mac_mib_get_forty_mhz_operation_implemented(mac_vap);
5027             break;
5028 
5029         case WLAN_MIB_INDEX_2040_COEXT_MGMT_SUPPORT:
5030             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot112040_bss_coexistence_management_support;
5031             break;
5032 
5033         case WLAN_MIB_INDEX_FORTY_MHZ_INTOL:
5034             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot11_forty_m_hz_intolerant;
5035             break;
5036 
5037         case WLAN_MIB_INDEX_OBSSSCAN_TRIGGER_INTERVAL:
5038             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot11_bss_width_trigger_scan_interval;
5039             break;
5040 
5041         case WLAN_MIB_INDEX_OBSSSCAN_TRANSITION_DELAY_FACTOR:
5042             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot11_bss_width_channel_transition_delay_factor;
5043             break;
5044 
5045         case WLAN_MIB_INDEX_OBSSSCAN_PASSIVE_DWELL:
5046             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot11_obss_scan_passive_dwell;
5047             break;
5048 
5049         case WLAN_MIB_INDEX_OBSSSCAN_ACTIVE_DWELL:
5050             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot11_obss_scan_active_dwell;
5051             break;
5052 
5053         case WLAN_MIB_INDEX_OBSSSCAN_PASSIVE_TOTAL_PER_CHANNEL:
5054             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot11_obss_scan_passive_total_per_channel;
5055             break;
5056 
5057         case WLAN_MIB_INDEX_OBSSSCAN_ACTIVE_TOTAL_PER_CHANNEL:
5058             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot11_obss_scan_active_total_per_channel;
5059             break;
5060 
5061         case WLAN_MIB_INDEX_OBSSSCAN_ACTIVITY_THRESHOLD:
5062             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_operation.dot11_obss_scan_activity_threshold;
5063             break;
5064 
5065 #ifdef _PRE_WLAN_FEATURE_MESH
5066         case WLAN_MIB_INDEX_MESH_ACCEPTING_PEER:
5067             mib_value = (hi_u32)mac_vap->mib_info->wlan_mib_mesh_sta_cfg.dot11_mesh_accepting_additional_peerings;
5068             break;
5069 #endif
5070         default:
5071             oam_error_log1(mac_vap->vap_id, OAM_SF_CFG, "{_hmac_config_get_mib::invalid ul_mib_idx[%d].}", mib_idx);
5072             return HI_FAIL;
5073     }
5074 
5075     oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{_hmac_config_get_mib::mib value=%d.}", mib_value);
5076 
5077     return HI_SUCCESS;
5078 }
5079 #endif
5080 
5081 /* ****************************************************************************
5082  功能描述  : 用户改变同步保护机制
5083  输入参数  : [1]mac_vap
5084              [2]us_len
5085              [3]puc_param
5086  返 回 值  : hi_u32
5087 **************************************************************************** */
hmac_protection_update_from_user(const mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)5088 hi_u32 hmac_protection_update_from_user(const mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
5089 {
5090     hi_u32 ret;
5091     /* **************************************************************************
5092         抛事件到DMAC层, 同步DMAC数据
5093     ************************************************************************** */
5094     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_PROTECTION_UPDATE_STA_USER, us_len, puc_param);
5095     if (ret != HI_SUCCESS) {
5096         hi_diag_log_msg_w0(0, "{hmac_config_set_protection::hmac_config_send_event_etc failed.}");
5097     }
5098     return ret;
5099 }
5100 
5101 /* ****************************************************************************
5102  函 数 名  : hmac_config_vap_state_syn
5103  功能描述  : HMAC同步vap状态到DMAC
5104     作    者   : HiSilicon
5105 **************************************************************************** */
hmac_config_vap_state_syn(const mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)5106 hi_u32 hmac_config_vap_state_syn(const mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
5107 {
5108     hi_u32 ret;
5109 
5110     /* **************************************************************************
5111         抛事件到DMAC层, 同步VAP最新状态到DMAC
5112     ************************************************************************** */
5113     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_VAP_STATE_SYN, us_len, puc_param);
5114     if (oal_unlikely(ret != HI_SUCCESS)) {
5115         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
5116                          "{hmac_config_vap_state_syn::hmac_config_send_event failed[%d].}", ret);
5117         return ret;
5118     }
5119 
5120     return ret;
5121 }
5122 
5123 /* ****************************************************************************
5124  功能描述  : dmac offload模式下hmac向dmac同步user cap info的所有内容
5125  修改历史      :
5126   1.日    期   : 2015年5月11日
5127     作    者   : HiSilicon
5128     修改内容   : 新生成函数
5129 **************************************************************************** */
hmac_config_user_cap_syn(const mac_vap_stru * mac_vap,const mac_user_stru * mac_user)5130 hi_u32 hmac_config_user_cap_syn(const mac_vap_stru *mac_vap, const mac_user_stru *mac_user)
5131 {
5132     hi_u32 ret;
5133     mac_h2d_usr_cap_stru mac_h2d_usr_cap;
5134 
5135     mac_h2d_usr_cap.user_idx = (hi_u8)mac_user->us_assoc_id;
5136     if (memcpy_s((hi_u8 *)(&mac_h2d_usr_cap.user_cap_info), sizeof(mac_user_cap_info_stru),
5137         (hi_u8 *)(&mac_user->cap_info), sizeof(mac_user_cap_info_stru)) != EOK) {
5138         oam_error_log0(0, OAM_SF_CFG, "hmac_config_user_cap_syn:: st_cap_info memcpy_s fail.");
5139         return HI_FAIL;
5140     }
5141     /* **************************************************************************
5142         抛事件到DMAC层, 同步VAP最新状态到DMAC
5143     ************************************************************************** */
5144     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_USER_CAP_SYN, sizeof(mac_h2d_usr_cap_stru),
5145         (hi_u8 *)(&mac_h2d_usr_cap));
5146     if (oal_unlikely(ret != HI_SUCCESS)) {
5147         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_user_cap_syn::send_event failed[%d].}", ret);
5148     }
5149     return ret;
5150 }
5151 
5152 /* ****************************************************************************
5153  功能描述  : dmac_offload架构下同步sta usr的状态到dmac
5154  修改历史      :
5155   1.日    期   : 2014年12月31日
5156     作    者   : HiSilicon
5157     修改内容   : 新生成函数
5158 **************************************************************************** */
hmac_config_user_info_syn(const mac_vap_stru * mac_vap,const mac_user_stru * mac_user)5159 hi_u32 hmac_config_user_info_syn(const mac_vap_stru *mac_vap, const mac_user_stru *mac_user)
5160 {
5161     hi_u32 ret;
5162     mac_h2d_usr_info_stru mac_h2d_usr_info;
5163 
5164     mac_h2d_usr_info.avail_bandwidth = mac_user->avail_bandwidth;
5165     mac_h2d_usr_info.cur_bandwidth = mac_user->cur_bandwidth;
5166     mac_h2d_usr_info.user_idx = (hi_u8)mac_user->us_assoc_id;
5167     mac_h2d_usr_info.user_pmf = mac_user->cap_info.pmf_active;
5168     mac_h2d_usr_info.arg1 = mac_user->ht_hdl.max_rx_ampdu_factor;
5169     mac_h2d_usr_info.arg2 = mac_user->ht_hdl.min_mpdu_start_spacing;
5170     mac_h2d_usr_info.user_asoc_state = mac_user->user_asoc_state;
5171 
5172     /* 协议模式信息同步到dmac */
5173     mac_h2d_usr_info.avail_protocol_mode = mac_user->avail_protocol_mode;
5174 
5175     mac_h2d_usr_info.cur_protocol_mode = mac_user->cur_protocol_mode;
5176     mac_h2d_usr_info.protocol_mode = mac_user->protocol_mode;
5177     mac_h2d_usr_info.bandwidth_cap = mac_user->bandwidth_cap;
5178 
5179     /* **************************************************************************
5180         抛事件到DMAC层, 同步VAP最新状态到DMAC
5181     ************************************************************************** */
5182     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_USR_INFO_SYN, sizeof(mac_h2d_usr_info),
5183         (hi_u8 *)(&mac_h2d_usr_info));
5184     if (oal_unlikely(ret != HI_SUCCESS)) {
5185         oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG,
5186             "{hmac_config_user_info_syn::hmac_config_send_event failed[%d],user_id[%d].}", ret, mac_user->us_assoc_id);
5187     }
5188 
5189     return ret;
5190 }
5191 
5192 /* ****************************************************************************
5193  功能描述  : 初始化用户的加密端口标志
5194  修改历史      :
5195   1.日    期   : 2015年5月13日
5196     作    者   : HiSilicon
5197     修改内容   : 新生成函数
5198 **************************************************************************** */
hmac_init_user_security_port(const mac_vap_stru * mac_vap,mac_user_stru * mac_user)5199 hi_u32 hmac_init_user_security_port(const mac_vap_stru *mac_vap, mac_user_stru *mac_user)
5200 {
5201 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
5202     hi_u32 ret;
5203     mac_cfg80211_init_port_stru init_port;
5204 #endif
5205     /* 初始化认证端口信息 */
5206     mac_vap_init_user_security_port(mac_vap, mac_user);
5207 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
5208     /* dmac offload模式下同步至device侧 */
5209     if (memcpy_s(init_port.auc_mac_addr, OAL_MAC_ADDR_LEN, mac_user->user_mac_addr, OAL_MAC_ADDR_LEN) != EOK) {
5210         oam_error_log0(0, OAM_SF_CFG, "hmac_init_user_security_port:: auc_user_mac_addr memcpy_s fail.");
5211         return HI_FAIL;
5212     }
5213     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_INIT_SECURTIY_PORT, OAL_MAC_ADDR_LEN, (hi_u8 *)&init_port);
5214     if (ret != HI_SUCCESS) {
5215         oam_error_log1(mac_vap->vap_id, OAM_SF_WPA,
5216             "{hmac_config_user_security_port::hmac_config_send_event failed[%d].}", ret);
5217         return ret;
5218     }
5219 #endif
5220     return HI_SUCCESS;
5221 }
5222 
5223 /* ****************************************************************************
5224  功能描述  : 配置用户关联状态,offload模式下同步信息到dmac
5225  修改历史      :
5226   1.日    期   : 2015年5月12日
5227     作    者   : HiSilicon
5228     修改内容   : 新生成函数
5229 **************************************************************************** */
hmac_user_set_asoc_state(const mac_vap_stru * mac_vap,mac_user_stru * mac_user,mac_user_asoc_state_enum_uint8 value)5230 hi_u32 hmac_user_set_asoc_state(const mac_vap_stru *mac_vap, mac_user_stru *mac_user,
5231     mac_user_asoc_state_enum_uint8 value)
5232 {
5233     mac_user_set_asoc_state(mac_user, value);
5234 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
5235     /* dmac offload架构下,同步user关联状态信息到dmac */
5236     hi_u32 ret = hmac_config_user_asoc_state_syn(mac_vap, mac_user);
5237     if (ret != HI_SUCCESS) {
5238         oam_error_log1(mac_vap->vap_id, OAM_SF_CFG,
5239                        "{hmac_user_set_asoc_state::user_asoc_state_syn failed[%d].}", ret);
5240     }
5241     return ret;
5242 #else
5243     hi_unref_param(mac_vap);
5244     return HI_SUCCESS;
5245 #endif
5246 }
5247 
5248 #ifdef _PRE_WLAN_FEATURE_HIPRIV
5249 /* ****************************************************************************
5250  功能描述  : 设置聚合最大个数
5251  修改历史      :
5252   1.日    期   : 2014年10月29日
5253     作    者   : HiSilicon
5254     修改内容   : 新生成函数
5255 **************************************************************************** */
hmac_config_set_ampdu_aggr_num(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)5256 hi_u32 hmac_config_set_ampdu_aggr_num(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
5257 {
5258     hi_u32 ret;
5259 
5260     /* **************************************************************************
5261         抛事件到DMAC层, 同步DMAC数据
5262     ************************************************************************** */
5263     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_AGGR_NUM, us_len, puc_param);
5264     if (oal_unlikely(ret != HI_SUCCESS)) {
5265         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
5266             "{hmac_config_set_ampdu_aggr_num::hmac_config_send_event failed[%d].}", ret);
5267     }
5268 
5269     return ret;
5270 }
5271 #endif
5272 
5273 /* ****************************************************************************
5274  功能描述  : 通过设置mib值, 设置AP的STBC能力
5275  修改历史      :
5276   1.日    期   : 2014年11月14日
5277     作    者   : HiSilicon
5278     修改内容   : 新生成函数
5279 **************************************************************************** */
hmac_config_set_stbc_cap(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)5280 hi_u32 hmac_config_set_stbc_cap(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
5281 {
5282     hi_u8 value = *puc_param;
5283 
5284     hi_unref_param(us_len);
5285 
5286     if (oal_unlikely(mac_vap->mib_info == HI_NULL)) {
5287         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_stbc_cap::pst_mac_vap->pst_mib_info null.}");
5288         return HI_ERR_CODE_PTR_NULL;
5289     }
5290 
5291     if (value == 0) {
5292         mac_vap->mib_info->phy_ht.dot11_tx_stbc_option_implemented = HI_FALSE;
5293         mac_vap->mib_info->phy_ht.dot11_rx_stbc_option_implemented = HI_FALSE;
5294         mac_vap->mib_info->phy_ht.dot11_tx_stbc_option_activated = HI_FALSE;
5295     } else {
5296         mac_vap->mib_info->phy_ht.dot11_tx_stbc_option_implemented = HI_TRUE;
5297         mac_vap->mib_info->phy_ht.dot11_rx_stbc_option_implemented = HI_TRUE;
5298         mac_vap->mib_info->phy_ht.dot11_tx_stbc_option_activated = HI_TRUE;
5299     }
5300 
5301 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE) /* hi1131-cb set at both side (HMAC to DMAC) */
5302     return hmac_config_send_event(mac_vap, WLAN_CFGID_SET_STBC_CAP, us_len, puc_param);
5303 #else
5304     return HI_SUCCESS;
5305 #endif
5306 }
5307 
5308 
5309 #ifdef _PRE_WLAN_FEATURE_SMP_SUPPORT
hmac_vap_start_xmit_check(oal_net_device_stru * netdev)5310 hi_u32 hmac_vap_start_xmit_check(oal_net_device_stru *netdev)
5311 {
5312     if (oal_unlikely(netdev == HI_NULL)) {
5313         oam_error_log0(0, OAM_SF_TX, "{wal_vap_start_xmit::pst_dev = HI_NULL!}\r\n");
5314         oal_netbuf_free(netbuf);
5315         return HI_SUCCESS;
5316     }
5317 
5318     /* 获取VAP结构体 */
5319     mac_vap_stru *mac_vap = (mac_vap_stru *)oal_net_dev_priv(netdev);
5320     /* 如果VAP结构体不存在,则丢弃报文 */
5321     if (oal_unlikely(mac_vap == HI_NULL)) {
5322         oam_error_log0(0, OAM_SF_TX, "{wal_vap_start_xmit::pst_vap = HI_NULL!}\r\n");
5323         oal_netbuf_free(netbuf);
5324         return HI_SUCCESS;
5325     }
5326 
5327     return HI_CONTINUE;
5328 }
5329 
5330 /* ****************************************************************************
5331  功能描述  : 挂接到VAP对应net_device结构体下的发送函数
5332  输入参数  : pst_buf: SKB结构体,其中data指针指向以太网头
5333              pst_dev: net_device结构体
5334  返 回 值  : HI_SUCCESS或其它错误码
5335  修改历史      :
5336   1.日    期   : 2012年11月6日
5337     作    者   : HiSilicon
5338     修改内容   : 新生成函数
5339 **************************************************************************** */
hmac_vap_start_xmit(oal_netbuf_stru * netbuf,oal_net_device_stru * netdev)5340 oal_net_dev_tx_enum hmac_vap_start_xmit(oal_netbuf_stru *netbuf, oal_net_device_stru *netdev)
5341 {
5342     hi_u32 ret = hmac_vap_start_xmit_check(netdev);
5343     if (ret == HI_SUCCESS) {
5344         return OAL_NETDEV_TX_OK;
5345     }
5346 
5347     mac_vap_stru *mac_vap = (mac_vap_stru *)oal_net_dev_priv(netdev);
5348 
5349     netbuf = oal_netbuf_unshare(netbuf);
5350     if (netbuf == HI_NULL) {
5351         oam_error_log0(0, OAM_SF_TX, "{wal_vap_start_xmit::the unshare netbuf = HI_NULL!}\r\n");
5352         return OAL_NETDEV_TX_OK;
5353     }
5354 
5355     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
5356     if (oal_unlikely(hmac_vap == HI_NULL)) {
5357         oam_error_log1(0, OAM_SF_TX, "{wal_vap_start_xmit::pst_hmac_vap[%d] = HI_NULL!}", mac_vap->vap_id);
5358         oal_netbuf_free(netbuf);
5359         return OAL_NETDEV_TX_OK;
5360     }
5361 
5362     /* 防止下行来包太多,造成软件处理来不及,造成软件积累包太多,skb内存不能及时释放,入队限制修改为300,
5363        MIPS降低后,这个值可以抬高 */
5364     if (oal_netbuf_list_num(&hmac_vap->tx_queue_head[hmac_vap->in_queue_id]) >= 300) { /* 300 用于判断 */
5365         /* 关键帧做100个缓存,保证关键帧的正常发送 */
5366         if (oal_netbuf_list_num(&hmac_vap->tx_queue_head[hmac_vap->in_queue_id]) < 400) { /* 400 用于判断 */
5367             hi_u8 data_type;
5368 
5369             data_type = mac_get_data_type_from_8023((hi_u8 *)oal_netbuf_payload(netbuf), MAC_NETBUFF_PAYLOAD_ETH);
5370             if ((data_type == MAC_DATA_EAPOL) ||
5371                 (data_type >= MAC_DATA_DHCP_DISCOVER && data_type <= MAC_DATA_DHCP_ACK) ||
5372                 (data_type == MAC_DATA_ARP_REQ) || (data_type == MAC_DATA_ARP_RSP)) {
5373                 hi_task_lock();
5374                 OAL_NETBUF_QUEUE_TAIL(&(hmac_vap->tx_queue_head[hmac_vap->in_queue_id]), netbuf);
5375                 hi_task_unlock();
5376             } else {
5377                 oal_netbuf_free(netbuf);
5378             }
5379         } else {
5380             oal_netbuf_free(netbuf);
5381         }
5382 
5383         if (g_tx_debug) {
5384             /* 增加维测信息,把tx_event_num的值打印出来,用户关连不上,或者一直ping不通,打开g_tx_debug开关,
5385                如果此时的值不为1,就属于异常 */
5386             oam_error_log1(mac_vap->vap_id, OAM_SF_TX, "{wal_vap_start_xmit::tx_event_num value is [%d].}",
5387                 (hi_s32)hi_atomic_read(&(hmac_vap->tx_event_num)));
5388             oal_io_print("wal_vap_start_xmit too fast\n");
5389         }
5390     } else {
5391         if (g_tx_debug) {
5392             oal_io_print("wal_vap_start_xmit enqueue and post event\n");
5393         }
5394 
5395         hi_task_lock();
5396         OAL_NETBUF_QUEUE_TAIL(&(hmac_vap->tx_queue_head[hmac_vap->in_queue_id]), netbuf);
5397         hi_task_unlock();
5398     }
5399 
5400     hmac_tx_post_event(mac_vap);
5401 
5402     return OAL_NETDEV_TX_OK;
5403 }
5404 
5405 #endif
5406 
hmac_bridge_vap_xmit_check(oal_netbuf_stru * netbuf,const oal_net_device_stru * netdev)5407 hi_u32 hmac_bridge_vap_xmit_check(oal_netbuf_stru *netbuf, const oal_net_device_stru *netdev)
5408 {
5409     if (oal_unlikely(netbuf == HI_NULL)) {
5410         oam_error_log0(0, OAM_SF_TX, "{hmac_bridge_vap_xmit::pst_buf = HI_NULL!}\r\n");
5411         return HI_FAIL;
5412     }
5413 
5414     if (oal_unlikely(netdev == HI_NULL)) {
5415         oam_error_log0(0, OAM_SF_TX, "{hmac_bridge_vap_xmit::pst_dev = HI_NULL!}\r\n");
5416         oal_netbuf_free(netbuf);
5417         return HI_FAIL;
5418     }
5419 
5420     /* 获取VAP结构体, 如果VAP结构体不存在,则丢弃报文 */
5421     mac_vap_stru *mac_vap = (mac_vap_stru *)oal_net_dev_priv(netdev);
5422     if (oal_unlikely(mac_vap == HI_NULL)) {
5423         oam_error_log0(0, OAM_SF_TX, "{hmac_bridge_vap_xmit::pst_vap = HI_NULL!}\r\n");
5424         oal_netbuf_free(netbuf);
5425         return HI_FAIL;
5426     }
5427 
5428     hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
5429     if (hmac_vap == HI_NULL) {
5430         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_bridge_vap_xmit::pst_hmac_vap null.}");
5431         oal_netbuf_free(netbuf);
5432         return HI_FAIL;
5433     }
5434 
5435 #ifdef _PRE_WLAN_FEATURE_ALWAYS_TX
5436     if (mac_vap->al_tx_flag == HI_SWITCH_ON) {
5437         oam_warning_log0(mac_vap->vap_id, OAM_SF_TX, "{hmac_bridge_vap_xmit::the vap alway tx/rx!}");
5438         oal_netbuf_free(netbuf);
5439         return HI_FAIL;
5440     }
5441 #endif
5442 
5443     return HI_SUCCESS;
5444 }
5445 
5446 /* ****************************************************************************
5447  功能描述  : 挂接到VAP对应net_device结构体下的发送函数
5448  输入参数  : pst_buf: SKB结构体,其中data指针指向以太网头
5449              pst_dev: net_device结构体
5450  返 回 值  : HI_SUCCESS或其它错误码
5451  修改历史      :
5452   1.日    期   : 2012年11月6日
5453     作    者   : HiSilicon
5454     修改内容   : 新生成函数
5455 **************************************************************************** */
hmac_bridge_vap_xmit(oal_net_device_stru * netdev,oal_netbuf_stru * netbuf)5456 oal_net_dev_tx_enum hmac_bridge_vap_xmit(oal_net_device_stru *netdev, oal_netbuf_stru *netbuf)
5457 {
5458     if (hmac_bridge_vap_xmit_check(netbuf, netdev) == HI_FAIL) {
5459         return OAL_NETDEV_TX_OK;
5460     }
5461 
5462     mac_vap_stru *mac_vap = (mac_vap_stru *)oal_net_dev_priv(netdev);
5463 
5464 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
5465     netbuf = oal_netbuf_unshare(netbuf);
5466 #elif (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
5467     netbuf = oal_netbuf_unshare(netbuf, GFP_ATOMIC);
5468 #endif
5469     if (oal_unlikely(netbuf == HI_NULL)) {
5470         oam_warning_log0(mac_vap->vap_id, OAM_SF_TX, "{hmac_bridge_vap_xmit::the unshare netbuf = HI_NULL!}");
5471         return OAL_NETDEV_TX_OK;
5472     }
5473 
5474 #ifdef _PRE_WLAN_FEATURE_WOW
5475     /* wow 过滤开关 */
5476     if (HI_TRUE == hmac_wow_tx_check_filter_switch()) {
5477         oal_netbuf_free(netbuf);
5478         return OAL_NETDEV_TX_OK;
5479     }
5480 #endif
5481 
5482     /* 判断VAP的状态,如果没有UP/PAUSE,则丢弃报文 */
5483     if (oal_unlikely(!((mac_vap->vap_state == MAC_VAP_STATE_UP) || (mac_vap->vap_state == MAC_VAP_STATE_PAUSE)))) {
5484         oam_info_log1(mac_vap->vap_id, OAM_SF_TX, "{hmac_bridge_vap_xmit::vap state[%d] != MAC_VAP_STATE_{UP|PAUSE}}",
5485             mac_vap->vap_state);
5486         oal_netbuf_free(netbuf);
5487         return OAL_NETDEV_TX_OK;
5488     }
5489 
5490 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
5491     /* 在将cb字段清零前,将extflag取出 */
5492     hi_u16 us_pbuf_flags = *((hi_u16 *)(netbuf->cb));
5493 #endif
5494 
5495     set_oal_netbuf_next(netbuf, HI_NULL);
5496     set_oal_netbuf_prev(netbuf, HI_NULL);
5497 
5498     /* 安全编程规则6.6例外(1) 固定长度的结构体进行内存初始化 */
5499     memset_s(oal_netbuf_cb(netbuf), oal_netbuf_cb_size(), 0, oal_netbuf_cb_size());
5500 
5501 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
5502     /* 对cb 字段中的extflag赋值 */
5503     if (mac_vap->vap_mode == WLAN_VAP_MODE_MESH) {
5504         hmac_tx_ctl_stru *tx_ctl = (hmac_tx_ctl_stru *)oal_netbuf_cb(netbuf);
5505         /*
5506         us_pbuf_flags:
5507         |BIT13       |BIT12           |
5508         |Ctrl PKT    |Compressed 6lo  |
5509         */
5510         tx_ctl->pbuf_flags = (us_pbuf_flags & (PBUF_FLAG_6LO_PKT | PBUF_FLAG_CTRL_PKT)) >> 12; /* 右移12位 */
5511     }
5512 #endif
5513 
5514     oal_net_dev_tx_enum ret_value = (hmac_tx_lan_to_wlan(mac_vap, netbuf) != HI_SUCCESS) ?
5515         OAL_NETDEV_TX_BUSY : OAL_NETDEV_TX_OK;
5516     if (oal_unlikely(ret_value != OAL_NETDEV_TX_OK)) {
5517         hmac_free_netbuf_list(netbuf);
5518     }
5519 
5520     return OAL_NETDEV_TX_OK;
5521 }
5522 
5523 /* ****************************************************************************
5524  功能描述  : 扫描终止
5525  修改历史      :
5526   1.日    期   : 2015年6月9日
5527     作    者   : HiSilicon
5528     修改内容   : 新生成函数
5529 **************************************************************************** */
hmac_config_scan_abort(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)5530 hi_u32 hmac_config_scan_abort(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
5531 {
5532     hmac_vap_stru *hmac_vap = HI_NULL;
5533     hmac_device_stru *hmac_dev = HI_NULL;
5534     hi_u32 ret;
5535 
5536     oam_warning_log1(mac_vap->vap_id, OAM_SF_SCAN,
5537                      "{hmac_config_scan_abort::vap_id[%d] scan abort.}", mac_vap->vap_id);
5538 
5539     hmac_dev = hmac_get_device_stru();
5540 
5541     /* 若下发的是ANY扫描,结束扫描的时候恢复标志为非ANY扫描,若下发的非ANY扫描,这里赋该值无影响 */
5542     hmac_dev->scan_mgmt.scan_record_mgmt.is_any_scan = HI_FALSE;
5543 
5544     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
5545     if (hmac_vap == HI_NULL) {
5546         oam_warning_log1(mac_vap->vap_id, OAM_SF_SCAN, "{hmac_config_scan_abort::pst_hmac_vap is null, vap_id[%d].}",
5547             mac_vap->vap_id);
5548         return HI_ERR_CODE_MAC_DEVICE_NULL;
5549     }
5550 
5551     if (((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP)
5552 #ifdef _PRE_WLAN_FEATURE_MESH
5553         || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
5554 #endif
5555         ) && (hmac_dev->scan_mgmt.scan_record_mgmt.vap_last_state != MAC_VAP_STATE_BUTT)) {
5556         oam_warning_log1(0, OAM_SF_SCAN,
5557                          "{hmac_config_scan_abort::en_vap_last_state:%d}",
5558                          hmac_dev->scan_mgmt.scan_record_mgmt.vap_last_state);
5559         hmac_fsm_change_state(hmac_vap, hmac_dev->scan_mgmt.scan_record_mgmt.vap_last_state);
5560         hmac_dev->scan_mgmt.scan_record_mgmt.vap_last_state = MAC_VAP_STATE_BUTT;
5561     }
5562     /* 清除扫描结果上报的回调函数,无需上报 */
5563     if (hmac_dev->scan_mgmt.scan_record_mgmt.vap_id == mac_vap->vap_id) {
5564         hmac_dev->scan_mgmt.scan_record_mgmt.fn_cb = HI_NULL;
5565         hmac_dev->scan_mgmt.is_scanning = HI_FALSE;
5566     }
5567 
5568     /* **************************************************************************
5569                          抛事件到DMAC层, 同步DMAC数据
5570     ************************************************************************** */
5571     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SCAN_ABORT, us_len, puc_param);
5572     if (oal_unlikely(ret != HI_SUCCESS)) {
5573         oam_warning_log1(mac_vap->vap_id, OAM_SF_SCAN,
5574                          "{hmac_config_scan_abort::hmac_config_send_event failed[%d].}", ret);
5575         return ret;
5576     }
5577 
5578     return HI_SUCCESS;
5579 }
5580 
5581 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
5582 /* ****************************************************************************
5583  功能描述  :host侧查询station info
5584  输入参数  : pst_mac_vap: mac_vap_stru
5585              us_len       : 参数长度
5586              puc_param    : 参数
5587  返 回 值  : 错误码
5588  修改历史      :
5589   1.日    期   : 2014年11月27日
5590     作    者   : HiSilicon
5591     修改内容   : 新生成函数
5592 **************************************************************************** */
hmac_config_query_station_info(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)5593 hi_u32 hmac_config_query_station_info(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
5594 {
5595     hi_u32 ret;
5596 
5597     /* **************************************************************************
5598         抛事件到DMAC层, 同步DMAC数据
5599     ************************************************************************** */
5600     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_QUERY_STATION_STATS, us_len, puc_param);
5601     if (oal_unlikely(ret != HI_SUCCESS)) {
5602         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
5603                          "{hmac_config_phy_stat_info::hmac_config_send_event failed[%d].}", ret);
5604     }
5605 
5606     return ret;
5607 }
5608 #endif
5609 
5610 #ifdef _PRE_WLAN_FEATURE_BTCOEX
5611 /* ****************************************************************************
5612  功能描述  : 共存删除BA会话
5613  修改历史      :
5614   1.日    期   : 2015年7月24日
5615     作    者   : HiSilicon
5616     修改内容   : 新生成函数
5617 **************************************************************************** */
hmac_btcoex_delba_foreach_tid(mac_vap_stru * mac_vap,const mac_user_stru * mac_user,mac_cfg_delba_req_param_stru * mac_cfg_delba_param)5618 static hi_u32 hmac_btcoex_delba_foreach_tid(mac_vap_stru *mac_vap, const mac_user_stru *mac_user,
5619     mac_cfg_delba_req_param_stru *mac_cfg_delba_param)
5620 {
5621     hi_u32 ret = 0;
5622 
5623     if (memcpy_s(mac_cfg_delba_param->auc_mac_addr, WLAN_MAC_ADDR_LEN,
5624                  mac_user->user_mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
5625         oam_error_log0(0, 0, "{hmac_btcoex_delba_foreach_tid::mem safe function err!}");
5626         return HI_FAIL;
5627     }
5628 
5629     for (mac_cfg_delba_param->tidno = 0; mac_cfg_delba_param->tidno < WLAN_TID_MAX_NUM; mac_cfg_delba_param->tidno++) {
5630         ret = hmac_config_delba_req(mac_vap, 0, (hi_u8 *)mac_cfg_delba_param);
5631         if (ret != HI_SUCCESS) {
5632             oam_warning_log2(mac_vap->vap_id, OAM_SF_COEX, "{hmac_btcoex_delba_foreach_tid::ul_ret: %d, tid: %d}", ret,
5633                 mac_cfg_delba_param->tidno);
5634             return ret;
5635         }
5636     }
5637     return ret;
5638 }
5639 
5640 /* ****************************************************************************
5641  功能描述  : hmac删除BA
5642  修改历史      :
5643   1.日    期   : 2015年7月24日
5644     作    者   : HiSilicon
5645     修改内容   : 新生成函数
5646 **************************************************************************** */
hmac_btcoex_delba_foreach_user(mac_vap_stru * mac_vap)5647 hi_u32 hmac_btcoex_delba_foreach_user(mac_vap_stru *mac_vap)
5648 {
5649     hi_u32 ret = 0;
5650     mac_cfg_delba_req_param_stru mac_cfg_delba_param;
5651     mac_user_stru *mac_user = HI_NULL;
5652     hi_u8 user_idx;
5653     hi_list *entry = HI_NULL;
5654     mac_res_user_hash_stru *res_hash = HI_NULL;
5655 
5656     mac_cfg_delba_param.direction = MAC_RECIPIENT_DELBA;
5657 
5658     for (user_idx = 0; user_idx < MAC_VAP_USER_HASH_MAX_VALUE; user_idx++) {
5659         hi_list_for_each(entry, &(mac_vap->ast_user_hash[user_idx])) {
5660             res_hash = (mac_res_user_hash_stru *)entry;
5661 
5662             mac_user = mac_user_get_user_stru(res_hash->user_idx);
5663             if (mac_user == HI_NULL) {
5664                 oam_warning_log1(mac_vap->vap_id, OAM_SF_COEX,
5665                     "{hmac_btcoex_delba_foreach_user::pst_mac_user null, user_idx: %d.}", res_hash->user_idx);
5666                 entry = res_hash->entry.next;
5667                 continue;
5668             }
5669             ret = hmac_btcoex_delba_foreach_tid(mac_vap, mac_user, &mac_cfg_delba_param);
5670             if (ret != HI_SUCCESS) {
5671                 return ret;
5672             }
5673         }
5674     }
5675 
5676     return ret;
5677 }
5678 
5679 /* ****************************************************************************
5680  功能描述  : hmac删除BA
5681  修改历史      :
5682   1.日    期   : 2015年7月24日
5683     作    者   : HiSilicon
5684     修改内容   : 新生成函数
5685 **************************************************************************** */
hmac_btcoex_rx_delba_trigger(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * puc_param)5686 hi_u32 hmac_btcoex_rx_delba_trigger(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *puc_param)
5687 {
5688     hmac_device_stru *hmac_dev = HI_NULL;
5689     d2h_btcoex_delba_event_stru *d2h_btcoex_delba = HI_NULL;
5690     hi_u32 ret;
5691 
5692     hi_unref_param(len);
5693 
5694     hmac_dev = hmac_get_device_stru();
5695     d2h_btcoex_delba = (d2h_btcoex_delba_event_stru *)puc_param;
5696 
5697     hmac_dev->d2h_btcoex_delba.need_delba = d2h_btcoex_delba->need_delba;
5698     hmac_dev->d2h_btcoex_delba.ba_size = d2h_btcoex_delba->ba_size;
5699     if (hmac_dev->d2h_btcoex_delba.need_delba) {
5700         ret = hmac_btcoex_delba_foreach_user(mac_vap);
5701         if (ret != HI_SUCCESS) {
5702             oam_warning_log1(mac_vap->vap_id, OAM_SF_COEX, "{hmac_btcoex_syn:delba send failed:ul_ret: %d}", ret);
5703             return ret;
5704         }
5705     }
5706     return HI_SUCCESS;
5707 }
5708 #endif
5709 
5710 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
5711 #ifdef _PRE_WLAN_FEATURE_HIPRIV
5712 /* ****************************************************************************
5713  功能描述  : reg_info test
5714  修改历史      :
5715   1.日    期   : 2015年7月24日
5716     作    者   : HiSilicon
5717     修改内容   : 新生成函数
5718 **************************************************************************** */
hmac_wifitest_get_reg_info(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * puc_param)5719 hi_u32 hmac_wifitest_get_reg_info(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *puc_param)
5720 {
5721     hmac_reg_info_receive_event *dmac_reg_info_response_event = HI_NULL;
5722     hmac_vap_stru *hmac_vap = HI_NULL;
5723 
5724     hi_unref_param(len);
5725 
5726     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
5727     if (hmac_vap == HI_NULL) {
5728         oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_wifitest_get_reg_info::pst_hmac_vap null.}");
5729         return HI_ERR_CODE_PTR_NULL;
5730     }
5731     mac_vap = hmac_vap->base_vap;
5732     dmac_reg_info_response_event = (hmac_reg_info_receive_event *)puc_param;
5733     g_hmac_reg_info_receive_event.reg_info_num = dmac_reg_info_response_event->reg_info_num;
5734     if (g_hmac_reg_info_receive_event.reg_info_num > REG_INFO_MAX_NUM) {
5735         oam_error_log1(mac_vap->vap_id, OAM_SF_ANY, "hmac_wifitest_get_reg_info:: reg numb is out of range[%d]",
5736             g_hmac_reg_info_receive_event.reg_info_num);
5737         return HI_FAIL;
5738     }
5739     while (dmac_reg_info_response_event->reg_info_num) {
5740         g_hmac_reg_info_receive_event.val[dmac_reg_info_response_event->reg_info_num - 1] =
5741             dmac_reg_info_response_event->val[dmac_reg_info_response_event->reg_info_num - 1];
5742         dmac_reg_info_response_event->reg_info_num--;
5743     }
5744 
5745     g_hmac_reg_info_receive_event.flag = HI_TRUE;
5746     hi_wait_queue_wake_up_interrupt(&(hmac_vap->query_wait_q));
5747 
5748     return HI_SUCCESS;
5749 }
5750 #endif
5751 #endif
5752 
5753 /* ****************************************************************************
5754  功能描述  : 输出常收结果
5755  修改历史      :
5756   1.日    期   : 2019年6月25日
5757     作    者   : HiSilicon
5758     修改内容   : 新生成函数
5759 **************************************************************************** */
hmac_get_rx_fcs_info(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * param)5760 hi_u32 hmac_get_rx_fcs_info(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *param)
5761 {
5762     hi_u32 succ_num;
5763     if (mac_vap == HI_NULL || param == HI_NULL) {
5764         oam_error_log2(0, OAM_SF_ANY, "{hmac_get_rx_fcs_info::pst_mac_vap[%p] NULL or pst_param[%p] NULL!}",
5765             (uintptr_t)mac_vap, (uintptr_t)param);
5766         return HI_ERR_CODE_PTR_NULL;
5767     }
5768     hi_unref_param(len);
5769     hi_unref_param(mac_vap);
5770 
5771     succ_num = *((hi_u32 *)param);
5772     /* 勿删,自动化测试需要用 */
5773 #ifdef CUSTOM_AT_COMMAND
5774     hi_at_printf("+RXINFO:%d\r\n", succ_num);
5775     hi_at_printf("OK\r\n");
5776 #endif
5777 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
5778     printk("+RXINFO:%d\r\n", succ_num);
5779     printk("OK\r\n");
5780 #endif
5781     return HI_SUCCESS;
5782 }
5783 
5784 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
hmac_print_ate_paras(const oal_at_rsp_stru * rsp,const hi_u8 * param,hi_u8 len)5785 hi_u32 hmac_print_ate_paras(const oal_at_rsp_stru *rsp, const hi_u8 *param, hi_u8 len)
5786 {
5787     if ((len < ((OAL_AT_ATE_PARAS_BUTT + 1) << 2)) || (rsp->data_num != OAL_AT_ATE_PARAS_BUTT)) { /* 2:每个字段4字节 */
5788         printk("ERROR\r\nReport data len invalid,len %d, data_num %d\r\n", len, rsp->data_num);
5789         return HI_FAIL;
5790     }
5791     hi_u32 *data = (hi_u32 *)(param + sizeof(oal_at_rsp_stru));
5792     printk("+RCALDATA:Efuse cali chance(s) left:%d times.\r\n", *((hi_s32 *)&data[OAL_AT_ATE_PARAS_USED_CNT]));
5793     printk("+RCALDATA:freq_offset %d\r\n", *((hi_s32 *)&data[OAL_AT_ATE_PARAS_FREQ_OFFSET]));
5794     printk("+RCALDATA:band_pwr_offset_0 %d\r\n", *((hi_s32 *)&data[OAL_AT_ATE_PARAS_BPWR_OFFSET_0]));
5795     printk("+RCALDATA:band_pwr_offset_1 %d\r\n", *((hi_s32 *)&data[OAL_AT_ATE_PARAS_BPWR_OFFSET_1]));
5796     printk("+RCALDATA:band_pwr_offset_2 %d\r\n", *((hi_s32 *)&data[OAL_AT_ATE_PARAS_BPWR_OFFSET_2]));
5797 
5798     printk("+RCALDATA:rate_pwr_offset_11n 0x%x\r\n", data[OAL_AT_ATE_PARAS_DBB_OFFSET_11N]);
5799     printk("+RCALDATA:rate_pwr_offset_11g 0x%x\r\n", data[OAL_AT_ATE_PARAS_DBB_OFFSET_11G]);
5800     printk("+RCALDATA:rate_pwr_offset_11b 0x%x\r\n", data[OAL_AT_ATE_PARAS_DBB_OFFSET_11B]);
5801     printk("+RCALDATA:dbb_scale_0 0x%x\r\n", data[OAL_AT_ATE_PARAS_DBB_SCALE_0]);
5802     printk("+RCALDATA:dbb_scale_1 0x%x\r\n", data[OAL_AT_ATE_PARAS_DBB_SCALE_1]);
5803     printk("+RCALDATA:dbb_scale_2 0x%x\r\n", data[OAL_AT_ATE_PARAS_DBB_SCALE_2]);
5804     printk("+RCALDATA:dbb_scale_3 0x%x\r\n", data[OAL_AT_ATE_PARAS_DBB_SCALE_3]);
5805     printk("+RCALDATA:dbb_scale_4 0x%x\r\n", data[OAL_AT_ATE_PARAS_DBB_SCALE_4]);
5806     printk("+RCALDATA:freq_and_band_pwr_hybrid_offset 0x%x\r\n", data[OAL_AT_ATE_PARAS_HYBRID_DATA]);
5807 
5808     return HI_SUCCESS;
5809 }
5810 
hmac_print_ate_mac(const oal_at_rsp_stru * rsp,const hi_u8 * param,hi_u8 len)5811 hi_u32 hmac_print_ate_mac(const oal_at_rsp_stru *rsp, const hi_u8 *param, hi_u8 len)
5812 {
5813     if ((len < ((OAL_AT_ATE_MAC_BUTT + 1) << 2)) || (rsp->data_num != OAL_AT_ATE_MAC_BUTT)) { /* 2:每个字段4字节 */
5814         printk("ERROR\r\nReport data len invalid,len %d, data_num %d\r\n", len, rsp->data_num);
5815         return HI_FAIL;
5816     }
5817     hi_u8 *mac = (hi_u8 *)(param + sizeof(oal_at_rsp_stru));
5818 
5819     printk("+EFUSEMAC:XX:XX:XX:%02x:%02x:%02x\r\n", mac[3], mac[4], mac[5]); /* 0 1 2 3 4 5:mac地址偏移 */
5820     hi_u32 *times_left = (hi_u32 *)(param + sizeof(oal_at_rsp_stru) + AT_ATE_MAC_SIZE);
5821     printk("+EFUSEMAC:Efuse mac chance(s) left:%d times.\r\n", *times_left); /* 剩余写机会总数 */
5822 
5823     return HI_SUCCESS;
5824 }
5825 
hmac_report_mfg_test(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * param)5826 hi_u32 hmac_report_mfg_test(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *param)
5827 {
5828     if (mac_vap == HI_NULL || param == HI_NULL) {
5829         oam_error_log2(0, OAM_SF_ANY, "{hmac_config_set_pm_switch::pst_mac_vap[%p] NULL or pst_param[%p] NULL!}",
5830             (uintptr_t)mac_vap, (uintptr_t)param);
5831         return HI_ERR_CODE_PTR_NULL;
5832     }
5833     hi_unref_param(mac_vap);
5834 
5835     if (len < sizeof(oal_at_rsp_stru)) {
5836         printk("ERROR\r\nRsp format error\r\n");
5837         return HI_SUCCESS;
5838     }
5839     oal_at_rsp_stru *rsp = (oal_at_rsp_stru *)param;
5840     if (rsp->result != 0) { /* 失败 */
5841         printk("ERROR\r\n");
5842         return HI_SUCCESS;
5843     } else if (rsp->num != 0) { /* 需打印内容 */
5844         switch (rsp->num) {
5845             case AT_RSP_ATE_PARAS:
5846                 if (hmac_print_ate_paras(rsp, param, len) != HI_SUCCESS) {
5847                     return HI_SUCCESS;
5848                 }
5849                 break;
5850             case AT_RSP_ATE_MAC:
5851                 if (hmac_print_ate_mac(rsp, param, len) != HI_SUCCESS) {
5852                     return HI_SUCCESS;
5853                 }
5854                 break;
5855             default:
5856                 printk("ERROR\r\nInvalid rsp num %d\r\n", rsp->result);
5857                 return HI_SUCCESS;
5858         }
5859     }
5860     printk("OK\r\n");
5861     return HI_SUCCESS;
5862 }
5863 #endif
5864 
hmac_report_mac_from_efuse(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * param)5865 hi_u32 hmac_report_mac_from_efuse(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *param)
5866 {
5867     frw_event_mem_stru         *event_mem = HI_NULL;
5868     frw_event_stru             *event = HI_NULL;
5869     hi_u32                      ret;
5870     hi_unref_param(len);
5871 
5872     if (param == HI_NULL) {
5873         oam_error_log0(0, OAM_SF_CFG, "{hmac_report_mac_from_efuse::puc_param is null!}\r\n");
5874         return HI_ERR_CODE_PTR_NULL;
5875     }
5876 
5877     /* 抛事件到WAL */
5878     event_mem = frw_event_alloc(ETHER_ADDR_LEN);
5879     if (event_mem == HI_NULL) {
5880         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_report_mac_from_efuse::event_mem null.}");
5881         return HI_ERR_CODE_PTR_NULL;
5882     }
5883 
5884     /* 填写事件 */
5885     event = (frw_event_stru *)event_mem->puc_data;
5886     frw_event_hdr_init(&(event->event_hdr), FRW_EVENT_TYPE_HOST_CTX, HMAC_HOST_CTX_EVENT_GET_MAC_FROM_EFUSE,
5887         WLAN_MAC_ADDR_LEN, FRW_EVENT_PIPELINE_STAGE_0, mac_vap->vap_id);
5888 
5889     if (memcpy_s(event->auc_event_data, WLAN_MAC_ADDR_LEN, param, WLAN_MAC_ADDR_LEN) != EOK) {
5890         oam_error_log0(0, OAM_SF_CFG, "hmac_report_mac_from_efuse:: param memcpy fail.");
5891         return HI_FAIL;
5892     }
5893     /* 分发事件到WAL层 */
5894     ret = frw_event_dispatch_event(event_mem);
5895     if (ret != HI_SUCCESS) {
5896         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
5897             "{hmac_report_mac_from_efuse::frw_event_dispatch_event fail[%d].}", ret);
5898         frw_event_free(event_mem);
5899         return ret;
5900     }
5901     frw_event_free(event_mem);
5902     return HI_SUCCESS;
5903 }
5904 
hmac_config_report_tx_params(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * param)5905 hi_u32 hmac_config_report_tx_params(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *param)
5906 {
5907     frw_event_mem_stru         *event_mem = HI_NULL;
5908     frw_event_stru             *event = HI_NULL;
5909     hi_u32                      ret;
5910     hi_unref_param(len);
5911 
5912     if (param == HI_NULL) {
5913         oam_error_log0(0, OAM_SF_CFG, "{hmac_config_report_theory_goodput::puc_param is null!}\r\n");
5914         return HI_ERR_CODE_PTR_NULL;
5915     }
5916 
5917     /* 抛事件到WAL */
5918     event_mem = frw_event_alloc(sizeof(hamc_config_report_tx_params_stru) * WLAN_WME_AC_BUTT);
5919     if (event_mem == HI_NULL) {
5920         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_report_theory_goodput::event_mem null.}");
5921         return HI_ERR_CODE_PTR_NULL;
5922     }
5923 
5924     /* 填写事件 */
5925     event = (frw_event_stru *)event_mem->puc_data;
5926     frw_event_hdr_init(&(event->event_hdr), FRW_EVENT_TYPE_HOST_CTX, HMAC_HOST_CTX_EVENT_REPORT_TX_PARAMS,
5927         sizeof(hamc_config_report_tx_params_stru) * WLAN_WME_AC_BUTT, FRW_EVENT_PIPELINE_STAGE_0, mac_vap->vap_id);
5928 
5929     if (memcpy_s(event->auc_event_data, sizeof(hamc_config_report_tx_params_stru) * WLAN_WME_AC_BUTT, param,
5930         sizeof(hamc_config_report_tx_params_stru) * WLAN_WME_AC_BUTT) != EOK) {
5931         oam_error_log0(0, OAM_SF_CFG, "hmac_config_report_theory_goodput:: param memcpy fail.");
5932         return HI_FAIL;
5933     }
5934 
5935     /* 分发事件到WAL层 */
5936     ret = frw_event_dispatch_event(event_mem);
5937     if (ret != HI_SUCCESS) {
5938         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
5939             "{hmac_config_report_theory_goodput::frw_event_dispatch_event fail[%d].}", ret);
5940         frw_event_free(event_mem);
5941         return ret;
5942     }
5943 
5944     frw_event_free(event_mem);
5945     return HI_SUCCESS;
5946 }
5947 
5948 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
hmac_report_dbg_cal_data_from_dev(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * param)5949 hi_u32 hmac_report_dbg_cal_data_from_dev(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *param)
5950 {
5951     frw_event_mem_stru         *event_mem = HI_NULL;
5952     frw_event_stru             *event = HI_NULL;
5953     hi_u32                      ret;
5954     hi_unref_param(len);
5955     const hi_u8 data_size = 28; /* 28:7个补偿值,每个4字节 */
5956     if (mac_vap == HI_NULL || param == HI_NULL) {
5957         oam_error_log2(0, OAM_SF_ANY, "{hmac_report_dbg_cal_data_from_dev::mac_vap[%p] NULL or param[%p] NULL!}",
5958             (uintptr_t)mac_vap, (uintptr_t)param);
5959         return HI_ERR_CODE_PTR_NULL;
5960     }
5961 
5962     /* 抛事件到WAL */
5963     event_mem = frw_event_alloc(data_size);
5964     if (event_mem == HI_NULL) {
5965         oam_error_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_report_dbg_cal_data_from_dev::event_mem null.}");
5966         return HI_ERR_CODE_PTR_NULL;
5967     }
5968 
5969     /* 填写事件 */
5970     event = (frw_event_stru *)event_mem->puc_data;
5971     frw_event_hdr_init(&(event->event_hdr), FRW_EVENT_TYPE_HOST_CTX, HMAC_HOST_CTX_EVENT_GET_DBG_CAL_DATA,
5972         WLAN_MAC_ADDR_LEN, FRW_EVENT_PIPELINE_STAGE_0, mac_vap->vap_id);
5973 
5974     if (memcpy_s(event->auc_event_data, data_size, param, data_size) != EOK) {
5975         oam_error_log0(0, 0, "hmac_report_dbg_cal_data_from_dev:: memcpy_s fail.");
5976         return HI_FAIL;
5977     }
5978     /* 分发事件到WAL层 */
5979     ret = frw_event_dispatch_event(event_mem);
5980     if (ret != HI_SUCCESS) {
5981         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
5982             "{hmac_report_dbg_cal_data_from_dev::frw_event_dispatch_event fail[%d].}", ret);
5983         frw_event_free(event_mem);
5984         return ret;
5985     }
5986     frw_event_free(event_mem);
5987     return HI_SUCCESS;
5988 }
5989 #endif
5990 
5991 /* ****************************************************************************
5992  功能描述  : hmac接收dmac抛回来的查询RSSI应答
5993  修改历史      :
5994   1.日    期   : 2019年6月26日
5995     作    者   : HiSilicon
5996     修改内容   : 新生成函数
5997 **************************************************************************** */
hmac_proc_query_rssi_response(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * puc_param)5998 hi_u32 hmac_proc_query_rssi_response(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *puc_param)
5999 {
6000     hmac_vap_stru *hmac_vap = HI_NULL;
6001     wlan_rssi_stru *rssi_param = HI_NULL;
6002 
6003     hi_unref_param(len);
6004     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
6005         oam_error_log2(0, OAM_SF_ANY, "{hmac_proc_query_rssi_response::mac_vap[%p] NULL or pst_puc_param[%p] NULL!}",
6006             (uintptr_t)mac_vap, (uintptr_t)puc_param);
6007         return HI_ERR_CODE_PTR_NULL;
6008     }
6009     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
6010     if (hmac_vap == HI_NULL) {
6011         oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_query_response::pst_hmac_vap null.}");
6012         return HI_FAIL;
6013     }
6014 
6015     rssi_param = (wlan_rssi_stru *)puc_param;
6016     hmac_vap->ap_rssi = rssi_param->rssi;
6017     hmac_vap->query_ap_rssi_flag = HI_TRUE;
6018     hi_wait_queue_wake_up_interrupt(&(hmac_vap->query_wait_q));
6019 
6020     return HI_SUCCESS;
6021 }
6022 
6023 #ifdef _PRE_WLAN_FEATURE_STA_UAPSD
6024 /* ****************************************************************************
6025  功能描述  : sta uspad 配置命令
6026  修改历史      :
6027   1.日    期   : 2015年2月5日
6028     作    者   : HiSilicon
6029     修改内容   : 新生成函数
6030 **************************************************************************** */
hmac_config_set_uapsd_para(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6031 hi_u32 hmac_config_set_uapsd_para(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6032 {
6033     mac_cfg_uapsd_sta_stru *uapsd_param = HI_NULL;
6034     mac_device_stru *mac_dev = HI_NULL;
6035 
6036 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
6037     hi_u32 ret;
6038 #endif
6039 
6040     /* wmm */
6041     mac_dev = mac_res_get_dev();
6042     if (mac_dev->wmm == HI_FALSE) {
6043         oam_warning_log0(0, OAM_SF_UM, "{hmac_config_set_uapsd_para::wmm is off, not support uapsd mode}");
6044         return HI_FAIL;
6045     }
6046 
6047     /* mesh */
6048     if (mac_vap->vap_mode == WLAN_VAP_MODE_MESH) {
6049         oam_warning_log0(mac_vap->vap_id, OAM_SF_PWR, "{hmac_config_set_uapsd_para::vap mode mesh,not support uapsd!}");
6050         return HI_FAIL;
6051     }
6052 
6053     /* 窄带 */
6054     if ((mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_5M) ||
6055         (mac_vap->channel.en_bandwidth == WLAN_BAND_WIDTH_10M)) {
6056         oam_warning_log1(mac_vap->vap_id, OAM_SF_PWR,
6057             "{hmac_config_set_uapsd_para::narrow band[%dM] mode,not support uapsd!}", mac_vap->channel.en_bandwidth);
6058         return HI_FAIL;
6059     }
6060 
6061     uapsd_param = (mac_cfg_uapsd_sta_stru *)puc_param;
6062     if (uapsd_param->max_sp_len >= MAC_APSD_SP_LEN_BUTT) {
6063         oam_error_log1(mac_vap->vap_id, OAM_SF_PWR, "{hmac_config_set_uapsd_para::uc_max_sp_len[%d] > 6!}",
6064             uapsd_param->max_sp_len);
6065         return HI_FAIL;
6066     }
6067     mac_vap_set_uapsd_para(mac_vap, uapsd_param);
6068 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
6069     /* **************************************************************************
6070         抛事件到DMAC层, 同步VAP最新状态到DMAC
6071     ************************************************************************** */
6072     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_UAPSD_PARA, us_len, puc_param);
6073     if (oal_unlikely(ret != HI_SUCCESS)) {
6074         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6075             "{hmac_config_set_uapsd_para::hmac_config_send_event failed[%d].}", ret);
6076         return ret;
6077     }
6078 #else
6079     hi_unref_param(us_len);
6080 #endif
6081     return HI_SUCCESS;
6082 }
6083 #endif
6084 
6085 #ifdef _PRE_WLAN_FEATURE_STA_PM
6086 /* ****************************************************************************
6087  功能描述  : 配置staut低功耗模式
6088  修改历史      :
6089   1.日    期   : 2015年10月13日
6090     作    者   : HiSilicon
6091     修改内容   : 新生成函数
6092 **************************************************************************** */
hmac_config_set_sta_pm_mode(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6093 hi_u32 hmac_config_set_sta_pm_mode(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6094 {
6095     return hmac_config_sync_cmd_common(mac_vap, WLAN_CFGID_SET_PS_MODE, us_len, puc_param);
6096 }
6097 
6098 /* ****************************************************************************
6099  功能描述  : 打开staut低功耗
6100  修改历史      :
6101   1.日    期   : 2015年10月13日
6102     作    者   : HiSilicon
6103     修改内容   : 新生成函数
6104 **************************************************************************** */
_hmac_config_set_sta_pm_on(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6105 hi_u32 _hmac_config_set_sta_pm_on(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6106 {
6107     hmac_vap_stru *hmac_vap = HI_NULL;
6108 
6109     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
6110     if (hmac_vap == HI_NULL) {
6111         oam_warning_log0(mac_vap->vap_id, OAM_SF_PWR, "{_hmac_config_set_sta_pm_on::pst_hmac_vap null.}");
6112         return HI_ERR_CODE_PTR_NULL;
6113     }
6114 
6115     /* 再下发打开低功耗 */
6116     return hmac_config_sync_cmd_common(mac_vap, WLAN_CFGID_SET_STA_PM_ON, us_len, puc_param);
6117 }
6118 
6119 #ifdef _PRE_WLAN_FEATURE_HIPRIV
hmac_config_set_psm_offset(mac_vap_stru * mac_vap,hi_u16 len,const hi_u8 * param)6120 hi_u32 hmac_config_set_psm_offset(mac_vap_stru *mac_vap, hi_u16 len, const hi_u8 *param)
6121 {
6122     hi_u32 ret;
6123 
6124     /* **************************************************************************
6125         抛事件到DMAC层, 同步DMAC数据
6126     ************************************************************************** */
6127     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_PSM_OFFSET, len, param);
6128     if (oal_unlikely(ret != HI_SUCCESS)) {
6129         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6130             "{hmac_config_set_psm_offset::hmac_config_send_event failed[%d].}", ret);
6131     }
6132 
6133     return ret;
6134 }
6135 
hmac_config_set_sta_hw_ps_mode(mac_vap_stru * mac_vap,hi_u16 len,const hi_u8 * param)6136 hi_u32 hmac_config_set_sta_hw_ps_mode(mac_vap_stru *mac_vap, hi_u16 len, const hi_u8 *param)
6137 {
6138     hi_u32 ret;
6139 
6140     /* **************************************************************************
6141         抛事件到DMAC层, 同步DMAC数据
6142     ************************************************************************** */
6143     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_STA_HW_PS_MODE, len, param);
6144     if (oal_unlikely(ret != HI_SUCCESS)) {
6145         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6146             "{hmac_config_set_sta_hw_ps_mode::hmac_config_send_event failed[%d].}", ret);
6147     }
6148 
6149     return ret;
6150 }
6151 #endif
6152 #endif
6153 
6154 #if (_PRE_MULTI_CORE_MODE == _PRE_MULTI_CORE_MODE_OFFLOAD_DMAC)
6155 /* ****************************************************************************
6156  功能描述  : 获取吞吐量,打印到host侧,便于自动化脚本获取结果
6157  修改历史      :
6158   1.日    期   : 2015年2月15日
6159     作    者   : HiSilicon
6160     修改内容   : 新生成函数
6161 **************************************************************************** */
hmac_get_thruput_info(mac_vap_stru * mac_vap,hi_u8 len,const hi_u8 * puc_param)6162 hi_u32 hmac_get_thruput_info(mac_vap_stru *mac_vap, hi_u8 len, const hi_u8 *puc_param)
6163 {
6164     hi_unref_param(mac_vap);
6165     hi_unref_param(len);
6166     dmac_thruput_info_sync_stru *thruput_info = HI_NULL;
6167 
6168     thruput_info = (dmac_thruput_info_sync_stru *)puc_param;
6169 
6170     if (thruput_info != HI_NULL) {
6171         oal_io_print1("interval cycles: %u \n", thruput_info->cycles);
6172         oal_io_print1("sw tx succ num: %u \n", thruput_info->sw_tx_succ_num);
6173         oal_io_print1("sw tx fail num: %u \n", thruput_info->sw_tx_fail_num);
6174         oal_io_print1("sw rx ampdu succ num: %u \n", thruput_info->sw_rx_ampdu_succ_num);
6175         oal_io_print1("sw rx mpdu succ num: %u \n", thruput_info->sw_rx_mpdu_succ_num);
6176         oal_io_print1("sw rx fail num: %u \n", thruput_info->sw_rx_ppdu_fail_num);
6177         oal_io_print1("hw rx ampdu fcs fail num: %u \n", thruput_info->hw_rx_ampdu_fcs_fail_num);
6178         oal_io_print1("hw rx mpdu fcs fail num: %u \n", thruput_info->hw_rx_mpdu_fcs_fail_num);
6179         return HI_SUCCESS;
6180     } else {
6181         oam_error_log0(0, OAM_SF_ANY, "{hmac_get_thruput_info::pst_thruput_info null.}");
6182         return HI_ERR_CODE_PTR_NULL;
6183     }
6184 }
6185 #endif
6186 
6187 #ifdef _PRE_WLAN_FEATURE_PMF
6188 /* ****************************************************************************
6189  功能描述  : chip test强制配置pmf能力,且对关联后的vap也生效
6190  修改历史      :
6191   1.日    期   : 2015年1月13日
6192     作    者   : HiSilicon
6193     修改内容   : 新生成函数
6194 **************************************************************************** */
hmac_enable_pmf(mac_vap_stru * mac_vap,hi_u8 * puc_param)6195 hi_u32 hmac_enable_pmf(mac_vap_stru *mac_vap, hi_u8 *puc_param)
6196 {
6197     hi_u8 pmf_active;
6198     hi_list *entry = HI_NULL;
6199     hi_list *user_list_head = HI_NULL;
6200     mac_user_stru *user_tmp = HI_NULL;
6201 
6202     oal_io_print("hmac_enable_pmf: func start!");
6203     if (mac_vap == HI_NULL || puc_param == HI_NULL) {
6204         oam_error_log2(0, OAM_SF_ANY, "hmac_enable_pmf:: pointer is null: pst_mac_vap[%p],puc_param[%p]",
6205             (uintptr_t)mac_vap, (uintptr_t)puc_param);
6206         return HI_ERR_CODE_PTR_NULL;
6207     }
6208 
6209     wlan_pmf_cap_status_uint8 *puc_pmf_cap = (wlan_pmf_cap_status_uint8 *)puc_param;
6210 
6211     switch (*puc_pmf_cap) {
6212         case MAC_PMF_DISABLED:
6213             mac_mib_set_dot11_rsnamfpr(mac_vap, HI_FALSE);
6214             mac_mib_set_dot11_rsnamfpc(mac_vap, HI_FALSE);
6215             mac_mib_set_dot11_rsnaactivated(mac_vap, HI_FALSE);
6216             pmf_active = HI_FALSE;
6217             break;
6218         case MAC_PMF_ENABLED:
6219             mac_mib_set_dot11_rsnamfpr(mac_vap, HI_FALSE);
6220             mac_mib_set_dot11_rsnamfpc(mac_vap, HI_TRUE);
6221             mac_mib_set_dot11_rsnaactivated(mac_vap, HI_TRUE);
6222             return HI_SUCCESS;
6223         case MAC_PME_REQUIRED:
6224             mac_mib_set_dot11_rsnamfpr(mac_vap, HI_TRUE);
6225             mac_mib_set_dot11_rsnamfpc(mac_vap, HI_TRUE);
6226             mac_mib_set_dot11_rsnaactivated(mac_vap, HI_TRUE);
6227             pmf_active = HI_TRUE;
6228             break;
6229         default:
6230             oal_io_print("hmac_enable_pmf: commend error!");
6231             return HI_FALSE;
6232     }
6233 
6234     if (mac_vap->vap_state == MAC_VAP_STATE_UP) {
6235         user_list_head = &(mac_vap->mac_user_list_head);
6236 
6237         for (entry = user_list_head->next; entry != user_list_head;) {
6238             user_tmp = hi_list_entry(entry, mac_user_stru, user_dlist);
6239 
6240             /* 指向双向链表下一个节点 */
6241             entry = entry->next;
6242             if (user_tmp == HI_NULL) { // user_tmp有为空的可能,误报告警,lin_t e774告警屏蔽
6243                 oam_error_log0(0, OAM_SF_ANY, "hmac_enable_pmf:: pst_user_tmp is null");
6244                 return HI_ERR_CODE_PTR_NULL;
6245             }
6246             mac_user_set_pmf_active(user_tmp, pmf_active);
6247         }
6248     }
6249 
6250     oal_io_print("hmac_enable_pmf: func end!");
6251 
6252     return HI_SUCCESS;
6253 }
6254 #endif
6255 
6256 #ifdef _PRE_WLAN_FEATURE_ARP_OFFLOAD
6257 /* ****************************************************************************
6258  功能描述      : 配置ARP offload信息
6259 
6260  修改历史      :
6261   1.日    期   : 2015年5月21日
6262     作    者   : HiSilicon
6263     修改内容   : 新生成函数
6264 **************************************************************************** */
hmac_config_arp_offload_setting(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6265 hi_u32 hmac_config_arp_offload_setting(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6266 {
6267     hi_u32 ret;
6268 
6269     /* **************************************************************************
6270         抛事件到DMAC层, 配置DMAC数据
6271     ************************************************************************** */
6272     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_ARP_OFFLOAD_SETTING, us_len, puc_param);
6273     if (oal_unlikely(ret != HI_SUCCESS)) {
6274         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_arp_offload_setting::hmac_config_send_event fail[%d].", ret);
6275     }
6276 
6277     return ret;
6278 }
6279 
6280 #ifdef _PRE_WLAN_FEATURE_HIPRIV
6281 /* ****************************************************************************
6282  功能描述      : 显示Device侧记录的IP地址
6283 
6284  修改历史      :
6285   1.日    期   : 2015年8月10日
6286     作    者   : HiSilicon
6287     修改内容   : 新生成函数
6288 **************************************************************************** */
hmac_config_arp_offload_show_info(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6289 hi_u32 hmac_config_arp_offload_show_info(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6290 {
6291     hi_u32 ret;
6292 
6293     /* **************************************************************************
6294         抛事件到DMAC层, 配置DMAC数据
6295     ************************************************************************** */
6296     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_ARP_OFFLOAD_SHOW_INFO, us_len, puc_param);
6297     if (oal_unlikely(ret != HI_SUCCESS)) {
6298         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_arp_offload_show_info::hmac_config_send_event fail[%d].", ret);
6299     }
6300 
6301     return ret;
6302 }
6303 #endif
6304 #endif
6305 
6306 #ifdef _PRE_WLAN_FEATURE_DHCP_OFFLOAD
6307 /* ****************************************************************************
6308  功能描述      : 配置IP地址信息
6309 
6310  修改历史      :
6311   1.日    期   : 2019年10月12日
6312     作    者   : HiSilicon
6313     修改内容   : 新生成函数
6314 **************************************************************************** */
hmac_config_dhcp_offload_setting(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6315 hi_u32 hmac_config_dhcp_offload_setting(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6316 {
6317     hi_u32 ret;
6318 
6319     /* **************************************************************************
6320         抛事件到DMAC层, 配置DMAC数据
6321     ************************************************************************** */
6322     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_DHCP_OFFLOAD_SETTING, us_len, puc_param);
6323     if (oal_unlikely(ret != HI_SUCCESS)) {
6324         oam_warning_log1(0, OAM_SF_CFG, "{hmac_config_dhcp_offload_setting::hmac_config_send_event fail[%d].", ret);
6325     }
6326 
6327     return ret;
6328 }
6329 #endif
6330 
6331 #if (_PRE_MULTI_CORE_MODE == _PRE_MULTI_CORE_MODE_OFFLOAD_DMAC)
6332 /* ****************************************************************************
6333  功能描述  : cfg vap h2d
6334  输入参数  : [1]mac_vap
6335              [2]us_len
6336              [3]puc_param
6337  返 回 值  : hi_u32
6338 **************************************************************************** */
hmac_config_cfg_vap_h2d(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6339 hi_u32 hmac_config_cfg_vap_h2d(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6340 {
6341     hi_unref_param(us_len);
6342     hi_u32 ret;
6343     mac_device_stru *mac_dev = HI_NULL;
6344 
6345     if (oal_unlikely((mac_vap == HI_NULL) || (puc_param == HI_NULL))) {
6346         oam_error_log2(0, OAM_SF_CFG, "{hmac_config_add_vap::param null,pst_vap=%d puc_param=%d.}", (uintptr_t)mac_vap,
6347             (uintptr_t)puc_param);
6348         return HI_ERR_CODE_PTR_NULL;
6349     }
6350 
6351     mac_dev = mac_res_get_dev();
6352     /* **************************************************************************
6353     抛事件到DMAC层, 创建dmac cfg vap
6354     ************************************************************************** */
6355     ret = hmac_cfg_vap_send_event(mac_dev);
6356     if (oal_unlikely(ret != HI_SUCCESS)) {
6357         oam_warning_log1(0, OAM_SF_CFG, "{hmac_cfg_vap_send_event::hmac_config_send_event fail[%d].", ret);
6358     }
6359 
6360     return ret;
6361 }
6362 #endif
6363 
6364 /* ****************************************************************************
6365  功能描述  :
6366  返 回 值  : HI_SUCCESS 或 失败错误码
6367  修改历史      :
6368   1.日    期   : 2015年10月22日
6369     作    者   : HiSilicon
6370     修改内容   : 新生成函数
6371 **************************************************************************** */
hmac_config_set_pm_cfg_param(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6372 hi_u32 hmac_config_set_pm_cfg_param(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6373 {
6374     hi_u32 ret;
6375 
6376     /* **************************************************************************
6377         抛事件到DMAC层, 同步DMAC数据
6378     ************************************************************************** */
6379     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_PM_CFG_PARAM, us_len, puc_param);
6380     if (oal_unlikely(ret != HI_SUCCESS)) {
6381         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6382             "{hmac_config_set_pm_cfg_param::hmac_config_send_event failed[%d].}", ret);
6383     }
6384 
6385     return ret;
6386 }
6387 
6388 /* ****************************************************************************
6389  功能描述  :
6390  返 回 值  : HI_SUCCESS 或 失败错误码
6391  修改历史      :
6392   1.日    期   : 2015年10月22日
6393     作    者   : HiSilicon
6394     修改内容   : 新生成函数
6395 **************************************************************************** */
hmac_config_set_cus_rf(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6396 hi_u32 hmac_config_set_cus_rf(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6397 {
6398     hi_u32 ret;
6399 
6400     /* **************************************************************************
6401         抛事件到DMAC层, 同步DMAC数据
6402     ************************************************************************** */
6403     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_CUS_RF, us_len, puc_param);
6404     if (oal_unlikely(ret != HI_SUCCESS)) {
6405         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6406                          "{hmac_config_set_cus_rf::hmac_config_send_event failed[%d].}", ret);
6407     }
6408 
6409     return ret;
6410 }
6411 
6412 /* ****************************************************************************
6413  功能描述  :
6414  返 回 值  : HI_SUCCESS 或 失败错误码
6415  修改历史      :
6416   1.日    期   : 2015年10月22日
6417     作    者   : HiSilicon
6418     修改内容   : 新生成函数
6419 **************************************************************************** */
hmac_config_set_cus_dts_cali(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6420 hi_u32 hmac_config_set_cus_dts_cali(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6421 {
6422     hi_u32 ret;
6423 
6424     /* **************************************************************************
6425         抛事件到DMAC层, 同步DMAC数据
6426     ************************************************************************** */
6427     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_CUS_DTS_CALI, us_len, puc_param);
6428     if (oal_unlikely(ret != HI_SUCCESS)) {
6429         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6430             "{hmac_config_set_cus_dts_cali::hmac_config_send_event failed[%d].}", ret);
6431     }
6432 
6433     return ret;
6434 }
6435 
6436 /* ****************************************************************************
6437  功能描述  :
6438  返 回 值  : HI_SUCCESS 或 失败错误码
6439  修改历史      :
6440   1.日    期   : 2015年10月22日
6441     作    者   : HiSilicon
6442     修改内容   : 新生成函数
6443 **************************************************************************** */
hmac_config_set_cus_nvram_params(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6444 hi_u32 hmac_config_set_cus_nvram_params(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6445 {
6446     hi_u32 ret;
6447 
6448     /* **************************************************************************
6449         抛事件到DMAC层, 同步DMAC数据
6450     ************************************************************************** */
6451     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_CUS_NVRAM_PARAM, us_len, puc_param);
6452     if (oal_unlikely(ret != HI_SUCCESS)) {
6453         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6454             "{hmac_config_set_cus_nvram_params::hmac_config_send_event failed[%d].}", ret);
6455     }
6456 
6457     return ret;
6458 }
6459 
hmac_config_set_cus_fcc_tx_params(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6460 hi_u32 hmac_config_set_cus_fcc_tx_params(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6461 {
6462     hi_u32 ret;
6463 
6464     /* **************************************************************************
6465         抛事件到DMAC层, 同步DMAC数据
6466     ************************************************************************** */
6467     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_CUS_FCC_TX_PWR, us_len, puc_param);
6468     if (oal_unlikely(ret != HI_SUCCESS)) {
6469         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6470             "{hmac_config_set_cus_fcc_tx_params::hmac_config_send_event failed[%d].}", ret);
6471     }
6472 
6473     return ret;
6474 }
6475 
6476 #ifdef _PRE_XTAL_FREQUENCY_COMPESATION_ENABLE
hmac_config_set_freq_comp(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6477 hi_u32 hmac_config_set_freq_comp(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6478 {
6479     hi_u32 ret;
6480 
6481     /* **************************************************************************
6482         抛事件到DMAC层, 同步DMAC数据
6483     ************************************************************************** */
6484     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_FREQ_COMP, us_len, puc_param);
6485     if (oal_unlikely(ret != HI_SUCCESS)) {
6486         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
6487                          "{hmac_config_set_freq_comp::hmac_config_send_event failed[%d].}", ret);
6488     }
6489 
6490     return ret;
6491 }
6492 #endif
6493 
6494 #ifdef _PRE_WLAN_FEATURE_TX_CLASSIFY_LAN_TO_WLAN
6495 /* ****************************************************************************
6496  功能描述  : 设置业务识别功能开关
6497  返 回 值  : 错误码
6498  修改历史      :
6499   1.日    期   : 2015年11月23日
6500     作    者   : HiSilicon
6501     修改内容   : 新生成函数
6502 **************************************************************************** */
hmac_config_set_tx_classify_switch(const mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6503 hi_u32 hmac_config_set_tx_classify_switch(const mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6504 {
6505     hi_u8 flag;
6506     hmac_vap_stru *hmac_vap = HI_NULL;
6507 
6508     /* 获取hmac_vap */
6509     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
6510     if (hmac_vap == HI_NULL) {
6511         oam_warning_log1(0, OAM_SF_ANY, "{hmac_config_set_tx_classify_switch::hmac_vap_get_vap_stru fail.vap_id[%u]}",
6512             mac_vap->vap_id);
6513         return HI_ERR_CODE_PTR_NULL;
6514     }
6515 
6516     /* 获取配置参数 */
6517     flag = *puc_param;
6518 
6519     /* 参数没有更改,不需要重新配置 */
6520     if (flag == hmac_vap->tx_traffic_classify_flag) {
6521         oam_warning_log1(0, OAM_SF_ANY, "hmac_config_set_tx_classify_switch::change nothing to flag:%d",
6522             hmac_vap->tx_traffic_classify_flag);
6523         return HI_SUCCESS;
6524     }
6525 
6526     /* 设置参数开关 */
6527     hmac_vap->tx_traffic_classify_flag = flag;
6528 
6529     if (hmac_vap->tx_traffic_classify_flag == HI_SWITCH_OFF) {
6530         oam_warning_log0(0, OAM_SF_ANY, "hmac_config_set_tx_classify_switch::flag = HI_SWITCH_OFF(0)");
6531         return HI_SUCCESS;
6532     } else if (hmac_vap->tx_traffic_classify_flag == HI_SWITCH_ON) {
6533         oam_warning_log0(0, OAM_SF_ANY, "hmac_config_set_tx_classify_switch::flag = HI_SWITCH_ON(1)");
6534         return HI_SUCCESS;
6535     }
6536 
6537     return HI_FAIL;
6538 }
6539 #endif /* _PRE_WLAN_FEATURE_TX_CLASSIFY_LAN_TO_WLAN */
6540 
6541 /* ****************************************************************************
6542  功能描述  : 打开sta device 低功耗
6543  输入参数  : [1]mac_vap
6544              [2]us_len
6545              [3]puc_param
6546  返 回 值  : hi_u32
6547 **************************************************************************** */
hmac_config_set_sta_pm_on(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6548 hi_u32 hmac_config_set_sta_pm_on(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6549 {
6550     hmac_vap_stru *hmac_vap = HI_NULL;
6551     mac_cfg_ps_open_stru *sta_pm_open = HI_NULL;
6552 
6553     if (oal_unlikely((mac_vap == HI_NULL) || (puc_param == HI_NULL))) {
6554         oam_warning_log0(0, OAM_SF_PWR, "{wal_config_set_sta_pm_on::pst_mac_vap / puc_param null}");
6555         return HI_ERR_CODE_PTR_NULL;
6556     }
6557 
6558     hmac_vap = hmac_vap_get_vap_stru(mac_vap->vap_id);
6559     if (hmac_vap == HI_NULL) {
6560         oam_warning_log1(mac_vap->vap_id, OAM_SF_PWR, "{wal_config_set_sta_pm_on::pst_hmac_vap null,vap state[%d].}",
6561             mac_vap->vap_state);
6562         return HI_ERR_CODE_PTR_NULL;
6563     }
6564     sta_pm_open = (mac_cfg_ps_open_stru *)puc_param;
6565 
6566     /* 如果上层主动dhcp成功此时取消超时开低功耗的定时器 */
6567     if ((hmac_vap->ps_sw_timer.is_registerd == HI_TRUE) && (sta_pm_open->pm_enable > MAC_STA_PM_SWITCH_OFF)) {
6568         frw_timer_immediate_destroy_timer(&(hmac_vap->ps_sw_timer));
6569     }
6570 
6571     return _hmac_config_set_sta_pm_on(mac_vap, us_len, puc_param);
6572 }
6573 
6574 #ifdef _PRE_WLAN_FEATURE_STA_PM
6575 #ifdef _PRE_WLAN_FEATURE_HIPRIV
hmac_config_set_pm_param(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6576 hi_u32 hmac_config_set_pm_param(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6577 {
6578     /* 规避逻辑问题: 配置bcn timeout时需要vap up,否则会导致bcn timeout中断无法清除 */
6579     if (mac_vap->vap_state != MAC_VAP_STATE_UP) {
6580         oam_warning_log0(0, OAM_SF_PWR, "hmac_config_set_pm_param: need up vap first.");
6581         return HI_FAIL;
6582     }
6583     return hmac_config_sync_cmd_common(mac_vap, WLAN_CFGID_SET_PSM_PARAM, us_len, puc_param);
6584 }
6585 #endif
6586 #endif
6587 
hmac_config_open_wmm(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6588 hi_u32 hmac_config_open_wmm(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6589 {
6590     hi_u8 wmm = *(hi_u8 *)puc_param;
6591 #if (_PRE_MULTI_CORE_MODE == _PRE_MULTI_CORE_MODE_OFFLOAD_DMAC)
6592     mac_device_stru *mac_dev = mac_res_get_dev();
6593     mac_dev->wmm = wmm;
6594     mac_vap->mib_info->wlan_mib_sta_config.dot11_qos_option_implemented = wmm;
6595     mac_vap->voice_aggr = !wmm;
6596 #endif
6597 
6598     if ((wmm == HI_FALSE) && (mac_vap->cap_flag.uapsd == HI_TRUE)) {
6599         oam_warning_log0(0, OAM_SF_UM, "{hmac_config_open_wmm::config uapsd mode, not support turn off wmm}");
6600         return HI_FAIL;
6601     }
6602 
6603     return hmac_config_sync_cmd_common(mac_vap, WLAN_CFGID_WMM_SWITCH, us_len, puc_param);
6604 }
6605 
6606 #ifdef _PRE_WLAN_FEATURE_HIPRIV
6607 /* ****************************************************************************
6608  功能描述  : 设置VAP mib值
6609  输入参数  : [1]mac_vap
6610              [2]us_len
6611              [3]puc_param
6612  返 回 值  : hi_u32
6613 **************************************************************************** */
hmac_config_set_mib(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6614 hi_u32 hmac_config_set_mib(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6615 {
6616     return _hmac_config_set_mib(mac_vap, us_len, puc_param);
6617 }
6618 
6619 /* ****************************************************************************
6620  函 数 名  : wal_config_get_mib
6621  功能描述  : 获取VAP mib值
6622  输出参数  : 无
6623  输入参数  : [1]mac_vap
6624              [2]us_len
6625              [3]puc_param
6626  返 回 值  : hi_u32
6627 **************************************************************************** */
hmac_config_get_mib(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6628 hi_u32 hmac_config_get_mib(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6629 {
6630     hi_unref_param(us_len);
6631     return _hmac_config_get_mib(mac_vap, puc_param);
6632 }
6633 #endif
6634 
6635 #ifdef _PRE_WLAN_FEATURE_MESH
6636 /* ****************************************************************************
6637  功能描述  : Mesh 设置用户状态
6638  修改历史      :
6639   1.日    期   : 2019年1月16日
6640     作    者   : HiSilicon
6641     修改内容   : 新生成函数
6642 **************************************************************************** */
hmac_config_set_mesh_user(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6643 hi_u32 hmac_config_set_mesh_user(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6644 {
6645     hi_u8 user_index = 0;
6646     mac_cfg_set_mesh_user_param_stru *set_mesh = (mac_cfg_set_mesh_user_param_stru *)puc_param;
6647     hi_unref_param(us_len);
6648 
6649     /* 判断命令为设置用户参数/新增用户 */
6650     if (set_mesh->set == HI_SWITCH_OFF) {
6651         oam_warning_log0(0, OAM_SF_UM, "{hmac_config_set_mesh_user::not support add user.}");
6652         return HI_FAIL;
6653     } else {
6654         if (mac_vap_find_user_by_macaddr(mac_vap, set_mesh->auc_addr, WLAN_MAC_ADDR_LEN, &user_index) != HI_SUCCESS) {
6655             oam_warning_log0(mac_vap->vap_id, OAM_SF_UM, "{hmac_config_set_mesh_user::find_user failed}");
6656             return HI_FAIL;
6657         }
6658     }
6659 
6660     hmac_user_stru *hmac_user = (hmac_user_stru *)hmac_user_get_user_stru(user_index);
6661     if ((hmac_user == HI_NULL) || (hmac_user->base_user == HI_NULL)) {
6662         oam_warning_log0(mac_vap->vap_id, OAM_SF_UM, "{hmac_config_set_mesh_user::pst_hmac_user null.}");
6663         return HI_ERR_CODE_PTR_NULL;
6664     }
6665 
6666     if (hmac_user->base_user->is_mesh_user == HI_FALSE) {
6667         oam_warning_log0(mac_vap->vap_id, OAM_SF_UM, "{hmac_config_set_mesh_user::isNot meshUser,unsupport set state}");
6668         return HI_FAIL;
6669     }
6670 
6671     /* 获取上层下发的设置状态值 */
6672     switch (set_mesh->plink_sta) {
6673         case HISI_PLINK_ESTAB:
6674             /* 设置用户携带在beacon和probe rsp中的优先级 */
6675             hmac_user->has_rx_mesh_confirm = HI_FALSE;
6676             hmac_user->base_user->bcn_prio = set_mesh->bcn_prio;
6677             hmac_user->base_user->is_mesh_mbr = set_mesh->is_mbr;
6678             /* 标志该用户在关联阶段中是否为发起角色 */
6679             hmac_user->base_user->mesh_initiative_role = set_mesh->mesh_initiative_peering;
6680             /* Mesh下ESTAB状态即为关联成功 */
6681             mac_user_set_asoc_state(hmac_user->base_user, MAC_USER_STATE_ASSOC);
6682             /* 通知算法 */
6683             hmac_user_add_notify_alg(mac_vap, user_index);
6684 
6685             /* 通知Dmac添加白名单 */
6686             hi_u32 ret = hmac_set_multicast_user_whitelist(mac_vap, set_mesh->auc_addr, WLAN_MAC_ADDR_LEN);
6687             if (ret != HI_SUCCESS) {
6688                 oam_warning_log1(mac_vap->vap_id, OAM_SF_UM, "{hmac_config_set_mesh_user::set allowlist fail=%d}", ret);
6689                 return ret;
6690             }
6691             oam_warning_log1(hmac_user->base_user->vap_id, OAM_SF_ASSOC,
6692                 "{hmac_config_set_mesh_user::mesh assoc mesh HI_SUCCESS! user_indx=%d.}", user_index);
6693             break;
6694         default:
6695             break;
6696     }
6697     return HI_SUCCESS;
6698 }
6699 
hmac_config_encap_mesh_frame(mac_vap_stru * mac_vap,mac_action_data_stru * action_data,oal_netbuf_stru * data,hi_u8 us_action_code,hi_u32 * len)6700 hi_u32 hmac_config_encap_mesh_frame(mac_vap_stru *mac_vap, mac_action_data_stru *action_data, oal_netbuf_stru *data,
6701     hi_u8 us_action_code, hi_u32 *len)
6702 {
6703     if (memset_s(oal_netbuf_cb(data), oal_netbuf_cb_size(), 0, oal_netbuf_cb_size()) != EOK) {
6704         oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_send_mesh_action::[MESH]memset_s fail.}");
6705         oal_netbuf_free(data);
6706         goto error_handle;
6707     }
6708 
6709     if (memset_s((hi_u8 *)oal_netbuf_header(data), MAC_80211_FRAME_LEN, 0, MAC_80211_FRAME_LEN) != EOK) {
6710         oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_send_mesh_action::[MESH]memset_s fail.}");
6711         oal_netbuf_free(data);
6712         goto error_handle;
6713     }
6714 
6715     if (us_action_code == MAC_SP_ACTION_MESH_PEERING_OPEN) {
6716         *len = hmac_encap_mesh_peering_open_frame(mac_vap, (oal_netbuf_header(data)), action_data);
6717     } else if (us_action_code == MAC_SP_ACTION_MESH_PEERING_CONFIRM) {
6718         *len = hmac_encap_mesh_peering_confirm_frame(mac_vap, (oal_netbuf_header(data)), action_data);
6719     } else if (us_action_code == MAC_SP_ACTION_MESH_PEERING_CLOSE) {
6720         *len = hmac_encap_mesh_peering_close_frame(mac_vap, (oal_netbuf_header(data)), action_data);
6721     } else if (us_action_code == MAC_SP_ACTION_MESH_GROUP_KEY_INFORM) {
6722         *len = hmac_encap_mesh_group_key_inform_frame(mac_vap, (oal_netbuf_header(data)), action_data);
6723     } else if (us_action_code == MAC_SP_ACTION_MESH_GROUP_KEY_ACK) {
6724         *len = hmac_encap_mesh_group_key_ack_frame(mac_vap, (oal_netbuf_header(data)), action_data);
6725     } else {
6726         oam_error_log1(mac_vap->vap_id, OAM_SF_ANY,
6727             "{hmac_config_send_mesh_action::[MESH]unsupported self-protected action code:%d}", us_action_code);
6728         goto error_handle;
6729     }
6730 
6731     if ((*len) == 0) {
6732         /* 组帧失败 */
6733         oam_warning_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_send_mesh_action::[MESH]encap_mesh_frame Err}");
6734         oal_netbuf_free(data);
6735         goto error_handle;
6736     }
6737     oal_netbuf_put(data, *len);
6738 
6739     /* 为填写发送描述符准备参数 */
6740     hmac_tx_ctl_stru *tx_ctl    = (hmac_tx_ctl_stru *)oal_netbuf_cb(data);
6741     tx_ctl->us_mpdu_len         = *len; /* dmac发送需要的mpdu长度 */
6742     tx_ctl->frame_header_length = MAC_80211_FRAME_LEN;
6743     tx_ctl->frame_header        = (mac_ieee80211_frame_stru *)oal_netbuf_header(data);
6744     tx_ctl->mac_head_type       = 1;
6745 
6746     mac_vap_set_cb_tx_user_idx(mac_vap, tx_ctl, action_data->puc_dst);
6747 
6748     oam_warning_log3(mac_vap->vap_id, OAM_SF_ANY,
6749         "{hmac_config_send_mesh_action::[MESH]Send Mesh Self-Protected Action[%d] to user [X:X:X:X:%x:%x].}",
6750         us_action_code, action_data->puc_dst[4], action_data->puc_dst[5]); /* 4 5 元素索引 */
6751 
6752     return HI_SUCCESS;
6753 
6754 error_handle:
6755     /* 释放上层申请的puc_data空间 */
6756     if (action_data->data_len > 0) {
6757         oal_free(action_data->puc_data);
6758         action_data->puc_data = HI_NULL;
6759     }
6760 
6761     return HI_FAIL;
6762 }
6763 
hmac_config_mesh_send_event(mac_vap_stru * mac_vap,hmac_user_stru * hmac_user,mac_action_data_stru * action_data,oal_netbuf_stru * data,hi_u32 len)6764 hi_u32 hmac_config_mesh_send_event(mac_vap_stru *mac_vap, hmac_user_stru *hmac_user, mac_action_data_stru *action_data,
6765     oal_netbuf_stru *data, hi_u32 len)
6766 {
6767     hi_u8 us_action_code;
6768     hi_u32 ret;
6769 
6770     us_action_code = mac_get_action_code(action_data->puc_data);
6771     ret = hmac_tx_mgmt_send_event(mac_vap, data, len);
6772     if (ret != HI_SUCCESS) {
6773         oal_netbuf_free(data);
6774         oam_warning_log1(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_send_mesh_action::[MESH]send_event Err%d}", ret);
6775 
6776         /* 释放上层申请的puc_data空间 */
6777         if (action_data->data_len > 0) {
6778             oal_free(action_data->puc_data);
6779             action_data->puc_data = HI_NULL;
6780         }
6781 
6782         return HI_FAIL;
6783     }
6784 
6785     /* 更改状态 */
6786     if ((us_action_code == MAC_SP_ACTION_MESH_PEERING_OPEN) && (hmac_user != HI_NULL)) {
6787         hmac_user_set_asoc_state(mac_vap, hmac_user->base_user, MAC_USER_STATE_AUTH_COMPLETE);
6788     }
6789 
6790     /* 释放上层申请的puc_data空间 */
6791     if (action_data->data_len > 0) {
6792         oal_free(action_data->puc_data);
6793         action_data->puc_data = HI_NULL;
6794     }
6795 
6796     return HI_SUCCESS;
6797 }
6798 
6799 /* ****************************************************************************
6800  功能描述  : Mesh 发送Action 帧
6801  修改历史      :
6802   1.日    期   : 2019年2月1日
6803     作    者   : HiSilicon
6804     修改内容   : 新生成函数
6805 **************************************************************************** */
hmac_config_send_mesh_action(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6806 hi_u32 hmac_config_send_mesh_action(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6807 {
6808     hi_u8           user_index = 0;
6809     hi_u32          len = 0;
6810     hmac_user_stru *hmac_user = HI_NULL;
6811 
6812     hi_unref_param(us_len);
6813 
6814     mac_action_data_stru *action_data = (mac_action_data_stru *)puc_param;
6815     hmac_vap_stru        *hmac_vap    = hmac_vap_get_vap_stru(mac_vap->vap_id);
6816     if (hmac_vap == HI_NULL) {
6817         oam_warning_log0(0, OAM_SF_UM, "{hmac_config_send_mesh_action::pst_hmac_vap null.}");
6818         goto error_handle;
6819     }
6820 
6821     /* 获取Action category 和code */
6822     hi_u8 us_category    = mac_get_action_category(action_data->puc_data);
6823     hi_u8 us_action_code = mac_get_action_code(action_data->puc_data);
6824     if (us_category != MAC_ACTION_CATEGORY_SELF_PROTECTED) {
6825         oam_warning_log0(0, OAM_SF_UM, "{hmac_config_send_mesh_action::action category is wrong.}");
6826         goto error_handle;
6827     }
6828 
6829     hi_u32 ret = mac_vap_find_user_by_macaddr(mac_vap, action_data->puc_dst, WLAN_MAC_ADDR_LEN, &user_index);
6830     /* Mesh Peering Close帧存在无用户发送的情况,收到一个从未关联得节点发来的帧 */
6831     if (us_action_code != MAC_SP_ACTION_MESH_PEERING_CLOSE) {
6832         /* 找到用户 */
6833         if (ret != HI_SUCCESS) {
6834             oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_send_mesh_action::[MESH]cannot find user}");
6835             goto error_handle;
6836         }
6837 
6838         hmac_user = (hmac_user_stru *)hmac_user_get_user_stru(user_index);
6839         if ((hmac_user == HI_NULL) || (hmac_user->base_user == HI_NULL)) {
6840             oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_send_mesh_action::[MESH]hmac/base user null}");
6841             goto error_handle;
6842         }
6843 
6844         if (hmac_user->base_user->is_mesh_user == HI_FALSE) {
6845             oam_warning_log0(mac_vap->vap_id, OAM_SF_UM, "{hmac_config_send_mesh_action::[MESH]is_mesh_user Err}");
6846             goto error_handle;
6847         }
6848     }
6849 
6850     /* 申请空间 */
6851     oal_netbuf_stru *data = (oal_netbuf_stru *)oal_netbuf_alloc(WLAN_MGMT_NETBUF_SIZE, 0, 4); /* align 4 */
6852     if (data == HI_NULL) {
6853         oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_config_send_mesh_action::[MESH]puc_data null.}");
6854         goto error_handle;
6855     }
6856 
6857     if (hmac_config_encap_mesh_frame(mac_vap, action_data, data, us_action_code, &len) != HI_SUCCESS) {
6858         return HI_FAIL;
6859     }
6860 
6861     return hmac_config_mesh_send_event(mac_vap, hmac_user, action_data, data, len);
6862 
6863 error_handle:
6864     /* 释放上层申请的puc_data空间 */
6865     if (action_data->data_len > 0) {
6866         oal_free(action_data->puc_data);
6867     }
6868 
6869     return HI_FAIL;
6870 }
6871 
6872 #ifdef _PRE_WLAN_FEATURE_HIPRIV
6873 /* ****************************************************************************
6874  功能描述  : 设置发送次数上报限制参数(调试使用)
6875  输入参数  : [1]mac_vap
6876              [2]us_len
6877              [3]puc_param
6878  返 回 值  : hi_u32
6879 **************************************************************************** */
hmac_config_set_report_times_limit(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6880 hi_u32 hmac_config_set_report_times_limit(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6881 {
6882     hi_u32 ret;
6883 
6884     if (mac_vap->vap_mode != WLAN_VAP_MODE_MESH) {
6885         return HI_FALSE;
6886     }
6887 
6888     /* **************************************************************************
6889         抛事件到DMAC层, 同步DMAC数据
6890     ************************************************************************** */
6891     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_REPORT_TIMES_LIMIT, us_len, puc_param);
6892     if (oal_unlikely(ret != HI_SUCCESS)) {
6893         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM,
6894             "{hmac_config_set_report_times_limit::hmac_config_send_event failed[%d].}", ret);
6895     }
6896 
6897     return ret;
6898 }
6899 
6900 /* ****************************************************************************
6901  功能描述  : 设置发送次数上报限制参数(调试使用)
6902  输入参数  : [1]mac_vap
6903              [2]us_len
6904              [3]puc_param
6905  返 回 值  : hi_u32
6906 **************************************************************************** */
hmac_config_set_report_cnt_limit(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6907 hi_u32 hmac_config_set_report_cnt_limit(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6908 {
6909     hi_u32 ret;
6910 
6911     if (mac_vap->vap_mode != WLAN_VAP_MODE_MESH) {
6912         return HI_FALSE;
6913     }
6914 
6915     /* **************************************************************************
6916         抛事件到DMAC层, 同步DMAC数据
6917     ************************************************************************** */
6918     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_REPORT_CNT_LIMIT, us_len, puc_param);
6919     if (oal_unlikely(ret != HI_SUCCESS)) {
6920         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM,
6921             "{hmac_config_set_report_cnt_limit::hmac_config_send_event failed[%d].}", ret);
6922     }
6923 
6924     return ret;
6925 }
6926 #endif
6927 
6928 /* ****************************************************************************
6929  功能描述  : hmac获取meshid
6930  输入参数  : event_hdr: 事件头
6931                             us_len       : 参数长度
6932                             puc_param    : 参数
6933  返 回 值  : hi_u32 错误码
6934  修改历史      :
6935   1.日    期   : 2019年3月19日
6936     作    者   : HiSilicon
6937     修改内容   : 新生成函数
6938 **************************************************************************** */
hmac_config_get_meshid(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)6939 hi_u32 hmac_config_get_meshid(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
6940 {
6941     /* 读取mib值 */
6942     return mac_mib_get_meshid(mac_vap, (hi_u8 *)pus_len, puc_param);
6943 }
6944 
6945 /* ****************************************************************************
6946  功能描述  : hmac设meshid
6947  输入参数  : event_hdr: 事件头
6948                             us_len       : 参数长度
6949                             puc_param    : 参数
6950  返 回 值  : hi_u32 错误码
6951  修改历史      :
6952   1.日    期   : 2019年3月19日
6953     作    者   : HiSilicon
6954     修改内容   : 新生成函数
6955 **************************************************************************** */
hmac_config_set_meshid(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6956 hi_u32 hmac_config_set_meshid(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6957 {
6958 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
6959     return hmac_config_send_event(mac_vap, WLAN_CFGID_MESHID, us_len, puc_param);
6960 #else
6961     /* 设置mib值 */
6962     mac_mib_set_meshid(mac_vap, (hi_u8)us_len, puc_param);
6963     return HI_SUCCESS;
6964 #endif
6965 }
6966 
6967 /* ****************************************************************************
6968  功能描述  : 设置mesh Hisi-optimization字段
6969  输入参数  : [1]mac_vap
6970              [2]us_len
6971              [3]puc_param
6972  返 回 值  : hi_u32
6973 **************************************************************************** */
hmac_config_set_beacon_priority(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)6974 hi_u32 hmac_config_set_beacon_priority(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
6975 {
6976     hi_u32 ret;
6977     hi_u8 priority;
6978 
6979     if (mac_vap == HI_NULL) {
6980         oam_error_log0(0, OAM_SF_CFG, "{hmac_config_set_beacon_priority::pst_mac_vap null.}");
6981         return HI_ERR_CODE_PTR_NULL;
6982     }
6983     if (mac_vap->vap_mode != WLAN_VAP_MODE_MESH) {
6984         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_beacon_priority::not Mesh vap!.}");
6985         return HI_FAIL;
6986     }
6987     priority = *puc_param;
6988 
6989     oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_set_beacon_priority:: lwip set prioriy: %d}", priority);
6990 
6991     mac_vap->priority = priority;
6992 
6993     /* **************************************************************************
6994         抛事件到DMAC层, 同步DMAC数据
6995     ************************************************************************** */
6996     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_BEACON_PRIORITY, us_len, puc_param);
6997     if (oal_unlikely(ret != HI_SUCCESS)) {
6998         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM,
6999             "{hmac_config_set_beacon_priority::hmac_config_send_event failed[%d].}", ret);
7000     }
7001 
7002     return ret;
7003 }
7004 
7005 /* ****************************************************************************
7006  功能描述  : 设置mesh vap 的mnid
7007  输入参数  : [1]mac_vap
7008              [2]us_len
7009              [3]puc_param
7010  返 回 值  : hi_u32
7011 **************************************************************************** */
hmac_config_set_mnid(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7012 hi_u32 hmac_config_set_mnid(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7013 {
7014     hi_u32 ret;
7015 
7016     /* **************************************************************************
7017         抛事件到DMAC层, 同步DMAC数据
7018     ************************************************************************** */
7019     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_MNID, us_len, puc_param);
7020     if (oal_unlikely(ret != HI_SUCCESS)) {
7021         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM,
7022                          "{hmac_config_set_mnid::hmac_config_send_event failed[%d].}", ret);
7023     }
7024 
7025     return ret;
7026 }
7027 
7028 #ifdef _PRE_WLAN_FEATURE_HIPRIV
7029 /* ****************************************************************************
7030  功能描述  : 设置mesh vap 为mbr
7031  输入参数  : [1]mac_vap
7032              [2]us_len
7033              [3]puc_param
7034  返 回 值  : hi_u32
7035 **************************************************************************** */
hmac_config_set_en_mbr(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7036 hi_u32 hmac_config_set_en_mbr(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7037 {
7038     hi_u32 ret;
7039 
7040     /* **************************************************************************
7041         抛事件到DMAC层, 同步DMAC数据
7042     ************************************************************************** */
7043     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_MBR_EN, us_len, puc_param);
7044     if (oal_unlikely(ret != HI_SUCCESS)) {
7045         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM,
7046                          "{hmac_config_set_en_mbr::hmac_config_send_event failed[%d].}", ret);
7047     }
7048 
7049     return ret;
7050 }
7051 #endif
7052 
7053 /* ****************************************************************************
7054  功能描述  : mesh上报new peer candidate事件到wpa
7055  输入参数  : [1]event_mem
7056  返 回 值  : hi_u32
7057 **************************************************************************** */
hmac_mesh_report_new_peer_candidate(frw_event_mem_stru * event_mem)7058 hi_u32 hmac_mesh_report_new_peer_candidate(frw_event_mem_stru *event_mem)
7059 {
7060     frw_event_stru *event = HI_NULL;
7061     frw_event_hdr_stru *event_hdr = HI_NULL;
7062     dmac_tx_event_stru *dtx_event = HI_NULL;
7063     mac_vap_stru *mac_vap = HI_NULL;
7064     hi_u32 us_payload_len;
7065     hi_u32 ret;
7066     oal_netbuf_stru *netbuf = HI_NULL;
7067 
7068     if (oal_unlikely(event_mem == HI_NULL)) {
7069         oam_error_log0(0, OAM_SF_RX, "{hmac_mesh_report_new_peer_candidate::event_mem null.}");
7070         return HI_ERR_CODE_PTR_NULL;
7071     }
7072 
7073     /* 获取事件头和事件结构体指针 */
7074     event = (frw_event_stru *)event_mem->puc_data;
7075     event_hdr = &(event->event_hdr);
7076     dtx_event = (dmac_tx_event_stru *)event->auc_event_data;
7077     netbuf = dtx_event->netbuf;
7078 
7079     mac_vap = mac_vap_get_vap_stru(event_hdr->vap_id);
7080     if (oal_unlikely(mac_vap == HI_NULL)) {
7081         oam_error_log0(0, OAM_SF_SCAN, "{hmac_mesh_report_new_peer_candidate::pst_mac_vap null.}");
7082 
7083         /* 释放上报的beacon的内存 */
7084         oal_netbuf_free(netbuf);
7085         return HI_ERR_CODE_PTR_NULL;
7086     }
7087 
7088     /* 处理Mesh Beacon参数 */
7089     us_payload_len = dtx_event->us_frame_len;
7090     ret = hmac_config_new_peer_candidate_event(mac_vap, netbuf, us_payload_len);
7091     if (ret != HI_SUCCESS) {
7092         /* 释放上报的beacon的内存 */
7093         oal_netbuf_free(netbuf);
7094         oam_warning_log1(0, 0, "hmac_mesh_report_new_peer_candidate:report to wpa fail,ret = %d!", ret);
7095     }
7096 
7097     return ret;
7098 }
7099 
7100 /* ****************************************************************************
7101  功能描述  : mesh通过wpa添加mesh用户
7102  输入参数  : mac_vap_stru *pst_mac_vap, hi_u8 uc_len, hi_u8 *puc_param
7103  修改历史      :
7104   1.日    期   : 2019年5月27日
7105     作    者   : HiSilicon
7106     修改内容   : 新生成函数
7107 **************************************************************************** */
hmac_config_add_mesh_user(mac_vap_stru * mac_vap,hi_u16 len,const hi_u8 * puc_param)7108 hi_u32 hmac_config_add_mesh_user(mac_vap_stru *mac_vap, hi_u16 len, const hi_u8 *puc_param)
7109 {
7110     mac_cfg_set_mesh_user_param_stru *add_mesh_user = HI_NULL;
7111     hi_u8                             user_index;
7112     hmac_user_stru                   *hmac_user = HI_NULL;
7113     hi_u32                            ret;
7114     mac_vap_stru                     *mac_vap_tmp = HI_NULL;
7115     hi_unref_param(len);
7116 
7117     add_mesh_user = (mac_cfg_set_mesh_user_param_stru *)puc_param;
7118 
7119     /* 判断命令为设置用户参数/新增用户 */
7120     if (add_mesh_user->set == HI_SWITCH_ON) {
7121         oam_warning_log0(0, OAM_SF_UM, "{hmac_config_add_mesh_user::not support set user state.}");
7122         return HI_FAIL;
7123     }
7124     /* mesh 下判断accepting peer的值,为false不接受远端接入 */
7125     if (mac_mib_get_accepting_peer(mac_vap) == HI_FALSE) {
7126         hi_diag_log_msg_w0(0, "{hmac_config_add_mesh_user::Mesh is not ready to accept peer connect.}");
7127         return HI_FAIL;
7128     }
7129     /* 若在同一device下的其他VAP下找到给用户,删除之。否则导致业务不通。在DBAC下尤其常见 */
7130     if (mac_device_find_user_by_macaddr(mac_vap, add_mesh_user->auc_addr, WLAN_MAC_ADDR_LEN,
7131         &user_index) == HI_SUCCESS) {
7132         hmac_user = (hmac_user_stru *)hmac_user_get_user_stru(user_index);
7133         if ((hmac_user != HI_NULL) && (hmac_user->base_user != HI_NULL)) {
7134             mac_vap_tmp = mac_vap_get_vap_stru(hmac_user->base_user->vap_id);
7135             if (mac_vap_tmp != HI_NULL) {
7136                 hmac_user_del(mac_vap_tmp, hmac_user);
7137             }
7138         }
7139     }
7140     ret = hmac_user_add(mac_vap, add_mesh_user->auc_addr, WLAN_MAC_ADDR_LEN, &user_index);
7141     if (ret != HI_SUCCESS) {
7142         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM, "{hmac_config_add_mesh_user::hmac_user_add failed[%d].}", ret);
7143         return ret;
7144     }
7145 
7146     hmac_user = (hmac_user_stru *)hmac_user_get_user_stru(user_index);
7147     if (hmac_user == HI_NULL) {
7148         oam_warning_log0(mac_vap->vap_id, OAM_SF_UM, "{hmac_config_add_mesh_user::pst_hmac_user null.}");
7149         return HI_ERR_CODE_PTR_NULL;
7150     }
7151 
7152     hmac_user->base_user->is_mesh_user = HI_TRUE;
7153 
7154     return HI_SUCCESS;
7155 }
7156 
7157 /* ****************************************************************************
7158  功能描述  : mesh设置new peer candidate的使能
7159  输入参数  : mac_vap_stru *pst_mac_vap, hi_u8 uc_len, hi_u8 *puc_param
7160  修改历史      :
7161   1.日    期   : 2019年6月29日
7162     作    者   : HiSilicon
7163     修改内容   : 新生成函数
7164 **************************************************************************** */
hmac_config_new_peer_candidate_en(mac_vap_stru * mac_vap,hi_u16 len,const hi_u8 * puc_param)7165 hi_u32 hmac_config_new_peer_candidate_en(mac_vap_stru *mac_vap, hi_u16 len, const hi_u8 *puc_param)
7166 {
7167     hi_u32 ret;
7168     mac_device_stru *mac_dev = mac_res_get_dev();
7169     mac_vap_stru *mac_vap_first = HI_NULL;
7170     mac_vap_stru *mac_vap_second = HI_NULL;
7171 
7172     if (mac_vap->vap_mode != WLAN_VAP_MODE_MESH) {
7173         return HI_FALSE;
7174     }
7175 
7176     ret = mac_device_find_2up_vap(mac_dev, &mac_vap_first, &mac_vap_second);
7177     if (ret == HI_SUCCESS) {
7178         oam_warning_log0(mac_vap->vap_id, OAM_SF_UM,
7179             "{hmac_config_new_peer_candidate_en::current mode is mbr,unsupport en auto-peer.}");
7180         return HI_FAIL;
7181     }
7182     /* **************************************************************************
7183         抛事件到DMAC层, 同步DMAC数据
7184     ************************************************************************** */
7185     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_NEW_PEER_CONFIG_EN, len, puc_param);
7186     if (oal_unlikely(ret != HI_SUCCESS)) {
7187         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM,
7188             "{hmac_config_new_peer_candidate_en::hmac_config_send_event failed[%d].}", ret);
7189     }
7190 
7191     return ret;
7192 }
7193 
7194 /* ****************************************************************************
7195  功能描述  : 设置mesh uc_accept_sta
7196  输入参数  : [1]mac_vap
7197              [2]us_len
7198              [3]puc_param
7199  返 回 值  : hi_u32
7200 **************************************************************************** */
hmac_config_set_mesh_accept_sta(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7201 hi_u32 hmac_config_set_mesh_accept_sta(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7202 {
7203     hi_u8 accept_sta;
7204     hi_unref_param(us_len);
7205 
7206     accept_sta = *puc_param;
7207 
7208     mac_vap->mesh_accept_sta = accept_sta;
7209 
7210     return HI_SUCCESS;
7211 }
7212 
7213 /* ***************************************************************************
7214  功能描述  : 设置mesh用户的gtk
7215  输入参数  : [1]mac_vap
7216              [2]us_len
7217              [3]puc_param
7218  返 回 值  : hi_u32
7219 **************************************************************************** */
hmac_config_set_mesh_user_gtk(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7220 hi_u32 hmac_config_set_mesh_user_gtk(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7221 {
7222     hi_u32 ret;
7223     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_MESH_USER_GTK, us_len, puc_param);
7224     if (oal_unlikely(ret != HI_SUCCESS)) {
7225         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM,
7226             "{hmac_config_set_mesh_user_gtk::[MESH]hmac_config_send_event failed[%d].}", ret);
7227     }
7228     return ret;
7229 }
7230 
7231 /* ****************************************************************************
7232  功能描述  : 设置mesh accept peer
7233  输入参数  : [1]mac_vap
7234              [2]us_len
7235              [3]puc_param
7236  返 回 值  : hi_u32
7237 **************************************************************************** */
hmac_config_set_accept_peer(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7238 hi_u32 hmac_config_set_accept_peer(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7239 {
7240     hi_u8 accept_peer;
7241     hi_unref_param(us_len);
7242 
7243     accept_peer = *puc_param;
7244 
7245     mac_mib_set_accepting_peer(mac_vap, accept_peer);
7246 
7247     return HI_SUCCESS;
7248 }
7249 
7250 /* ****************************************************************************
7251  功能描述  : 组new peer candidate事件上报wpa
7252  输入参数  : mac_vap_stru *mac_vap, oal_netbuf_stru *beacon_netbuf, hi_u16 us_frame_len
7253  返 回 值  : hi_u32
7254  修改历史      :
7255   1.日    期   : 2019年8月12日
7256     作    者   : HiSilicon
7257     修改内容   : 新生成函数
7258 **************************************************************************** */
hmac_config_new_peer_candidate_event(const mac_vap_stru * mac_vap,oal_netbuf_stru * netbuf,hi_u32 payload_len)7259 hi_u32 hmac_config_new_peer_candidate_event(const mac_vap_stru *mac_vap, oal_netbuf_stru *netbuf, hi_u32 payload_len)
7260 {
7261     frw_event_mem_stru *event_mem = HI_NULL;
7262     frw_event_stru *event = HI_NULL;
7263     hi_u8 *puc_ie_payload = HI_NULL;
7264     hi_u8 *puc_payload = HI_NULL;
7265     hmac_rx_ctl_stru *cb = HI_NULL;
7266     mac_mesh_conf_ie_stru *mesh_conf_ie = HI_NULL;
7267     mac_ieee80211_frame_stru *frame_header = HI_NULL;
7268     hmac_report_new_peer_candidate_stru *wal_new_peer = HI_NULL;
7269     hi_u32 ret;
7270 
7271     puc_payload = (hi_u8 *)oal_netbuf_data(netbuf);
7272     cb = (hmac_rx_ctl_stru *)oal_netbuf_cb(netbuf);
7273     frame_header = (mac_ieee80211_frame_stru *)puc_payload;
7274 
7275     /* Probe Rsp和Beacon帧中前面为Timestamp,beacon interval,capability字段,非tlv结构,不能直接用于mac_find_ie函数,
7276       此处加上偏移,以Element ID为0的SSID做为起始地址查找指定IE */
7277     puc_ie_payload = puc_payload + MAC_80211_FRAME_LEN;
7278 
7279     if (payload_len > MAC_SSID_OFFSET) {
7280         /* 新增Mesh Configuration Element解析获取Accepting Peer字段值 */
7281         mesh_conf_ie = (mac_mesh_conf_ie_stru *)mac_find_ie(MAC_EID_MESH_CONF,
7282             puc_ie_payload + MAC_TIME_STAMP_LEN + MAC_BEACON_INTERVAL_LEN + MAC_CAP_INFO_LEN,
7283             payload_len - MAC_SSID_OFFSET);
7284     }
7285     if (mesh_conf_ie == HI_NULL) {
7286         return HI_ERR_CODE_PTR_NULL;
7287     }
7288 
7289     event_mem = frw_event_alloc(sizeof(hmac_report_new_peer_candidate_stru));
7290     if (event_mem == HI_NULL) {
7291         oam_error_log0(mac_vap->vap_id, OAM_SF_ANY, "{hmac_mesh_report_new_peer_candidate::event_mem null.}");
7292         return HI_ERR_CODE_PTR_NULL;
7293     }
7294 
7295     /* 填写事件 */
7296     event = (frw_event_stru *)event_mem->puc_data;
7297 
7298     frw_event_hdr_init(&(event->event_hdr), FRW_EVENT_TYPE_HOST_CTX, HMAC_HOST_CTX_EVENT_SUB_TYPE_NEW_PEER_CANDIDATE,
7299         sizeof(hmac_report_new_peer_candidate_stru), FRW_EVENT_PIPELINE_STAGE_0, mac_vap->vap_id);
7300 
7301     wal_new_peer = (hmac_report_new_peer_candidate_stru *)(event->auc_event_data);
7302     wal_new_peer->bcn_prio = mac_get_hisi_beacon_prio(puc_ie_payload, (hi_s32)payload_len);
7303     wal_new_peer->accept_sta = mac_get_hisi_accept_sta(puc_ie_payload, (hi_s32)payload_len);
7304     wal_new_peer->is_mbr = mac_get_hisi_en_is_mbr(puc_ie_payload, (hi_s32)payload_len);
7305     wal_new_peer->link_num = mesh_conf_ie->mesh_formation_info.number_of_peerings;
7306 
7307     /* 抛事件,无法传递有符号数,下面的左值rssi需要定义为无符号数,后面使用的时候再强转 -g- */
7308     wal_new_peer->rssi = (hi_u8)(cb->rssi_dbm);
7309 
7310     if (memcpy_s(wal_new_peer->auc_mac_addr, OAL_MAC_ADDR_LEN, frame_header->auc_address2, OAL_MAC_ADDR_LEN) != EOK) {
7311         oam_error_log0(0, OAM_SF_CFG, "hmac_mesh_report_new_peer_candidate:: auc_mac_addr memcpy_s fail.");
7312         frw_event_free(event_mem);
7313         return HI_FAIL;
7314     }
7315 
7316     /* 分发事件 */
7317     ret = frw_event_dispatch_event(event_mem);
7318     frw_event_free(event_mem);
7319 
7320     return ret;
7321 }
7322 
7323 /* ****************************************************************************
7324  功能描述  : hmac读取mesh节点信息
7325  修改历史      :
7326   1.日    期   : 2019年11月28日
7327     作    者   : HiSilicon
7328     修改内容   : 新生成函数
7329 **************************************************************************** */
hmac_config_get_mesh_nodeinfo(mac_vap_stru * mac_vap,hi_u16 * pus_len,hi_u8 * puc_param)7330 hi_u32 hmac_config_get_mesh_nodeinfo(mac_vap_stru *mac_vap, hi_u16 *pus_len, hi_u8 *puc_param)
7331 {
7332     mac_cfg_mesh_nodeinfo_stru *param = HI_NULL;
7333 
7334     param = (mac_cfg_mesh_nodeinfo_stru *)puc_param;
7335 
7336     if (memset_s(param, sizeof(mac_cfg_mesh_nodeinfo_stru), 0, sizeof(mac_cfg_mesh_nodeinfo_stru)) != EOK) {
7337         oam_error_log0(0, OAM_SF_CFG, "hmac_config_get_mesh_nodeinfo:: memset_s fail.");
7338         return HI_FAIL;
7339     }
7340     if ((mac_vap->vap_mode == WLAN_VAP_MODE_BSS_STA) && (mac_vap->is_conn_to_mesh == HI_TRUE)) {
7341         param->node_type = MAC_HISI_MESH_STA;
7342     } else if ((mac_vap->vap_mode == WLAN_VAP_MODE_MESH) && (mac_vap->is_mbr == HI_FALSE)) {
7343         param->node_type = MAC_HISI_MESH_MG;
7344     } else if ((mac_vap->vap_mode == WLAN_VAP_MODE_MESH) && (mac_vap->is_mbr == HI_TRUE)) {
7345         param->node_type = MAC_HISI_MESH_MBR;
7346     } else {
7347         oam_warning_log0(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_get_mesh_nodeinfo::unspec mesh node type.}");
7348         param->node_type = MAC_HISI_MESH_UNSPEC;
7349         *pus_len = sizeof(mac_cfg_mesh_nodeinfo_stru);
7350         return HI_SUCCESS;
7351     }
7352     param->privacy = mac_vap->mib_info->wlan_mib_privacy.dot11_privacy_invoked;
7353     param->mesh_accept_sta = mac_vap->mesh_accept_sta;
7354     param->priority = mac_vap->priority;
7355     param->user_num = mac_vap->user_nums;
7356     param->chan = mac_vap->channel.chan_number;
7357 
7358     *pus_len = sizeof(mac_cfg_mesh_nodeinfo_stru);
7359 
7360     oam_warning_log2(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_get_mesh_nodeinfo::node type=%d, chan=%d.}",
7361         param->node_type, param->chan);
7362 
7363     return HI_SUCCESS;
7364 }
7365 #endif
7366 
7367 /* ****************************************************************************
7368  功能描述  : 设置vap 重传限制数
7369  输入参数  : [1]mac_vap
7370              [2]us_len
7371              [3]puc_param
7372  返 回 值  : hi_u32
7373 **************************************************************************** */
hmac_config_set_retry_limit(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7374 hi_u32 hmac_config_set_retry_limit(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7375 {
7376     hi_u32 ret;
7377 
7378     /* **************************************************************************
7379         抛事件到DMAC层, 同步DMAC数据
7380     ************************************************************************** */
7381     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_RETRY_LIMIT, us_len, puc_param);
7382     if (oal_unlikely(ret != HI_SUCCESS)) {
7383         oam_warning_log1(mac_vap->vap_id, OAM_SF_UM,
7384             "{hmac_config_set_retry_limit::hmac_config_send_event failed[%d].}", ret);
7385     }
7386 
7387     return ret;
7388 }
7389 
7390 #ifdef FEATURE_DAQ
7391 /* ****************************************************************************
7392  功能描述  : 获取数据采集结果
7393  修改历史      :
7394   1.日    期   : 2019年5月22日
7395     作    者   : HiSilicon
7396     修改内容   : 新生成函数
7397 **************************************************************************** */
hmac_config_data_acq_result(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7398 hi_u32 hmac_config_data_acq_result(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7399 {
7400     hi_u32 ret;
7401 
7402     /* **************************************************************************
7403         抛事件到DMAC层, 同步DMAC数据
7404     ************************************************************************** */
7405     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_DATA_ACQ_REPORT, us_len, puc_param);
7406     if (oal_unlikely(ret != HI_SUCCESS)) {
7407         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7408             "{hmac_config_data_acq_result::hmac_config_send_event failed[%d].}", ret);
7409     }
7410 
7411     return ret;
7412 }
7413 
7414 /* ****************************************************************************
7415  功能描述  : 返回数据采集结果
7416  修改历史      :
7417   1.日    期   : 2019年5月22日
7418     作    者   : HiSilicon
7419     修改内容   : 新生成函数
7420 **************************************************************************** */
hmac_get_data_acq_result(mac_vap_stru * mac_vap,hi_u8 us_len,const hi_u8 * puc_param)7421 hi_u32 hmac_get_data_acq_result(mac_vap_stru *mac_vap, hi_u8 us_len, const hi_u8 *puc_param)
7422 {
7423     wlan_acq_result_addr_stru *data_result_addr = HI_NULL;
7424 
7425     hi_unref_param(us_len);
7426 
7427     data_result_addr = (wlan_acq_result_addr_stru *)puc_param;
7428 
7429     oam_unrom_w_log4(mac_vap->vap_id, 0, "{hmac_get_data_acq_result::0x%x,0x%x,0x%x,0x%x}",
7430         data_result_addr->start_addr, data_result_addr->middle_addr1, data_result_addr->middle_addr2,
7431         data_result_addr->end_addr);
7432 
7433     return hmac_send_event_to_host(mac_vap, (const hi_u8 *)data_result_addr, sizeof(wlan_acq_result_addr_stru),
7434         HMAC_HOST_CTX_EVENT_SUB_TYPE_ACQ_RESULT);
7435 }
7436 
7437 /* ****************************************************************************
7438  功能描述  : 查询数据采集状态
7439  修改历史      :
7440   1.日    期   : 2019年5月22日
7441     作    者   : HiSilicon
7442     修改内容   : 新生成函数
7443 **************************************************************************** */
hmac_config_data_acq_status(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7444 hi_u32 hmac_config_data_acq_status(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7445 {
7446     hi_u32 ret;
7447 
7448     hi_unref_param(us_len);
7449     /* **************************************************************************
7450         抛事件到DMAC层, 同步DMAC数据
7451     ************************************************************************** */
7452     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_DATA_ACQ_STATUS, us_len, puc_param);
7453     if (oal_unlikely(ret != HI_SUCCESS)) {
7454         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7455             "{hmac_config_data_acq_status::hmac_config_send_event failed[%d].}", ret);
7456     }
7457 
7458     return ret;
7459 }
7460 
7461 /* ****************************************************************************
7462  功能描述  : 返回数据采集状态
7463  修改历史      :
7464   1.日    期   : 2019年5月22日
7465     作    者   : HiSilicon
7466     修改内容   : 新生成函数
7467 **************************************************************************** */
hmac_get_data_acq_status(mac_vap_stru * mac_vap,hi_u8 us_len,const hi_u8 * puc_param)7468 hi_u32 hmac_get_data_acq_status(mac_vap_stru *mac_vap, hi_u8 us_len, const hi_u8 *puc_param)
7469 {
7470     hi_u8 value;
7471 
7472     hi_unref_param(us_len);
7473 
7474     value = *((hi_u8 *)puc_param);
7475     oam_warning_log1(mac_vap->vap_id, 0, "{hmac_get_data_acq_status::en_value[%d]}", value);
7476 
7477     return hmac_send_event_to_host(mac_vap, (const hi_u8 *)(&value), sizeof(hi_u8),
7478         HMAC_HOST_CTX_EVENT_SUB_TYPE_ACQ_STATUS);
7479 }
7480 
7481 /* ****************************************************************************
7482  功能描述  : 启动数据采集信息
7483  修改历史      :
7484   1.日    期   : 2019年5月22日
7485     作    者   : HiSilicon
7486     修改内容   : 新生成函数
7487 **************************************************************************** */
hmac_config_data_acq_start(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7488 hi_u32 hmac_config_data_acq_start(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7489 {
7490     hi_u32 ret;
7491 
7492     /* **************************************************************************
7493         抛事件到DMAC层, 同步DMAC数据
7494     ************************************************************************** */
7495     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_DATA_ACQ_START, us_len, puc_param);
7496     if (oal_unlikely(ret != HI_SUCCESS)) {
7497         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7498             "{hmac_config_data_acq_start::hmac_config_send_event failed[%d].}", ret);
7499     }
7500 
7501     return ret;
7502 }
7503 #endif
7504 
7505 #ifdef _PRE_WLAN_FEATURE_BW_HIEX
7506 /* ****************************************************************************
7507  功能描述  : 设置窄带切换到宽带发送selfcts的参数
7508  修改历史      :
7509   1.日    期   : 2019年7月10日
7510     作    者   : HiSilicon
7511     修改内容   : 新生成函数
7512 **************************************************************************** */
hmac_config_hiex_set_selfcts(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7513 hi_u32 hmac_config_hiex_set_selfcts(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7514 {
7515     wlan_selfcts_param_stru *param = HI_NULL;
7516 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
7517     hi_u32 ret;
7518 #endif
7519 
7520     param = (wlan_selfcts_param_stru *)puc_param;
7521     mac_vap->selfcts = param->selfcts;
7522     mac_vap->duration = param->duration;
7523     mac_vap->us_per = param->us_per;
7524     oam_warning_log3(mac_vap->vap_id, OAM_SF_CFG, "{hmac_config_hiex_set_selfcts::enable[%d] duration[%d] per[%d].}",
7525         mac_vap->selfcts, mac_vap->duration, mac_vap->us_per);
7526 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
7527     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_SELFCTS, us_len, puc_param);
7528     if (oal_unlikely(ret != HI_SUCCESS)) {
7529         oam_warning_log1(mac_vap->vap_id, OAM_SF_COEX,
7530             "{hmac_config_hiex_set_selfcts::send event return err code [%d].}", ret);
7531         return ret;
7532     }
7533 #else
7534     hi_unref_param(us_len);
7535 #endif
7536 
7537     return HI_SUCCESS;
7538 }
7539 #endif
7540 
7541 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
7542 /* ****************************************************************************
7543  功能描述  : 对各band做平均功率补偿,传递补偿事件给dmac
7544  输入参数  : [1]mac_vap
7545              [2]len 事件传递的数据长度
7546              [3]puc_param 事件传递的数据指针
7547  输出参数  : 无
7548  返 回 值  : 事件传递是否成功的结果
7549 **************************************************************************** */
hmac_config_set_cal_band_power(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7550 hi_u32 hmac_config_set_cal_band_power(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7551 {
7552     /* 抛事件到DMAC层, 同步DMAC数据 */
7553     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CAL_BAND_POWER, us_len, puc_param);
7554     if (oal_unlikely(ret != HI_SUCCESS)) {
7555         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7556             "{hmac_config_set_cal_band_power::hmac_config_send_event failed[%d].}", ret);
7557     }
7558 
7559     return ret;
7560 }
7561 
7562 /* ****************************************************************************
7563  功能描述  : 对不同协议场景、不用速率分别做功率补偿,传递补偿事件给dmac
7564  输入参数  : [1]mac_vap
7565              [2]len 事件传递的数据长度
7566              [3]puc_param 事件传递的数据指针
7567  输出参数  : 无
7568  返 回 值  : 事件传递是否成功的结果
7569 **************************************************************************** */
hmac_config_set_cal_rate_power(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7570 hi_u32 hmac_config_set_cal_rate_power(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7571 {
7572     /* 抛事件到DMAC层, 同步DMAC数据 */
7573     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CAL_RATE_POWER, us_len, puc_param);
7574     if (oal_unlikely(ret != HI_SUCCESS)) {
7575         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7576             "{hmac_config_set_cal_rate_power::hmac_config_send_event failed[%d].}", ret);
7577     }
7578 
7579     return ret;
7580 }
7581 
7582 /* ****************************************************************************
7583  功能描述  : 进行常温频偏功率补偿,传递补偿事件给dmac
7584  输入参数  : [1]mac_vap
7585              [2]len 事件传递的数据长度
7586              [3]puc_param 事件传递的数据指针
7587  输出参数  : 无
7588  返 回 值  : 事件传递是否成功的结果
7589 **************************************************************************** */
hmac_config_set_cal_freq(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7590 hi_u32 hmac_config_set_cal_freq(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7591 {
7592     /* 抛事件到DMAC层, 同步DMAC数据 */
7593     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_CAL_FREQ, us_len, puc_param);
7594     if (oal_unlikely(ret != HI_SUCCESS)) {
7595         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7596                          "{hmac_config_set_cal_freq::hmac_config_send_event failed[%d].}", ret);
7597     }
7598 
7599     return ret;
7600 }
7601 
7602 /* ****************************************************************************
7603  功能描述  :MAC 设入 EFUSE
7604  返 回 值  : HI_SUCCESS 或 失败错误码
7605  修改历史      :
7606   1.日    期   : 2015年10月22日
7607     修改内容   : 新生成函数
7608 **************************************************************************** */
hmac_config_get_efuse_mac(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7609 hi_u32 hmac_config_get_efuse_mac(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7610 {
7611     /* **************************************************************************
7612         抛事件到DMAC层, 同步DMAC数据
7613     ************************************************************************** */
7614     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_GET_EFUSE_MAC, us_len, puc_param);
7615     if (oal_unlikely(ret != HI_SUCCESS)) {
7616         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7617                          "{hmac_config_get_efuse_mac::hmac_config_send_event failed[%d].}", ret);
7618     }
7619     return ret;
7620 }
7621 
7622 /* ****************************************************************************
7623  功能描述  :MAC 设入 EFUSE
7624  返 回 值  : HI_SUCCESS 或 失败错误码
7625  修改历史      :
7626   1.日    期   : 2015年10月22日
7627     修改内容   : 新生成函数
7628 **************************************************************************** */
hmac_config_set_efuse_mac(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7629 hi_u32 hmac_config_set_efuse_mac(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7630 {
7631     /* **************************************************************************
7632         抛事件到DMAC层, 同步DMAC数据
7633     ************************************************************************** */
7634     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_EFUSE_MAC, us_len, puc_param);
7635     if (oal_unlikely(ret != HI_SUCCESS)) {
7636         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7637                          "{hmac_config_set_efuse_mac::hmac_config_send_event failed[%d].}", ret);
7638     }
7639 
7640     return ret;
7641 }
7642 
7643 /* ****************************************************************************
7644  功能描述  :将校准值写入EFUSE
7645  返 回 值  : HI_SUCCESS 或 失败错误码
7646  修改历史      :
7647   1.日    期   : 2015年10月22日
7648     修改内容   : 新生成函数
7649 **************************************************************************** */
hmac_config_set_dataefuse(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7650 hi_u32 hmac_config_set_dataefuse(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7651 {
7652     /* **************************************************************************
7653         抛事件到DMAC层, 同步DMAC数据
7654     ************************************************************************** */
7655     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_DATAEFUSE, us_len, puc_param);
7656     if (oal_unlikely(ret != HI_SUCCESS)) {
7657         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7658                          "{hmac_config_set_dataefuse::hmac_config_send_event failed[%d].}", ret);
7659     }
7660 
7661     return ret;
7662 }
7663 
7664 /* ****************************************************************************
7665  功能描述  :获取校准数据
7666  修改历史      :
7667   1.日    期   : 2020年03月09日
7668     修改内容   : 新生成函数
7669 **************************************************************************** */
hmac_config_get_cal_data(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7670 hi_u32 hmac_config_get_cal_data(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7671 {
7672     /* **************************************************************************
7673         抛事件到DMAC层, 同步DMAC数据
7674     ************************************************************************** */
7675     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_GET_CAL_DATA, us_len, puc_param);
7676     if (oal_unlikely(ret != HI_SUCCESS)) {
7677         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7678                          "{hmac_config_get_cal_data::hmac_config_send_event failed[%d].}", ret);
7679     }
7680     return ret;
7681 }
7682 
7683 /* ****************************************************************************
7684  功能描述  :设置发送功率偏移
7685  修改历史      :
7686   1.日    期   : 2020年3月6日
7687     作    者   : HiSilicon
7688     修改内容   : 新生成函数
7689 **************************************************************************** */
hmac_config_set_tx_pwr_offset(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7690 hi_u32 hmac_config_set_tx_pwr_offset(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7691 {
7692     /* **************************************************************************
7693         抛事件到DMAC层, 同步DMAC数据
7694     ************************************************************************** */
7695     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_TX_PWR_OFFSET, us_len, puc_param);
7696     if (oal_unlikely(ret != HI_SUCCESS)) {
7697         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7698             "{hmac_config_set_tx_pwr_offset::hmac_config_send_event failed[%d].}", ret);
7699     }
7700 
7701     return ret;
7702 }
7703 #endif
7704 
7705 /* ****************************************************************************
7706  功能描述  :设置cca阈值
7707  返 回 值  : HI_SUCCESS 或 失败错误码
7708  修改历史      :
7709   1.日    期   : 2020年1月12日
7710     作    者   : HiSilicon
7711     修改内容   : 新生成函数
7712 **************************************************************************** */
hmac_config_set_cca_th(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7713 hi_u32 hmac_config_set_cca_th(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7714 {
7715     /* **************************************************************************
7716         抛事件到DMAC层, 同步DMAC数据
7717     ************************************************************************** */
7718     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_SET_CCA_TH, us_len, puc_param);
7719     if (oal_unlikely(ret != HI_SUCCESS)) {
7720         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7721                          "{hmac_config_set_cca_th::hmac_config_send_event failed[%d].}", ret);
7722     }
7723 
7724     return ret;
7725 }
7726 
hmac_config_get_efuse_mac_addr(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7727 hi_u32 hmac_config_get_efuse_mac_addr(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7728 {
7729     /* **************************************************************************
7730         抛事件到DMAC层, 同步DMAC数据
7731     ************************************************************************** */
7732     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_GET_EFUSE_MAC_ADDR, us_len, puc_param);
7733     if (oal_unlikely(ret != HI_SUCCESS)) {
7734         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7735             "{hmac_config_get_efuse_mac_addr::hmac_config_send_event failed[%d].}", ret);
7736     }
7737 
7738     return ret;
7739 }
7740 
7741 #if defined(_PRE_WLAN_FEATURE_HIPRIV) && defined(_PRE_WLAN_FEATURE_INTRF_MODE)
hmac_config_set_intrf_mode(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7742 hi_u32 hmac_config_set_intrf_mode(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7743 {
7744     /* **************************************************************************
7745         抛事件到DMAC层, 同步DMAC数据
7746     ************************************************************************** */
7747     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_INTRF_MODE_ON, us_len, puc_param);
7748     if (oal_unlikely(ret != HI_SUCCESS)) {
7749         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7750             "{hmac_config_set_intrf_mode::hmac_config_send_event failed[%d].}", ret);
7751     }
7752 
7753     return ret;
7754 }
7755 #endif
7756 
hmac_config_notify_get_tx_params(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7757 hi_u32 hmac_config_notify_get_tx_params(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7758 {
7759     hi_u32 ret;
7760 
7761     ret = hmac_config_send_event(mac_vap, WLAN_CFGID_NOTIFY_GET_TX_PARAMS, us_len, puc_param);
7762     if (oal_unlikely(ret != HI_SUCCESS)) {
7763         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7764             "{hmac_config_notify_get_goodput::hmac_config_send_event failed[%d].}", ret);
7765     }
7766 
7767     return ret;
7768 }
7769 
7770 /* ****************************************************************************
7771  功能描述  :降低开机电流(注意:会牺牲一部分射频性能)
7772  修改历史      :
7773   1.日    期   : 2020年07月11日
7774     修改内容   : 新生成函数
7775 **************************************************************************** */
hmac_config_minimize_boot_current(mac_vap_stru * mac_vap,hi_u16 us_len,const hi_u8 * puc_param)7776 hi_u32 hmac_config_minimize_boot_current(mac_vap_stru *mac_vap, hi_u16 us_len, const hi_u8 *puc_param)
7777 {
7778     /* **************************************************************************
7779         抛事件到DMAC层, 同步DMAC数据
7780     ************************************************************************** */
7781     hi_u32 ret = hmac_config_send_event(mac_vap, WLAN_CFGID_MINIMIZE_BOOT_CURRET, us_len, puc_param);
7782     if (oal_unlikely(ret != HI_SUCCESS)) {
7783         oam_warning_log1(mac_vap->vap_id, OAM_SF_CFG,
7784             "{hmac_config_minimize_boot_current::hmac_config_send_event failed[%d].}", ret);
7785     }
7786     return ret;
7787 }
7788 
7789 #ifdef __cplusplus
7790 #if __cplusplus
7791 }
7792 #endif
7793 #endif
7794