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, ¶m->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 *)¶m);
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