• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17  */
18 
19 /* ****************************************************************************
20   1 头文件包含
21 **************************************************************************** */
22 #include "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