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 "oal_ext_if.h"
23 #include "hmac_ext_if.h"
24 #include "wal_main.h"
25 #include "wal_scan.h"
26 #include "wal_cfg80211.h"
27 #include "wal_ioctl.h"
28 #include "wal_hipriv.h"
29 #include "wal_linux_flowctl.h"
30 #include "wal_cfg80211_apt.h"
31 #include "hdf_wifi_event.h"
32 #include "net_adpater.h"
33 #include "hi_wifi_driver_wpa_if.h"
34 #ifdef _PRE_WLAN_FEATURE_ANY
35 #include "hmac_any.h"
36 #endif
37 #ifdef _PRE_WLAN_FEATURE_P2P
38 #include "hmac_p2p.h"
39 #endif
40 #ifdef _PRE_WLAN_FEATURE_CSI
41 #include "hi_wifi_api.h"
42 #endif
43 #ifdef _PRE_WLAN_FEATURE_MESH
44 #include "dmac_config.h"
45 #endif
46 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
47 #include "plat_firmware.h"
48 #endif
49
50 #ifdef __cplusplus
51 #if __cplusplus
52 extern "C" {
53 #endif
54 #endif
55
56 /* ****************************************************************************
57 2 全局变量定义
58 **************************************************************************** */
59 #ifdef _PRE_WLAN_FEATURE_CSI
60 hi_wifi_csi_data_cb g_csi_data_func;
61 hi_u32 g_csi_tsf_tmp = 0; /* 存储本次上报的CSI数据的时间戳,方便与下一次时间戳比较 */
62 hi_u32 g_csi_tsf_val = 0; /* 存储上报的CSI数据的时间戳反转次数 */
63 #endif
64
65 hi_wifi_report_tx_params_callback g_wal_report_tx_params_callback = HI_NULL;
66
67 /* ****************************************************************************
68 3 函数实现
69 **************************************************************************** */
wal_scan_result_clean_timeout_fn(hi_void * arg)70 hi_u32 wal_scan_result_clean_timeout_fn(hi_void *arg)
71 {
72 hi_u32 ret;
73 wal_msg_write_stru write_msg;
74
75 oal_net_device_stru *netdev = (oal_net_device_stru *)arg;
76 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CLEAN_SCAN_RESULT, sizeof(hi_u32));
77 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u32),
78 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
79 if (oal_unlikely(ret != HI_SUCCESS)) {
80 oam_warning_log1(0, OAM_SF_ANY, "{wal_scan_result_clean_timeout_fn::return err code [%u]!}", ret);
81 }
82
83 return ret;
84 }
85
86 /* ****************************************************************************
87 函 数 名 : wal_scan_comp_proc_sta
88 功能描述 : STA上报扫描完成事件处理
89 输入参数 : event_mem: 事件内存
90 输出参数 : 无
91 返 回 值 :
92 调用函数 :
93 被调函数 :
94 修改历史 :
95 1.日 期 : 2013年7月5日
96 作 者 : HiSilicon
97 修改内容 : 新生成函数
98 2.日 期 : 2013年9月9日
99 作 者 : HiSilicon
100 修改内容 : 增加上报内核部分函数
101 **************************************************************************** */
102 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
103 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_scan_comp_proc_sta(frw_event_mem_stru * event_mem)104 hi_u32 wal_scan_comp_proc_sta(frw_event_mem_stru *event_mem)
105 {
106 if (oal_unlikely(event_mem == HI_NULL)) {
107 oam_error_log0(0, OAM_SF_SCAN, "{wal_scan_comp_proc_sta::event_mem is null!}");
108 return HI_ERR_CODE_PTR_NULL;
109 }
110
111 frw_event_stru *event = (frw_event_stru *)event_mem->puc_data;
112 oal_net_device_stru *netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
113 if (netdev == HI_NULL) {
114 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ASSOC, "{wal_scan_comp_proc_sta::get net device ptr null}");
115 return HI_ERR_CODE_PTR_NULL;
116 }
117
118 /* 获取hmac vap结构体 */
119 hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(event->event_hdr.vap_id);
120 if (hmac_vap == HI_NULL) {
121 oam_warning_log0(event->event_hdr.vap_id, OAM_SF_SCAN, "{wal_scan_comp_proc_sta::pst_hmac_vap is NULL!}");
122 return HI_ERR_CODE_PTR_NULL;
123 }
124
125 /* 删除等待扫描超时定时器 */
126 if (hmac_vap->scan_timeout.is_registerd == HI_TRUE) {
127 frw_timer_immediate_destroy_timer(&(hmac_vap->scan_timeout));
128 }
129
130 /* 获取hmac device 指针 */
131 hmac_device_stru *hmac_dev = hmac_get_device_stru();
132 mac_device_stru *mac_dev = mac_res_get_dev();
133 hmac_scan_stru *scan_mgmt = &(hmac_dev->scan_mgmt);
134
135 /* 无论是否是ANY扫描,扫描完成时需要恢复标志为当前非ANY扫描 */
136 scan_mgmt->scan_record_mgmt.is_any_scan = HI_FALSE;
137
138 /* 获取扫描结果的管理结构地址 */
139 hmac_bss_mgmt_stru *bss_mgmt = &(hmac_dev->scan_mgmt.scan_record_mgmt.bss_mgmt);
140
141 /* 获取驱动上报的扫描结果结构体指针 */
142 hmac_scan_rsp_stru *scan_rsp = (hmac_scan_rsp_stru *)event->auc_event_data;
143
144 /* 如果扫描返回结果的非成功,打印维测信息 */
145 if (scan_rsp->result_code != HMAC_MGMT_SUCCESS) {
146 oam_warning_log1(event->event_hdr.vap_id, OAM_SF_SCAN, "wal_scan_comp_proc_sta:Err=%d", scan_rsp->result_code);
147 }
148
149 /* 扫描成功时上报所有扫描到的bss */
150 if (scan_rsp->result_code == HMAC_MGMT_SUCCESS) {
151 wal_inform_all_bss(netdev, mac_dev->wiphy, bss_mgmt, event->event_hdr.vap_id);
152 }
153
154 /* 对于内核下发的扫描request资源加锁 */
155 oal_spin_lock(&(scan_mgmt->st_scan_request_spinlock));
156
157 /* 上层下发的普通扫描进行对应处理 */
158 if (scan_mgmt->request != HI_NULL) {
159 /* 通知 kernel scan 已经结束 */
160 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION) || defined(_PRE_HDF_LINUX)
161 HdfWifiEventScanDone(netdev, (WifiScanStatus)HISI_SCAN_SUCCESS);
162 wal_free_scan_mgmt_resource(scan_mgmt);
163 #else
164 oal_cfg80211_scan_done(scan_mgmt->request, 0);
165 scan_mgmt->request = HI_NULL;
166 #endif
167 scan_mgmt->complete = HI_TRUE;
168 }
169
170 if (scan_mgmt->sched_scan_req != HI_NULL) {
171 /* 上报调度扫描结果 */
172 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
173 oal_cfg80211_sched_scan_result(mac_dev->wiphy);
174 #endif
175 scan_mgmt->sched_scan_req = HI_NULL;
176 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
177 scan_mgmt->sched_scan_complete = HI_TRUE;
178 #endif
179 }
180
181 /* 通知完内核,释放资源后解锁 */
182 oal_spin_unlock(&(scan_mgmt->st_scan_request_spinlock));
183
184 /* 创建扫描清除结果定时器 */
185 frw_timer_create_timer(&(hmac_vap->scanresult_clean_timeout), wal_scan_result_clean_timeout_fn,
186 WLAN_SCANRESULT_CLEAN_TIME, netdev, HI_FALSE);
187 return HI_SUCCESS;
188 }
189
190 /* ****************************************************************************
191 函 数 名 : wal_asoc_comp_proc_sta
192 功能描述 : STA上报关联完成事件处理
193 输入参数 : event_mem: 事件内存
194 输出参数 : 无
195 返 回 值 :
196 调用函数 :
197 被调函数 :
198 修改历史 :
199 1.日 期 : 2013年7月5日
200 作 者 : HiSilicon
201 修改内容 : 新生成函数
202 **************************************************************************** */
203 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
204 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_asoc_comp_proc_sta(frw_event_mem_stru * event_mem)205 hi_u32 wal_asoc_comp_proc_sta(frw_event_mem_stru *event_mem)
206 {
207 frw_event_stru *event = HI_NULL;
208 oal_connet_result_stru connet_result;
209 oal_net_device_stru *netdev = HI_NULL;
210 hmac_asoc_rsp_stru *asoc_rsp = HI_NULL;
211
212 if (oal_unlikely(event_mem == HI_NULL)) {
213 oam_error_log0(0, OAM_SF_ASSOC, "{wal_asoc_comp_proc_sta::event_mem is null!}");
214 return HI_ERR_CODE_PTR_NULL;
215 }
216
217 event = (frw_event_stru *)event_mem->puc_data;
218 asoc_rsp = (hmac_asoc_rsp_stru *)event->auc_event_data;
219
220 /* 获取net_device */
221 netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
222 if (netdev == HI_NULL) {
223 oal_free(asoc_rsp->puc_asoc_rsp_ie_buff);
224 asoc_rsp->puc_asoc_rsp_ie_buff = HI_NULL;
225 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ASSOC, "{wal_asoc_comp_proc_sta::get net device ptr is null!}");
226 return HI_ERR_CODE_PTR_NULL;
227 }
228
229 if (memset_s(&connet_result, sizeof(oal_connet_result_stru), 0, sizeof(oal_connet_result_stru)) != EOK) {
230 oam_error_log0(0, OAM_SF_ASSOC, "{wal_asoc_comp_proc_sta::mem safe function err!}");
231 oal_free(asoc_rsp->puc_asoc_rsp_ie_buff);
232 asoc_rsp->puc_asoc_rsp_ie_buff = HI_NULL;
233 return HI_FAIL;
234 }
235 /* 准备上报内核的关联结果结构体 */
236 if (memcpy_s(connet_result.auc_bssid, WLAN_MAC_ADDR_LEN, asoc_rsp->auc_addr_ap, WLAN_MAC_ADDR_LEN) != EOK) {
237 oam_error_log0(0, OAM_SF_ASSOC, "{wal_asoc_comp_proc_sta::mem safe function err!}");
238 oal_free(asoc_rsp->puc_asoc_rsp_ie_buff);
239 asoc_rsp->puc_asoc_rsp_ie_buff = HI_NULL;
240 return HI_FAIL;
241 }
242 connet_result.puc_req_ie = asoc_rsp->puc_asoc_req_ie_buff;
243 connet_result.req_ie_len = asoc_rsp->asoc_req_ie_len;
244 connet_result.puc_rsp_ie = asoc_rsp->puc_asoc_rsp_ie_buff;
245 connet_result.rsp_ie_len = asoc_rsp->asoc_rsp_ie_len;
246 connet_result.us_status_code = asoc_rsp->status_code;
247 connet_result.us_freq = asoc_rsp->us_freq;
248 connet_result.us_connect_status = asoc_rsp->result_code;
249
250 /* 调用内核接口,上报关联结果 */
251 oal_cfg80211_connect_result(netdev, &connet_result);
252
253 /* 释放关联管理帧内存 */
254 oal_mem_free(asoc_rsp->puc_asoc_req_ie_buff);
255 oal_free(asoc_rsp->puc_asoc_rsp_ie_buff);
256 asoc_rsp->puc_asoc_rsp_ie_buff = HI_NULL;
257
258 return HI_SUCCESS;
259 }
260
261 /* ****************************************************************************
262 函 数 名 : wal_disasoc_comp_event_proc
263 功能描述 : STA上报去关联完成事件处理
264 输入参数 : event_mem: 事件内存
265 输出参数 : 无
266 返 回 值 :
267 调用函数 :
268 被调函数 :
269 修改历史 :
270 1.日 期 : 2013年7月5日
271 作 者 : HiSilicon
272 修改内容 : 新生成函数
273 **************************************************************************** */
274 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
275 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_disasoc_comp_proc_sta(frw_event_mem_stru * event_mem)276 hi_u32 wal_disasoc_comp_proc_sta(frw_event_mem_stru *event_mem)
277 {
278 frw_event_stru *event = HI_NULL;
279 oal_disconnect_result_stru disconnect_result;
280 oal_net_device_stru *netdev = HI_NULL;
281 hi_u32 *pul_reason_code = HI_NULL;
282 hi_u16 us_disass_reason_code;
283 hi_u16 us_dmac_reason_code;
284 hi_u32 ret;
285
286 if (oal_unlikely(event_mem == HI_NULL)) {
287 oam_error_log0(0, OAM_SF_ASSOC, "{wal_disasoc_comp_proc_sta::event_mem is null!}");
288 return HI_ERR_CODE_PTR_NULL;
289 }
290
291 event = (frw_event_stru *)event_mem->puc_data;
292
293 /* 获取net_device */
294 netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
295 if (netdev == HI_NULL) {
296 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ASSOC,
297 "{wal_disasoc_comp_proc_sta::get net device ptr is null!}");
298 return HI_ERR_CODE_PTR_NULL;
299 }
300
301 /* 获取去关联原因码指针 */
302 pul_reason_code = (hi_u32 *)event->auc_event_data;
303 us_disass_reason_code = (*pul_reason_code) & 0x0000ffff;
304 us_dmac_reason_code = ((*pul_reason_code) >> 16) & 0x0000ffff; /* 右移16位 */
305
306 if (memset_s(&disconnect_result, sizeof(oal_disconnect_result_stru), 0,
307 sizeof(oal_disconnect_result_stru)) != EOK) {
308 return HI_FAIL;
309 }
310 hi_bool locally_generated = (us_dmac_reason_code == DMAC_DISASOC_MISC_KICKUSER);
311
312 /* 准备上报内核的关联结果结构体 */
313 disconnect_result.us_reason_code = us_disass_reason_code;
314 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) && !defined(_PRE_HDF_LINUX)
315 if (!locally_generated && (us_disass_reason_code == WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY ||
316 us_disass_reason_code == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA ||
317 us_disass_reason_code == WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA)) {
318 disconnect_result.us_reason_code = 0;
319 }
320 #endif
321 /* 调用内核接口,上报去关联结果 */
322 ret = oal_cfg80211_disconnected(netdev, disconnect_result.us_reason_code, disconnect_result.pus_disconn_ie,
323 disconnect_result.us_disconn_ie_len, locally_generated);
324 if (ret != HI_SUCCESS) {
325 oam_error_log1(event->event_hdr.vap_id, OAM_SF_ASSOC,
326 "{wal_disasoc_comp_proc_sta::cfg80211_disconnected fail[%d]!}", ret);
327 return ret;
328 }
329
330 oam_warning_log3(event->event_hdr.vap_id, OAM_SF_ASSOC,
331 "{wal_disasoc_comp_proc_sta reason_code[%d] ,dmac_reason_code[%d], locally[%d]OK!}", us_disass_reason_code,
332 us_dmac_reason_code, locally_generated);
333
334 return HI_SUCCESS;
335 }
336
337 /* ****************************************************************************
338 函 数 名 : wal_connect_new_sta_proc_ap
339 功能描述 : 驱动上报内核bss网络中新加入了一个STA
340 输入参数 : 无
341 输出参数 : 无
342 返 回 值 :
343 调用函数 :
344 被调函数 :
345 修改历史 :
346 1.日 期 : 2013年9月9日
347 作 者 : HiSilicon
348 修改内容 : 新生成函数
349 **************************************************************************** */
350 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
351 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_connect_new_sta_proc_ap(frw_event_mem_stru * event_mem)352 hi_u32 wal_connect_new_sta_proc_ap(frw_event_mem_stru *event_mem)
353 {
354 hi_u8 user_mac_addr[WLAN_MAC_ADDR_LEN] = {0};
355 oal_station_info_stru station_info;
356
357 if (oal_unlikely(event_mem == HI_NULL)) {
358 oam_error_log0(0, OAM_SF_ASSOC, "{wal_connect_new_sta_proc_ap::event_mem is null!}");
359 return HI_ERR_CODE_PTR_NULL;
360 }
361 frw_event_stru *event = (frw_event_stru *)event_mem->puc_data;
362
363 /* 获取net_device */
364 oal_net_device_stru *netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
365 if (netdev == HI_NULL) {
366 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ASSOC, "{wal_connect_new_sta_proc_ap::netdev is null!}");
367 return HI_ERR_CODE_PTR_NULL;
368 }
369
370 /* 固定长度的结构体进行内存初始化 */
371 memset_s(&station_info, sizeof(oal_station_info_stru), 0, sizeof(oal_station_info_stru));
372
373 /* 向内核标记填充了关联请求帧的ie信息 */
374 #if (LINUX_VERSION_CODE >= kernel_version(4, 0, 0))
375 /* Linux 4.0 版本不需要STATION_INFO_ASSOC_REQ_IES 标识 */
376 #else
377 station_info.filled |= STATION_INFO_ASSOC_REQ_IES;
378 #endif
379
380 hmac_asoc_user_req_ie_stru *asoc_user_req_info = (hmac_asoc_user_req_ie_stru *)(event->auc_event_data);
381 station_info.assoc_req_ies = asoc_user_req_info->puc_assoc_req_ie_buff;
382 if (station_info.assoc_req_ies == HI_NULL) {
383 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ASSOC, "{wal_connect_new_sta_proc_ap::asoc ie is null!}");
384 return HI_ERR_CODE_PTR_NULL;
385 }
386 station_info.assoc_req_ies_len = asoc_user_req_info->assoc_req_ie_len;
387
388 /* 获取关联user mac addr */
389 if (memcpy_s(user_mac_addr, WLAN_MAC_ADDR_LEN,
390 (hi_u8 *)asoc_user_req_info->auc_user_mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
391 oam_error_log0(0, OAM_SF_ASSOC, "{wal_connect_new_sta_proc_ap::mem safe function err!}");
392 return HI_FAIL;
393 }
394
395 /* 调用内核接口,上报STA关联结果 */
396 hi_u32 ret = oal_cfg80211_new_sta(netdev, user_mac_addr, WLAN_MAC_ADDR_LEN, &station_info, GFP_ATOMIC);
397 if (ret != HI_SUCCESS) {
398 oam_error_log1(event->event_hdr.vap_id, OAM_SF_ASSOC,
399 "{wal_connect_new_sta_proc_ap::oal_cfg80211_new_sta fail[%d]!}", ret);
400 return ret;
401 }
402
403 oam_warning_log3(event->event_hdr.vap_id, OAM_SF_ASSOC,
404 "{wal_connect_new_sta_proc_ap mac[XX:XX:XX:%02X:%02X:%02X]}", user_mac_addr[3], user_mac_addr[4],
405 user_mac_addr[5]); /* 3/4/5 MAC地址位数 */
406
407 return HI_SUCCESS;
408 }
409
410 /* ****************************************************************************
411 函 数 名 : wal_disconnect_sta_proc_ap
412 功能描述 : 驱动上报内核bss网络中删除了一个STA
413 输入参数 : 无
414 输出参数 : 无
415 返 回 值 :
416 调用函数 :
417 被调函数 :
418 修改历史 :
419 1.日 期 : 2013年9月9日
420 作 者 : HiSilicon
421 修改内容 : 新生成函数
422 **************************************************************************** */
423 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
424 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_disconnect_sta_proc_ap(frw_event_mem_stru * event_mem)425 hi_u32 wal_disconnect_sta_proc_ap(frw_event_mem_stru *event_mem)
426 {
427 frw_event_stru *event = HI_NULL;
428 oal_net_device_stru *netdev = HI_NULL;
429 hi_u8 user_mac_addr[WLAN_MAC_ADDR_LEN] = {0};
430 hi_u32 ret;
431
432 if (oal_unlikely(event_mem == HI_NULL)) {
433 oam_error_log0(0, OAM_SF_ASSOC, "{wal_disconnect_sta_proc_ap::event_mem is null!}");
434 return HI_ERR_CODE_PTR_NULL;
435 }
436
437 event = (frw_event_stru *)event_mem->puc_data;
438
439 /* 获取net_device */
440 netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
441 if (netdev == HI_NULL) {
442 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ASSOC,
443 "{wal_disconnect_sta_proc_ap::get net device ptr is null!}");
444 return HI_ERR_CODE_PTR_NULL;
445 }
446 /* 获取去关联user mac addr */
447 if (memcpy_s(user_mac_addr, WLAN_MAC_ADDR_LEN,
448 (hi_u8 *)event->auc_event_data, WLAN_MAC_ADDR_LEN) != EOK) { /* event->auc_event_data: 可变数组 */
449 oam_error_log0(0, OAM_SF_ASSOC, "{wal_disconnect_sta_proc_ap::mem safe function err!}");
450 return HI_FAIL;
451 }
452 /* 调用内核接口,上报STA去关联结果 */
453 ret = oal_cfg80211_del_sta(netdev, user_mac_addr, WLAN_MAC_ADDR_LEN, GFP_ATOMIC);
454 if (ret != HI_SUCCESS) {
455 oam_error_log1(event->event_hdr.vap_id, OAM_SF_ASSOC,
456 "{wal_disconnect_sta_proc_ap::cfg80211_del_sta fail[%d]}", ret);
457 return ret;
458 }
459
460 oam_warning_log3(event->event_hdr.vap_id, OAM_SF_ASSOC,
461 "{wal_disconnect_sta_proc_ap mac[XX:XX:XX:%02x:%02x:%02x]}",
462 user_mac_addr[3], user_mac_addr[4], user_mac_addr[5]); /* 3 4 5 数组位数 */
463
464 return HI_SUCCESS;
465 }
466
wal_set_tpc_mode(oal_net_device_stru * netdev,hi_u32 mode)467 hi_void wal_set_tpc_mode(oal_net_device_stru *netdev, hi_u32 mode)
468 {
469 wal_msg_write_stru write_msg;
470 mac_ioctl_alg_param_stru *alg_param = (mac_ioctl_alg_param_stru *)(write_msg.auc_value);
471 hi_u32 ret;
472
473 alg_param->alg_cfg = MAC_ALG_CFG_TPC_MODE;
474 alg_param->is_negtive = HI_FALSE;
475 alg_param->value = mode;
476
477 /* 抛事件到wal层处理 */
478 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ALG_PARAM, sizeof(mac_ioctl_alg_param_stru));
479
480 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
481 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_ioctl_alg_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
482 if (oal_unlikely(ret != HI_SUCCESS)) {
483 oam_error_log1(0, OAM_SF_ANY, "{wal_at_set_tpc::wal_send_cfg_event return err code [%u]!}", ret);
484 return;
485 }
486
487 return;
488 }
489
490 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
491 /* ****************************************************************************
492 函 数 名 : wal_mic_failure_proc
493 功能描述 : 驱动上报内核mic错误
494 输入参数 : 无
495 输出参数 : 无
496 返 回 值 :
497 调用函数 :
498 被调函数 :
499 修改历史 :
500 1.日 期 : 2013年12月28日
501 作 者 : HiSilicon
502 修改内容 : 新生成函数
503 **************************************************************************** */
504 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
505 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_mic_failure_proc(frw_event_mem_stru * event_mem)506 hi_u32 wal_mic_failure_proc(frw_event_mem_stru *event_mem)
507 {
508 frw_event_stru *event = HI_NULL;
509 oal_net_device_stru *netdev = HI_NULL;
510 hmac_mic_event_stru *mic_event = HI_NULL;
511
512 if (oal_unlikely(event_mem == HI_NULL)) {
513 oam_error_log0(0, OAM_SF_CRYPTO, "{wal_mic_failure_proc::event_mem is null!}");
514 return HI_ERR_CODE_PTR_NULL;
515 }
516
517 event = (frw_event_stru *)event_mem->puc_data;
518 mic_event = (hmac_mic_event_stru *)(event->auc_event_data);
519
520 /* 获取net_device */
521 netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
522 if (netdev == HI_NULL) {
523 oam_error_log0(event->event_hdr.vap_id, OAM_SF_CRYPTO, "{wal_mic_failure_proc::get net device ptr is null!}");
524 return HI_ERR_CODE_PTR_NULL;
525 }
526
527 /* 调用内核接口,上报mic攻击 */
528 oal_cfg80211_mic_failure(netdev, mic_event->auc_user_mac, mic_event->key_type, mic_event->l_key_id, HI_NULL,
529 GFP_ATOMIC);
530
531 oam_warning_log3(event->event_hdr.vap_id, OAM_SF_CRYPTO, "{wal_mic_failure_proc::mac[%x %x %x] OK!}",
532 mic_event->auc_user_mac[3], mic_event->auc_user_mac[4], /* 3 4 数组位数 */
533 mic_event->auc_user_mac[5]); /* 5 数组位数 */
534
535 return HI_SUCCESS;
536 }
537 #endif
538 /* ****************************************************************************
539 函 数 名 : wal_send_mgmt_to_host
540 功能描述 : 驱动上报内核接收到管理帧
541 输入参数 : 无
542 输出参数 : 无
543 返 回 值 :
544 调用函数 :
545 被调函数 :
546 修改历史 :
547 1.日 期 : 2014年5月17日
548 作 者 : HiSilicon
549 修改内容 : 新生成函数
550 **************************************************************************** */
551 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
552 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_send_mgmt_to_host(frw_event_mem_stru * event_mem)553 hi_u32 wal_send_mgmt_to_host(frw_event_mem_stru *event_mem)
554 {
555 frw_event_stru *event = HI_NULL;
556 oal_net_device_stru *netdev = HI_NULL;
557 hi_s32 l_freq;
558 hi_u8 *puc_buf = HI_NULL;
559 hi_u16 us_len;
560 hi_u8 ret;
561 hmac_rx_mgmt_event_stru *mgmt_frame = HI_NULL;
562 oal_ieee80211_mgmt *ieee80211_mgmt = HI_NULL;
563
564 if (oal_unlikely(event_mem == HI_NULL)) {
565 oam_error_log0(0, OAM_SF_ANY, "{wal_send_mgmt_to_host::event_mem is null!}");
566 return HI_ERR_CODE_PTR_NULL;
567 }
568
569 event = (frw_event_stru *)event_mem->puc_data;
570 mgmt_frame = (hmac_rx_mgmt_event_stru *)(event->auc_event_data);
571
572 /* 获取net_device */
573 netdev = oal_get_netdev_by_name(mgmt_frame->ac_name);
574 if (netdev == HI_NULL) {
575 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ANY, "{wal_send_mgmt_to_host::get net device ptr is null!}");
576 oal_free(mgmt_frame->puc_buf);
577 return HI_ERR_CODE_PTR_NULL;
578 }
579 oal_dev_put(netdev);
580
581 puc_buf = mgmt_frame->puc_buf;
582 us_len = mgmt_frame->us_len;
583 l_freq = mgmt_frame->l_freq;
584
585 ieee80211_mgmt = (oal_ieee80211_mgmt *)puc_buf;
586 /* 调用内核接口,上报接收到管理帧 */
587 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
588 ret = HdfWifiEventRxMgmt(netdev, l_freq, 0, puc_buf, us_len);
589 #else
590 ret = oal_cfg80211_rx_mgmt(netdev, l_freq, puc_buf, us_len, GFP_ATOMIC);
591 #endif
592 if (ret != HI_SUCCESS) {
593 oam_warning_log2(event->event_hdr.vap_id, OAM_SF_ANY, "{wal_send_mgmt_to_host::fc[0x%04x], if_type[%d]!}",
594 ieee80211_mgmt->frame_control, GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype);
595 oam_warning_log3(event->event_hdr.vap_id, OAM_SF_ANY,
596 "{wal_send_mgmt_to_host::cfg80211_rx_mgmt_ext fail[%d]!len[%d], freq[%d]}", ret, us_len, l_freq);
597 oal_free(puc_buf);
598 return HI_FAIL;
599 }
600 oam_info_log3(event->event_hdr.vap_id, OAM_SF_ANY, "{wal_send_mgmt_to_host::freq = %d, len = %d, TYPE[%04X] OK!}",
601 l_freq, us_len, ieee80211_mgmt->frame_control);
602 oal_free(puc_buf);
603 return HI_SUCCESS;
604 }
605
606 #ifdef _PRE_WLAN_FEATURE_P2P
607 /* ****************************************************************************
608 函 数 名 : wal_p2p_listen_timeout
609 功能描述 : HMAC上报监听超时
610 输入参数 : frw_event_mem_stru *event_mem
611 输出参数 : 无
612 返 回 值 : hi_u32
613 调用函数 :
614 被调函数 :
615 修改历史 :
616 1.日 期 : 2014年11月25日
617 作 者 : HiSilicon
618 修改内容 : 新生成函数
619 **************************************************************************** */
620 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
621 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_p2p_listen_timeout(frw_event_mem_stru * event_mem)622 hi_u32 wal_p2p_listen_timeout(frw_event_mem_stru *event_mem)
623 {
624 frw_event_stru *event = HI_NULL;
625 oal_wireless_dev *wdev = HI_NULL;
626 hmac_p2p_listen_expired_stru *p2p_listen_expired = HI_NULL;
627 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
628 mac_device_stru *mac_dev = HI_NULL;
629 hi_u64 ull_cookie;
630 #endif
631 oal_ieee80211_channel_stru listen_channel;
632 hi_u32 ret;
633
634 if (oal_unlikely(event_mem == HI_NULL)) {
635 oam_error_log0(0, OAM_SF_P2P, "{wal_p2p_listen_timeout::event_mem is null!}");
636 return HI_ERR_CODE_PTR_NULL;
637 }
638
639 event = (frw_event_stru *)event_mem->puc_data;
640 p2p_listen_expired = (hmac_p2p_listen_expired_stru *)(event->auc_event_data);
641
642 wdev = p2p_listen_expired->wdev;
643 listen_channel = p2p_listen_expired->st_listen_channel;
644 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) && !defined(_PRE_HDF_LINUX)
645 /* 获取mac_device_stru */
646 mac_dev = mac_res_get_dev();
647 ull_cookie = mac_dev->p2p_info.ull_last_roc_id;
648 cfg80211_remain_on_channel_expired(wdev, ull_cookie, &listen_channel, GFP_ATOMIC);
649 #endif
650 /* 调用内核接口,上报报监听超时 */
651 ret = HdfWifiEventCancelRemainOnChannel(wdev->netdev, listen_channel.center_freq);
652 if (ret != HI_SUCCESS) {
653 oam_error_log1(event->event_hdr.vap_id, OAM_SF_P2P, "{wal_p2p_listen_timeout!}", ret);
654 return ret;
655 }
656
657 return HI_SUCCESS;
658 }
659 #endif
660
661 #ifdef _PRE_WLAN_FEATURE_MESH
662 /* ****************************************************************************
663 函 数 名 : wal_mesh_close_peer_inform
664 功能描述 : MESH 驱动上报Wpa 通知其对指定远端节点发起取消配对流程
665 输入参数 : 无
666 输出参数 : 无
667 返 回 值 :
668 调用函数 :
669 被调函数 :
670 修改历史 :
671 1.日 期 : 2019年1月26日
672 作 者 : HiSilicon
673 修改内容 : 新生成函数
674 **************************************************************************** */
675 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
676 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_mesh_close_peer_inform(frw_event_mem_stru * event_mem)677 hi_u32 wal_mesh_close_peer_inform(frw_event_mem_stru *event_mem)
678 {
679 frw_event_stru *event = HI_NULL;
680 oal_net_device_stru *netdev = HI_NULL;
681 hi_u32 *pul_reason_code = HI_NULL;
682 hi_u16 us_disass_reason_code;
683 hi_u16 us_dmac_reason_code;
684 hi_u32 ret;
685 hi_u8 user_mac_addr[WLAN_MAC_ADDR_LEN] = {0};
686
687 if (oal_unlikely(event_mem == HI_NULL)) {
688 oam_error_log0(0, OAM_SF_ASSOC, "{wal_mesh_close_peer_inform::event_mem is null!}");
689 return HI_ERR_CODE_PTR_NULL;
690 }
691
692 event = (frw_event_stru *)event_mem->puc_data;
693
694 /* 获取net_device */
695 netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
696 if (netdev == HI_NULL) {
697 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ASSOC,
698 "{wal_mesh_close_peer_inform::get net device ptr is null!}");
699 return HI_ERR_CODE_PTR_NULL;
700 }
701 /* 获取待去关联的用户的Mac地址 */
702 if (memcpy_s(user_mac_addr, WLAN_MAC_ADDR_LEN, (hi_u8 *)event->auc_event_data, WLAN_MAC_ADDR_LEN) !=
703 EOK) { /* event->auc_event_data, 可变数组 */
704 oam_error_log0(0, OAM_SF_ASSOC, "{wal_mesh_close_peer_inform::mem safe function err!}");
705 return HI_FAIL;
706 }
707 /* 获取去关联原因码指针 */
708 pul_reason_code = (hi_u32 *)(event->auc_event_data + WLAN_MAC_ADDR_LEN); // 可变数组用法,lin_t e416告警屏蔽
709 us_disass_reason_code = (*pul_reason_code) & 0x0000ffff;
710 us_dmac_reason_code = ((*pul_reason_code) >> 16) & 0x0000ffff; /* 16 右移16位 */
711
712 /* 调用内核接口,上报去关联结果 */
713 ret = cfg80211_mesh_close(netdev, user_mac_addr, WLAN_MAC_ADDR_LEN, us_disass_reason_code);
714 if (ret != HI_SUCCESS) {
715 oam_error_log1(event->event_hdr.vap_id, OAM_SF_ASSOC,
716 "{wal_mesh_close_peer_inform::oal_cfg80211_mesh_close fail[%d]!}", ret);
717 return ret;
718 }
719
720 oam_warning_log2(event->event_hdr.vap_id, OAM_SF_ASSOC,
721 "{wal_mesh_close_peer_inform reason_code[%d] ,dmac_reason_code[%d]OK!}", us_disass_reason_code,
722 us_dmac_reason_code);
723
724 return HI_SUCCESS;
725 }
726 /* ****************************************************************************
727 功能描述 : MESH 驱动上报Wpa 通知有符合关联条件的远端节点
728 输入参数 : frw_event_mem_stru *event_mem
729 返 回 值 :hi_u32
730 修改历史 :
731 1.日 期 : 2019年3月21日
732 作 者 : HiSilicon
733 修改内容 : 新生成函数
734 **************************************************************************** */
735 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
736 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_mesh_new_peer_candidate(frw_event_mem_stru * event_mem)737 hi_u32 wal_mesh_new_peer_candidate(frw_event_mem_stru *event_mem)
738 {
739 frw_event_stru *event = HI_NULL;
740 oal_net_device_stru *netdev = HI_NULL;
741 hi_u32 ret;
742 hmac_report_new_peer_candidate_stru *puc_new_peer = HI_NULL;
743
744 if (oal_unlikely(event_mem == HI_NULL)) {
745 oam_error_log0(0, OAM_SF_ASSOC, "{wal_mesh_new_peer_candidate::event_mem is null!}");
746 return HI_ERR_CODE_PTR_NULL;
747 }
748
749 event = (frw_event_stru *)event_mem->puc_data;
750 puc_new_peer = (hmac_report_new_peer_candidate_stru *)(event->auc_event_data);
751
752 /* 获取net_device */
753 netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
754 if (netdev == HI_NULL) {
755 oam_error_log0(event->event_hdr.vap_id, OAM_SF_ASSOC,
756 "{wal_mesh_new_peer_candidate::get net device ptr is null!}");
757 return HI_ERR_CODE_PTR_NULL;
758 }
759
760 /* 调用内核接口,上报去关联结果 */
761 ret = cfg80211_mesh_new_peer_candidate(netdev, puc_new_peer);
762 if (ret != HI_SUCCESS) {
763 oam_error_log1(event->event_hdr.vap_id, OAM_SF_ASSOC,
764 "{wal_mesh_new_peer_candidate::wal_mesh_new_peer_candidate fail[%d]!}", ret);
765 return ret;
766 }
767
768 oam_info_log2(event->event_hdr.vap_id, OAM_SF_ASSOC, "{wal_mesh_new_peer_candidate:: mac addr = %x:%x!}",
769 puc_new_peer->auc_mac_addr[4], puc_new_peer->auc_mac_addr[5]); /* 4 5 地址位数 */
770
771 return HI_SUCCESS;
772 }
773 #endif
774
775 #ifdef _PRE_WLAN_FEATURE_ANY
776 /* ****************************************************************************
777 2 全局变量定义
778 **************************************************************************** */
779 static hi_wifi_any_callback g_any_callback = {HI_NULL, HI_NULL};
780 static hi_wifi_any_scan_result_cb g_scan_ret_cb = HI_NULL;
781 static hi_wifi_any_peer_info g_peer_info;
782 static hi_u8 g_query_completed_flag = HI_FALSE;
783 /* ****************************************************************************
784 3 函数实现
785 **************************************************************************** */
786 /* ****************************************************************************
787 功能描述 : 注册ANY设备接口的报文发送和接收回调函数,之前注册过的会被覆盖替换掉
788 输入参数 : send_cb从用户传过来的发送回调函数
789 recv_cb从用户传过来的接收回调函数
790 返 回 值 : hi_void
791
792 修改历史 :
793 1.日 期 : 2019年1月24日
794 作 者 : HiSilicon
795 修改内容 : 新生成函数
796 **************************************************************************** */
wal_any_set_callback(hi_wifi_any_send_complete_cb send_cb,hi_wifi_any_recv_cb recv_cb)797 hi_void wal_any_set_callback(hi_wifi_any_send_complete_cb send_cb, hi_wifi_any_recv_cb recv_cb)
798 {
799 g_any_callback.send_cb = send_cb;
800 g_any_callback.recv_cb = recv_cb;
801 return;
802 }
803
804 /* ****************************************************************************
805 功能描述 : 发起扫描发现ANY对端设备信息,包括MAC地址,信道和接收到的cookie等信息
806 输入参数 : hi_wifi_any_scan_result_cb 扫描完成之后的结果回调处理函数
807 返 回 值 : hi_void
808
809 修改历史 :
810 1.日 期 : 2019年1月24日
811 作 者 : HiSilicon
812 修改内容 : 新生成函数
813 **************************************************************************** */
wal_any_set_scan_callback(hi_wifi_any_scan_result_cb cb)814 hi_void wal_any_set_scan_callback(hi_wifi_any_scan_result_cb cb)
815 {
816 g_scan_ret_cb = cb;
817 return;
818 }
819
820 /* ****************************************************************************
821 功能描述 : ANY WAL层配置HMAC层公共接口,不带参数场景使用
822 输入参数 : wlan_cfgid_enum_uint16 配置操作枚举值
823 返 回 值 : HI_SUCCESS 上报成功,其它错误码 上报失败
824
825 修改历史 :
826 1.日 期 : 2019年1月24日
827 作 者 : HiSilicon
828 修改内容 : 新生成函数
829 **************************************************************************** */
wal_any_global_config(wlan_cfgid_enum_uint16 wid,oal_net_device_stru * netdev)830 hi_s32 wal_any_global_config(wlan_cfgid_enum_uint16 wid, oal_net_device_stru *netdev)
831 {
832 wal_msg_write_stru write_msg;
833 hi_u32 ret;
834
835 if (netdev == HI_NULL) {
836 oam_error_log0(0, 0, "{wal_any_global_config:pst_netdev is NULL, need to initialize ANY.}");
837 return HI_FAIL;
838 }
839 /* **************************************************************************
840 抛事件到wal层处理
841 ************************************************************************** */
842 wal_write_msg_hdr_init(&write_msg, wid, 0);
843
844 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH, (hi_u8 *)&write_msg, HI_FALSE,
845 HI_NULL);
846 if (oal_unlikely(ret != HI_SUCCESS)) {
847 oam_warning_log1(0, OAM_SF_ANY, "{wal_any_global_config::return err code [%u]!}", ret);
848 return HI_FAIL;
849 }
850
851 return HI_SUCCESS;
852 }
853 /* ****************************************************************************
854 功能描述 : 上报接收到ANY帧事件处理
855 输入参数 : event_mem: 事件内存
856 返 回 值 : 成功返回HI_SUCCESS,失败返回其他值
857 修改历史 :
858 1.日 期 : 2019年1月24日
859 作 者 : HiSilicon
860 修改内容 : 新生成函数
861 **************************************************************************** */
862 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
863 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_any_process_rx_data(frw_event_mem_stru * event_mem)864 hi_u32 wal_any_process_rx_data(frw_event_mem_stru *event_mem)
865 {
866 frw_event_stru *event = HI_NULL;
867 oal_any_peer_param_stru *peer_param = HI_NULL;
868
869 if (oal_unlikely(event_mem == HI_NULL)) {
870 oam_error_log0(0, OAM_SF_ASSOC, "{wal_any_process_rx_data::event_mem is null!}");
871 return HI_ERR_CODE_PTR_NULL;
872 }
873
874 event = (frw_event_stru *)event_mem->puc_data;
875
876 /* 获取ANY用户数据结构体指针 */
877 peer_param = (oal_any_peer_param_stru *)event->auc_event_data;
878
879 if (g_any_callback.recv_cb != HI_NULL) {
880 /* 直接采用用户注册的接收回调函数进行处理 */
881 g_any_callback.recv_cb(peer_param->auc_mac, peer_param->puc_data, peer_param->us_len, peer_param->seq_num);
882 }
883
884 /* 释放由HMAC申请的内存 */
885 oal_mem_free(peer_param->puc_data);
886 peer_param->puc_data = HI_NULL;
887 return HI_SUCCESS;
888 }
889 /* ****************************************************************************
890 功能描述 : 上报ANY帧发送状态事件处理
891 输入参数 : event_mem: 事件内存
892 返 回 值 : 成功返回HI_SUCCESS,失败返回其他值
893 修改历史 :
894 1.日 期 : 2019年1月24日
895 作 者 : HiSilicon
896 修改内容 : 新生成函数
897 **************************************************************************** */
898 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
899 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_any_process_tx_complete(frw_event_mem_stru * event_mem)900 hi_u32 wal_any_process_tx_complete(frw_event_mem_stru *event_mem)
901 {
902 frw_event_stru *event = HI_NULL;
903 hi_u8 *puc_data = HI_NULL;
904
905 if (oal_unlikely(event_mem == HI_NULL)) {
906 oam_error_log0(0, OAM_SF_ASSOC, "{wal_any_process_tx_complete::event_mem is null!}");
907 return HI_ERR_CODE_PTR_NULL;
908 }
909
910 event = (frw_event_stru *)event_mem->puc_data;
911
912 /* 获取帧发送状态数据 */
913 puc_data = (hi_u8 *)event->auc_event_data;
914
915 /* lin_t -e415 */ /* lin_t -e416 */
916 if (g_any_callback.send_cb != HI_NULL) {
917 /* 直接采用用户注册的发送回调函数进行处理 */ /* 可变数组用法,lin_t e415/e416告警屏蔽 */
918 g_any_callback.send_cb(puc_data, puc_data[ETH_ALEN], puc_data[ETH_ALEN + 1]);
919 }
920 /* lin_t +e415 */ /* lin_t +e416 */
921
922 return HI_SUCCESS;
923 }
924 /* ****************************************************************************
925 功能描述 : 向用户上报扫描到的ANY设备信息
926 返 回 值 : 成功返回HI_SUCCESS,失败返回其他值
927 修改历史 :
928 1.日 期 : 2019年1月24日
929 作 者 : HiSilicon
930 修改内容 : 新生成函数
931 **************************************************************************** */
932 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
933 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_any_process_scan_result(frw_event_mem_stru * event_mem)934 hi_u32 wal_any_process_scan_result(frw_event_mem_stru *event_mem)
935 {
936 frw_event_stru *event = HI_NULL;
937 hmac_any_device_list_stru *puc_data = HI_NULL;
938 hi_u8 loop;
939
940 if (oal_unlikely(event_mem == HI_NULL)) {
941 oam_error_log0(0, OAM_SF_ASSOC, "{wal_any_process_scan_result::event_mem is null!}");
942 return HI_ERR_CODE_PTR_NULL;
943 }
944
945 event = (frw_event_stru *)event_mem->puc_data;
946
947 /* 获取数据指针 */
948 puc_data = *((hmac_any_device_list_stru **)(event->auc_event_data));
949 if ((puc_data == HI_NULL) || (puc_data->dev_list == HI_NULL)) {
950 oam_error_log0(0, OAM_SF_ASSOC,
951 "{wal_any_process_scan_result::puc_data or pst_dev_list is null, not initialized}");
952 return HI_ERR_CODE_PTR_NULL;
953 }
954
955 if (g_scan_ret_cb != HI_NULL) {
956 /* 直接采用用户注册的回调函数进行处理 */
957 if (puc_data->dev_num != 0) {
958 g_scan_ret_cb(puc_data->dev_list, puc_data->dev_num);
959 } else {
960 g_scan_ret_cb(HI_NULL, 0);
961 }
962 }
963
964 /* 完成上报,释放扫描结果 */
965 for (loop = 0; loop < puc_data->dev_num; loop++) {
966 if (puc_data->dev_list[loop] != HI_NULL) {
967 oal_mem_free(puc_data->dev_list[loop]);
968 puc_data->dev_list[loop] = HI_NULL;
969 }
970 }
971 puc_data->dev_num = 0;
972
973 return HI_SUCCESS;
974 }
975 /* ****************************************************************************
976 功能描述 : 向用户上报扫描到的ANY设备信息
977 返 回 值 : 成功返回HI_SUCCESS,失败返回其他值
978 修改历史 :
979 1.日 期 : 2019年1月24日
980 作 者 : HiSilicon
981 修改内容 : 新生成函数
982 **************************************************************************** */
983 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
984 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_any_process_peer_info(frw_event_mem_stru * event_mem)985 hi_u32 wal_any_process_peer_info(frw_event_mem_stru *event_mem)
986 {
987 frw_event_stru *event = HI_NULL;
988 hmac_vap_stru *hmac_vap = HI_NULL;
989 hi_wifi_any_peer_info *peer_info = HI_NULL;
990
991 if (oal_unlikely(event_mem == HI_NULL)) {
992 oam_error_log0(0, OAM_SF_ANY, "{wal_any_process_peer_info::event_mem is null!}");
993 return HI_ERR_CODE_PTR_NULL;
994 }
995
996 event = (frw_event_stru *)event_mem->puc_data;
997 hmac_vap = hmac_vap_get_vap_stru(event->event_hdr.vap_id);
998 if (hmac_vap == HI_NULL) {
999 oam_error_log1(0, OAM_SF_ANY, "{wal_any_process_peer_info::pst_hmac_vap null.vap_id[%d]}",
1000 event->event_hdr.vap_id);
1001 return HI_ERR_CODE_PTR_NULL;
1002 }
1003
1004 peer_info = (hi_wifi_any_peer_info *)(event->auc_event_data); /* event->auc_event_data, 可变数组 */
1005 memcpy_s(&g_peer_info, sizeof(hi_wifi_any_peer_info), peer_info, sizeof(hi_wifi_any_peer_info));
1006
1007 g_query_completed_flag = HI_TRUE;
1008 hi_wait_queue_wake_up_interrupt(&(hmac_vap->query_wait_q));
1009
1010 return HI_SUCCESS;
1011 }
1012
1013 /* ****************************************************************************
1014 功能描述 : 等待HMAC和DMAC返回查询ANY对端的结果
1015 返 回 值 : 成功返回HI_SUCCESS,不存在或失败返回其他值
1016
1017 修改历史 :
1018 1.日 期 : 2019年1月24日
1019 作 者 : HiSilicon
1020 修改内容 : 新生成函数
1021 **************************************************************************** */
wal_any_wait_query_result(hmac_vap_stru * hmac_vap,hi_wifi_any_peer_info * peer)1022 hi_u32 wal_any_wait_query_result(hmac_vap_stru *hmac_vap, hi_wifi_any_peer_info *peer)
1023 {
1024 hi_u32 ret;
1025 hi_u8 auc_mac[ETH_ALEN] = {0};
1026
1027 if (g_query_completed_flag == HI_FALSE) {
1028 memset_s(&g_peer_info, sizeof(hi_wifi_any_peer_info), 0, sizeof(hi_wifi_any_peer_info));
1029
1030 ret = (hi_u32)hi_wait_event_timeout(hmac_vap->query_wait_q, (HI_TRUE == g_query_completed_flag),
1031 (5 * HZ)); /* 5 频率,非wifi目录定义宏函数,误报告警,lin_t e26告警屏蔽 */
1032 if (ret == 0) {
1033 oam_warning_log1(0, OAM_SF_ANY, "wal_any_wait_query_result: query temp timeout. ret:%d", ret);
1034 return HI_FAIL;
1035 }
1036 }
1037
1038 /* 查询获取到结果之后恢复成false,便于下一次使用 */
1039 g_query_completed_flag = HI_FALSE;
1040
1041 /* 底层如果返回的对端信息MAC地址为全0,约定为对端不存在 */
1042 if (memcmp(g_peer_info.mac, auc_mac, ETH_ALEN) == 0) {
1043 oam_warning_log0(0, OAM_SF_ANY, "wal_any_wait_query_result: peer does not exist!");
1044 return HI_FAIL;
1045 }
1046
1047 memcpy_s(peer, sizeof(hi_wifi_any_peer_info), &g_peer_info, sizeof(hi_wifi_any_peer_info));
1048 return HI_SUCCESS;
1049 }
1050 #endif
1051
1052 #ifdef _PRE_WLAN_FEATURE_CSI
1053 /* ****************************************************************************
1054 功能描述 : 打开CSI数据上报开关
1055 返 回 值 : 错误码
1056 **************************************************************************** */
wal_csi_switch(hi_u8 switch_flag)1057 hi_s32 wal_csi_switch(hi_u8 switch_flag)
1058 {
1059 oal_net_device_stru *netdev = HI_NULL;
1060 wal_msg_write_stru write_msg;
1061 hi_u32 ret;
1062
1063 netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
1064 if (netdev == HI_NULL) {
1065 oam_error_log0(0, OAM_SF_CSI, "{wal_csi_switch::pst_cfg_net_dev is null.}");
1066 return HI_ERR_CODE_PTR_NULL;
1067 }
1068 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
1069 oal_dev_put(netdev);
1070 #endif
1071 write_msg.auc_value[0] = switch_flag;
1072
1073 /* **************************************************************************
1074 抛事件到hmac层处理
1075 ************************************************************************** */
1076 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CSI_SWITCH, sizeof(hi_u8));
1077 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
1078 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1079 if (ret != HI_SUCCESS) {
1080 oam_error_log1(0, OAM_SF_CSI, "{wal_csi_switch::wal_send_cfg_event return err code [%d].}", ret);
1081 return HI_FAIL;
1082 }
1083 return HI_SUCCESS;
1084 }
1085
1086 /* ****************************************************************************
1087 功能描述 : 传递CSI数据上报的回调函数指针到WAL层的获取白名单事件注册函数
1088 修改历史 :
1089 1.日 期 : 2019年2月22日
1090 作 者 : HiSilicon
1091 修改内容 : 新生成函数
1092 **************************************************************************** */
wal_csi_register_data_report_cb(hi_wifi_csi_data_cb func)1093 hi_void wal_csi_register_data_report_cb(hi_wifi_csi_data_cb func)
1094 {
1095 g_csi_data_func = func;
1096 }
1097
1098 /* ****************************************************************************
1099 功能描述 : CSI参数配置
1100 修改历史 :
1101 1.日 期 : 2019年2月22日
1102 作 者 : HiSilicon
1103 修改内容 : 新生成函数
1104 **************************************************************************** */
wal_csi_set_config(const hi_char * ifname,hi_u32 report_min_interval,const hi_wifi_csi_entry * entry_list,hi_s32 entry_num)1105 hi_s32 wal_csi_set_config(const hi_char *ifname, hi_u32 report_min_interval, const hi_wifi_csi_entry *entry_list,
1106 hi_s32 entry_num)
1107 {
1108 wal_msg_write_stru write_msg;
1109 mac_csi_config_stru csi_config;
1110 hi_u8 idx = 0;
1111
1112 for (idx = 0; idx < (hi_u8)entry_num; idx++) {
1113 /* 判断采样周期是否符合范围(0---2^15),可参考CSI上报数据格式文档 */
1114 if (entry_list->sample_period >= CSI_REPORT_PERIOD_BUTT) {
1115 oam_error_log1(0, OAM_SF_CSI, "{wal_csi_set_config::sample period of the %d entry is illegal.}", idx);
1116 return HI_FAIL;
1117 }
1118 /* 判断帧类型是否符合范围 */
1119 if (entry_list->frame_type > (CSI_FRAME_TYPE_DATA | CSI_FRAME_TYPE_MGMT | CSI_FRAME_TYPE_CTRL)) {
1120 oam_error_log1(0, OAM_SF_CSI, "{wal_csi_set_config::frame_type of the %d entry is illegal.}", idx);
1121 return HI_FAIL;
1122 }
1123 if (memcpy_s(csi_config.ast_csi_param[idx].mac_addr, WLAN_MAC_ADDR_LEN,
1124 entry_list->mac, WLAN_MAC_ADDR_LEN) != EOK) {
1125 oam_error_log0(0, OAM_SF_CSI, "{wal_csi_set_config::memcpy_s mac addr err!}");
1126 return HI_FAIL;
1127 }
1128 csi_config.ast_csi_param[idx].sample_period = entry_list->sample_period;
1129 csi_config.ast_csi_param[idx].frame_type = entry_list->frame_type;
1130 entry_list++;
1131 }
1132 csi_config.entry_num = idx;
1133 csi_config.report_min_interval = report_min_interval;
1134
1135 oal_net_device_stru *netdev = oal_get_netdev_by_name(ifname);
1136 if (netdev == HI_NULL) {
1137 oam_warning_buf(0, OAM_SF_CSI, "{wal_csi_set_config::ifname [%s] len [%d]is not found.}", (hi_char *)ifname,
1138 strlen(ifname));
1139 return HI_ERR_CODE_PTR_NULL;
1140 }
1141
1142 /* 对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
1143 memset_s(csi_config.resv, sizeof(csi_config.resv), 0, sizeof(csi_config.resv));
1144 /* 将结构体数组mac_csi_param_stru填充到事件中去 */
1145 if (memcpy_s(write_msg.auc_value, sizeof(write_msg.auc_value), &csi_config, sizeof(mac_csi_config_stru)) != EOK) {
1146 oam_error_log0(0, OAM_SF_CSI, "{wal_csi_set_config::mem safe function err!}");
1147 return HI_FAIL;
1148 }
1149 /* **************************************************************************
1150 抛事件到hmac层处理
1151 ************************************************************************** */
1152 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CSI_SET_CONFIG, sizeof(mac_csi_config_stru));
1153 hi_u32 send_event_ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
1154 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_csi_config_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1155 if (send_event_ret != HI_SUCCESS) {
1156 oam_error_log1(0, OAM_SF_CSI, "{wal_csi_set_config::wal_send_cfg_event err code [%d]!}", send_event_ret);
1157 return (hi_s32)send_event_ret;
1158 }
1159 return HI_SUCCESS;
1160 }
1161 /* ****************************************************************************
1162 功能描述 : 解析HAMC层抛到WAL层的上报CSI数据事件
1163 修改历史 :
1164 1.日 期 : 2019年2月22日
1165 作 者 : HiSilicon
1166 修改内容 : 新生成函数
1167 **************************************************************************** */
1168 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
1169 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_csi_data_report(frw_event_mem_stru * event_mem)1170 hi_u32 wal_csi_data_report(frw_event_mem_stru *event_mem)
1171 {
1172 frw_event_stru *event = HI_NULL;
1173 mac_csi_data_stru *csi_report_data = HI_NULL;
1174 hi_u8 auc_csi_data[OAL_CSI_DATA_BUFF_SIZE + OAL_CSI_TSF_SIZE];
1175 hi_u32 tsf_tmp;
1176
1177 event = (frw_event_stru *)event_mem->puc_data;
1178 csi_report_data = (mac_csi_data_stru *)event->auc_event_data;
1179
1180 /* 对数组初始化为0,避免因未初始化从而对下面数据造成影响 */
1181 if (memset_s(auc_csi_data, sizeof(auc_csi_data), 0, sizeof(auc_csi_data)) != EOK) {
1182 oam_error_log0(0, OAM_SF_ANY, "{wal_csi_data_report::memset_s err!}");
1183 return HI_FAIL;
1184 }
1185
1186 /* 取出从dmac上报的CSI数据的前4字节的32位时间戳存到tmp数组中,再强转获得10进制时间戳 */
1187 tsf_tmp = (hi_u32)(((csi_report_data->csi_data[3] & 0xFF) << 24) | /* 3 数组位数 24 左移24位 */
1188 ((csi_report_data->csi_data[2] & 0xFF) << 16) | /* 2 数组位数 16 左移16位 */
1189 ((csi_report_data->csi_data[1] & 0xFF) << 8) | /* 8 左移8位 */
1190 (csi_report_data->csi_data[0] & 0xFF));
1191 /* 将本次获取的32位时间戳与上次时间戳比较,若小于上次时间戳则说明逻辑上报的时间戳反转重新计时,
1192 * 此时需向前进1,即向第33位进1
1193 */
1194 if (tsf_tmp < g_csi_tsf_tmp) {
1195 g_csi_tsf_val++;
1196 }
1197 /* g_csi_tsf_val用于统计时间戳反转次数 */
1198 auc_csi_data[3] = (hi_u8)(g_csi_tsf_val >> 24); /* 3 数组位数 24 右移24位 */
1199 auc_csi_data[2] = (hi_u8)(g_csi_tsf_val >> 16); /* 2 数组位数 16 右移16位 */
1200 auc_csi_data[1] = (hi_u8)(g_csi_tsf_val >> 8); /* 8 右移8位 */
1201 auc_csi_data[0] = (hi_u8)(g_csi_tsf_val);
1202
1203 /* 将本次时间戳放到全局变量,以便于和下一次上报的时间戳比较 */
1204 g_csi_tsf_tmp = tsf_tmp;
1205
1206 /* 将原来dmac上报的184字节时间戳拼接4个字节,构成188字节数据,其中时间戳为拼接后的数据开头8字节,
1207 * 由原来32位变为64位
1208 */
1209 if (memcpy_s(auc_csi_data + OAL_CSI_TSF_SIZE, OAL_CSI_DATA_BUFF_SIZE, csi_report_data->csi_data,
1210 csi_report_data->data_len) != EOK) {
1211 oam_error_log0(0, OAM_SF_ANY, "{wal_csi_data_report::memcpy_s err!}");
1212 return HI_FAIL;
1213 }
1214
1215 /* 调用用户传进来的函数名,发送给用户:上报的csi数据,上报的数据长度 */
1216 if (g_csi_data_func != HI_NULL) {
1217 g_csi_data_func(auc_csi_data, (hi_s32)(csi_report_data->data_len + OAL_CSI_TSF_SIZE));
1218 }
1219 return HI_SUCCESS;
1220 }
1221 #endif
1222
1223 #ifdef _PRE_WLAN_FEATURE_P2P
1224 /* ****************************************************************************
1225 功能描述 : 解析HAMC层抛到WAL层的发送ACTION帧事件
1226 修改历史 :
1227 1.日 期 : 2019年8月15日
1228 作 者 : HiSilicon
1229 修改内容 : 新生成函数
1230 **************************************************************************** */
1231 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
1232 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_p2p_action_tx_status(frw_event_mem_stru * event_mem)1233 hi_u32 wal_p2p_action_tx_status(frw_event_mem_stru *event_mem)
1234 {
1235 frw_event_stru *tx_status_event = HI_NULL;
1236 mac_p2p_tx_status_stru *p2p_tx_status = HI_NULL;
1237 struct wireless_dev *wdev = HI_NULL;
1238 mac_vap_stru *mac_vap = HI_NULL;
1239 mac_vap_stru *tmp_mac_vap = HI_NULL;
1240 hi_u32 netdev_index;
1241 oal_net_device_stru *netdev = HI_NULL;
1242 hi_u8 is_get_net_device = HI_FALSE;
1243 hi_u32 ret = HI_FAIL;
1244
1245 tx_status_event = (frw_event_stru *)event_mem->puc_data;
1246 p2p_tx_status = (mac_p2p_tx_status_stru *)tx_status_event->auc_event_data;
1247
1248 mac_vap = mac_vap_get_vap_stru(tx_status_event->event_hdr.vap_id);
1249 if (mac_vap == HI_NULL) {
1250 oam_error_log0(0, OAM_SF_CSI, "{wal_p2p_action_tx_status::mac_vap is null.}");
1251 return HI_FAIL;
1252 }
1253
1254 /* 获取到当前发送ACTION帧的net_device */
1255 for (netdev_index = 0; netdev_index < WLAN_VAP_NUM_PER_BOARD; netdev_index++) {
1256 netdev = oal_get_past_net_device_by_index(netdev_index);
1257 if (netdev != HI_NULL && netdev->mlPriv != HI_NULL) {
1258 tmp_mac_vap = (mac_vap_stru *)netdev->mlPriv;
1259 if (mac_vap->vap_id == tmp_mac_vap->vap_id) {
1260 is_get_net_device = HI_TRUE;
1261 break;
1262 }
1263 }
1264 }
1265
1266 hi_unref_param(wdev);
1267 if (is_get_net_device == HI_TRUE) {
1268 wdev = netdev->ieee80211Ptr; /* past_net_device不会是空指针,误报lint,-g- lin_t !e613 */
1269 HdfWifiEventMgmtTxStatus(wdev->netdev, p2p_tx_status->puc_buf, p2p_tx_status->len, p2p_tx_status->ack);
1270 ret = HI_SUCCESS;
1271 }
1272
1273 return ret;
1274 }
1275 #endif
1276
1277 /* ****************************************************************************
1278 功能描述 : 解析HAMC层抛到WAL层的MAC地址
1279 **************************************************************************** */
wal_get_efuse_mac_from_dev(frw_event_mem_stru * event_mem)1280 hi_u32 wal_get_efuse_mac_from_dev(frw_event_mem_stru *event_mem)
1281 {
1282 frw_event_stru *event = HI_NULL;
1283 hi_u32 ret;
1284
1285 if (oal_unlikely(event_mem == HI_NULL)) {
1286 oam_error_log0(0, OAM_SF_TX, "{wal_get_efuse_mac_from_dev::event_mem is null!}");
1287 return HI_ERR_CODE_PTR_NULL;
1288 }
1289
1290 event = (frw_event_stru *)event_mem->puc_data;
1291 ret = wal_set_dev_addr_from_efuse((const hi_char *)event->auc_event_data, WLAN_MAC_ADDR_LEN);
1292 if (ret != HI_SUCCESS) {
1293 oam_warning_log0(0, OAM_SF_TX, "{wal_get_efuse_mac_from_dev::set dev_addr fail!}");
1294 }
1295
1296 return HI_SUCCESS;
1297 }
1298
wal_register_tx_params_callback(hi_wifi_report_tx_params_callback func)1299 hi_void wal_register_tx_params_callback(hi_wifi_report_tx_params_callback func)
1300 {
1301 g_wal_report_tx_params_callback = func;
1302 }
1303
wal_report_tx_params(frw_event_mem_stru * event_mem)1304 hi_u32 wal_report_tx_params(frw_event_mem_stru *event_mem)
1305 {
1306 frw_event_stru *event = HI_NULL;
1307 hi_wifi_report_tx_params *data = HI_NULL;
1308
1309 if (oal_unlikely(event_mem == HI_NULL)) {
1310 oam_error_log0(0, OAM_SF_TX, "{wal_get_efuse_mac_from_dev::event_mem is null!}");
1311 return HI_ERR_CODE_PTR_NULL;
1312 }
1313
1314 event = (frw_event_stru *)event_mem->puc_data;
1315 data = (hi_wifi_report_tx_params *)event->auc_event_data;
1316
1317 if (g_wal_report_tx_params_callback == HI_NULL) {
1318 return HI_ERR_CODE_PTR_NULL;
1319 }
1320
1321 return g_wal_report_tx_params_callback(data);
1322 }
1323
1324 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
wal_get_dbg_cal_data_from_dev(frw_event_mem_stru * event_mem)1325 hi_u32 wal_get_dbg_cal_data_from_dev(frw_event_mem_stru *event_mem)
1326 {
1327 frw_event_stru *event = HI_NULL;
1328 const hi_u8 data_strlen = 77; /* 77:数据字符串的长度 */
1329 hi_char data_str[data_strlen];
1330 if (oal_unlikely(event_mem == HI_NULL)) {
1331 oam_error_log0(0, OAM_SF_TX, "{wal_get_efuse_mac_from_dev::event_mem is null!}\r\n");
1332 return HI_ERR_CODE_PTR_NULL;
1333 }
1334 /* 固定长度的结构体进行内存初始化 */
1335 memset_s(data_str, data_strlen, '\0', data_strlen);
1336 event = (frw_event_stru *)event_mem->puc_data;
1337 hi_u32 *cal_data = (hi_u32 *)event->auc_event_data;
1338 if (snprintf_s(data_str, data_strlen, data_strlen - 1, "0x%08x,0x%08x,0x%08x,0x%08x,0x%08x,0x%08x,0x%08x",
1339 cal_data[0], /* 0:6个补偿值之一 */
1340 cal_data[1], /* 1:6个补偿值之一 */
1341 cal_data[2], /* 2:6个补偿值之一 */
1342 cal_data[3], /* 3:6个补偿值之一 */
1343 cal_data[4], /* 4:6个补偿值之一 */
1344 cal_data[5], /* 5:6个补偿值之一 */
1345 cal_data[6]) == -1) { /* 6:6个补偿值之一 */
1346 printk("ERROR\r\n");
1347 return HI_FAIL;
1348 }
1349 /* 写到wifi_cfg */
1350 if (firmware_write_cfg((hi_u8 *)WIFI_CFG_DBB_PARAMS, (hi_u8 *)data_str, data_strlen - 1) != HI_SUCCESS) {
1351 oam_error_log0(0, OAM_SF_ANY, "wal_get_dbg_cal_data_from_dev:: save to wifi_cfg failed!");
1352 printk("ERROR\r\n");
1353 return HI_FAIL;
1354 }
1355 printk("OK\r\n");
1356 return HI_SUCCESS;
1357 }
1358 #endif
1359
1360 #ifdef FEATURE_DAQ
1361 /* ****************************************************************************
1362 功能描述 : 解析HAMC层抛到WAL层的数采状态事件
1363 修改历史 :
1364 1.日 期 : 2019年5月22日
1365 作 者 : HiSilicon
1366 修改内容 : 新生成函数
1367 **************************************************************************** */
1368 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
1369 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_data_acq_status(frw_event_mem_stru * event_mem)1370 hi_u32 wal_data_acq_status(frw_event_mem_stru *event_mem)
1371 {
1372 frw_event_stru *event = HI_NULL;
1373 hmac_vap_stru *hmac_vap = HI_NULL;
1374
1375 if (oal_unlikely(event_mem == HI_NULL)) {
1376 oam_error_log0(0, OAM_SF_TX, "{wal_cfg80211_mgmt_tx_status::event_mem is null!}");
1377 return HI_ERR_CODE_PTR_NULL;
1378 }
1379
1380 event = (frw_event_stru *)event_mem->puc_data;
1381
1382 hmac_vap = hmac_vap_get_vap_stru(event->event_hdr.vap_id);
1383 if (hmac_vap == HI_NULL) {
1384 oam_error_log1(0, OAM_SF_TX, "{wal_cfg80211_mgmt_tx_status::pst_hmac_vap null.vap_id[%d]}",
1385 event->event_hdr.vap_id);
1386 return HI_ERR_CODE_PTR_NULL;
1387 }
1388
1389 hmac_vap->acq_status_filter = *(hi_u8 *)(event->auc_event_data);
1390 hmac_vap->station_info_query_completed_flag = HI_TRUE;
1391 hi_wait_queue_wake_up_interrupt(&(hmac_vap->query_wait_q));
1392
1393 return HI_SUCCESS;
1394 }
1395 /* ****************************************************************************
1396 功能描述 : 解析HAMC层抛到WAL层的数采结果事件
1397 修改历史 :
1398 1.日 期 : 2019年5月22日
1399 作 者 : HiSilicon
1400 修改内容 : 新生成函数
1401 **************************************************************************** */
1402 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
1403 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_data_acq_result(frw_event_mem_stru * event_mem)1404 hi_u32 wal_data_acq_result(frw_event_mem_stru *event_mem)
1405 {
1406 wlan_acq_result_addr_stru *data_result_addr = HI_NULL;
1407 hmac_vap_stru *hmac_vap = HI_NULL;
1408 frw_event_stru *event = HI_NULL;
1409
1410 if (oal_unlikely(event_mem == HI_NULL)) {
1411 oam_error_log0(0, OAM_SF_TX, "{wal_cfg80211_mgmt_tx_status::event_mem is null!}");
1412 return HI_ERR_CODE_PTR_NULL;
1413 }
1414
1415 event = (frw_event_stru *)event_mem->puc_data;
1416 hmac_vap = hmac_vap_get_vap_stru(event->event_hdr.vap_id);
1417 if (hmac_vap == HI_NULL) {
1418 oam_error_log1(0, OAM_SF_TX, "{wal_cfg80211_mgmt_tx_status::pst_hmac_vap null.vap_id[%d]}",
1419 event->event_hdr.vap_id);
1420 return HI_ERR_CODE_PTR_NULL;
1421 }
1422
1423 data_result_addr = (wlan_acq_result_addr_stru *)(event->auc_event_data);
1424
1425 hmac_vap->acq_result_addr.start_addr = data_result_addr->start_addr;
1426 hmac_vap->acq_result_addr.middle_addr1 = data_result_addr->middle_addr1;
1427 hmac_vap->acq_result_addr.middle_addr2 = data_result_addr->middle_addr2;
1428 hmac_vap->acq_result_addr.end_addr = data_result_addr->end_addr;
1429
1430 hmac_vap->station_info_query_completed_flag = HI_TRUE;
1431 hi_wait_queue_wake_up_interrupt(&(hmac_vap->query_wait_q));
1432
1433 return HI_SUCCESS;
1434 }
1435 #endif
1436
1437 #if (_PRE_MULTI_CORE_MODE != _PRE_MULTI_CORE_MODE_OFFLOAD_DMAC)
1438 /* ****************************************************************************
1439 功能描述 : 解析HAMC层抛到WAL层的信道切换事件
1440 **************************************************************************** */
1441 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
1442 g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_channel_switch_report(frw_event_mem_stru * event_mem)1443 hi_u32 wal_channel_switch_report(frw_event_mem_stru *event_mem)
1444 {
1445 frw_event_stru *event = HI_NULL;
1446 oal_net_device_stru *netdev = HI_NULL;
1447 hi_s32 l_freq;
1448
1449 if (oal_unlikely(event_mem == HI_NULL)) {
1450 oam_error_log0(0, OAM_SF_TX, "{wal_channel_switch_report::event_mem is null!}");
1451 return HI_ERR_CODE_PTR_NULL;
1452 }
1453
1454 event = (frw_event_stru *)event_mem->puc_data;
1455
1456 /* 获取net_device */
1457 netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
1458 if (netdev == HI_NULL) {
1459 oam_error_log0(event->event_hdr.vap_id, OAM_SF_TX, "{wal_channel_switch_report::get net device ptr is null!}");
1460 return HI_ERR_CODE_PTR_NULL;
1461 }
1462
1463 l_freq = *(hi_s32 *)event->auc_event_data;
1464
1465 /* 调用内核接口,上报去关联结果 */
1466 hi_u32 ret = HdfWifiEventCsaChannelSwitch(netdev, l_freq);
1467 if (ret != HI_SUCCESS) {
1468 oam_error_log1(event->event_hdr.vap_id, OAM_SF_TX,
1469 "{wal_channel_switch_report::cfg80211_disconnected fail[%d]!}\r\n", ret);
1470 return ret;
1471 }
1472
1473 hi_diag_log_msg_i1(0, "{wal_channel_switch_report new channel_freq %d!}", (hi_u32)l_freq);
1474
1475 return HI_SUCCESS;
1476 }
1477 #endif
1478
1479 #ifdef __cplusplus
1480 #if __cplusplus
1481 }
1482 #endif
1483 #endif
1484