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