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