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