• 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 "net_adpater.h"
23 #include "hdf_base.h"
24 #include "hmac_config.h"
25 #include "oal_util.h"
26 #include "wal_customize.h"
27 #include "wal_event_msg.h"
28 #include "wal_ioctl.h"
29 #include "wal_main.h"
30 #include "oal_net.h"
31 #include "wal_scan.h"
32 #include "hdf_wlan_utils.h"
33 #include "osal_mem.h"
34 
35 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
36 #include "lwip/tcpip.h"
37 #include "lwip/netif.h"
38 #elif (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) && !defined(_PRE_HDF_LINUX)
39 #include "wal_linux_atcmdsrv.h"
40 #endif
41 
42 #ifdef _PRE_WLAN_FEATURE_MESH
43 #include "dmac_ext_if.h"
44 #include "hmac_vap.h"
45 #include "hmac_user.h"
46 #endif
47 
48 #ifdef _PRE_WLAN_FEATURE_P2P
49 #include "wal_cfg80211.h"
50 #endif
51 #include "plat_firmware.h"
52 #include "eapol.h"
53 
54 #ifdef __cplusplus
55 #if __cplusplus
56 extern "C" {
57 #endif
58 #endif
59 
60 extern hi_u8 wal_lwip_set_hwaddr(oal_net_device_stru *netDev, uint8_t *addr, uint8_t len);
61 /* ****************************************************************************
62   2 全局变量定义
63 **************************************************************************** */
64 netif_flow_ctrl_enum g_netif_flow_ctrl = NETIF_FLOW_CTRL_OFF;
65 wal_dev_addr_stru g_dev_addr = { 0 };
66 hi_u8 g_efuseMacExist = false;
67 
68 hi_u8 g_wait_mac_set = 1;
69 WifiIfAdd g_ifAdd = { 0 };
70 #define netif_is_not_ready() (NETIF_FLOW_CTRL_ON == g_netif_flow_ctrl)
71 
72 /* ****************************************************************************
73   3 函数实现
74 **************************************************************************** */
75 /* ****************************************************************************
76  功能描述  : 随机化初始mac地址 让单板启动时携带默认mac
77  修改历史      :
78  1.日    期   : 2019年5月15日
79     作    者   : HiSilicon
80     修改内容   : 新生成函数
81  2.日    期   : 2019年5月29日
82     修改内容   :增加从efuse读取mac addr
83 **************************************************************************** */
wal_init_dev_addr(hi_void)84 hi_void wal_init_dev_addr(hi_void)
85 {
86     hi_u32 ret;
87     hi_u32 wait_count = 10;
88     if ((cfg_get_mac(&g_dev_addr.ac_addr[0], ETHER_ADDR_LEN)) &&
89         (wal_macaddr_check(&g_dev_addr.ac_addr[0]) == HI_SUCCESS)) { /* 优先从nv读取MAC地址 */
90         return;
91     } else { /* 未读到正常配置的MAC地址,尝试从efuse读,或生成随机地址 */
92         /* 生成随机地址 */
93         oal_random_ether_addr(g_dev_addr.ac_addr, WLAN_MAC_ADDR_LEN);
94         g_dev_addr.ac_addr[1] = 0x11;
95         g_dev_addr.ac_addr[2] = 0x31; /* 2 地址第3位 */
96         g_dev_addr.us_status = 0;
97         g_efuseMacExist = false;
98         /* 尝试下发事件从efuse读取MAC地址 */
99         ret = wal_get_efuse_mac_addr();
100         if (oal_unlikely(ret != HI_SUCCESS)) {
101             oam_warning_log1(0, OAM_SF_ANY, "{wal_get_efuse_mac::return err code [%u]!}", ret);
102         }
103         while (g_wait_mac_set == 1 && (wait_count--) > 0) {
104             msleep(1);
105         }
106         if (g_wait_mac_set == 1) {
107             oam_warning_log0(0, OAM_SF_ANY, "{wal_init_dev_addr::read addr from efuse timeout!}");
108         }
109     }
110 }
111 
wal_get_efuse_mac_addr(hi_void)112 hi_u32 wal_get_efuse_mac_addr(hi_void)
113 {
114     oal_net_device_stru *netdev;
115     wal_msg_write_stru write_msg = { 0 };
116     hi_u32 ret;
117 
118     netdev = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
119     if (netdev == HI_NULL) {
120         oam_error_log0(0, 0, "wal_get_efuse_mac_addr::sta device not fonud.");
121         return HI_FAIL;
122     }
123 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
124     oal_dev_put(netdev);
125 #endif
126 
127     /* **************************************************************************
128                                 抛事件到wal层处理
129     ************************************************************************** */
130     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_GET_EFUSE_MAC_ADDR, sizeof(hi_s32));
131     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
132         (hi_u8 *)(&write_msg), HI_FALSE, HI_NULL);
133     if (oal_unlikely(ret != HI_SUCCESS)) {
134         oam_warning_log1(0, OAM_SF_ANY, "{wal_get_efuse_mac_addr::return err code [%u]!}\r\n", ret);
135     }
136 
137     return ret;
138 }
139 
wal_set_dev_addr_from_efuse(const hi_char * pc_addr,hi_u8 mac_len)140 hi_u32 wal_set_dev_addr_from_efuse(const hi_char *pc_addr, hi_u8 mac_len)
141 {
142     if (pc_addr == HI_NULL) {
143         oam_error_log0(0, OAM_SF_ANY, "wal_set_dev_addr:: pc_addr is NULL!");
144         return HI_FAIL;
145     }
146     if (wal_macaddr_check((hi_u8 *)pc_addr) != HI_SUCCESS) {
147         g_wait_mac_set = 2;
148         oam_warning_log0(0, OAM_SF_ANY, "wal_set_dev_addr:: mac from efuse is zero!");
149         return HI_FAIL;
150     }
151 
152     if (memcpy_s(g_dev_addr.ac_addr, ETHER_ADDR_LEN, pc_addr, mac_len) != EOK) {
153         oam_error_log0(0, 0, "wal_set_dev_addr:: memcpy_s FAILED");
154         return HI_FAIL;
155     }
156 
157     g_efuseMacExist = true;
158     g_wait_mac_set = 0;
159     return HI_SUCCESS;
160 }
161 
162 
wal_set_dev_addr(const hi_char * pc_addr,hi_u8 mac_len)163 hi_u32 wal_set_dev_addr(const hi_char *pc_addr, hi_u8 mac_len)
164 {
165     hi_u32 count = 0;
166 
167     if (pc_addr == NULL) {
168         oam_error_log0(0, OAM_SF_ANY, "wal_set_dev_addr:: pc_addr is NULL!");
169         return HI_FAIL;
170     }
171 
172     count = NetDevGetRegisterCount();
173 
174     /* 存在业务vap不能修改mac地址 */
175     if (count > 1) {
176         oam_error_log0(0, OAM_SF_ANY, "wal_set_dev_addr::vap exist, could not set mac address!");
177         return HI_FAIL;
178     }
179 
180     if (memcpy_s(g_dev_addr.ac_addr, ETHER_ADDR_LEN, pc_addr, mac_len) != EOK) {
181         oam_error_log0(0, OAM_SF_ANY, "{wal_set_dev_addr::mem safe function err!}");
182         return HI_FAIL;
183     }
184 
185     return HI_SUCCESS;
186 }
187 
188 /* 根据设备类型分配mac地址索引 */
wal_get_dev_addr_idx(nl80211_iftype_uint8 type)189 static wal_addr_idx wal_get_dev_addr_idx(nl80211_iftype_uint8 type)
190 {
191     wal_addr_idx addr_idx = WAL_ADDR_IDX_BUTT;
192 
193     switch (type) {
194         case PROTOCOL_80211_IFTYPE_STATION:
195             addr_idx = WAL_ADDR_IDX_STA0;
196             break;
197         case PROTOCOL_80211_IFTYPE_AP:
198         case PROTOCOL_80211_IFTYPE_P2P_CLIENT:
199         case PROTOCOL_80211_IFTYPE_P2P_GO:
200         case PROTOCOL_80211_IFTYPE_MESH_POINT:
201             addr_idx = WAL_ADDR_IDX_AP0;
202             break;
203         case PROTOCOL_80211_IFTYPE_P2P_DEVICE:
204             addr_idx = WAL_ADDR_IDX_STA2;
205             break;
206         default:
207             oam_error_log1(0, OAM_SF_ANY, "wal_get_dev_addr_idx:: dev type [%d] is not supported !", type);
208             break;
209     }
210 
211     return addr_idx;
212 }
213 /* 建议5.5误报,在166行对其指向内容进行了修改 */
wal_get_dev_addr(hi_u8 * pc_addr,hi_u8 addr_len,nl80211_iftype_uint8 type)214 hi_u32 wal_get_dev_addr(hi_u8 *pc_addr, hi_u8 addr_len, nl80211_iftype_uint8 type) /* 建议5.5误报,166行有元素赋值 */
215 {
216     hi_u16 us_addr[ETHER_ADDR_LEN];
217     hi_u32 tmp;
218     wal_addr_idx addr_idx;
219 
220     if (pc_addr == NULL) {
221         oam_error_log0(0, OAM_SF_ANY, "wal_get_dev_addr:: pc_addr is NULL!");
222         return HI_FAIL;
223     }
224 
225     addr_idx = wal_get_dev_addr_idx(type);
226     if (addr_idx >= WAL_ADDR_IDX_BUTT) {
227         return HI_FAIL;
228     }
229 
230     for (tmp = 0; tmp < ETHER_ADDR_LEN; tmp++) {
231         us_addr[tmp] = (hi_u16)g_dev_addr.ac_addr[tmp];
232     }
233 
234     /* 1.低位自增 2.高位取其进位 3.低位将进位位置0 */
235     us_addr[5] += addr_idx;                      /* 5 地址第6位 */
236     us_addr[4] += ((us_addr[5] & (0x100)) >> 8); /* 4 地址第5位 5 地址第6位 8 右移8位 */
237     us_addr[5] = us_addr[5] & (0xff);            /* 5 地址第6位 */
238     /* 最低位运算完成,下面类似 */
239     us_addr[3] += ((us_addr[4] & (0x100)) >> 8); /* 3 地址第4位 4 地址第5位 8 右移8位 */
240     us_addr[4] = us_addr[4] & (0xff);            /* 4 地址第5位 */
241     us_addr[2] += ((us_addr[3] & (0x100)) >> 8); /* 2 地址第3位 3 地址第4位 8 右移8位 */
242     us_addr[3] = us_addr[3] & (0xff);            /* 3 地址第4位 */
243     us_addr[1] += ((us_addr[2] & (0x100)) >> 8); /* 1 地址第2位 2 地址第3位 8 右移8位 */
244     us_addr[2] = us_addr[2] & (0xff);            /* 2 地址第3位 */
245     us_addr[0] += ((us_addr[1] & (0x100)) >> 8); /* 8 右移8位 */
246     us_addr[1] = us_addr[1] & (0xff);
247     if (us_addr[0] > 0xff) {
248         us_addr[0] = 0;
249     }
250     us_addr[0] &= 0xFE;
251 
252     for (tmp = 0; tmp < addr_len; tmp++) {
253         pc_addr[tmp] = (hi_u8)us_addr[tmp];
254     }
255 
256     return HI_SUCCESS;
257 }
258 
259 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION) || defined(_PRE_HDF_LINUX)
SpecialEtherTypeProcess(const struct NetDevice * netDev,NetBuf * buff)260 ProcessingResult SpecialEtherTypeProcess(const struct NetDevice *netDev, NetBuf *buff)
261 {
262     struct EtherHeader *header = NULL;
263     uint16_t etherType;
264     const struct Eapol *eapolInstance = NULL;
265     int ret;
266 
267     if (netDev == NULL || buff == NULL) {
268         return PROCESSING_ERROR;
269     }
270 
271     header = (struct EtherHeader *)NetBufGetAddress(buff, E_DATA_BUF);
272     etherType = ntohs(header->etherType);
273     if (etherType != ETHER_TYPE_PAE) {
274         return PROCESSING_CONTINUE;
275     }
276     if (netDev->specialProcPriv == NULL) {
277         return PROCESSING_ERROR;
278     }
279 
280     eapolInstance = EapolGetInstance();
281     ret = eapolInstance->eapolOp->writeEapolToQueue(netDev, buff);
282     if (ret != HDF_SUCCESS) {
283         NetBufFree(buff);
284     }
285     return PROCESSING_COMPLETE;
286 }
287 #endif
288 
289 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
290 /* ****************************************************************************
291  函 数 名  : netif_set_flow_ctrl_status
292  功能描述  : LiteOS协议栈流控反压接口
293  输入参数  : oal_netif *netif, netif_flow_ctrl_enum_uint8 status
294  输出参数  : 无
295  返 回 值  : hi_void
296  调用函数  :
297  被调函数  :
298 
299  修改历史      :
300   1.日    期   : 2016年3月22日
301     作    者   : HiSilicon
302     修改内容   : 新生成函数
303 
304 **************************************************************************** */
netif_set_flow_ctrl_status(const struct NetDevice * netDev,netif_flow_ctrl_enum_uint8 status)305 hi_void netif_set_flow_ctrl_status(const struct NetDevice *netDev, netif_flow_ctrl_enum_uint8 status)
306 {
307     if (netDev == HI_NULL) {
308         oam_error_log0(0, 0, "netDev parameter NULL.");
309         return;
310     }
311 
312     if (status == NETIF_FLOW_CTRL_ON) {
313         g_netif_flow_ctrl = NETIF_FLOW_CTRL_ON;
314     } else if (status == NETIF_FLOW_CTRL_OFF) {
315         g_netif_flow_ctrl = NETIF_FLOW_CTRL_OFF;
316     } else {
317         oam_error_log0(0, 0, "netif_set_flow_ctrl_status::status invalid!\r\n");
318     }
319 }
320 
321 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
322 /* ****************************************************************************
323  功能描述  : Mesh协议栈通知驱动将某个用户去关联
324  输入参数  : oal_lwip_netif *pst_netif, oal_linklayer_addr *pst_mac_addr
325  返 回 值  :hi_s32
326  修改历史      :
327   1.日    期   : 2019年1月26日
328     修改内容   : 新生成函数
329 
330 **************************************************************************** */
hwal_lwip_remove_user(oal_lwip_netif * netif,oal_linklayer_addr * mac_addr)331 hi_s32 hwal_lwip_remove_user(oal_lwip_netif *netif, oal_linklayer_addr *mac_addr)
332 {
333     oal_net_device_stru *netdev = HI_NULL;
334     mac_vap_stru *mac_vap = HI_NULL;
335     wal_msg_write_stru write_msg;
336     mac_cfg_kick_user_param_stru *kick_user_param = HI_NULL;
337 
338     if (netif == HI_NULL) {
339         oam_error_log0(0, 0, "hwal_lwip_remove_user parameter NULL.");
340         return HI_ERR_CODE_PTR_NULL;
341     }
342 
343     netdev = (oal_net_device_stru *)netif->state;
344     if (oal_unlikely((netdev == HI_NULL) || (mac_addr == HI_NULL))) {
345         oam_error_log0(0, OAM_SF_ANY, "{hwal_lwip_remove_user::pst_net_dev or pst_mac_addr null ptr error!}");
346         return HI_ERR_CODE_PTR_NULL;
347     }
348 
349     /* 获取VAP结构体 */
350     mac_vap = (mac_vap_stru *)oal_net_dev_priv(netdev);
351     /* 如果VAP结构体不存在,则直接返回 */
352     if (oal_unlikely(mac_vap == HI_NULL)) {
353         oam_warning_log0(0, OAM_SF_ANY, "{hwal_lwip_remove_user::pst_vap = OAL_PTR_NULL!}");
354         return HI_ERR_CODE_PTR_NULL;
355     }
356 
357     if (mac_addr->addrlen != WLAN_MAC_ADDR_LEN) {
358         oam_warning_log0(0, OAM_SF_ANY, "{hwal_lwip_remove_user::the mac address len is invalid!}");
359         return HI_FAIL;
360     }
361 
362     if (ether_is_multicast(mac_addr->addr)) {
363         oam_warning_log0(0, OAM_SF_ANY, "{hwal_lwip_remove_user::is not unicast mac address!}");
364         return HI_FAIL;
365     }
366 
367     /* **************************************************************************
368                              抛事件到wal层处理
369     ************************************************************************** */
370     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_KICK_USER, sizeof(mac_cfg_kick_user_param_stru));
371 
372     /* 设置配置命令参数 */
373     kick_user_param = (mac_cfg_kick_user_param_stru *)(write_msg.auc_value);
374     if (memcpy_s(kick_user_param->auc_mac_addr, WLAN_MAC_ADDR_LEN,
375         (hi_u8*)(mac_addr->addr), WLAN_MAC_ADDR_LEN) != EOK) {
376         oam_error_log0(0, OAM_SF_ANY, "{hwal_lwip_remove_user::mem safe function err!}");
377         return HI_FAIL;
378     }
379     /* 填写去关联reason code */
380     kick_user_param->us_reason_code = MAC_UNSPEC_REASON;
381 
382     hi_u32 ret = wal_send_cfg_event(netdev,
383                                     WAL_MSG_TYPE_WRITE,
384                                     WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_kick_user_param_stru),
385                                     (hi_u8 *)&write_msg,
386                                     HI_FALSE,
387                                     HI_NULL);
388     if (oal_unlikely(ret != HI_SUCCESS)) {
389         oam_warning_log1(0, OAM_SF_ANY, "{hwal_lwip_remove_user::return err code [%u]!}", ret);
390         return HI_FAIL;
391     }
392     return HI_SUCCESS;
393 }
394 
395 /* ****************************************************************************
396  功能描述  : Mesh协议栈设置beacon/probe rsp中的Hisi-optimization字段
397  输入参数  : oal_lwip_netif *pst_netif, hi_u8 uc_prio
398  返 回 值  :hi_s32
399  修改历史      :
400   1.日    期   : 2019年4月24日
401     修改内容   : 新生成函数
402 
403 **************************************************************************** */
hwal_lwip_set_beacon_priority(oal_lwip_netif * netif,hi_u8 prio)404 hi_s32 hwal_lwip_set_beacon_priority(oal_lwip_netif *netif, hi_u8 prio)
405 {
406     hi_u32 ret;
407     oal_net_device_stru *netdev = HI_NULL;
408     mac_vap_stru *mac_vap = HI_NULL;
409     wal_msg_write_stru write_msg;
410 
411     if (netif == HI_NULL) {
412         oam_error_log0(0, 0, "hwal_lwip_set_beacon_priority pst_netif parameter NULL.");
413         return HI_ERR_CODE_PTR_NULL;
414     }
415 
416     netdev = (oal_net_device_stru *)netif->state;
417     if (oal_unlikely(netdev == HI_NULL)) {
418         oam_error_log0(0, OAM_SF_ANY, "{hwal_lwip_set_beacon_priority::pst_net_dev null ptr error!}");
419         return HI_ERR_CODE_PTR_NULL;
420     }
421 
422     /* 获取VAP结构体 */
423     mac_vap = (mac_vap_stru *)oal_net_dev_priv(netdev);
424     /* 如果VAP结构体不存在,则直接返回 */
425     if (oal_unlikely(mac_vap == HI_NULL)) {
426         oam_warning_log0(0, OAM_SF_ANY, "{hwal_lwip_set_beacon_priority::pst_vap = OAL_PTR_NULL!}");
427         return HI_ERR_CODE_PTR_NULL;
428     }
429 
430     /* **************************************************************************
431                              抛事件到wal层处理
432     ************************************************************************** */
433     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_BEACON_PRIORITY, sizeof(hi_u8));
434 
435     /* 设置配置命令参数 */
436     *((hi_u8 *)(write_msg.auc_value)) = prio;
437 
438     ret = wal_send_cfg_event(netdev,
439                              WAL_MSG_TYPE_WRITE,
440                              WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
441                              (hi_u8 *)&write_msg,
442                              HI_FALSE,
443                              HI_NULL);
444     if (oal_unlikely(ret != HI_SUCCESS)) {
445         oam_warning_log1(0, OAM_SF_ANY, "{hwal_lwip_set_beacon_priority::return err code [%u]!}", ret);
446         return (hi_s32)ret;
447     }
448     return HI_SUCCESS;
449 }
450 
451 /* ****************************************************************************
452  函 数 名  : wal_netdev_set_mnid
453  功能描述  : Mesh协议栈设置vap的mnid
454  输入参数  : oal_lwip_netif *pst_netif, oal_uniqid_t us_mnid
455  返 回 值  :hi_s32
456  修改历史      :
457   1.日    期   : 2019年4月28日
458     修改内容   : 新生成函数
459 
460 **************************************************************************** */
hwal_lwip_set_mnid(oal_lwip_netif * netif,oal_uniqid_t us_mnid)461 hi_s32 hwal_lwip_set_mnid(oal_lwip_netif *netif, oal_uniqid_t us_mnid)
462 {
463     hi_u32 ret;
464     oal_net_device_stru *netdev = HI_NULL;
465     mac_vap_stru *mac_vap = HI_NULL;
466     wal_msg_write_stru write_msg;
467 
468     if (oal_unlikely(netif == HI_NULL)) {
469         oam_error_log0(0, OAM_SF_ANY, "{hwal_lwip_set_mnid::pst_netif null ptr error!}");
470         return HI_ERR_CODE_PTR_NULL;
471     }
472 
473     netdev = (oal_net_device_stru *)netif->state;
474     if (oal_unlikely(netdev == HI_NULL)) {
475         oam_error_log0(0, OAM_SF_ANY, "{hwal_lwip_set_mnid::pst_net_dev null ptr error!}");
476         return HI_ERR_CODE_PTR_NULL;
477     }
478     /* 获取VAP结构体 */
479     mac_vap = (mac_vap_stru *)oal_net_dev_priv(netdev);
480     /* 如果VAP结构体不存在,则直接返回 */
481     if (oal_unlikely(mac_vap == HI_NULL)) {
482         oam_warning_log0(0, OAM_SF_ANY, "{hwal_lwip_set_mnid::pst_vap = OAL_PTR_NULL!}");
483         return HI_ERR_CODE_PTR_NULL;
484     }
485 
486     if (mac_vap->vap_mode != WLAN_VAP_MODE_MESH) {
487         oam_warning_log0(0, OAM_SF_ANY, "{hwal_lwip_set_mnid::pst_vap is not mesh vap!}");
488         return HI_FAIL;
489     }
490 
491     /* **************************************************************************
492                              抛事件到wal层处理
493     ************************************************************************** */
494     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_MNID, sizeof(hi_u16));
495 
496     /* 设置配置命令参数 */
497     *((hi_u16 *)(write_msg.auc_value)) = us_mnid;
498 
499     ret = wal_send_cfg_event(netdev,
500                              WAL_MSG_TYPE_WRITE,
501                              WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u16),
502                              (hi_u8 *)&write_msg,
503                              HI_FALSE,
504                              HI_NULL);
505     if (oal_unlikely(ret != HI_SUCCESS)) {
506         oam_warning_log1(0, OAM_SF_ANY, "{hwal_lwip_set_mnid::return err code [%u]!}", ret);
507         return (hi_s32)ret;
508     }
509     return HI_SUCCESS;
510 }
511 #endif
512 
513 
514 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
515 /* ****************************************************************************
516  功能描述  : 驱动上报去关联状态改变到LWIP。
517 **************************************************************************** */
wal_report_sta_disassoc_to_lwip(oal_net_device_stru * netdev)518 hi_void wal_report_sta_disassoc_to_lwip(oal_net_device_stru *netdev)
519 {
520     hi_u8 index;
521     /* 内部调用函数,参数合法性由调用者保证 */
522     if (netdev->lwip_netif->linklayer_event != HI_NULL) {
523         oam_warning_log0(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::LL_EVENT_AP_DISCONN}");
524         netdev->lwip_netif->linklayer_event(netdev->lwip_netif, LL_EVENT_AP_DISCONN, HI_NULL);
525     } else {
526         oam_warning_log0(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::linklayer_event callback isn't registed}");
527     }
528 
529     (hi_void)netifapi_netif_set_link_down(netdev->lwip_netif);
530     (hi_void)netifapi_netif_set_addr(netdev->lwip_netif, HI_NULL, HI_NULL, HI_NULL);
531     for (index = 0; index < LWIP_IPV6_NUM_ADDRESSES; index++) {
532         (hi_void)netifapi_netif_rmv_ip6_address(netdev->lwip_netif, &netdev->lwip_netif->ip6_addr[index]);
533     }
534     oam_warning_log0(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::report sta disconn succ to lwip!}");
535 }
536 #endif
537 
538 /* ****************************************************************************
539  函 数 名  : wal_lwip_set_hwaddr
540  功能描述  : 向LWIP协议栈注册的修改mac地址回调函数
541  输入参数  : [1]netif
542              [2]addr
543              [3]len
544  输出参数  : 无
545  返 回 值  : hi_u32
546 **************************************************************************** */
547 /* 1337行将该函数指针赋给了netif->drv_set_hwaddr,如果改变该函数,就需要改变netif结构体,lint_t e818告警屏蔽 */
wal_lwip_set_hwaddr(oal_net_device_stru * netDev,uint8_t * addr,uint8_t len)548 hi_u8 wal_lwip_set_hwaddr(oal_net_device_stru *netDev, uint8_t *addr, uint8_t len)
549 {
550     oal_net_device_stru *netdev = HI_NULL;
551 
552     if (addr == NULL) {
553         oam_error_log0(0, 0, "addr is NULL!");
554         return (hi_u8)HI_FAIL;
555     }
556 
557     if ((addr[0] & 0x01) != 0) {
558         oam_error_log0(0, 0, "config a multicast mac address, please check!");
559         return (hi_u8)HI_FAIL;
560     }
561     if (len != ETHER_ADDR_LEN) {
562         oam_error_log1(0, 0, "config wrong mac address len=%u.", len);
563         return (hi_u8)HI_FAIL;
564     }
565 
566     netdev = netDev;
567     if (netdev == NULL) {
568         oam_error_log0(0, 0, "netdev is NULL!");
569         return (hi_u8)HI_FAIL;
570     }
571 
572     /* 如果netdev是running状态,则直接返回失败 */
573     if ((oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) != 0) {
574         oam_error_log0(0, 0, "netdev is running!");
575         return (hi_u8)HI_FAIL;
576     }
577 
578     /* 更新netdev中的mac地址 */
579     if (memcpy_s(netdev->macAddr, ETHER_ADDR_LEN, addr, ETHER_ADDR_LEN) != EOK) {
580         oam_error_log0(0, OAM_SF_ANY, "{wal_lwip_set_hwaddr::mem safe function err!}");
581         return (hi_u8)HI_FAIL;
582     }
583     /* 设置netdevice的MAC地址,MAC地址在HMAC层被初始化到MIB中 */
584     if (wal_set_mac_to_mib(netdev) != HI_SUCCESS) {
585         oam_error_log0(0, OAM_SF_ANY, "{wal_lwip_set_hwaddr::wal_set_mac_to_mib fail!}");
586         return (hi_u8)HI_FAIL;
587     }
588 
589     return (hi_u8)HI_SUCCESS;
590 }
591 
592 /* ****************************************************************************
593  功能描述  : 向LWIP协议栈注册的连接变化回调函数
594  输入参数  : struct netif *netif
595 **************************************************************************** */
596 /* 1366行将该函数指针赋给了netif->drv_set_hwaddr,如果改变该函数,就需要改变netif结构体,lint_t e818告警屏蔽 */
wal_lwip_status_callback(oal_net_device_stru * netDev,NetIfStatus status)597 hi_void wal_lwip_status_callback(oal_net_device_stru *netDev, NetIfStatus status)
598 {
599     oal_net_device_stru *netdev = netDev;
600     if (netdev == NULL) {
601         oam_error_log0(0, 0, "netdev is NULL!");
602         return;
603     }
604     if (status == NETIF_UP) {
605         wal_netdev_open(netdev);
606     } else {
607         wal_netdev_stop(netdev);
608     }
609     return;
610 }
611 #endif /* #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION) */
612 
613 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
wal_report_sta_assoc(oal_net_device_stru * netdev)614 hi_void wal_report_sta_assoc(oal_net_device_stru *netdev)
615 {
616     if (netdev->lwip_netif->linklayer_event != HI_NULL) {
617         oam_warning_log0(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::LL_EVENT_AP_CONN}");
618         netdev->lwip_netif->linklayer_event(netdev->lwip_netif, LL_EVENT_AP_CONN, (hi_u8 *)&ap_conn_info);
619     } else {
620         oam_warning_log0(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::linklayer_event callback isn't registed}");
621     }
622 
623     (hi_void)netifapi_netif_set_link_up(netdev->lwip_netif);
624 #ifdef _PRE_WLAN_FEATURE_LWIP_IPV6_AUTOCONFIG
625     (hi_void)netifapi_set_ipv6_forwarding(netdev->lwip_netif, HI_FALSE);
626     (hi_void)netifapi_set_ra_enable(netdev->lwip_netif, HI_FALSE);
627     (hi_void)netifapi_set_ip6_autoconfig_enabled(netdev->lwip_netif);
628     (hi_void)netifapi_set_accept_ra(netdev->lwip_netif, HI_TRUE);
629 #endif
630     (hi_void)netifapi_netif_add_ip6_linklocal_address(netdev->lwip_netif, HI_TRUE);
631 
632 }
633 #endif
634 /* ****************************************************************************
635  功能描述  : 驱动上报sta关联/去关联AP
636  输入参数  : frw_event_mem_stru *pst_event_mem
637  返 回 值  :hi_u32
638  修改历史      :
639   1.日    期   : 2019年7月9日
640     修改内容   : 新生成函数
641 **************************************************************************** */
642 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
643    g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_report_sta_assoc_info(frw_event_mem_stru * event_mem)644 hi_u32 wal_report_sta_assoc_info(frw_event_mem_stru *event_mem)
645 {
646     frw_event_stru *event = HI_NULL;
647     hmac_sta_report_assoc_info_stru *sta_asoc_param = HI_NULL;
648     oal_net_device_stru *netdev = HI_NULL;
649 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
650     oal_event_ap_conn_stru ap_conn_info;
651 #endif
652 
653     if (oal_unlikely(event_mem == HI_NULL)) {
654         oam_error_log0(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::pst_event_mem is null!}");
655         return HI_ERR_CODE_PTR_NULL;
656     }
657     event = (frw_event_stru *)event_mem->puc_data;
658     sta_asoc_param = (hmac_sta_report_assoc_info_stru *)event->auc_event_data;
659     netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
660     if (netdev == HI_NULL) {
661         oam_error_log0(event->event_hdr.vap_id, OAM_SF_ANY, "{wal_report_sta_assoc_info::net device null}");
662         return HI_ERR_CODE_PTR_NULL;
663     }
664 
665     if (sta_asoc_param->is_assoc == HI_TRUE) {
666 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
667         if (memcpy_s(ap_conn_info.addr.addr, WLAN_MAC_ADDR_LEN,
668             sta_asoc_param->auc_mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
669             oam_error_log0(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::mem safe function err!}");
670             return HI_FAIL;
671         }
672         ap_conn_info.addr.addrlen = WLAN_MAC_ADDR_LEN;
673         ap_conn_info.rssi = -(sta_asoc_param->rssi);
674         ap_conn_info.is_mesh_ap = sta_asoc_param->conn_to_mesh;
675 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
676         wal_report_sta_assoc(netdev);
677 #endif
678         (hi_void)netifapi_netif_add_ip6_linklocal_address(netdev->lwip_netif, HI_TRUE);
679 #endif
680         oam_warning_log0(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::report sta conn succ to lwip!}");
681         oam_warning_log4(0, OAM_SF_ANY, "{wal_report_sta_assoc_info::rssi=%x,is_mesh_ap=%d,mac addr=X:X:X:X:%x:%x}",
682             (hi_s32)(-(sta_asoc_param->rssi)), sta_asoc_param->conn_to_mesh,
683             sta_asoc_param->auc_mac_addr[4], sta_asoc_param->auc_mac_addr[5]); /* 4 5 地址位数 */
684     } else {
685 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
686         wal_report_sta_disassoc_to_lwip(netdev);
687 #endif
688     }
689 
690     return HI_SUCCESS;
691 }
692 
693 #ifdef _PRE_WLAN_FEATURE_MESH
694 /* ****************************************************************************
695  函 数 名  : wal_mesh_inform_tx_data_info
696  功能描述  : MESH 驱动上报Lwip 单播数据帧的一些信息。
697  输入参数  : frw_event_mem_stru *pst_event_mem
698  返 回 值  :hi_u32
699  修改历史      :
700   1.日    期   : 2019年1月26日
701     修改内容   : 新生成函数
702 **************************************************************************** */
703 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
704    g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_mesh_inform_tx_data_info(frw_event_mem_stru * event_mem)705 hi_u32 wal_mesh_inform_tx_data_info(frw_event_mem_stru *event_mem)
706 {
707     frw_event_stru *event = HI_NULL;
708     dmac_tx_info_report_stru *tx_info_param = HI_NULL;
709     oal_net_device_stru *netdev = HI_NULL;
710 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
711     oal_event_tx_info_stru tx_info;
712 #endif
713 
714     if (oal_unlikely(event_mem == HI_NULL)) {
715         oam_error_log0(0, OAM_SF_ANY, "{wal_mesh_inform_tx_data_info::pst_event_mem is null!}");
716         return HI_ERR_CODE_PTR_NULL;
717     }
718 
719     event = (frw_event_stru *)event_mem->puc_data;
720 
721     tx_info_param = (dmac_tx_info_report_stru *)event->auc_event_data;
722     netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
723     if (netdev == HI_NULL) {
724         oam_error_log0(event->event_hdr.vap_id, OAM_SF_ANY,
725             "{wal_mesh_inform_tx_data_info::get net device ptr is null!}");
726         return HI_ERR_CODE_PTR_NULL;
727     }
728 
729 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
730     if (memcpy_s(tx_info.addr.addr, NETIF_MAX_HWADDR_LEN, tx_info_param->auc_da, WLAN_MAC_ADDR_LEN) != EOK) {
731         oam_error_log0(0, OAM_SF_ANY, "{wal_mesh_inform_tx_data_info::mem safe function err!}");
732         return HI_FAIL;
733     }
734     tx_info.addr.addrlen = WLAN_MAC_ADDR_LEN;
735     tx_info.retry_count = tx_info_param->tx_count;
736     tx_info.status = tx_info_param->mesh_tx_status;
737     tx_info.pkt_sz = tx_info_param->us_length;
738     tx_info.data_rate = tx_info_param->rate_kbps;
739     tx_info.bandwidth = tx_info_param->bw;
740     oam_info_log4(0, OAM_SF_ANY,
741         "{wal_mesh_inform_tx_data_info::report to mesh stack,retry_count = %d,status = %d,pkt_sz = %d,data_rate = %d}",
742         tx_info_param->tx_count, tx_info_param->mesh_tx_status, tx_info_param->us_length, tx_info_param->rate_kbps);
743     oam_info_log1(0, OAM_SF_ANY, "{wal_mesh_inform_tx_data_info::report to mesh stack,bandwidth = %d!}",
744         tx_info_param->bw);
745 
746     if (netdev->lwip_netif->linklayer_event != HI_NULL) {
747         oam_warning_log0(0, OAM_SF_ANY, "{wal_mesh_inform_tx_data_info::LL_EVENT_TX_INFO}");
748         netdev->lwip_netif->linklayer_event(netdev->lwip_netif, LL_EVENT_TX_INFO, (hi_u8 *)&tx_info);
749     } else {
750         oam_warning_log0(0, OAM_SF_ANY, "{wal_mesh_inform_tx_data_info::linklayer_event callback isn't registed!}");
751     }
752 
753     oam_info_log0(0, OAM_SF_ANY, "{wal_mesh_inform_tx_data_info::report tx data info!}");
754 #else
755     hi_unref_param(tx_info_param);
756 #endif
757     return HI_SUCCESS;
758 }
759 
760 /* wal_mesh_report_assoc_info没有申明,误报lin_t515告警,告警屏蔽 */
wal_mesh_report_assoc_info(const mac_user_assoc_info_stru * assoc_info,oal_net_device_stru * netdev)761 hi_u32 wal_mesh_report_assoc_info(const mac_user_assoc_info_stru *assoc_info, oal_net_device_stru *netdev)
762 {
763     hi_unref_param(netdev);
764 
765 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
766     oal_event_new_peer_stru new_peer;
767     if (memcpy_s(new_peer.addr.addr, NETIF_MAX_HWADDR_LEN, assoc_info->auc_user_addr, WLAN_MAC_ADDR_LEN) != EOK) {
768         oam_error_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::mem safe function err!}");
769         return HI_FAIL;
770     }
771     new_peer.addr.addrlen = WLAN_MAC_ADDR_LEN;
772     new_peer.is_mesh_user = ((assoc_info->is_initiative_role << 4) | (assoc_info->is_mesh_user & 0x0F)); /* 4 */
773     new_peer.beacon_prio = assoc_info->bcn_prio;
774     new_peer.rssi = (hi_s8)(-(assoc_info->conn_rx_rssi));
775     new_peer.lqi = 0;
776 
777     if (netdev->lwip_netif->linklayer_event != HI_NULL) {
778         oam_warning_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::LL_EVENT_NEW_PEER}");
779         netdev->lwip_netif->linklayer_event(netdev->lwip_netif, LL_EVENT_NEW_PEER, (hi_s8 *)&new_peer);
780     } else {
781         oam_warning_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info:linklayer_event callback isn't registed}");
782     }
783 #endif
784 
785     if (assoc_info->is_mesh_user == HI_TRUE) {
786         oam_warning_log3(0, OAM_SF_ANY,
787             "{wal_mesh_report_mesh_user_info:report add mesh peer to lwip,bcn_prio=%d,role=%d,rssi=%d}",
788             assoc_info->bcn_prio, assoc_info->is_initiative_role, (hi_s32)(-(assoc_info->conn_rx_rssi)));
789     } else {
790         oam_warning_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::report add sta to lwip}");
791     }
792 
793     return HI_SUCCESS;
794 }
795 
796 /* ****************************************************************************
797  功能描述  : MESH 驱动上报某用户关联状态改变。
798  输入参数  : frw_event_mem_stru *pst_event_mem
799  返 回 值  :hi_u32
800  修改历史      :
801   1.日    期   : 2019年4月24日
802     修改内容   : 新生成函数
803 **************************************************************************** */
804 /* g_ast_wal_host_ctx_table数组成员,需要修改结构体frw_event_sub_table_item_stru进而需要修改
805    g_ast_dmac_host_crx_table数组的成员,其中dmac_cfg_vap_init_event对变量进行了修改,lint_t e818告警屏蔽 */
wal_mesh_report_mesh_user_info(frw_event_mem_stru * event_mem)806 hi_u32 wal_mesh_report_mesh_user_info(frw_event_mem_stru *event_mem)
807 {
808     if (oal_unlikely(event_mem == HI_NULL)) {
809         oam_error_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::pst_event_mem is null!}");
810         return HI_ERR_CODE_PTR_NULL;
811     }
812 
813     frw_event_stru *event = (frw_event_stru *)event_mem->puc_data;
814     mac_user_assoc_info_stru *assoc_info = (mac_user_assoc_info_stru *)event->auc_event_data;
815     oal_net_device_stru *netdev = hmac_vap_get_net_device(event->event_hdr.vap_id);
816     if (netdev == HI_NULL) {
817         oam_error_log0(event->event_hdr.vap_id, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::netdev null}");
818         return HI_ERR_CODE_PTR_NULL;
819     }
820 
821     if (assoc_info->assoc_state == MAC_USER_STATE_DEL) {
822 #ifdef _PRE_WLAN_FEATURE_MESH_LWIP_RIPPLE
823         oal_event_del_peer_stru del_peer;
824         if (memcpy_s(del_peer.addr.addr, NETIF_MAX_HWADDR_LEN, assoc_info->auc_user_addr, WLAN_MAC_ADDR_LEN) != EOK) {
825             oam_error_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::mem safe function err!}");
826             return HI_FAIL;
827         }
828         del_peer.addr.addrlen = WLAN_MAC_ADDR_LEN;
829         del_peer.is_mesh_user = assoc_info->is_mesh_user;
830 
831         if (netdev->lwip_netif->linklayer_event != HI_NULL) {
832             oam_warning_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::LL_EVENT_DEL_PEER}");
833             netdev->lwip_netif->linklayer_event(netdev->lwip_netif, LL_EVENT_DEL_PEER, (hi_u8 *)&del_peer);
834         } else {
835             oam_warning_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info:linklayer_event callback isn't registed}");
836         }
837 #endif
838 
839         if (assoc_info->is_mesh_user == HI_TRUE) {
840             oam_warning_log2(0, OAM_SF_ANY,
841                 "{wal_mesh_report_mesh_user_info:report del mesh peer to lwip,mac addr[%x:%x]}",
842                 assoc_info->auc_user_addr[4], assoc_info->auc_user_addr[5]); /* 4 5 地址位数 */
843         } else {
844             oam_warning_log2(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::report del sta to lwip,mac addr[%x:%x]}",
845                 assoc_info->auc_user_addr[4], assoc_info->auc_user_addr[5]); /* 4 5 地址位数 */
846         }
847 
848         return HI_SUCCESS;
849     } else if (assoc_info->assoc_state == MAC_USER_STATE_ASSOC) {
850         hi_u32 ret = wal_mesh_report_assoc_info(assoc_info, netdev);
851         return ret;
852     } else {
853         oam_warning_log0(0, OAM_SF_ANY, "{wal_mesh_report_mesh_user_info::rx unsupport state}");
854 
855         return HI_FAIL;
856     }
857 }
858 #endif /* #ifdef _PRE_WLAN_FEATURE_MESH */
859 
860 /* ****************************************************************************
861  功能描述  : 根据组播ip地址获取组播mac地址
862  输入参数  : puc_group_ip指向ip地址的指针; uc_ip_len ip地址长度
863  输出参数  : puc_group_mac 存储组播mac地址的指针
864  修改历史      :
865   1.日    期   : 2019年5月9日
866     修改内容   : 新生成函数
867 
868 **************************************************************************** */
wal_ip_conver_multi_mac(hi_u8 * puc_group_mac,const hi_u8 * puc_group_ip,hi_u8 ip_len)869 hi_void wal_ip_conver_multi_mac(hi_u8 *puc_group_mac, const hi_u8 *puc_group_ip, hi_u8 ip_len)
870 {
871     if (puc_group_ip == HI_NULL) {
872         oam_error_log0(0, 0, "wal_ip_conver_multi_mac::puc_group_ip null!");
873         return;
874     }
875 
876     if (ip_len == OAL_IPV6_ADDR_SIZE) {
877         /* ipv6下,组播mac最后4字节由IP地址映射而来 */
878         puc_group_mac[0] = 0x33;
879         puc_group_mac[1] = 0x33;
880         puc_group_ip += 12;                                                               /* 12 取最后4个字节 */
881         if (memcpy_s(puc_group_mac + 2, WLAN_MAC_ADDR_LEN - 2, puc_group_ip, 4) != EOK) { /* 2 偏移量 4 复制长度 */
882             oam_error_log0(0, OAM_SF_ANY, "{wal_ip_conver_multi_mac::mem safe function err!}");
883             return;
884         }
885     } else {
886         /* ipv4下,组播mac最后23bit由IP地址映射而来 */
887         puc_group_mac[0] = 0x01;
888         puc_group_mac[1] = 0x0;
889         puc_group_mac[2] = 0x5e; /* 2 mac第3位 */
890         puc_group_ip += 1;
891         if (memcpy_s(puc_group_mac + 3, WLAN_MAC_ADDR_LEN - 3, puc_group_ip, 3) != EOK) { /* 3 偏移量 复制长度 */
892             oam_error_log0(0, OAM_SF_ANY, "{wal_ip_conver_multi_mac::mem safe function err!}");
893             return;
894         }
895         puc_group_mac[3] &= 0x7f; /* 3 mac第4位 */
896     }
897 
898     return;
899 }
900 
wal_netdev_open_send_event(oal_net_device_stru * netdev)901 hi_u32 wal_netdev_open_send_event(oal_net_device_stru *netdev)
902 {
903     wal_msg_write_stru write_msg;
904     wal_msg_stru *rsp_msg = HI_NULL;
905     hi_u32 ret;
906 #ifdef _PRE_WLAN_FEATURE_P2P
907     wlan_p2p_mode_enum_uint8 p2p_mode;
908 #endif
909     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_START_VAP, sizeof(mac_cfg_start_vap_param_stru));
910     ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
911 
912 #ifdef _PRE_WLAN_FEATURE_P2P
913     p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype);
914     if (p2p_mode == WLAN_P2P_BUTT) {
915         oam_error_log0(0, OAM_SF_ANY, "{wal_netdev_open::wal_wireless_iftype_to_mac_p2p_mode return BUFF}");
916         wal_wake_unlock();
917         return HI_FAIL;
918     }
919     ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
920 #endif
921 
922     ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->mgmt_rate_init_flag = HI_TRUE;
923 
924     /* 发送消息 */
925     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
926         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_start_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
927     if (oal_unlikely(ret != HI_SUCCESS)) {
928         oam_warning_log1(0, OAM_SF_ANY, "{wal_netdev_open::wal_alloc_cfg_event return err code %u!}", ret);
929         wal_wake_unlock();
930         return ret;
931     }
932 
933     /* 处理返回消息 */
934     ret = wal_check_and_release_msg_resp(rsp_msg);
935     if (ret != HI_SUCCESS) {
936         oam_warning_log1(0, OAM_SF_ANY, "{wal_netdev_open::hmac start vap fail,err code[%u]!}", ret);
937         wal_wake_unlock();
938         return ret;
939     }
940 
941     return HI_SUCCESS;
942 }
943 
944 /* ****************************************************************************
945  函 数 名  : wal_netdev_open
946  功能描述  : 启用VAP
947  输入参数  : pst_net_dev: net_device
948  输出参数  : 无
949  返 回 值  : 错误码
950  调用函数  :
951  被调函数  :
952 
953  修改历史      :
954   1.日    期   : 2012年12月11日
955     作    者   : HiSilicon
956     修改内容   : 新生成函数
957 
958 **************************************************************************** */
959 
wal_netdev_open(oal_net_device_stru * netdev)960 hi_s32 wal_netdev_open(oal_net_device_stru *netdev)
961 {
962     wal_msg_query_stru query_msg;
963     wal_msg_stru *rsp_msg = HI_NULL;
964     hi_u32 ret;
965     wal_msg_rsp_stru *query_rsp_msg = HI_NULL;
966     mac_cfg_ssid_param_stru *ssid = HI_NULL;
967     hi_u8 ssid_len;
968 
969     if (oal_unlikely(netdev == HI_NULL)) {
970         oam_error_log0(0, OAM_SF_ANY, "{wal_netdev_open::pst_net_dev is null ptr!}");
971         return HI_ERR_CODE_PTR_NULL;
972     }
973 
974     oam_warning_log1(0, OAM_SF_ANY, "{wal_netdev_open::iftype:%d.!}", GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype);
975 
976     wal_wake_lock();
977 
978     if (GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_AP
979 #ifdef _PRE_WLAN_FEATURE_MESH
980         || (GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_MESH_POINT)
981 #endif
982     ) {
983         query_msg.wid = WLAN_CFGID_SSID;
984 
985         /* 发送消息 */
986         ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
987         if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
988             oam_warning_log1(0, OAM_SF_ANY, "{_wal_netdev_open::wal_alloc_cfg_event return err code %d!}", ret);
989             wal_wake_unlock();
990             return ret;
991         }
992 
993         /* 处理返回消息 */
994         query_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
995         ssid = (mac_cfg_ssid_param_stru *)(query_rsp_msg->auc_value);
996         ssid_len = ssid->ssid_len;
997 
998         oal_free(rsp_msg);
999 
1000         if (ssid_len == 0) {
1001             oam_warning_log0(0, OAM_SF_ANY, "{wal_netdev_open::ssid not set,no need to start vap.!}");
1002             oal_net_tx_wake_all_queues(); /* 启动发送队列 */
1003             wal_wake_unlock();
1004             return HI_SUCCESS;
1005         }
1006     }
1007 
1008     /* **************************************************************************
1009         抛事件到wal层处理
1010     ************************************************************************** */
1011     ret = wal_netdev_open_send_event(netdev);
1012     if (ret != HI_SUCCESS) {
1013         return ret;
1014     }
1015 
1016     if ((oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) == 0) {
1017         oal_netdevice_flags(netdev) |= OAL_IFF_RUNNING;
1018     }
1019 
1020     oal_net_tx_wake_all_queues(); /* 启动发送队列 */
1021     wal_wake_unlock();
1022 
1023     return HI_SUCCESS;
1024 }
1025 
wal_netdev_stop_del_vap(const oal_net_device_stru * netdev)1026 hi_u32 wal_netdev_stop_del_vap(const oal_net_device_stru *netdev)
1027 {
1028 #ifdef _PRE_WLAN_FEATURE_P2P
1029     mac_device_stru *mac_dev = HI_NULL;
1030 #endif
1031     /* wlan0/p2p0 down时 删除VAP */
1032     if (GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_AP ||
1033         GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_STATION ||
1034         GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_P2P_DEVICE
1035 #ifdef _PRE_WLAN_FEATURE_MESH
1036         || GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_MESH_POINT
1037 #endif
1038     ) {
1039 #ifdef _PRE_WLAN_FEATURE_P2P
1040         /* 用于删除p2p小组 */
1041         if (oal_net_dev_priv(netdev) == HI_NULL) {
1042             oam_error_log0(0, OAM_SF_ANY, "{wal_netdev_stop::pst_mac_vap is null, netdev released.}");
1043             wal_wake_unlock();
1044             return HI_SUCCESS;
1045         }
1046         mac_dev = mac_res_get_dev(); /* 用于删除p2p小组 */
1047         if (mac_dev != HI_NULL) {
1048             wal_del_p2p_group(mac_dev);
1049         }
1050 #endif
1051         wal_wake_unlock();
1052         return HI_SUCCESS;
1053     }
1054 
1055     return HI_CONTINUE;
1056 }
1057 
1058 /* ****************************************************************************
1059  函 数 名  : wal_netdev_stop
1060  功能描述  : 停用vap
1061  输入参数  : pst_net_dev: net_device
1062  输出参数  : 无
1063  返 回 值  : 错误码
1064  调用函数  :
1065  被调函数  :
1066 
1067  修改历史      :
1068   1.日    期   : 2013年5月13日
1069     修改内容   : 新生成函数
1070 
1071 **************************************************************************** */
wal_netdev_stop(oal_net_device_stru * netdev)1072 hi_s32 wal_netdev_stop(oal_net_device_stru *netdev)
1073 {
1074     wal_msg_write_stru write_msg;
1075     wal_msg_stru *rsp_msg = HI_NULL;
1076 #ifdef _PRE_WLAN_FEATURE_P2P
1077     wlan_p2p_mode_enum_uint8 p2p_mode;
1078 #endif
1079     hi_u32 ret;
1080 
1081     if (oal_unlikely((netdev == HI_NULL) || (GET_NET_DEV_CFG80211_WIRELESS(netdev) == NULL))) {
1082         oam_warning_log0(0, OAM_SF_ANY, "{wal_netdev_stop::pst_net_dev/ieee80211_ptr is null ptr!}");
1083         return HI_ERR_CODE_PTR_NULL;
1084     }
1085 
1086     /* stop the netdev's queues */
1087     oal_net_tx_stop_all_queues(); /* 停止发送队列 */
1088 
1089     oam_warning_log1(0, OAM_SF_ANY, "{wal_netdev_stop::iftype:%d.}", GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype);
1090 
1091     /* 如果netdev不是running状态,则直接返回成功 */
1092     if ((oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) == 0) {
1093         oam_warning_log0(0, OAM_SF_ANY, "{wal_netdev_stop::vap is already down!}");
1094         return HI_SUCCESS;
1095     }
1096     wal_wake_lock();
1097     wal_force_scan_complete(netdev);
1098 
1099     /* **************************************************************************
1100                            抛事件到wal层处理
1101     ************************************************************************** */
1102     /* 填写WID消息 */
1103     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_DOWN_VAP, sizeof(mac_cfg_down_vap_param_stru));
1104     ((mac_cfg_down_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
1105 #ifdef _PRE_WLAN_FEATURE_P2P
1106     p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype);
1107     if (p2p_mode == WLAN_P2P_BUTT) {
1108         oam_error_log0(0, OAM_SF_ANY, "{wal_netdev_stop::wal_wireless_iftype_to_mac_p2p_mode return BUFF}");
1109         wal_wake_unlock();
1110         return HI_FAIL;
1111     }
1112     ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
1113 #endif
1114 
1115     /* 发送消息 */
1116     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
1117         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_down_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
1118     if (oal_unlikely(ret != HI_SUCCESS)) {
1119         oam_warning_log1(0, OAM_SF_ANY, "{wal_netdev_stop::wal_alloc_cfg_event return err code %u!}", ret);
1120         wal_wake_unlock();
1121         return ret;
1122     }
1123 
1124     /* 处理返回消息 */
1125     ret = wal_check_and_release_msg_resp(rsp_msg);
1126     if (ret != HI_SUCCESS) {
1127         oam_warning_log1(0, OAM_SF_ANY, "{wal_netdev_stop::hmac stop vap fail!err code [%d]}", ret);
1128         wal_wake_unlock();
1129         return ret;
1130     }
1131 
1132     if (wal_netdev_stop_del_vap(netdev) == HI_SUCCESS) {
1133         return HI_SUCCESS;
1134     }
1135 
1136     wal_wake_unlock();
1137     return HI_SUCCESS;
1138 }
1139 
1140 /* ****************************************************************************
1141  函 数 名  : wal_netdev_get_stats
1142  功能描述  : 获取统计信息
1143 **************************************************************************** */
wal_netdev_get_stats(oal_net_device_stru * netdev)1144 static oal_net_device_stats_stru *wal_netdev_get_stats(oal_net_device_stru *netdev)
1145 {
1146     oal_net_device_stats_stru *stats = HI_NULL;
1147 
1148     if (netdev == HI_NULL) {
1149         return HI_NULL;
1150     }
1151     stats = &(netdev->stats); // modify by zhangwensheng temp
1152     stats->rxPackets = 10;
1153     stats->rxBytes = 10;
1154     stats->txPackets = 10;
1155     stats->txBytes = 10;
1156 
1157     return stats;
1158 }
1159 
1160 /* ****************************************************************************
1161  功能描述  : net device的ioctl函数
1162  输入参数  : net device指针
1163  返 回 值  : 统计结果指针
1164 **************************************************************************** */
1165 
wal_net_device_ioctl(oal_net_device_stru * netdev,oal_ifreq_stru * ifr,hi_s32 cmd)1166 static hi_s32 wal_net_device_ioctl(oal_net_device_stru *netdev, oal_ifreq_stru *ifr, hi_s32 cmd)
1167 {
1168     hi_u32 ret = HI_SUCCESS;
1169 
1170     if ((netdev == HI_NULL) || (ifr == HI_NULL)) {
1171         oam_error_log2(0, OAM_SF_ANY, "{wal_net_device_ioctl::pst_dev %p, pst_ifr %p!}", (uintptr_t)netdev,
1172             (uintptr_t)ifr);
1173         return HI_ERR_CODE_PTR_NULL;
1174     }
1175 
1176     /* 1102 wpa_supplicant 通过ioctl 下发命令 */
1177     if (cmd == WAL_SIOCDEVPRIVATE + 1) {
1178 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
1179         ret = wal_priv_cmd(netdev, ifr, cmd);
1180 #endif
1181         return ret;
1182     } else {
1183         oam_warning_log1(0, OAM_SF_ANY, "{wal_net_device_ioctl::unrecognised cmd, %d!}", cmd);
1184         return HI_SUCCESS;
1185     }
1186 }
1187 
1188 /* ****************************************************************************
1189  函 数 名  : oal_net_device_change_mtu
1190  功能描述  : net device的change_mtu函数
1191  输入参数  : net device指针
1192  输出参数  : 无
1193  返 回 值  : 统计结果指针
1194  调用函数  :
1195  被调函数  :
1196 
1197  修改历史      :
1198   1.日    期   : 2012年12月25日
1199     作    者   : HiSilicon
1200     修改内容   : 新生成函数
1201 
1202 **************************************************************************** */
1203 
oal_net_device_change_mtu(oal_net_device_stru * netdev,hi_s32 mtu)1204 static inline int32_t oal_net_device_change_mtu(oal_net_device_stru *netdev, hi_s32 mtu)
1205 {
1206     /* 需要优化 */
1207     netdev->mtu = (hi_u32)mtu;
1208     return HI_SUCCESS;
1209 }
1210 
1211 /* ****************************************************************************
1212  函 数 名  : wal_netdev_set_mac_addr
1213  功能描述  : 设置mac地址
1214  输入参数  : pst_dev: 网络设备
1215              p_addr : 地址
1216  输出参数  : 无
1217  返 回 值  :
1218  调用函数  :
1219  被调函数  :
1220 
1221  修改历史      :
1222   1.日    期   : 2012年12月24日
1223     作    者   : HiSilicon
1224     修改内容   : 新生成函数
1225 
1226 **************************************************************************** */
1227 
wal_netdev_set_mac_addr(oal_net_device_stru * netdev,void * addr)1228 static hi_s32 wal_netdev_set_mac_addr(oal_net_device_stru *netdev, void *addr)
1229 {
1230     oal_sockaddr_stru *mac_addr = HI_NULL;
1231     wal_msg_write_stru write_msg;
1232     mac_cfg_staion_id_param_stru *param = HI_NULL;
1233 #ifdef _PRE_WLAN_FEATURE_P2P
1234     oal_wireless_dev *wdev = HI_NULL;
1235 #endif
1236     hi_u32 ret;
1237 
1238     mac_addr = OsalMemAlloc(sizeof(oal_sockaddr_stru));
1239     if (mac_addr == NULL) {
1240         oam_error_log0(0, OAM_SF_ANY, "{wal_netdev_set_mac_addr::OsalMemAlloc faile!}");
1241         return HDF_ERR_MALLOC_FAIL;
1242     }
1243 
1244     if (oal_unlikely((netdev == HI_NULL) || (addr == HI_NULL))) {
1245         oam_error_log2(0, OAM_SF_ANY, "{wal_netdev_set_mac_addr::pst_net_dev or p_addr null ptr error %p, %p!}",
1246             (uintptr_t)netdev, (uintptr_t)addr);
1247         OsalMemFree(mac_addr);
1248         return HI_ERR_CODE_PTR_NULL;
1249     }
1250 
1251     if (oal_netif_running(netdev)) { /* 业务需要,lin_t e506/e774告警屏蔽 */
1252         oam_warning_log0(0, OAM_SF_ANY, "{wal_netdev_set_mac_addr::cannot set address; device running!}");
1253         OsalMemFree(mac_addr);
1254         return HI_FAIL;
1255     }
1256 
1257     if (memcpy_s((mac_addr->sa_data), WLAN_MAC_ADDR_LEN, (hi_u8 *)addr, WLAN_MAC_ADDR_LEN) != EOK) {
1258         oam_error_log0(0, OAM_SF_ANY, "{wal_netdev_set_mac_addr::mem safe function err!}");
1259         OsalMemFree(mac_addr);
1260         return HI_FAIL;
1261     }
1262     if (ether_is_multicast(mac_addr->sa_data)) {
1263         oam_warning_log0(0, OAM_SF_ANY, "{wal_netdev_set_mac_addr::can not set group/broadcast addr!}");
1264         OsalMemFree(mac_addr);
1265         return HI_FAIL;
1266     }
1267     wal_wake_lock();
1268     if (memcpy_s((netdev->macAddr), WLAN_MAC_ADDR_LEN, (mac_addr->sa_data), WLAN_MAC_ADDR_LEN) != EOK) {
1269         oam_error_log0(0, OAM_SF_ANY, "{wal_netdev_set_mac_addr::mem safe function err!}");
1270         OsalMemFree(mac_addr);
1271         return HI_FAIL;
1272     }
1273     /* 1131如果return则无法通过命令配置mac地址到寄存器 */
1274     wal_wake_unlock();
1275     /* ****************************************************************************
1276                      抛事件到wal层处理
1277     **************************************************************************** */
1278     wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_STATION_ID, sizeof(mac_cfg_staion_id_param_stru));
1279     param = (mac_cfg_staion_id_param_stru *)(write_msg.auc_value);
1280 
1281     /* 设置配置命令参数 */
1282     if (memcpy_s((param->auc_station_id), WLAN_MAC_ADDR_LEN, (mac_addr->sa_data), WLAN_MAC_ADDR_LEN) != EOK) {
1283         oam_warning_log0(0, OAM_SF_ANY, "{wal_netdev_set_mac_addr::write_msg mem safe function err!}");
1284         OsalMemFree(mac_addr);
1285         return HI_FAIL;
1286     }
1287 #ifdef _PRE_WLAN_FEATURE_P2P
1288     /* Enter the P2P mode for delivering net_device */
1289     wdev = (oal_wireless_dev *)netdev->ieee80211Ptr;
1290     param->p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(wdev->iftype);
1291     if (param->p2p_mode == WLAN_P2P_BUTT) {
1292         oam_warning_log0(0, OAM_SF_ANY,
1293             "{wal_netdev_set_mac_addr::wal_wireless_iftype_to_mac_p2p_mode return BUFF}\r\n");
1294         OsalMemFree(mac_addr);
1295         return HI_FAIL;
1296     }
1297 #endif
1298     ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
1299         WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_staion_id_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1300     if (oal_unlikely(ret != HI_SUCCESS)) {
1301         oam_warning_log1(0, OAM_SF_ANY, "{hwal_lwip_set_mnid::return err code [%u]!}", ret);
1302         OsalMemFree(mac_addr);
1303         return (hi_s32)ret;
1304     }
1305     OsalMemFree(mac_addr);
1306     return HI_SUCCESS;
1307 }
1308 
1309 /* ****************************************************************************
1310   net_device上挂接的net_device_ops函数
1311 **************************************************************************** */
1312 oal_net_device_ops_stru g_wal_net_dev_ops = {
1313     .getStats = wal_netdev_get_stats,
1314     .open = wal_netdev_open,
1315     .stop = wal_netdev_stop,
1316     .xmit = hmac_bridge_vap_xmit,
1317     .ioctl = wal_net_device_ioctl,
1318     .changeMtu = oal_net_device_change_mtu,
1319     .init = oal_net_device_init,
1320     .deInit = oal_net_free_netdev,
1321 #if (defined(_PRE_WLAN_FEATURE_FLOWCTL) || defined(_PRE_WLAN_FEATURE_OFFLOAD_FLOWCTL))
1322     .selectQueue = wal_netdev_select_queue,
1323 #endif
1324 
1325     .setMacAddr = wal_netdev_set_mac_addr,
1326 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
1327     .netifNotify = HI_NULL,
1328 #endif
1329     .specialEtherTypeProcess = SpecialEtherTypeProcess,
1330 };
1331 
1332 
1333 /* ****************************************************************************
1334  功能描述  : 获取g_wal_net_dev_ops结构
1335 **************************************************************************** */
wal_get_net_dev_ops(hi_void)1336 oal_net_device_ops_stru *wal_get_net_dev_ops(hi_void)
1337 {
1338     return &g_wal_net_dev_ops;
1339 }
1340 
wal_init_netdev(nl80211_iftype_uint8 type,oal_net_device_stru * netdev)1341 hi_s32 wal_init_netdev(nl80211_iftype_uint8 type, oal_net_device_stru *netdev)
1342 {
1343     oal_wireless_dev *wdev = HI_NULL;
1344     hi_u8 ac_addr[ETHER_ADDR_LEN] = {0};
1345 
1346     /* 对netdevice进行赋值 */
1347 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) && !defined(_PRE_HDF_LINUX)
1348     netdev->wireless_handlers = wal_get_g_iw_handler_def();
1349 #endif
1350     netdev->netDeviceIf = wal_get_net_dev_ops();
1351 
1352     if (wal_get_dev_addr(ac_addr, ETHER_ADDR_LEN, type) != HI_SUCCESS) {
1353         oam_warning_log0(0, OAM_SF_ANY, "{wal_init_wlan_netdev::wal_get_dev_addr failed!}");
1354         return HI_FAIL;
1355     }
1356 
1357     if (memcpy_s(netdev->macAddr, ETHER_ADDR_LEN, ac_addr, ETHER_ADDR_LEN) != EOK) {
1358         oam_error_log0(0, OAM_SF_ANY, "{wal_init_wlan_netdev::mem safe function err!}");
1359         return HI_FAIL;
1360     }
1361 
1362 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE) && (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) && \
1363     !defined(_PRE_HDF_LINUX)
1364     netdev->ethtool_ops = &g_wal_ethtool_ops;
1365 #endif
1366 
1367     oal_netdevice_watchdog_timeo(netdev) = 5; /* 固定设置为 5 */
1368 
1369     wdev = (oal_wireless_dev *)oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, sizeof(oal_wireless_dev));
1370     if (oal_unlikely(wdev == HI_NULL)) {
1371         oam_error_log0(0, OAM_SF_ANY, "{alloc mem, pst_wdev is null ptr!}");
1372         return HI_ERR_CODE_PTR_NULL;
1373     }
1374 
1375     /* 安全编程规则6.6例外(3)从堆中分配内存后,赋予初值 */
1376     if (memset_s(wdev, sizeof(oal_wireless_dev), 0, sizeof(oal_wireless_dev)) != EOK) {
1377         oal_mem_free(wdev);
1378         return HI_FAIL;
1379     }
1380 
1381     netdev->ieee80211Ptr = wdev;
1382     oal_netdevice_specical_proc_priv(netdev) = NULL;
1383 
1384     wdev->netdev = netdev;
1385     wdev->iftype = type;
1386 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) && !defined(_PRE_HDF_LINUX)
1387     wdev->wiphy = mac_res_get_dev()->wiphy;
1388 #elif (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION) || defined(_PRE_HDF_LINUX)
1389     wdev->wiphy = oal_wiphy_get();
1390 #endif
1391 
1392 #ifdef _PRE_WLAN_FEATURE_P2P
1393     if (type == NL80211_IFTYPE_P2P_DEVICE) {
1394         mac_wiphy_priv_stru *wiphy_priv = oal_wiphy_priv(wdev->wiphy);
1395         wiphy_priv->mac_device->p2p_info.pst_p2p_net_device = netdev;
1396     }
1397 #endif
1398 
1399     oal_netdevice_flags(netdev) &= ~OAL_IFF_RUNNING; /* 将net device的flag设为down */
1400 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
1401     /* HCC层用 */
1402     oal_netdevice_headroom(netdev) = 64; /* 固定设置为 64 */
1403     oal_netdevice_tailroom(netdev) = 32; /* 固定设置为 32 */
1404 #endif
1405 
1406 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION) || defined(_PRE_HDF_LINUX)
1407     CreateEapolData(netdev);
1408 #endif
1409 
1410     return HI_SUCCESS;
1411 }
1412 
wal_init_netif(nl80211_iftype_uint8 type,oal_net_device_stru * netdev)1413 hi_s32 wal_init_netif(nl80211_iftype_uint8 type, oal_net_device_stru *netdev)
1414 {
1415     /* 注册net_device */
1416     hi_u32 ret;
1417     (void)type;
1418     ret = NetDeviceAdd(netdev);
1419     if (oal_unlikely(ret != 0)) {
1420         oam_warning_log1(0, OAM_SF_ANY, "{wal_init_netif::NetDeviceAdd return error code %d}", ret);
1421         return HI_FAIL;
1422     }
1423     if (wal_init_wlan_vap(netdev) != HI_SUCCESS) {
1424         return HI_FAIL;
1425     }
1426 
1427     return HI_SUCCESS;
1428 }
1429 
1430 /* ****************************************************************************
1431  功能描述  : 初始化wlan设备
1432  输入参数  : [1]type 设备类型
1433              [2]mode 模式
1434              [3]NetDevice
1435  输出参数  : [1]ifname 设备名
1436              [2]len 设备名长度
1437  返 回 值  : 错误码
1438 **************************************************************************** */
1439 /* 建议5.5误检,在2024行作为strncpy_s函数的第一个参数传入 */
wal_init_drv_wlan_netdev(nl80211_iftype_uint8 type,wal_phy_mode mode,oal_net_device_stru * netdev)1440 hi_s32 wal_init_drv_wlan_netdev(nl80211_iftype_uint8 type, wal_phy_mode mode, oal_net_device_stru *netdev)
1441 {
1442     hi_char *ac_mode_str = NULL;
1443     hi_s32 ret;
1444     if (oal_unlikely(netdev == HI_NULL)) {
1445         oam_error_log0(0, OAM_SF_ANY, "{netdev is null!}");
1446         return HI_ERR_CODE_PTR_NULL;
1447     }
1448 
1449     do {
1450         ret = wal_init_netdev(type, netdev);
1451         if (ret != HI_SUCCESS) {
1452             break;
1453         }
1454 
1455         ret = wal_init_netif(type, netdev);
1456         if (ret != HI_SUCCESS) {
1457             break;
1458         }
1459         ac_mode_str = "11bgn";
1460         if (mode == WAL_PHY_MODE_11G) {
1461             ac_mode_str = "11bg";
1462         } else if (mode == WAL_PHY_MODE_11B) {
1463             ac_mode_str = "11b";
1464         }
1465 
1466         ret = wal_ioctl_set_mode(netdev, ac_mode_str);
1467     } while (false);
1468 
1469     if (ret != HI_SUCCESS) {
1470         wal_deinit_wlan_vap(netdev);
1471         oal_net_unregister_netdev(netdev);
1472         oal_net_clear_netdev(netdev);
1473         return HI_FAIL;
1474     }
1475 
1476     return HI_SUCCESS;
1477 }
1478 
SetIfName(WifiIfAdd * ifAdd)1479 hi_s32 SetIfName(WifiIfAdd *ifAdd)
1480 {
1481     if (ifAdd == NULL || ifAdd->ifName == NULL) {
1482         HDF_LOGE("%s:para is null!", __func__);
1483         return HI_FAIL;
1484     }
1485     hi_s32 ret = strcpy_s(g_ifAdd.ifName, IFNAMSIZ, ifAdd->ifName);
1486     if (ret != HI_SUCCESS) {
1487         HDF_LOGE("%s:copy ifName fail", __func__);
1488         return HI_FAIL;
1489     }
1490     return HI_SUCCESS;
1491 }
1492 
GetIfName(nl80211_iftype_uint8 type,char * ifName,uint32_t len)1493 int32_t GetIfName(nl80211_iftype_uint8 type, char *ifName, uint32_t len)
1494 {
1495     if (ifName == NULL || len == 0) {
1496         HDF_LOGE("%s:para is null!", __func__);
1497         return HI_FAIL;
1498     }
1499     switch (type) {
1500         case NL80211_IFTYPE_P2P_DEVICE:
1501             if (snprintf_s(ifName, len, len - 1, "p2p%d", 0) < 0) {
1502                 HDF_LOGE("%s:format ifName failed!", __func__);
1503                 return HI_FAIL;
1504             }
1505             break;
1506         case NL80211_IFTYPE_P2P_CLIENT:
1507             /*  fall-through */
1508         case NL80211_IFTYPE_P2P_GO:
1509             if (strcpy_s(ifName, IFNAMSIZ, g_ifAdd.ifName) != EOK) {
1510                 HDF_LOGE("%s:copy ifName fail", __func__);
1511                 return HI_FAIL;
1512             }
1513             break;
1514         default:
1515             HDF_LOGE("%s:GetIfName::not supported dev type!", __func__);
1516             return HI_FAIL;
1517     }
1518     return HI_SUCCESS;
1519 }
1520 
InitNetdev(struct NetDevice * netDevice,nl80211_iftype_uint8 type)1521 hi_s32 InitNetdev(struct NetDevice *netDevice, nl80211_iftype_uint8 type)
1522 {
1523     struct NetDevice *netdev = NULL;
1524     char ifName[WIFI_IFNAME_MAX_SIZE] = {0};
1525     struct HdfWifiNetDeviceData *data = NULL;
1526     hi_s32 ret;
1527     if (netDevice == NULL) {
1528         HDF_LOGE("%s:para is null!", __func__);
1529         return HI_FAIL;
1530     }
1531     if (GetIfName(type, ifName, WIFI_IFNAME_MAX_SIZE) != HI_SUCCESS) {
1532         HDF_LOGE("%s:get ifName failed!", __func__);
1533         return HI_FAIL;
1534     }
1535 #ifdef _PRE_HDF_LINUX
1536     netdev = NetDeviceInit(ifName, strlen(ifName), WIFI_LINK, FULL_OS);
1537 #else
1538     netdev = NetDeviceInit(ifName, strlen(ifName), WIFI_LINK, LITE_OS);
1539 #endif
1540     if (netdev == NULL) {
1541         HDF_LOGE("%s:netdev is null!", __func__);
1542         return HI_FAIL;
1543     }
1544     data = GetPlatformData(netDevice);
1545     if (data == NULL) {
1546         HDF_LOGE("%s:netdevice data null!", __func__);
1547         return HI_FAIL;
1548     }
1549     netdev->classDriverName = netDevice->classDriverName;
1550     netdev->classDriverPriv = data;
1551     ret = wal_init_drv_wlan_netdev(type, WAL_PHY_MODE_11N, netdev);
1552     if (ret != HI_SUCCESS) {
1553         oam_error_log2(0, OAM_SF_ANY, "InitP2pNetdev %s failed. return:%d\n", netdev->name, ret);
1554     }
1555 
1556     return ret;
1557 }
1558 
DeinitNetdev(nl80211_iftype_uint8 type)1559 hi_s32 DeinitNetdev(nl80211_iftype_uint8 type)
1560 {
1561     struct NetDevice *netDevice = NULL;
1562     hi_s32 ret;
1563     char *ifName = (char *)oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, WIFI_IFNAME_MAX_SIZE);
1564     if (oal_unlikely(ifName == HI_NULL)) {
1565         oam_error_log0(0, OAM_SF_ANY, "{alloc mem, pst_ifName is null ptr!}");
1566         return HI_ERR_CODE_PTR_NULL;
1567     }
1568     if (GetIfName(type, ifName, WIFI_IFNAME_MAX_SIZE) != HI_SUCCESS) {
1569         HDF_LOGE("%s:get ifName failed!", __func__);
1570         oal_mem_free(ifName);
1571         return HI_FAIL;
1572     }
1573     netDevice = NetDeviceGetInstByName(ifName);
1574 
1575     ret = wal_deinit_drv_wlan_netdev(netDevice);
1576     if (ret != HDF_SUCCESS) {
1577         HDF_LOGE("%s:wal_deinit_drv_wlan_netdev failed!", __func__);
1578         oal_mem_free(ifName);
1579         return ret;
1580     }
1581     ret = NetDeviceDeInit(netDevice);
1582     if (ret != HDF_SUCCESS) {
1583         HDF_LOGE("%s:NetDeviceDeInit failed!", __func__);
1584         oal_mem_free(ifName);
1585         return ret;
1586     }
1587     if (ifName != HI_NULL) {
1588         oal_mem_free(ifName);
1589     }
1590     return ret;
1591 }
1592 
1593 /* ****************************************************************************
1594  功能描述  : 去初始化wlan设备
1595  输入参数  : *ifname 设备名
1596  返 回 值:错误码
1597 **************************************************************************** */
wal_deinit_drv_wlan_netdev(oal_net_device_stru * netdev)1598 hi_s32 wal_deinit_drv_wlan_netdev(oal_net_device_stru *netdev)
1599 {
1600     oal_wireless_dev *wdev = HI_NULL;
1601     hi_u32 ret;
1602 
1603     if (netdev == HI_NULL) {
1604         oam_warning_log0(0, OAM_SF_ANY, "{wal_deinit_wlan_netdev::netdev is null!}");
1605         return HI_ERR_CODE_PTR_NULL;
1606     }
1607 
1608     /* 先通知lwip解注册 */
1609     oal_net_unregister_netdev(netdev);
1610 
1611     ret = wal_deinit_wlan_vap(netdev);
1612     if (ret != HI_SUCCESS) {
1613         oam_warning_log0(0, OAM_SF_ANY, "{wal_deinit_wlan_netdev::deinit vap failed!}");
1614         return HI_FAIL;
1615     }
1616     wdev = (struct wireless_dev *)oal_netdevice_wdev(netdev);
1617     if (wdev != HI_NULL) {
1618         oal_mem_free(wdev);
1619     }
1620     oal_net_clear_netdev(netdev);
1621 
1622     return HI_SUCCESS;
1623 }
1624 
1625 /* ****************************************************************************
1626  功能描述  : 判断netdev是否处于busy
1627 **************************************************************************** */
wal_dev_is_running(hi_void)1628 hi_u8 wal_dev_is_running(hi_void)
1629 {
1630     return NetDeviceIsAnyInstRunning();
1631 }
1632 
1633 #ifdef __cplusplus
1634 #if __cplusplus
1635 }
1636 #endif
1637 #endif
1638