1 /*
2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 /* ****************************************************************************
20 1 头文件包含
21 **************************************************************************** */
22 #include "oal_ext_if.h"
23 #include "oam_ext_if.h"
24 #include "hmac_ext_if.h"
25 #include "wal_main.h"
26 #include "wal_ioctl.h"
27 #include "wal_event_msg.h"
28 #include "wal_hipriv.h"
29 #include "net_adpater.h"
30 #include "wal_11d.h"
31
32 #include "wal_customize.h"
33
34 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
35 #endif
36
37 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
38 #include "lwip/netifapi.h"
39 #endif
40 #ifdef _PRE_WLAN_FEATURE_ANY
41 #include "hi_any_api.h"
42 #endif
43
44 #ifdef __cplusplus
45 #if __cplusplus
46 extern "C" {
47 #endif
48 #endif
49
50 #define MAX_PRIV_CMD_SIZE 4096
51
52 /* ****************************************************************************
53 私有命令函数表. 私有命令格式:
54 设备名 命令名 参数
55 hipriv "Hisilicon0 create vap0"
56 **************************************************************************** */
57 #define CMD_SET_AP_WPS_P2P_IE "SET_AP_WPS_P2P_IE"
58 #define CMD_P2P_SET_NOA "P2P_SET_NOA"
59 #define CMD_P2P_SET_PS "P2P_SET_PS"
60 #define CMD_SET_POWER_ON "SET_POWER_ON"
61 #define CMD_SET_POWER_MGMT_ON "SET_POWER_MGMT_ON"
62 #define CMD_COUNTRY "COUNTRY"
63 #define CMD_SET_QOS_MAP "SET_QOS_MAP"
64 #define CMD_TX_POWER "TX_POWER"
65 #define CMD_WPAS_GET_CUST "WPAS_GET_CUST"
66 #define CMD_SET_SSID "SET_SSID"
67
68 /* ****************************************************************************
69 结构体定义
70 **************************************************************************** */
71 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
72 typedef struct {
73 hi_u32 ap_max_user; /* ap最大用户数 */
74 hi_char ac_ap_mac_filter_mode[257]; /* AP mac地址过滤命令参数,最长257 */
75 hi_s32 ap_power_flag; /* AP上电标志 */
76 } wal_ap_config_stru;
77 #endif /* #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) */
78
79 /* ****************************************************************************
80 2 函数声明
81 **************************************************************************** */
82 /* 静态函数声明 */
83 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
84 static hi_u32 wal_ioctl_get_mode(oal_net_device_stru *netdev, hi_s8 *pc_param);
85 static hi_u32 wal_ioctl_get_essid(oal_net_device_stru *netdev, hi_s8 *pc_param);
86 static hi_u32 wal_ioctl_get_bss_type(oal_net_device_stru *netdev, hi_s8 *pc_param);
87 static hi_u32 wal_ioctl_set_bss_type(oal_net_device_stru *netdev, hi_s8 *pc_param);
88 static hi_u32 wal_ioctl_get_freq(oal_net_device_stru *netdev, hi_s8 *pc_param);
89 static hi_u32 wal_ioctl_get_txpower(oal_net_device_stru *netdev, hi_s8 *pc_param);
90 static hi_u32 wal_ioctl_get_apaddr(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
91 oal_sockaddr_stru *addr, hi_s8 *pc_extra);
92 static hi_u32 wal_ioctl_get_iwrate(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
93 oal_iw_param_stru *param, hi_s8 *pc_extra);
94 static hi_u32 wal_ioctl_get_iwsense(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
95 oal_iw_param_stru *param, hi_s8 *pc_extra);
96 static hi_u32 wal_ioctl_get_rtsthres(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
97 oal_iw_param_stru *param, hi_s8 *pc_extra);
98 static hi_u32 wal_ioctl_get_fragthres(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
99 oal_iw_param_stru *param, hi_s8 *pc_extra);
100 static hi_u32 wal_ioctl_get_iwencode(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
101 oal_iw_point_stru *param, hi_s8 *pc_extra);
102 static hi_u32 wal_ioctl_get_iwrange(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
103 oal_iw_point_stru *param, hi_s8 *pc_extra);
104 static hi_u32 wal_ioctl_get_param(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
105 hi_s8 *pc_extra);
106 static hi_u32 wal_ioctl_set_param(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
107 hi_s8 *pc_extra);
108 static hi_u32 wal_ioctl_get_iwname(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_s8 *pc_name,
109 hi_s8 *pc_extra);
110 static hi_s32 wal_ioctl_set_wme_params(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
111 hi_s8 *pc_extra);
112 static hi_u32 wal_ioctl_get_wme_params(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
113 hi_s8 *pc_extra);
114 static hi_u32 wal_ioctl_setcountry(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *w,
115 hi_s8 *pc_extra);
116 static hi_u32 wal_ioctl_getcountry(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *w,
117 hi_s8 *pc_extra);
118 static hi_u32 wal_ioctl_reduce_sar(oal_net_device_stru *netdev, hi_u8 tx_power);
119 static hi_s32 wal_ioctl_set_ap_config(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
120 oal_iwreq_data_union *wrqu, hi_s8 *pc_extra);
121 static hi_s32 wal_ioctl_get_assoc_list(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
122 oal_iwreq_data_union *wrqu, hi_s8 *pc_extra);
123 static hi_s32 wal_ioctl_set_mac_filters(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
124 oal_iwreq_data_union *wrqu, hi_s8 *pc_extra);
125 static hi_s32 wal_ioctl_set_ap_sta_disassoc(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
126 oal_iwreq_data_union *wrqu, hi_s8 *pc_extra);
127 #endif
128
129 /* ****************************************************************************
130 2 全局变量定义
131 **************************************************************************** */
132 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE) && (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
133 oal_ethtool_ops_stru g_wal_ethtool_ops = { 0 };
134 #endif
135
136 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
137 static wal_ap_config_stru g_st_ap_config_info = { 0 }; /* AP配置信息,需要在vap 创建后下发的 */
138
139 /* ****************************************************************************
140 标准ioctl命令函数表.
141 **************************************************************************** */
142 static const oal_iw_handler g_ast_iw_handlers[] = {
143 HI_NULL, /* SIOCSIWCOMMIT, */
144 (oal_iw_handler)wal_ioctl_get_iwname, /* SIOCGIWNAME, */
145 HI_NULL, /* SIOCSIWNWID, */
146 HI_NULL, /* SIOCGIWNWID, */
147 (oal_iw_handler)wal_ioctl_set_freq, /* SIOCSIWFREQ, 设置频点/信道 */
148 (oal_iw_handler)wal_ioctl_get_freq, /* SIOCGIWFREQ, 获取频点/信道 */
149 (oal_iw_handler)wal_ioctl_set_bss_type, /* SIOCSIWMODE, 设置bss type */
150 (oal_iw_handler)wal_ioctl_get_bss_type, /* SIOCGIWMODE, 获取bss type */
151 HI_NULL, /* SIOCSIWSENS, */
152 (oal_iw_handler)wal_ioctl_get_iwsense, /* SIOCGIWSENS, */
153 HI_NULL, /* SIOCSIWRANGE, */ /* not used */
154 (oal_iw_handler)wal_ioctl_get_iwrange, /* SIOCGIWRANGE, */
155 HI_NULL, /* SIOCSIWPRIV, */ /* not used */
156 HI_NULL, /* SIOCGIWPRIV, */ /* kernel code */
157 HI_NULL, /* SIOCSIWSTATS, */ /* not used */
158 HI_NULL, /* SIOCGIWSTATS, */
159 HI_NULL, /* SIOCSIWSPY, */
160 HI_NULL, /* SIOCGIWSPY, */
161 HI_NULL, /* -- hole -- */
162 HI_NULL, /* -- hole -- */
163 HI_NULL, /* SIOCSIWAP, */
164 (oal_iw_handler)wal_ioctl_get_apaddr, /* SIOCGIWAP, */
165 HI_NULL, /* SIOCSIWMLME, */
166 HI_NULL, /* SIOCGIWAPLIST, */
167 HI_NULL, /* SIOCSIWSCAN, */
168 HI_NULL, /* SIOCGIWSCAN, */
169 (oal_iw_handler)wal_ioctl_set_essid, /* SIOCSIWESSID, 设置ssid */
170 (oal_iw_handler)wal_ioctl_get_essid, /* SIOCGIWESSID, 读取ssid */
171 HI_NULL, /* SIOCSIWNICKN */
172 HI_NULL, /* SIOCGIWNICKN */
173 HI_NULL, /* -- hole -- */
174 HI_NULL, /* -- hole -- */
175 HI_NULL, /* SIOCSIWRATE */
176 (oal_iw_handler)wal_ioctl_get_iwrate, /* SIOCGIWRATE */
177 HI_NULL, /* SIOCSIWRTS */
178 (oal_iw_handler)wal_ioctl_get_rtsthres, /* SIOCGIWRTS */
179 HI_NULL, /* SIOCSIWFRAG */
180 (oal_iw_handler)wal_ioctl_get_fragthres, /* SIOCGIWFRAG */
181 (oal_iw_handler)wal_ioctl_set_txpower, /* SIOCSIWTXPOW, 设置传输功率限制 */
182 (oal_iw_handler)wal_ioctl_get_txpower, /* SIOCGIWTXPOW, 设置传输功率限制 */
183 HI_NULL, /* SIOCSIWRETRY */
184 HI_NULL, /* SIOCGIWRETRY */
185 HI_NULL, /* SIOCSIWENCODE */
186 (oal_iw_handler)wal_ioctl_get_iwencode, /* SIOCGIWENCODE */
187 HI_NULL, /* SIOCSIWPOWER */
188 HI_NULL, /* SIOCGIWPOWER */
189 HI_NULL, /* -- hole -- */
190 HI_NULL, /* -- hole -- */
191 HI_NULL, /* SIOCSIWGENIE */
192 HI_NULL, /* SIOCGIWGENIE */
193 HI_NULL, /* SIOCSIWAUTH */
194 HI_NULL, /* SIOCGIWAUTH */
195 HI_NULL, /* SIOCSIWENCODEEXT */
196 HI_NULL /* SIOCGIWENCODEEXT */
197 };
198
199 /* ****************************************************************************
200 私有ioctl命令参数定义定义
201 **************************************************************************** */
202 #ifndef _PRE_HDF_LINUX
203 static const oal_iw_priv_args_stru g_ast_iw_priv_args[] = {
204 { WAL_IOCTL_PRIV_SET_MODE, OAL_IW_PRIV_TYPE_CHAR | 24, 0, "mode" }, /* 参数类型是char, 个数为24 */
205 { WAL_IOCTL_PRIV_GET_MODE, 0, OAL_IW_PRIV_TYPE_CHAR | 24, "get_mode" }, /* 参数类型是char, 个数为24 */
206 { WAL_IOCTL_PRIV_SET_COUNTRY, OAL_IW_PRIV_TYPE_CHAR | 3, 0, "setcountry" }, /* 参数类型是char, 个数为3 */
207 { WAL_IOCTL_PRIV_GET_COUNTRY, 0, OAL_IW_PRIV_TYPE_CHAR | 3, "getcountry" }, /* 参数类型是char, 个数为3 */
208
209 { WAL_IOCTL_PRIV_SET_AP_CFG, OAL_IW_PRIV_TYPE_CHAR | 256, 0, "AP_SET_CFG" }, /* 参数类型是char, 个数为256 */
210 { WAL_IOCTL_PRIV_AP_MAC_FLTR, OAL_IW_PRIV_TYPE_CHAR | 256, /* 参数类型是char, 个数为256 */
211 OAL_IW_PRIV_TYPE_CHAR | OAL_IW_PRIV_SIZE_FIXED | 0, "AP_SET_MAC_FLTR"},
212 { WAL_IOCTL_PRIV_AP_GET_STA_LIST, 0, OAL_IW_PRIV_TYPE_CHAR | 1024, "AP_GET_STA_LIST" }, /* 个数为1024 */
213 { WAL_IOCTL_PRIV_AP_STA_DISASSOC, OAL_IW_PRIV_TYPE_CHAR | 256, /* 个数为256 */
214 OAL_IW_PRIV_TYPE_CHAR | 0, "AP_STA_DISASSOC"},
215
216 /* sub-ioctl函数入口 */
217 { WAL_IOCTL_PRIV_SETPARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, /* 个数为2 */
218 0, "setparam"},
219 {WAL_IOCTL_PRIV_GETPARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
220 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "getparam"},
221
222 /* sub-ioctl标志,name为'\0', 数字1表示set命令后面跟1个参数, get命令得到1个值 */
223 {WAL_IOCTL_PRIV_SETPARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, ""},
224 {WAL_IOCTL_PRIV_SETPARAM, OAL_IW_PRIV_TYPE_BYTE | OAL_IW_PRIV_SIZE_FIXED | OAL_IW_PRIV_TYPE_ADDR, 0, ""},
225 {WAL_IOCTL_PRIV_GETPARAM, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "" },
226 {WAL_IOCTL_PRIV_GETPARAM, 0, OAL_IW_PRIV_TYPE_BYTE | OAL_IW_PRIV_SIZE_FIXED | OAL_IW_PRIV_TYPE_ADDR, ""},
227 {WLAN_CFGID_SHORTGI, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "shortgi20"},
228 {WLAN_CFGID_SHORTGI, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_shortgi20"},
229 {WLAN_CFGID_SHORT_PREAMBLE, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "shpreamble"},
230 {WLAN_CFGID_SHORT_PREAMBLE, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_shpreamble"},
231 {WLAN_CFGID_PROT_MODE, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "protmode"},
232 {WLAN_CFGID_PROT_MODE, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_protmode"},
233 {WLAN_CFGID_AUTH_MODE, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "authmode"},
234 {WLAN_CFGID_AUTH_MODE, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_authmode"},
235 {WLAN_CFGID_BEACON_INTERVAL, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "bintval"},
236 {WLAN_CFGID_BEACON_INTERVAL, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_bintval"},
237 {WLAN_CFGID_TID, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_tid"},
238 /* U-APSD命令 */
239 {WLAN_CFGID_UAPSD_EN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "uapsden"},
240 {WLAN_CFGID_UAPSD_EN, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_uapsden"},
241 {WLAN_CFGID_DTIM_PERIOD, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, 0, "dtim_period"},
242 {WLAN_CFGID_DTIM_PERIOD, 0, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_dtim_period"},
243
244 /* EDCA参数配置命令 sub-ioctl入口 */
245 {WAL_IOCTL_PRIV_SET_WMM_PARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 3, 0, "setwmmparam"}, /* 个数为3 */
246 {WAL_IOCTL_PRIV_GET_WMM_PARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, /* 个数为2 */
247 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, "getwmmparam"}, /* 个数为2 */
248
249 /* sub-ioctl标志,name为'\0', 2表示set命令后跟两个参数 */
250 {WAL_IOCTL_PRIV_SET_WMM_PARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, ""}, /* 个数为2 */
251 {WAL_IOCTL_PRIV_GET_WMM_PARAM, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
252 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "" },
253 {WLAN_CFGID_EDCA_TABLE_CWMIN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "cwmin"}, /* 个数为2 */
254 {WLAN_CFGID_EDCA_TABLE_CWMIN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
255 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_cwmin"},
256 {WLAN_CFGID_EDCA_TABLE_CWMAX, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "cwmax"}, /* 个数为2 */
257 {WLAN_CFGID_EDCA_TABLE_CWMAX, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
258 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_cwmax"},
259 {WLAN_CFGID_EDCA_TABLE_AIFSN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "aifsn"}, /* 个数为2 */
260 {WLAN_CFGID_EDCA_TABLE_AIFSN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
261 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_aifsn"},
262 {WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "txoplimit"}, /* 个数为2 */
263 {WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
264 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_txoplimit"},
265 {WLAN_CFGID_EDCA_TABLE_MSDU_LIFETIME, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, /* 个数为2 */
266 0, "lifetime"},
267 {WLAN_CFGID_EDCA_TABLE_MSDU_LIFETIME, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
268 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_lifetime"},
269 {WLAN_CFGID_EDCA_TABLE_MANDATORY, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "mandatory"}, /* 个数为2 */
270 {WLAN_CFGID_EDCA_TABLE_MANDATORY, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
271 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_mandatory"},
272
273 {WLAN_CFGID_QEDCA_TABLE_CWMIN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "qcwmin"}, /* 个数为2 */
274 {WLAN_CFGID_QEDCA_TABLE_CWMIN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
275 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qcwmin"},
276 {WLAN_CFGID_QEDCA_TABLE_CWMAX, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "qcwmax"}, /* 个数为2 */
277 {WLAN_CFGID_QEDCA_TABLE_CWMAX, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
278 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qcwmax"},
279 {WLAN_CFGID_QEDCA_TABLE_AIFSN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, 0, "qaifsn"}, /* 个数为2 */
280 {WLAN_CFGID_QEDCA_TABLE_AIFSN, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
281 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qaifsn"},
282 {WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, /* 个数为2 */
283 0, "qtxoplimit"},
284 {WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
285 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qtxoplimit"},
286 {WLAN_CFGID_QEDCA_TABLE_MSDU_LIFETIME, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, /* 个数为2 */
287 0, "qlifetime"},
288 {WLAN_CFGID_QEDCA_TABLE_MSDU_LIFETIME, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
289 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qlifetime"},
290 {WLAN_CFGID_QEDCA_TABLE_MANDATORY, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 2, /* 个数为2 */
291 0, "qmandatory"},
292 {WLAN_CFGID_QEDCA_TABLE_MANDATORY, OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1,
293 OAL_IW_PRIV_TYPE_INT | OAL_IW_PRIV_SIZE_FIXED | 1, "get_qmandatory"},
294
295 };
296 #endif /* ifndef _PRE_HDF_LINUX */
297
298 /* ****************************************************************************
299 私有ioctl命令函数表.
300 **************************************************************************** */
301 static const oal_iw_handler g_ast_iw_priv_handlers[] = {
302 (oal_iw_handler)wal_ioctl_set_param, /* SIOCWFIRSTPRIV+0 */ /* sub-ioctl set 入口 */
303 (oal_iw_handler)wal_ioctl_get_param, /* SIOCWFIRSTPRIV+1 */ /* sub-ioctl get 入口 */
304 HI_NULL, /* SIOCWFIRSTPRIV+2 */ /* setkey */
305 (oal_iw_handler)wal_ioctl_set_wme_params, /* SIOCWFIRSTPRIV+3 */ /* setwmmparams */
306 HI_NULL, /* SIOCWFIRSTPRIV+4 */ /* delkey */
307 (oal_iw_handler)wal_ioctl_get_wme_params, /* SIOCWFIRSTPRIV+5 */ /* getwmmparams */
308 HI_NULL, /* SIOCWFIRSTPRIV+6 */ /* setmlme */
309 HI_NULL, /* SIOCWFIRSTPRIV+7 */ /* getchaninfo */
310 (oal_iw_handler)wal_ioctl_setcountry, /* SIOCWFIRSTPRIV+8 */ /* setcountry */
311 (oal_iw_handler)wal_ioctl_getcountry, /* SIOCWFIRSTPRIV+9 */ /* getcountry */
312 HI_NULL, /* SIOCWFIRSTPRIV+10 */ /* addmac */
313 HI_NULL, /* SIOCWFIRSTPRIV+11 */ /* getscanresults */
314 HI_NULL, /* SIOCWFIRSTPRIV+12 */ /* delmac */
315 HI_NULL, /* SIOCWFIRSTPRIV+13 */ /* getchanlist */
316 HI_NULL, /* SIOCWFIRSTPRIV+14 */ /* setchanlist */
317 HI_NULL, /* SIOCWFIRSTPRIV+15 */ /* kickmac */
318 HI_NULL, /* SIOCWFIRSTPRIV+16 */ /* chanswitch */
319 (oal_iw_handler)wal_ioctl_get_mode, /* SIOCWFIRSTPRIV+17 */ /* 获取模式, 例: iwpriv vapN get_mode */
320 (oal_iw_handler)wal_ioctl_set_mode, /* SIOCWFIRSTPRIV+18 */ /* 设置模式, 例: iwpriv vapN mode 11g */
321 HI_NULL, /* SIOCWFIRSTPRIV+19 */ /* getappiebuf */
322 HI_NULL, /* SIOCWFIRSTPRIV+20 */ /* null */
323 (oal_iw_handler)wal_ioctl_get_assoc_list, /* SIOCWFIRSTPRIV+21 */ /* APUT取得关联STA列表 */
324 (oal_iw_handler)wal_ioctl_set_mac_filters, /* SIOCWFIRSTPRIV+22 */ /* APUT设置STA过滤 */
325 (oal_iw_handler)wal_ioctl_set_ap_config, /* SIOCWFIRSTPRIV+23 */ /* 设置APUT参数 */
326 (oal_iw_handler)wal_ioctl_set_ap_sta_disassoc, /* SIOCWFIRSTPRIV+24 */ /* APUT去关联STA */
327 HI_NULL, /* SIOCWFIRSTPRIV+25 */ /* getStatistics */
328 HI_NULL, /* SIOCWFIRSTPRIV+26 */ /* sendmgmt */
329 HI_NULL, /* SIOCWFIRSTPRIV+27 */ /* null */
330 HI_NULL, /* SIOCWFIRSTPRIV+28 */ /* null */
331 HI_NULL, /* SIOCWFIRSTPRIV+29 */ /* getaclmac */
332 HI_NULL, /* SIOCWFIRSTPRIV+30 */ /* sethbrparams */
333 HI_NULL, /* SIOCWFIRSTPRIV+29 */ /* getaclmac */
334 HI_NULL, /* SIOCWFIRSTPRIV+30 */ /* sethbrparams */
335 HI_NULL, /* SIOCWFIRSTPRIV+31 */ /* setrxtimeout */
336 };
337
338 /* ****************************************************************************
339 无线配置iw_handler_def定义
340 **************************************************************************** */
341 #ifndef _PRE_HDF_LINUX
342 oal_iw_handler_def_stru g_iw_handler_def =
343 {
344 .standard = g_ast_iw_handlers,
345 .num_standard = hi_array_size(g_ast_iw_handlers),
346 .private = g_ast_iw_priv_handlers,
347 .num_private = hi_array_size(g_ast_iw_priv_handlers),
348 .private_args = g_ast_iw_priv_args,
349 .num_private_args = hi_array_size(g_ast_iw_priv_args),
350 .get_wireless_stats = HI_NULL
351 };
352 #endif
353 #endif /* #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) */
354
355 /* ****************************************************************************
356 协议模式字符串定义
357 **************************************************************************** */
358 const wal_ioctl_mode_map_stru g_ast_mode_map[] = {
359 {"11b", WLAN_LEGACY_11B_MODE, WLAN_BAND_2G, WLAN_BAND_WIDTH_20M, {0}},
360 {"11bg", WLAN_MIXED_ONE_11G_MODE, WLAN_BAND_2G, WLAN_BAND_WIDTH_20M, {0}},
361 {"11bgn", WLAN_HT_MODE, WLAN_BAND_2G, WLAN_BAND_WIDTH_20M, {0}},
362 { HI_NULL, 0, 0, 0, { 0 } }
363 };
364
365 /* ****************************************************************************
366 3 函数实现
367 **************************************************************************** */
368 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_get_g_iw_handler_def(hi_void)369 oal_iw_handler_def_stru *wal_get_g_iw_handler_def(hi_void)
370 {
371 #ifndef _PRE_HDF_LINUX
372 return &g_iw_handler_def;
373 #else
374 return NULL;
375 #endif
376 }
377 #endif
378 /* ****************************************************************************
379 函 数 名 : wal_get_cmd_one_arg
380 功能描述 : 获取字符串第一个参数 以空格为参数区分标识
381 输入参数 : pc_cmd : 传入的字符串
382 输出参数 : pc_arg : 第一个参数
383 pul_cmd_offset : 第一个参数的长度
384 返 回 值 : 错误码
385 调用函数 :
386 被调函数 :
387
388 修改历史 :
389 1.日 期 : 2012年12月13日
390 作 者 : HiSilicon
391 修改内容 : 新生成函数
392
393 **************************************************************************** */
wal_get_cmd_one_arg(const hi_char * pc_cmd,hi_char * pc_arg,hi_u32 pc_arg_len,hi_u32 * pul_cmd_offset)394 hi_u32 wal_get_cmd_one_arg(const hi_char *pc_cmd, hi_char *pc_arg, hi_u32 pc_arg_len, hi_u32 *pul_cmd_offset)
395 {
396 const hi_char *pc_cmd_copy = HI_NULL;
397 hi_u32 pos = 0;
398
399 if (oal_unlikely((pc_cmd == HI_NULL) || (pc_arg == HI_NULL) || (pul_cmd_offset == HI_NULL))) {
400 oam_error_log3(0, 0,
401 "{wal_get_cmd_one_arg::pc_cmd/pc_arg/pul_cmd_offset null ptr error %p, %p, %p!}\r\n",
402 (uintptr_t)pc_cmd, (uintptr_t)pc_arg, (uintptr_t)pul_cmd_offset);
403 return HI_ERR_CODE_PTR_NULL;
404 }
405
406 pc_cmd_copy = pc_cmd;
407
408 /* 去掉字符串开始的空格 */
409 while (*pc_cmd_copy == ' ') {
410 ++pc_cmd_copy;
411 }
412
413 while ((*pc_cmd_copy != ' ') && (*pc_cmd_copy != '\0')) {
414 pc_arg[pos] = *pc_cmd_copy;
415 ++pos;
416 ++pc_cmd_copy;
417
418 if (oal_unlikely(pos >= pc_arg_len)) {
419 oam_warning_log1(0, 0, "{wal_get_cmd_one_arg::ul_pos >= WAL_HIPRIV_CMD_NAME_MAX_LEN, ul_pos %d!}\r\n", pos);
420 return HI_ERR_CODE_ARRAY_OVERFLOW;
421 }
422 }
423
424 pc_arg[pos] = '\0';
425
426 /* 字符串到结尾,返回错误码 */
427 if (0 == pos) {
428 oam_info_log0(0, 0, "{wal_get_cmd_one_arg::return param pc_arg is null!}\r\n");
429 return HI_ERR_CODE_PTR_NULL;
430 }
431
432 *pul_cmd_offset = (hi_u32)(pc_cmd_copy - pc_cmd);
433
434 return HI_SUCCESS;
435 }
436
437 #ifdef _PRE_WLAN_FEATURE_P2P
438 /* ****************************************************************************
439 函 数 名 : wal_wireless_iftype_to_mac_p2p_mode
440 输入参数 : enum nl80211_iftype en_iftype
441 输出参数 : 无
442 返 回 值 : wlan_p2p_mode_enum_uint8
443 调用函数 :
444 被调函数 :
445
446 修改历史 :
447 1.日 期 : 2014年12月31日
448 作 者 : HiSilicon
449 修改内容 : 新生成函数
450
451 **************************************************************************** */
wal_wireless_iftype_to_mac_p2p_mode(nl80211_iftype_uint8 iftype)452 wlan_p2p_mode_enum_uint8 wal_wireless_iftype_to_mac_p2p_mode(nl80211_iftype_uint8 iftype)
453 {
454 wlan_p2p_mode_enum_uint8 p2p_mode = WLAN_LEGACY_VAP_MODE;
455
456 switch (iftype) {
457 case NL80211_IFTYPE_P2P_CLIENT:
458 p2p_mode = WLAN_P2P_CL_MODE;
459 break;
460 case NL80211_IFTYPE_P2P_GO:
461 p2p_mode = WLAN_P2P_GO_MODE;
462 break;
463 case NL80211_IFTYPE_P2P_DEVICE:
464 p2p_mode = WLAN_P2P_DEV_MODE;
465 break;
466 #ifdef _PRE_WLAN_FEATURE_MESH
467 case NL80211_IFTYPE_MESH_POINT:
468 #endif
469 case NL80211_IFTYPE_AP:
470 case NL80211_IFTYPE_STATION:
471 p2p_mode = WLAN_LEGACY_VAP_MODE;
472 break;
473 default:
474 p2p_mode = WLAN_P2P_BUTT;
475 }
476 return p2p_mode;
477 }
478 #endif
479
480 /* ****************************************************************************
481 功能描述 : cfg vap h2d
482 输入参数 : pst_net_dev: net_device
483 修改历史 :
484 1.日 期 : 2015年6月10日
485 作 者 : HiSilicon
486 修改内容 : 新生成函数
487 **************************************************************************** */
wal_cfg_vap_h2d_event(oal_net_device_stru * netdev)488 hi_u32 wal_cfg_vap_h2d_event(oal_net_device_stru *netdev)
489 {
490 hi_unref_param(netdev);
491 oal_net_device_stru *netdev_cfg = HI_NULL;
492 hi_u32 ret;
493 wal_msg_stru *rsp_msg = HI_NULL;
494 wal_msg_write_stru write_msg;
495
496 netdev_cfg = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
497 if (netdev_cfg == HI_NULL) {
498 oam_warning_log0(0, 0, "{wal_init_wlan_vap::pst_cfg_net_dev is null!}\r\n");
499 return HI_ERR_CODE_PTR_NULL;
500 }
501 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
502 oal_dev_put(netdev_cfg);
503 #endif
504 /* **************************************************************************
505 抛事件到wal层处理
506 ************************************************************************** */
507 /* 填写消息 */
508 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CFG_VAP_H2D, sizeof(mac_cfg_vap_h2d_stru));
509 ((mac_cfg_vap_h2d_stru *)write_msg.auc_value)->net_dev = netdev_cfg;
510
511 /* 发送消息 */
512 ret = wal_send_cfg_event(netdev_cfg, WAL_MSG_TYPE_WRITE,
513 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_vap_h2d_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
514 if (oal_unlikely(ret != HI_SUCCESS)) {
515 oam_warning_log1(0, 0, "{wal_cfg_vap_h2d_event::wal_alloc_cfg_event return err code %u!}\r\n", ret);
516 return ret;
517 }
518
519 /* 处理返回消息 */
520 ret = wal_check_and_release_msg_resp(rsp_msg);
521 if (ret != HI_SUCCESS) {
522 oam_warning_log1(0, 0, "{wal_cfg_vap_h2d_event::hmac cfg vap h2d fail,err code[%u]\r\n", ret);
523 return ret;
524 }
525
526 return HI_SUCCESS;
527 }
528 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
529 /* ****************************************************************************
530 函 数 名 : wal_host_dev_config
531 功能描述 : 02 host device_sruc配置接口,目前用于上下电流程
532 输入参数 : 无
533 输出参数 : 无
534 返 回 值 :
535 调用函数 :
536 被调函数 :
537
538 修改历史 :
539 1.日 期 : 2015年11月24日
540 作 者 : HiSilicon
541 修改内容 : 新生成函数
542 **************************************************************************** */
wal_host_dev_config(const oal_net_device_stru * netdev,wlan_cfgid_enum_uint16 wid)543 static hi_u32 wal_host_dev_config(const oal_net_device_stru *netdev, wlan_cfgid_enum_uint16 wid)
544 {
545 oal_wireless_dev *wdev = HI_NULL;
546 mac_wiphy_priv_stru *wiphy_priv = HI_NULL;
547 hmac_vap_stru *hmac_vap = HI_NULL;
548 mac_device_stru *mac_dev = HI_NULL;
549 oal_net_device_stru *netdev_cfg = HI_NULL;
550 hi_u32 ret;
551 wal_msg_stru *rsp_msg = HI_NULL;
552 wal_msg_write_stru write_msg;
553
554 wdev = (oal_wireless_dev *)oal_netdevice_wdev(netdev);
555 if ((wdev == HI_NULL) || (wdev->wiphy == HI_NULL)) {
556 oam_warning_log0(0, 0, "{wal_init_wlan_vap::pst_wdev is null!}\r\n");
557 return HI_ERR_CODE_PTR_NULL;
558 }
559
560 wiphy_priv = (mac_wiphy_priv_stru *)oal_wiphy_priv(wdev->wiphy);
561 mac_dev = wiphy_priv->mac_device;
562 hmac_vap = hmac_vap_get_vap_stru(WLAN_CFG_VAP_ID);
563 if (mac_dev == HI_NULL || hmac_vap == HI_NULL || hmac_vap->net_device == HI_NULL) {
564 oam_warning_log2(0, 0, "{wal_init_wlan_vap::mac_dev/hmac_vap is null! mac_dev=%p,hmac_vap=%p}",
565 (uintptr_t)mac_dev, (uintptr_t)hmac_vap);
566 return HI_ERR_CODE_PTR_NULL;
567 }
568 netdev_cfg = hmac_vap->net_device;
569
570 /* **************************************************************************
571 抛事件到wal层处理
572 ************************************************************************** */
573 /* 填写消息 */
574 wal_write_msg_hdr_init(&write_msg, wid, 0);
575
576 /* 发送消息 */
577 ret = wal_send_cfg_event(netdev_cfg, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH, (hi_u8 *)&write_msg, HI_TRUE,
578 &rsp_msg);
579 if (oal_unlikely(ret != HI_SUCCESS)) {
580 oam_warning_log1(0, 0, "{wal_cfg_vap_h2d_event::wal_alloc_cfg_event return err code %u!}\r\n", ret);
581 return ret;
582 }
583
584 /* 处理返回消息 */
585 ret = wal_check_and_release_msg_resp(rsp_msg);
586 if (ret != HI_SUCCESS) {
587 oam_warning_log1(0, 0, "{wal_cfg_vap_h2d_event::hmac cfg vap h2d fail,err code[%u]\r\n", ret);
588 return ret;
589 }
590
591 return HI_SUCCESS;
592 }
593
594 /* ****************************************************************************
595 函 数 名 : wal_host_dev_init
596 功能描述 : 02 host device_sruc的初始化接口,目前用于上下电流程
597 输入参数 : 无
598 输出参数 : 无
599 返 回 值 :
600 调用函数 :
601 被调函数 :
602
603 修改历史 :
604 1.日 期 : 2015年11月24日
605 作 者 : HiSilicon
606 修改内容 : 新生成函数
607
608 **************************************************************************** */
wal_host_dev_init(const oal_net_device_stru * netdev)609 hi_u32 wal_host_dev_init(const oal_net_device_stru *netdev)
610 {
611 return wal_host_dev_config(netdev, WLAN_CFGID_HOST_DEV_INIT);
612 }
613
614 /* ****************************************************************************
615 函 数 名 : wal_host_dev_init
616 功能描述 : 02 host device_sruc的去初始化接口,目前用于上下电流程
617 输入参数 : 无
618 输出参数 : 无
619 返 回 值 :
620 调用函数 :
621 被调函数 :
622
623 修改历史 :
624 1.日 期 : 2015年11月26日
625 作 者 : HiSilicon
626 修改内容 : 新生成函数
627
628 **************************************************************************** */
wal_host_dev_exit(const oal_net_device_stru * netdev)629 hi_u32 wal_host_dev_exit(const oal_net_device_stru *netdev)
630 {
631 return wal_host_dev_config(netdev, WLAN_CFGID_HOST_DEV_EXIT);
632 }
633 #endif
634
635 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_ioctl_get_mode(oal_net_device_stru * netdev,hi_s8 * pc_param)636 static hi_u32 wal_ioctl_get_mode(oal_net_device_stru *netdev, hi_s8 *pc_param)
637 {
638 return HI_FAIL;
639 }
640 #endif
641
642 /* ****************************************************************************
643 函 数 名 : wal_ioctl_set_mode
644 功能描述 : 设置模式: 包括协议、频段、带宽
645 输入参数 : pst_net_dev: net device
646 pc_param : 参数
647 输出参数 : 无
648 返 回 值 : 错误码
649 调用函数 :
650 被调函数 :
651
652 修改历史 :
653 1.日 期 : 2014年12月12日
654 作 者 : HiSilicon
655 修改内容 : 新生成函数
656
657 **************************************************************************** */
wal_ioctl_set_mode(oal_net_device_stru * netdev,hi_char * pc_param)658 hi_u32 wal_ioctl_set_mode(oal_net_device_stru *netdev, hi_char *pc_param)
659 {
660 hi_char ac_mode_str[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0}; /* 预留协议模式字符串空间 */
661 hi_u8 prot_idx;
662 wal_msg_write_stru write_msg;
663 hi_u32 off_set = 0;
664
665 if (oal_unlikely((netdev == HI_NULL) || (pc_param == HI_NULL))) {
666 oam_error_log2(0, 0, "{wal_ioctl_set_mode::pst_net_dev/p_param null ptr error %p %p!}\r\n", (uintptr_t)netdev,
667 (uintptr_t)pc_param);
668 return HI_ERR_WIFI_WAL_FAILURE;
669 }
670
671 /* 设备在up状态不允许配置,必须先down */
672 if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
673 oam_error_log1(0, 0, "{wal_ioctl_set_mode::device busy %d!}\r\n", oal_netdevice_flags(netdev));
674 return HI_ERR_WIFI_WAL_BUSY;
675 }
676
677 /* pc_param指向传入模式参数, 将其取出存放到ac_mode_str中 */
678 hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_mode_str, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
679 if (ret != HI_SUCCESS) {
680 oam_warning_log1(0, 0, "{wal_ioctl_set_mode::mode get failed [%d]!}\r\n", ret);
681 return ret;
682 }
683 ac_mode_str[sizeof(ac_mode_str) - 1] = '\0'; /* 确保以null结尾 */
684
685 for (prot_idx = 0; HI_NULL != g_ast_mode_map[prot_idx].pc_name; prot_idx++) {
686 if (0 == strcmp(g_ast_mode_map[prot_idx].pc_name, ac_mode_str)) {
687 break;
688 }
689 }
690
691 if (HI_NULL == g_ast_mode_map[prot_idx].pc_name) {
692 oam_warning_log0(0, 0, "{wal_ioctl_set_mode::unrecognized protocol string!}\r\n");
693 return HI_FAIL;
694 }
695
696 /* **************************************************************************
697 抛事件到wal层处理
698 ************************************************************************** */
699 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_MODE, sizeof(mac_cfg_mode_param_stru));
700
701 mac_cfg_mode_param_stru *mode_param = (mac_cfg_mode_param_stru *)(write_msg.auc_value);
702 mode_param->protocol = g_ast_mode_map[prot_idx].mode;
703 mode_param->band = g_ast_mode_map[prot_idx].band;
704 mode_param->en_bandwidth = g_ast_mode_map[prot_idx].en_bandwidth;
705
706 oam_info_log3(0, OAM_SF_CFG, "{wal_ioctl_set_mode::protocol[%d],band[%d],bandwidth[%d]!}", mode_param->protocol,
707 mode_param->band, mode_param->en_bandwidth);
708
709 /* 发送消息 */
710 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_mode_param_stru),
711 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
712 if (oal_unlikely(ret != HI_SUCCESS)) {
713 oam_warning_log1(0, 0, "{wal_ioctl_set_mode::wal_alloc_cfg_event return err code %u!}\r\n", ret);
714 return ret;
715 }
716
717 return HI_SUCCESS;
718 }
719
720 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_ioctl_get_essid(oal_net_device_stru * netdev,hi_s8 * pc_param)721 static hi_u32 wal_ioctl_get_essid(oal_net_device_stru *netdev, hi_s8 *pc_param)
722 {
723 return HI_FAIL;
724 }
725 #endif
726
727 /* ****************************************************************************
728 函 数 名 : oal_strim
729 功能描述 : 去掉字符串开始与结尾的空格
730 输入参数 : 无
731 输出参数 : 无
732 返 回 值 :
733 调用函数 :
734 被调函数 :
735
736 修改历史 :
737 1.日 期 : 2013年8月12日
738 作 者 : HiSilicon
739 修改内容 : 新生成函数
740
741 **************************************************************************** */
oal_strim(hi_char * str,hi_u8 max_cmd_len)742 static hi_char *oal_strim(hi_char *str, hi_u8 max_cmd_len)
743 {
744 hi_u32 size;
745 hi_char* str_end = HI_NULL;
746
747 hi_unref_param(max_cmd_len);
748 while (*str == ' ') {
749 ++str;
750 }
751
752 size = strlen((const hi_char *)str);
753 if (!size) {
754 return str;
755 }
756
757 str_end = str + size - 1;
758 while ((str_end >= str) && (*str_end == ' ')) {
759 str_end--;
760 }
761
762 *(str_end + 1) = '\0';
763
764 return str;
765 }
766
767 /* ****************************************************************************
768 函 数 名 : wal_ioctl_set_essid
769 功能描述 : 设置ssid
770 输入参数 : [1]net_dev
771 [2]pc_param
772 输出参数 : 无
773 返 回 值 : static hi_u32
774 **************************************************************************** */
775 /* 结构体数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_ioctl_set_essid(oal_net_device_stru * netdev,hi_char * pc_param)776 hi_u32 wal_ioctl_set_essid(oal_net_device_stru *netdev, hi_char *pc_param)
777 {
778 wal_msg_write_stru write_msg;
779 hi_u32 off_set;
780 hi_char ac_ssid[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
781 mac_vap_stru *mac_vap = oal_net_dev_priv(netdev);
782
783 if (mac_vap == NULL) {
784 oam_warning_log0(0, 0, "{wal_ioctl_set_essid::pst_mac_vap is null!}");
785 return HI_ERR_CODE_PTR_NULL;
786 }
787
788 if (mac_vap->vap_mode == WLAN_VAP_MODE_BSS_AP
789 #ifdef _PRE_WLAN_FEATURE_MESH
790 || (mac_vap->vap_mode == WLAN_VAP_MODE_MESH)
791 #endif
792 ) {
793 /* 设备在up状态且是AP时,不允许配置,必须先down */
794 if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
795 oam_error_log1(mac_vap->vap_id, 0, "{wal_ioctl_set_essid::device is busy, please down it firste %d!}",
796 oal_netdevice_flags(netdev));
797 return HI_FAIL;
798 }
799 }
800
801 /* pc_param指向传入模式参数, 将其取出存放到ac_mode_str中 */
802 hi_u32 ret = wal_get_cmd_one_arg(pc_param, ac_ssid, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
803 if (ret != HI_SUCCESS) {
804 oam_warning_log1(0, 0, "{wal_ioctl_set_essid::wal_get_cmd_one_arg vap name return err_code %d!}", ret);
805 return ret;
806 }
807
808 hi_char *pc_ssid = oal_strim(ac_ssid, WAL_HIPRIV_CMD_NAME_MAX_LEN); /* 去掉字符串开始结尾的空格 */
809 hi_u8 ssid_len = (hi_u8)strlen(pc_ssid);
810 oam_info_log1(mac_vap->vap_id, 0, "{wal_ioctl_set_essid:: ssid length %d!}", ssid_len);
811 ssid_len = (ssid_len > WLAN_SSID_MAX_LEN - 1) ? (WLAN_SSID_MAX_LEN - 1) : ssid_len; /* -1为\0预留空间 */
812 oam_info_log1(mac_vap->vap_id, 0, "{wal_ioctl_set_essid:: ssid length is %d!}", ssid_len);
813
814 /* **************************************************************************
815 抛事件到wal层处理
816 ************************************************************************** */
817 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SSID, sizeof(mac_cfg_ssid_param_stru));
818
819 /* 填写WID对应的参数 */
820 mac_cfg_ssid_param_stru *param = (mac_cfg_ssid_param_stru *)(write_msg.auc_value);
821 param->ssid_len = ssid_len;
822 if (memcpy_s(param->ac_ssid, WLAN_SSID_MAX_LEN, pc_ssid, ssid_len) != EOK) {
823 oam_error_log0(0, 0, "{wal_ioctl_set_essid::mem safe function err!}");
824 return HI_FAIL;
825 }
826
827 /* 发送消息 */
828 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_ssid_param_stru),
829 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
830 if (oal_unlikely(ret != HI_SUCCESS)) {
831 oam_warning_log1(mac_vap->vap_id, 0, "{wal_ioctl_set_essid:: wal_alloc_cfg_event Err=%u}", ret);
832 return ret;
833 }
834
835 return HI_SUCCESS;
836 }
837
838 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_ioctl_get_bss_type(oal_net_device_stru * netdev,hi_s8 * pc_param)839 static hi_u32 wal_ioctl_get_bss_type(oal_net_device_stru *netdev, hi_s8 *pc_param)
840 {
841 return HI_FAIL;
842 }
wal_ioctl_set_bss_type(oal_net_device_stru * netdev,hi_s8 * pc_param)843 static hi_u32 wal_ioctl_set_bss_type(oal_net_device_stru *netdev, hi_s8 *pc_param)
844 {
845 return HI_FAIL;
846 }
wal_ioctl_get_freq(oal_net_device_stru * netdev,hi_s8 * pc_param)847 static hi_u32 wal_ioctl_get_freq(oal_net_device_stru *netdev, hi_s8 *pc_param)
848 {
849 return HI_FAIL;
850 }
851 #endif
852
853 /* ****************************************************************************
854 函 数 名 : wal_ioctl_set_freq
855 功能描述 : 设置频点/信道
856 输入参数 : 无
857 输出参数 : 无
858 返 回 值 :
859 调用函数 :
860 被调函数 :
861
862 修改历史 :
863 1.日 期 : 2014年12月12日
864 作 者 : HiSilicon
865 修改内容 : 新生成函数
866
867 **************************************************************************** */
868 /* 结构体数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_ioctl_set_freq(oal_net_device_stru * netdev,hi_char * pc_param)869 hi_u32 wal_ioctl_set_freq(oal_net_device_stru *netdev, hi_char *pc_param)
870 {
871 wal_msg_write_stru write_msg;
872 hi_s32 channel;
873 hi_u32 off_set;
874 hi_char ac_freq[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
875 hi_u32 ret;
876
877 /* 设备在up状态不允许配置,必须先down */
878 if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
879 oam_error_log1(0, 0, "{wal_ioctl_set_freq::device is busy, please down it first %d!}\r\n",
880 oal_netdevice_flags(netdev));
881 return HI_ERR_WIFI_WAL_BUSY;
882 }
883
884 /* pc_param指向新创建的net_device 的name, 将其取出存放到ac_name中 */
885 ret = wal_get_cmd_one_arg(pc_param, ac_freq, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
886 if (ret != HI_SUCCESS) {
887 oam_warning_log1(0, 0, "{wal_ioctl_set_freq::wal_get_cmd_one_arg vap name return err_code %u!}\r\n", ret);
888 return ret;
889 }
890
891 channel = oal_atoi(ac_freq);
892 if ((channel < 1) || (channel > 14)) { /* 信道号最大为14 */
893 oam_warning_log1(0, 0, "{wal_ioctl_set_freq::channel set fail = %d!}\r\n", channel);
894 return HI_FAIL;
895 }
896 oam_info_log1(0, 0, "{wal_ioctl_set_freq::channel = %d!}\r\n", channel);
897 ret = mac_is_channel_num_valid(WLAN_BAND_2G, channel);
898 if (ret != HI_SUCCESS) {
899 oam_error_log2(0, OAM_SF_CFG, "{wal_ioctl_set_freq::channel=%d,Err=%d}", channel, ret);
900 return HI_FAIL;
901 }
902 /* **************************************************************************
903 抛事件到wal层处理
904 ************************************************************************** */
905 /* 填写消息 */
906 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_CURRENT_CHANEL, sizeof(hi_s32));
907 *((hi_s32 *)(write_msg.auc_value)) = channel;
908
909 /* 发送消息 */
910 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
911 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
912 if (oal_unlikely(ret != HI_SUCCESS)) {
913 oam_warning_log1(0, 0, "{wal_ioctl_set_freq::return err code %d!}\r\n", ret);
914 return ret;
915 }
916
917 return HI_SUCCESS;
918 }
919
920 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_ioctl_get_txpower(oal_net_device_stru * netdev,hi_s8 * pc_param)921 static hi_u32 wal_ioctl_get_txpower(oal_net_device_stru *netdev, hi_s8 *pc_param)
922 {
923 return HI_FAIL;
924 }
925 #endif
926
927 /* 结构体数组g_ast_hipriv_cmd的成员,其中wal_hipriv_getcountry修改了对应变量,lint_t e818告警屏蔽 */
wal_ioctl_set_txpower(oal_net_device_stru * netdev,hi_char * pc_param)928 hi_u32 wal_ioctl_set_txpower(oal_net_device_stru *netdev, hi_char *pc_param)
929 {
930 wal_msg_write_stru write_msg;
931 hi_s32 l_pwer;
932 hi_u32 off_set;
933 hi_char ac_val[WAL_HIPRIV_CMD_NAME_MAX_LEN] = {0};
934 hi_u32 ret;
935
936 ret = wal_get_cmd_one_arg(pc_param, ac_val, WAL_HIPRIV_CMD_NAME_MAX_LEN, &off_set);
937 if (ret != HI_SUCCESS) {
938 oam_warning_log1(0, 0, "{wal_ioctl_set_txpower::wal_get_cmd_one_arg vap name return err_code %d!}\r\n", ret);
939 return ret;
940 }
941
942 l_pwer = oal_atoi(ac_val);
943
944 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_TX_POWER, sizeof(hi_s32));
945 *((hi_s32 *)(write_msg.auc_value)) = l_pwer;
946
947 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
948 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
949 if (oal_unlikely(ret != HI_SUCCESS)) {
950 oam_warning_log1(0, 0, "{wal_ioctl_set_txpower::return err code %u!}", ret);
951 return ret;
952 }
953
954 return HI_SUCCESS;
955 }
956
957 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
958 /* ****************************************************************************
959 功能描述 : 获取字符串第一个参数,以逗号为命令区分标识,并扣除命令前置字符
960 输入参数 : pc_cmd : 传入的字符串
961 puc_token : 命令前置字串
962 输出参数 : pc_arg : 扣掉命令前置字串后的参数
963 pul_cmd_offset : 第一个参数的长度 调用函数 :
964 **************************************************************************** */
wal_get_parameter_from_cmd(hi_char * pc_cmd,hi_char * pc_arg,const hi_char * puc_token,hi_char * pul_cmd_offset,hi_u32 ul_param_max_len)965 static hi_u32 wal_get_parameter_from_cmd(hi_char *pc_cmd, hi_char *pc_arg, const hi_char *puc_token,
966 hi_char *pul_cmd_offset, hi_u32 ul_param_max_len)
967 {
968 hi_char *pc_cmd_copy = HI_NULL;
969 hi_char ac_cmd_copy[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN];
970 hi_u32 pos = 0;
971 hi_u32 arg_len;
972
973 if (oal_unlikely((pc_cmd == HI_NULL) || (pc_arg == HI_NULL) || (pul_cmd_offset == HI_NULL))) {
974 oam_error_log3(0, 0,
975 "{wal_get_parameter_from_cmd::pc_cmd/pc_arg/pul_cmd_offset null ptr error %d, %d, %d, %d!}\r\n", pc_cmd,
976 pc_arg, pul_cmd_offset);
977 return HI_FAIL;
978 }
979
980 pc_cmd_copy = pc_cmd;
981
982 /* 去掉字符串开始的逗号 */
983 while (*pc_cmd_copy == ',') {
984 ++pc_cmd_copy;
985 }
986 /* 取得逗号前的字符串 */
987 while ((*pc_cmd_copy != ',') && (*pc_cmd_copy != '\0')) {
988 ac_cmd_copy[pos] = *pc_cmd_copy;
989 ++pos;
990 ++pc_cmd_copy;
991
992 if (oal_unlikely(pos >= ul_param_max_len)) {
993 oam_warning_log1(0, 0,
994 "{wal_get_parameter_from_cmd::ul_pos >= WAL_HIPRIV_CMD_NAME_MAX_LEN, ul_pos %d!}\r\n", pos);
995 return HI_FAIL;
996 }
997 }
998 ac_cmd_copy[pos] = '\0';
999 /* 字符串到结尾,返回错误码 */
1000 if (0 == pos) {
1001 oam_info_log0(0, 0, "{wal_get_parameter_from_cmd::return param pc_arg is null!}\r\n");
1002 return HI_FAIL;
1003 }
1004 *pul_cmd_offset = (hi_u32)(pc_cmd_copy - pc_cmd);
1005
1006 /* 检查字符串是否包含期望的前置命令字符 */
1007 if (0 != memcmp(ac_cmd_copy, puc_token, strlen(puc_token))) {
1008 return HI_FAIL;
1009 } else {
1010 /* 扣除前置命令字符,回传参数 */
1011 arg_len = strlen(ac_cmd_copy) - strlen(puc_token);
1012 memcpy_s(pc_arg, arg_len, ac_cmd_copy + strlen(puc_token), arg_len);
1013 pc_arg[arg_len] = '\0';
1014 }
1015 return HI_SUCCESS;
1016 }
1017
1018 /* ****************************************************************************
1019 函 数 名 : wal_ioctl_get_apaddr
1020 功能描述 : 获取BSSID
1021 输入参数 : 无
1022 输出参数 : 无
1023 返 回 值 :
1024 调用函数 :
1025 被调函数 :
1026
1027 修改历史 :
1028 1.日 期 : 2014年4月21日
1029 作 者 : HiSilicon
1030 修改内容 : 新生成函数
1031
1032 **************************************************************************** */
wal_ioctl_get_apaddr(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_sockaddr_stru * addr,hi_s8 * pc_extra)1033 static hi_u32 wal_ioctl_get_apaddr(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, oal_sockaddr_stru *addr,
1034 hi_s8 *pc_extra)
1035 {
1036 mac_vap_stru *mac_vap = HI_NULL;
1037 hi_u8 mac_addr[WLAN_MAC_ADDR_LEN] = {0};
1038
1039 mac_vap = oal_net_dev_priv(netdev);
1040 if (mac_vap == HI_NULL) {
1041 oam_warning_log0(0, 0, "{wal_ioctl_get_apaddr::pst_mac_vap is null!}\r\n");
1042 return HI_FAIL;
1043 }
1044
1045 if (mac_vap->vap_state == MAC_VAP_STATE_UP) {
1046 if (memcpy_s(addr->sa_data, WLAN_MAC_ADDR_LEN, mac_vap->auc_bssid, WLAN_MAC_ADDR_LEN) != EOK) {
1047 oam_error_log0(0, 0, "{wal_ioctl_get_apaddr::mem safe function err!}");
1048 return HI_FAIL;
1049 }
1050 } else {
1051 if (memcpy_s(addr->sa_data, WLAN_MAC_ADDR_LEN, mac_addr, WLAN_MAC_ADDR_LEN) != EOK) {
1052 oam_error_log0(0, 0, "{wal_ioctl_get_apaddr::mem safe function err!}");
1053 return HI_FAIL;
1054 }
1055 }
1056
1057 return HI_SUCCESS;
1058 }
1059
1060 /* ****************************************************************************
1061 函 数 名 : wal_ioctl_get_iwrate
1062 功能描述 : iwconfig获取rate,不支持,返回-1
1063 输入参数 : 无
1064 输出参数 : 无
1065 返 回 值 :
1066 调用函数 :
1067 被调函数 :
1068
1069 修改历史 :
1070 1.日 期 : 2014年4月21日
1071 作 者 : HiSilicon
1072 修改内容 : 新生成函数
1073
1074 **************************************************************************** */
wal_ioctl_get_iwrate(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_param_stru * param,hi_s8 * pc_extra)1075 static hi_u32 wal_ioctl_get_iwrate(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1076 oal_iw_param_stru *param, hi_s8 *pc_extra)
1077 {
1078 /* iwconfig获取rate,不支持此命令,则返回-1 */
1079 return HI_FAIL;
1080 }
1081
1082 /* ****************************************************************************
1083 函 数 名 : wal_ioctl_get_iwrate
1084 功能描述 : iwconfig获取sense,不支持,返回-1
1085 输入参数 : 无
1086 输出参数 : 无
1087 返 回 值 :
1088 调用函数 :
1089 被调函数 :
1090
1091 修改历史 :
1092 1.日 期 : 2014年4月21日
1093 作 者 : HiSilicon
1094 修改内容 : 新生成函数
1095
1096 **************************************************************************** */
wal_ioctl_get_iwsense(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_param_stru * param,hi_s8 * pc_extra)1097 static hi_u32 wal_ioctl_get_iwsense(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1098 oal_iw_param_stru *param, hi_s8 *pc_extra)
1099 {
1100 /* iwconfig获取sense,不支持此命令,则返回-1 */
1101 return HI_FAIL;
1102 }
1103
1104 /* ****************************************************************************
1105 函 数 名 : wal_ioctl_get_rtsthres
1106 功能描述 : iwconfig获取rtsthres
1107 输入参数 : 无
1108 输出参数 : 无
1109 返 回 值 :
1110 调用函数 :
1111 被调函数 :
1112
1113 修改历史 :
1114 1.日 期 : 2014年4月21日
1115 作 者 : HiSilicon
1116 修改内容 : 新生成函数
1117
1118 **************************************************************************** */
wal_ioctl_get_rtsthres(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_param_stru * param,hi_s8 * pc_extra)1119 static hi_u32 wal_ioctl_get_rtsthres(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1120 oal_iw_param_stru *param, hi_s8 *pc_extra)
1121 {
1122 mac_vap_stru *mac_vap = HI_NULL;
1123
1124 mac_vap = oal_net_dev_priv(netdev);
1125 if (mac_vap == HI_NULL) {
1126 oam_warning_log0(0, 0, "{wal_ioctl_get_rtsthres::pst_mac_vap is null!}\r\n");
1127 return HI_FAIL;
1128 }
1129
1130 param->value = (hi_s32)mac_vap->mib_info->wlan_mib_operation.dot11_rts_threshold;
1131 param->disabled = (WLAN_RTS_MAX == param->value);
1132 param->fixed = 1;
1133
1134 return HI_SUCCESS;
1135 }
1136
1137 /* ****************************************************************************
1138 函 数 名 : wal_ioctl_get_fragthres
1139 功能描述 : iwconfig获取fragthres
1140 输入参数 : 无
1141 输出参数 : 无
1142 返 回 值 :
1143 调用函数 :
1144 被调函数 :
1145
1146 修改历史 :
1147 1.日 期 : 2014年4月21日
1148 作 者 : HiSilicon
1149 修改内容 : 新生成函数
1150
1151 **************************************************************************** */
wal_ioctl_get_fragthres(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_param_stru * param,hi_s8 * pc_extra)1152 static hi_u32 wal_ioctl_get_fragthres(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1153 oal_iw_param_stru *param, hi_s8 *pc_extra)
1154 {
1155 mac_vap_stru *mac_vap = HI_NULL;
1156
1157 mac_vap = oal_net_dev_priv(netdev);
1158 if (mac_vap == HI_NULL) {
1159 oam_warning_log0(0, 0, "{wal_ioctl_get_fragthres::pst_mac_vap is null!}\r\n");
1160 return HI_FAIL;
1161 }
1162
1163 param->value = (hi_s32)mac_vap->mib_info->wlan_mib_operation.dot11_fragmentation_threshold;
1164 param->disabled = (WLAN_FRAG_THRESHOLD_MAX == param->value);
1165 param->fixed = 1;
1166
1167 return HI_SUCCESS;
1168 }
1169
1170 /* ****************************************************************************
1171 函 数 名 : wal_ioctl_get_iwencode
1172 功能描述 : iwconfig获取encode, 不支持
1173 输入参数 : 无
1174 输出参数 : 无
1175 返 回 值 :
1176 调用函数 :
1177 被调函数 :
1178
1179 修改历史 :
1180 1.日 期 : 2014年4月22日
1181 作 者 : HiSilicon
1182 修改内容 : 新生成函数
1183
1184 **************************************************************************** */
wal_ioctl_get_iwencode(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_point_stru * param,hi_s8 * pc_extra)1185 static hi_u32 wal_ioctl_get_iwencode(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1186 oal_iw_point_stru *param, hi_s8 *pc_extra)
1187 {
1188 /* 不支持iwconfig获取encode,直接返回-1 */
1189 return HI_FAIL;
1190 }
1191
1192 /* ****************************************************************************
1193 函 数 名 : wal_ioctl_get_iwrange
1194 功能描述 : iwconfig获取iwrange, 不支持
1195 输入参数 : 无
1196 输出参数 : 无
1197 返 回 值 :
1198 调用函数 :
1199 被调函数 :
1200
1201 修改历史 :
1202 1.日 期 : 2014年4月21日
1203 作 者 : HiSilicon
1204 修改内容 : 新生成函数
1205
1206 **************************************************************************** */
wal_ioctl_get_iwrange(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,oal_iw_point_stru * param,hi_s8 * pc_extra)1207 static hi_u32 wal_ioctl_get_iwrange(oal_net_device_stru *netdev, oal_iw_request_info_stru *info,
1208 oal_iw_point_stru *param, hi_s8 *pc_extra)
1209 {
1210 return HI_FAIL;
1211 }
1212
1213 /* ****************************************************************************
1214 函 数 名 : wal_ioctl_get_param
1215 功能描述 : iwpriv私有获取参数命令入口
1216 输入参数 : 无
1217 输出参数 : 无
1218 返 回 值 :
1219 调用函数 :
1220 被调函数 :
1221
1222 修改历史 :
1223 1.日 期 : 2013年1月17日
1224 作 者 : HiSilicon
1225 修改内容 : 新生成函数
1226
1227 **************************************************************************** */
wal_ioctl_get_param(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * iw,hi_s8 * pc_extra)1228 static hi_u32 wal_ioctl_get_param(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
1229 hi_s8 *pc_extra)
1230 {
1231 hi_u32 ret;
1232 wal_msg_stru *rsp_msg = HI_NULL;
1233 wal_msg_query_stru query_msg;
1234 wal_msg_rsp_stru *query_rsp_msg = HI_NULL;
1235 hi_s32 *pl_param = HI_NULL;
1236
1237 pl_param = (hi_s32 *)pc_extra;
1238 oam_info_log1(0, 0, "{wal_ioctl_get_param::return err code %d!}\r\n", pl_param[0]);
1239
1240 /* **************************************************************************
1241 抛事件到wal层处理
1242 ************************************************************************** */
1243 query_msg.wid = (hi_u16)pl_param[0];
1244
1245 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
1246 if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
1247 oam_warning_log1(0, 0, "{wal_ioctl_get_param::return err code %u!}\r\n", ret);
1248 return ret;
1249 }
1250
1251 /* 处理返回消息 */
1252 query_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
1253
1254 /* 业务处理 */
1255 pl_param[0] = *((hi_s32 *)(query_rsp_msg->auc_value));
1256
1257 oal_free(rsp_msg);
1258 return HI_SUCCESS;
1259 }
1260
1261 /* ****************************************************************************
1262 函 数 名 : wal_ioctl_set_param
1263 功能描述 : iwpriv私有设置参数命令入口
1264 输入参数 : 无
1265 输出参数 : 无
1266 返 回 值 :
1267 调用函数 :
1268 被调函数 :
1269
1270 修改历史 :
1271 1.日 期 : 2013年1月17日
1272 作 者 : HiSilicon
1273 修改内容 : 新生成函数
1274
1275 **************************************************************************** */
wal_ioctl_set_param(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * iw,hi_s8 * pc_extra)1276 static hi_u32 wal_ioctl_set_param(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
1277 hi_s8 *pc_extra)
1278 {
1279 hi_s32 l_error = 0;
1280 wal_msg_write_stru write_msg;
1281 hi_u32 ret;
1282
1283 /* 设备在up状态不允许配置,必须先down */
1284 if ((OAL_IFF_RUNNING & oal_netdevice_flags(netdev)) != 0) {
1285 oam_error_log1(0, 0, "{wal_ioctl_set_param::device is busy, please down it first %d!}\r\n",
1286 oal_netdevice_flags(netdev));
1287 return HI_FAIL;
1288 }
1289
1290 hi_s32 *pl_param = (hi_s32 *)pc_extra;
1291 hi_s32 l_subioctl_id = pl_param[0]; /* 获取sub-ioctl的ID */
1292 hi_s32 l_value = pl_param[1]; /* 获取要设置的值 */
1293 oam_info_log2(0, 0, "{wal_ioctl_set_param::subioctl_id, value is %d, %d!}\r\n", l_subioctl_id, l_value);
1294
1295 if (l_value < 0) {
1296 oam_warning_log1(0, 0, "{wal_ioctl_set_param::input value is negative %d!}\r\n", l_value);
1297 return HI_FAIL;
1298 }
1299
1300 /* **************************************************************************
1301 抛事件到wal层处理
1302 ************************************************************************** */
1303 wal_write_msg_hdr_init(&write_msg, (hi_u16)l_subioctl_id, sizeof(hi_s32));
1304 if (l_subioctl_id == WLAN_CFGID_PROT_MODE) {
1305 if (l_value >= WLAN_PROT_BUTT) { /* 参数检查 */
1306 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1307 }
1308 } else if (l_subioctl_id == WLAN_CFGID_AUTH_MODE) {
1309 if (l_value >= WLAN_WITP_ALG_AUTH_BUTT) { /* 参数检查 */
1310 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1311 }
1312 } else if (l_subioctl_id == WLAN_CFGID_BEACON_INTERVAL) {
1313 if (l_value > WLAN_BEACON_INTVAL_MAX || l_value < WLAN_BEACON_INTVAL_MIN) {
1314 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1315 }
1316 } else if (l_subioctl_id == WLAN_CFGID_DTIM_PERIOD) {
1317 if (l_value > WLAN_DTIM_PERIOD_MAX || l_value < WLAN_DTIM_PERIOD_MIN) {
1318 oam_error_log1(0, 0, "{wal_ioctl_set_param::input dtim_period invalid %d!}\r\n", l_value);
1319 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1320 }
1321 }
1322
1323 if (l_error != 0) { /* 参数异常 */
1324 return l_error;
1325 }
1326
1327 *((hi_s32 *)(write_msg.auc_value)) = l_value; /* 填写set消息的payload */
1328
1329 /* 发送消息 */
1330 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_s32),
1331 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1332 if (oal_unlikely(ret != HI_SUCCESS)) {
1333 oam_warning_log1(0, 0, "{wal_ioctl_set_param::return err code %u!}\r\n", ret);
1334 return ret;
1335 }
1336
1337 return HI_SUCCESS;
1338 }
1339
1340 /* 编程规范规则5.1 避免函数过长,函数不超过50行(非空非注释),申请例外: 参数有效性判断,逻辑简单,功能聚合性不拆分 */
wal_ioctl_check_wme_params(hi_s32 l_subioctl_id,hi_s32 l_value)1341 static hi_u32 wal_ioctl_check_wme_params(hi_s32 l_subioctl_id, hi_s32 l_value)
1342 {
1343 hi_s32 l_error = 0;
1344 switch (l_subioctl_id) { /* 根据sub-ioctl id填写WID */
1345 case WLAN_CFGID_EDCA_TABLE_CWMIN:
1346 if ((l_value > WLAN_QEDCA_TABLE_CWMIN_MAX) || (l_value < WLAN_QEDCA_TABLE_CWMIN_MIN)) {
1347 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1348 }
1349 break;
1350
1351 case WLAN_CFGID_EDCA_TABLE_CWMAX:
1352 if ((l_value > WLAN_QEDCA_TABLE_CWMAX_MAX) || (l_value < WLAN_QEDCA_TABLE_CWMAX_MIN)) {
1353 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1354 }
1355 break;
1356
1357 case WLAN_CFGID_EDCA_TABLE_AIFSN:
1358 if ((l_value < WLAN_QEDCA_TABLE_AIFSN_MIN) || (l_value > WLAN_QEDCA_TABLE_AIFSN_MAX)) {
1359 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1360 }
1361 break;
1362
1363 case WLAN_CFGID_EDCA_TABLE_TXOP_LIMIT:
1364 if ((l_value > WLAN_QEDCA_TABLE_TXOP_LIMIT_MAX) || (l_value < WLAN_QEDCA_TABLE_TXOP_LIMIT_MIN)) {
1365 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1366 }
1367 break;
1368
1369 case WLAN_CFGID_EDCA_TABLE_MSDU_LIFETIME:
1370 if (l_value > WLAN_QEDCA_TABLE_MSDU_LIFETIME_MAX) {
1371 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1372 }
1373 break;
1374
1375 case WLAN_CFGID_EDCA_TABLE_MANDATORY:
1376 if ((l_value != HI_TRUE) && (l_value != HI_FALSE)) {
1377 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1378 }
1379 break;
1380
1381 case WLAN_CFGID_QEDCA_TABLE_CWMIN:
1382 if ((l_value > WLAN_QEDCA_TABLE_CWMIN_MAX) || (l_value < WLAN_QEDCA_TABLE_CWMIN_MIN)) {
1383 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1384 }
1385 break;
1386
1387 case WLAN_CFGID_QEDCA_TABLE_CWMAX:
1388 if ((l_value > WLAN_QEDCA_TABLE_CWMAX_MAX) || (l_value < WLAN_QEDCA_TABLE_CWMAX_MIN)) {
1389 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1390 }
1391 break;
1392
1393 case WLAN_CFGID_QEDCA_TABLE_AIFSN:
1394 if ((l_value < WLAN_QEDCA_TABLE_AIFSN_MIN) || (l_value > WLAN_QEDCA_TABLE_AIFSN_MAX)) {
1395 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1396 }
1397 break;
1398
1399 case WLAN_CFGID_QEDCA_TABLE_TXOP_LIMIT:
1400 if (l_value > WLAN_QEDCA_TABLE_TXOP_LIMIT_MAX) {
1401 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1402 }
1403 break;
1404
1405 case WLAN_CFGID_QEDCA_TABLE_MSDU_LIFETIME:
1406 if (l_value > WLAN_QEDCA_TABLE_MSDU_LIFETIME_MAX) {
1407 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1408 }
1409 break;
1410
1411 case WLAN_CFGID_QEDCA_TABLE_MANDATORY:
1412 if ((l_value != HI_TRUE) && (l_value != HI_FALSE)) {
1413 l_error = HI_ERR_WIFI_WAL_INVALID_PARAMETER;
1414 }
1415
1416 break;
1417
1418 default:
1419 break;
1420 }
1421
1422 if (l_error != 0) { /* 参数异常 */
1423 return HI_FAIL;
1424 }
1425
1426 return HI_SUCCESS;
1427 }
1428
1429 /* ****************************************************************************
1430 函 数 名 : wal_ioctl_set_wme_params
1431 功能描述 : iwpriv私有设置参数命令入口
1432 输入参数 : 无
1433 输出参数 : 无
1434 返 回 值 :
1435 调用函数 :
1436 被调函数 :
1437
1438 修改历史 :
1439 1.日 期 : 2013年5月9日
1440 作 者 : HiSilicon
1441 修改内容 : 新生成函数
1442
1443 **************************************************************************** */
wal_ioctl_set_wme_params(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * iw,hi_s8 * pc_extra)1444 static hi_s32 wal_ioctl_set_wme_params(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
1445 hi_s8 *pc_extra)
1446 {
1447 hi_u32 ret;
1448 hi_s32 *pl_param = HI_NULL;
1449 hi_s32 l_subioctl_id;
1450 hi_s32 l_ac;
1451 hi_s32 l_value;
1452 wal_msg_write_stru write_msg;
1453 wal_msg_wmm_stru *wmm_params = HI_NULL;
1454
1455 /* 设备在up状态不允许配置,必须先down */
1456 if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
1457 oam_error_log1(0, 0, "{wal_ioctl_set_wme_params::device is busy, please down it first %d!}\r\n",
1458 oal_netdevice_flags(netdev));
1459 return HI_FAIL;
1460 }
1461
1462 pl_param = (hi_s32 *)pc_extra;
1463 l_subioctl_id = pl_param[0]; /* 获取sub-ioctl的ID */
1464 l_ac = pl_param[1];
1465 l_value = pl_param[2]; /* 2: 获取要设置的值 */
1466
1467 oam_info_log3(0, 0, "{wal_ioctl_set_wme_params::the subioctl_id,l_ac,value is %d, %d, %d!}\r\n", l_subioctl_id,
1468 l_ac, l_value);
1469
1470 /* ac取值0~3, value不能为负值 */
1471 if ((l_value < 0) || (l_ac < 0) || (l_ac >= WLAN_WME_AC_BUTT)) {
1472 oam_warning_log2(0, 0, "{wal_ioctl_set_wme_params::input value is negative %d, %d!}\r\n", l_value, l_ac);
1473 return HI_FAIL;
1474 }
1475
1476 /* **************************************************************************
1477 抛事件到wal层处理
1478 ************************************************************************** */
1479 if (wal_ioctl_check_wme_params(l_subioctl_id, l_value) != HI_SUCCESS) { /* 参数异常 */
1480 return HI_FAIL;
1481 }
1482
1483 wal_write_msg_hdr_init(&write_msg, (hi_u16)l_subioctl_id, sizeof(wal_msg_wmm_stru));
1484
1485 wmm_params = (wal_msg_wmm_stru *)(write_msg.auc_value);
1486 wmm_params->cfg_id = (hi_u16)l_subioctl_id;
1487 wmm_params->ac = (hi_u32)l_ac; /* 填写set消息的payload */
1488 wmm_params->value = (hi_u32)l_value; /* 填写set消息的payload */
1489
1490 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(wal_msg_wmm_stru),
1491 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
1492 if (oal_unlikely(ret != HI_SUCCESS)) {
1493 oam_warning_log1(0, 0, "{wal_ioctl_set_wme_params::return err code %u!}\r\n", ret);
1494 return ret;
1495 }
1496
1497 return HI_SUCCESS;
1498 }
1499
1500 /* ****************************************************************************
1501 函 数 名 : wal_ioctl_get_wme_params
1502 功能描述 : iwpriv私有获取参数命令入口
1503 输入参数 : 无
1504 输出参数 : 无
1505 返 回 值 :
1506 调用函数 :
1507 被调函数 :
1508
1509 修改历史 :
1510 1.日 期 : 2013年5月9日
1511 作 者 : HiSilicon
1512 修改内容 : 新生成函数
1513
1514 **************************************************************************** */
wal_ioctl_get_wme_params(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * iw,hi_s8 * pc_extra)1515 static hi_u32 wal_ioctl_get_wme_params(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *iw,
1516 hi_s8 *pc_extra)
1517 {
1518 hi_s32 *param = HI_NULL;
1519 mac_vap_stru *mac_vap = HI_NULL;
1520 wal_msg_query_stru query_msg;
1521 wal_msg_stru *rsp_msg = HI_NULL;
1522 wal_msg_rsp_stru *query_rsp_msg = HI_NULL;
1523 hmac_config_wmm_para_stru *wmm_para = HI_NULL;
1524 hi_u32 ret;
1525 hi_s32 *pl_param = HI_NULL;
1526
1527 param = (hi_s32 *)pc_extra;
1528 mac_vap = oal_net_dev_priv(netdev);
1529 if (oal_unlikely(mac_vap == HI_NULL)) {
1530 oam_error_log0(0, 0, "{wal_ioctl_get_wme_params::oal_net_dev_priv(pst_net_dev) is null ptr.}\r\n");
1531 return HI_ERR_CODE_PTR_NULL;
1532 }
1533 pl_param = (hi_s32 *)pc_extra;
1534 oam_info_log1(0, OAM_SF_WMM, "{wal_ioctl_get_wme_params::return err code %d!}\r\n", pl_param[0]);
1535 /* **************************************************************************
1536 抛事件到wal层处理
1537 ************************************************************************** */
1538 query_msg.wid = (hi_u16)pl_param[0];
1539
1540 /* 发送消息 */
1541 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
1542 if (ret != HI_SUCCESS) {
1543 oam_warning_log1(0, 0, "{wal_ioctl_get_wme_params::fail to get wmm params, error[%u]}", ret);
1544 return ret;
1545 }
1546
1547 /* 处理返回消息 */
1548 query_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
1549
1550 /* 业务处理 */
1551 wmm_para = (hmac_config_wmm_para_stru*)(query_rsp_msg->auc_value);
1552 param[0] = wmm_para->value;
1553
1554 oal_free(rsp_msg);
1555
1556 return HI_SUCCESS;
1557 }
1558
1559 /* ****************************************************************************
1560 函 数 名 : wal_ioctl_setcountry
1561 功能描述 : 设置管制域国家码
1562 输入参数 : pst_net_dev: net device
1563 pst_info : 请求的信息
1564 p_w : 请求的信息
1565 pc_extra : 国家字符串
1566 输出参数 : 无
1567 返 回 值 : 错误码
1568 调用函数 :
1569 被调函数 :
1570
1571 修改历史 :
1572 1.日 期 : 2013年10月16日
1573 作 者 : HiSilicon
1574 修改内容 : 新生成函数
1575
1576 **************************************************************************** */
wal_ioctl_setcountry(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * w,hi_s8 * pc_extra)1577 static hi_u32 wal_ioctl_setcountry(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *w,
1578 hi_s8 *pc_extra)
1579 {
1580 hi_u32 ret;
1581
1582 /* 设备在up状态不允许配置,必须先down */
1583 if (0 != (OAL_IFF_RUNNING & oal_netdevice_flags(netdev))) {
1584 oam_info_log1(0, 0, "{wal_ioctl_setcountry::country is %d, %d!}\r\n", oal_netdevice_flags(netdev));
1585 return HI_FAIL;
1586 }
1587
1588 ret = wal_regdomain_update(netdev, pc_extra, MAC_CONTRY_CODE_LEN);
1589 if (ret != HI_SUCCESS) {
1590 oam_warning_log1(0, 0, "{wal_ioctl_setcountry::regdomain_update return err code %u!}\r\n", ret);
1591 return ret;
1592 }
1593
1594 return HI_SUCCESS;
1595 }
1596
1597 /* ****************************************************************************
1598 函 数 名 : wal_ioctl_getcountry
1599 功能描述 : 读取国家码
1600 输入参数 : pst_net_dev: net device
1601 pst_info : 请求的信息
1602 p_w : 请求的信息
1603 输出参数 : pc_extra : 读取到的国家码
1604 返 回 值 : 错误码
1605 调用函数 :
1606 被调函数 :
1607
1608 修改历史 :
1609 1.日 期 : 2013年10月16日
1610 作 者 : HiSilicon
1611 修改内容 : 新生成函数
1612
1613 **************************************************************************** */
wal_ioctl_getcountry(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_void * w,hi_s8 * pc_extra)1614 static hi_u32 wal_ioctl_getcountry(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_void *w,
1615 hi_s8 *pc_extra)
1616 {
1617 hi_u32 ret;
1618 wal_msg_query_stru query_msg;
1619 wal_msg_stru *rsp_msg = HI_NULL;
1620 wal_msg_rsp_stru *query_rsp_msg = HI_NULL;
1621 mac_cfg_get_country_stru *get_country = HI_NULL;
1622 oal_iw_point_stru *iw_point = (oal_iw_point_stru *)w;
1623
1624 /* **************************************************************************
1625 抛事件到wal层处理
1626 ************************************************************************** */
1627 query_msg.wid = WLAN_CFGID_COUNTRY;
1628
1629 /* 发送消息 */
1630 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&query_msg, HI_TRUE, &rsp_msg);
1631 if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
1632 oam_error_log1(0, 0, "{wal_ioctl_getcountry:: wal_alloc_cfg_event return err code %u!}\r\n", ret);
1633 return ret;
1634 }
1635 /* 处理返回消息 */
1636 query_rsp_msg = (wal_msg_rsp_stru *)(rsp_msg->auc_msg_data);
1637 /* 业务处理 */
1638 get_country = (mac_cfg_get_country_stru *)(query_rsp_msg->auc_value);
1639 if (get_country->ac_country != HI_NULL) {
1640 if (memcpy_s(pc_extra, WLAN_COUNTRY_STR_LEN, get_country->ac_country, WLAN_COUNTRY_STR_LEN) != EOK) {
1641 oam_error_log0(0, 0, "{wal_ioctl_getcountry::mem safe function err!}");
1642 oal_free(rsp_msg);
1643 return HI_FAIL;
1644 }
1645 }
1646 iw_point->length = WLAN_COUNTRY_STR_LEN;
1647 oal_free(rsp_msg);
1648
1649 return HI_SUCCESS;
1650 }
1651
1652 /* ****************************************************************************
1653 功能描述 : netd下发命令取得关联设备列表
1654 输入参数 : oal_iw_request_info_stru *pst_info
1655 oal_iwreq_data_union *pst_wrqu
1656 **************************************************************************** */
wal_ioctl_get_assoc_list(oal_net_device_stru * net_dev,oal_iw_request_info_stru * info,oal_iwreq_data_union * wrqu,hi_s8 * pc_extra)1657 static hi_s32 wal_ioctl_get_assoc_list(oal_net_device_stru *net_dev, oal_iw_request_info_stru *info,
1658 oal_iwreq_data_union *wrqu, hi_s8 *pc_extra)
1659 {
1660 hi_s32 l_ret;
1661 wal_msg_query_stru st_query_msg;
1662 wal_msg_stru *pst_rsp_msg = HI_NULL;
1663 wal_msg_rsp_stru *pst_query_rsp_msg = HI_NULL;
1664 hi_char *pc_sta_list = HI_NULL;
1665 oal_netbuf_stru *pst_response_netbuf = HI_NULL;
1666
1667 if (oal_unlikely(info == HI_NULL || wrqu == HI_NULL || pc_extra == HI_NULL)) {
1668 oam_warning_log3(0, 0,
1669 "{wal_ioctl_get_assoc_list:: param is HI_NULL , pst_info = %p , pst_wrqu = %p , pc_extra = %p}\n", info,
1670 wrqu, pc_extra);
1671 return -OAL_EFAIL;
1672 }
1673
1674 /* 上层在任何时候都可能下发此命令,需要先判断当前netdev的状态并及时返回 */
1675 if (oal_unlikely(oal_net_dev_priv(net_dev) == HI_NULL)) {
1676 return -OAL_EFAIL;
1677 }
1678
1679 /* **************************************************************************
1680 抛事件到wal层处理
1681 ************************************************************************** */
1682 st_query_msg.wid = WLAN_CFGID_GET_STA_LIST;
1683
1684 /* 发送消息 */
1685 l_ret = wal_send_cfg_event(net_dev, WAL_MSG_TYPE_QUERY, WAL_MSG_WID_LENGTH, (hi_u8 *)&st_query_msg, HI_TRUE,
1686 &pst_rsp_msg);
1687 if ((l_ret != HI_SUCCESS) || (pst_rsp_msg == HI_NULL)) {
1688 oam_error_log1(0, 0, "{wal_ioctl_get_assoc_list:: wal_alloc_cfg_event return err code %d!}\r\n", l_ret);
1689 return l_ret;
1690 }
1691
1692 /* 处理返回消息 */
1693 pst_query_rsp_msg = (wal_msg_rsp_stru *)(pst_rsp_msg->auc_msg_data);
1694 /* 业务处理 */
1695 if (pst_query_rsp_msg->us_len >= sizeof(oal_netbuf_stru)) {
1696 /* 获取hmac保存的netbuf指针 */
1697 memcpy_s(&pst_response_netbuf, sizeof(oal_netbuf_stru), pst_query_rsp_msg->auc_value, sizeof(oal_netbuf_stru));
1698 if (pst_response_netbuf != HI_NULL) {
1699 /* 保存ap保存的sta地址信息 */
1700 pc_sta_list = (hi_char *)oal_netbuf_data(pst_response_netbuf);
1701 wrqu->data.length = (hi_u16)(oal_netbuf_len(pst_response_netbuf) + 1);
1702 memcpy_s(pc_extra, wrqu->data.length, pc_sta_list, wrqu->data.length);
1703 pc_extra[oal_netbuf_len(pst_response_netbuf)] = '\0';
1704 oal_netbuf_free(pst_response_netbuf);
1705 } else {
1706 l_ret = -OAL_ENOMEM;
1707 }
1708 } else {
1709 oal_print_hex_dump((hi_u8 *)pst_rsp_msg->auc_msg_data, pst_query_rsp_msg->us_len, 32,
1710 "query msg: "); /* group size 32 */
1711 l_ret = -OAL_EINVAL;
1712 }
1713
1714 if (l_ret != HI_SUCCESS) {
1715 oam_error_log1(0, 0, "{wal_ioctl_get_assoc_list::process failed,ret=%d}", l_ret);
1716 } else {
1717 oal_io_print2("wal_ioctl_get_assoc_list,pc_sta_list is:%s,len:%d\n", pc_extra, wrqu->data.length);
1718 }
1719
1720 oal_free(pst_rsp_msg);
1721 return l_ret;
1722 }
1723
1724 /* ****************************************************************************
1725 功能描述 : set ap mac filter mode to hmac
1726 **************************************************************************** */
wal_config_mac_filter(oal_net_device_stru * net_dev,hi_char * pc_command)1727 static hi_s32 wal_config_mac_filter(oal_net_device_stru *net_dev, hi_char *pc_command)
1728 {
1729 hi_char parsed_command[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN];
1730 hi_char *pc_parse_command = HI_NULL;
1731 hi_u32 ul_mac_mode;
1732 hi_u32 ul_mac_cnt;
1733 hi_u32 ul_i;
1734 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1735 wal_msg_write_stru st_write_msg;
1736 hi_u16 us_len;
1737 wal_msg_stru *pst_rsp_msg = HI_NULL;
1738 hi_u32 ul_err_code;
1739 hi_s32 l_ret = 0;
1740 #endif
1741 hi_u32 ul_ret;
1742 hi_char off_set;
1743
1744 if (pc_command == HI_NULL) {
1745 return -OAL_EINVAL;
1746 }
1747 pc_parse_command = pc_command;
1748
1749 /* 解析MAC_MODE */
1750 ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC_MODE=", &off_set,
1751 WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1752 if (ul_ret != HI_SUCCESS) {
1753 oam_warning_log1(0, 0, "{wal_config_mac_filter::wal_get_parameter_from_cmd return err_code %u.}\r\n", ul_ret);
1754 return -OAL_EINVAL;
1755 }
1756 /* 检查参数是否合法 0,1,2 */
1757 ul_mac_mode = (hi_u32)oal_atoi(parsed_command);
1758 if (ul_mac_mode > 2) { /* mac mode 2 */
1759 oam_warning_log4(0, 0, "{wal_config_mac_filter::invalid MAC_MODE[%c%c%c%c]!}\r\n", (hi_u8)parsed_command[0],
1760 (hi_u8)parsed_command[1], /* command 0/1 */
1761 (hi_u8)parsed_command[2], (hi_u8)parsed_command[3]); /* command 2/3 */
1762 return -OAL_EINVAL;
1763 }
1764
1765 /* 设置过滤模式 */
1766 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1767 ul_ret = wal_hipriv_send_cfg_uint32_data(net_dev, parsed_command, WLAN_CFGID_BLACKLIST_MODE);
1768 if (ul_ret != HI_SUCCESS) {
1769 return (hi_s32)ul_ret;
1770 }
1771 #endif
1772 /* 解析MAC_CNT */
1773 pc_parse_command += off_set;
1774 ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC_CNT=", &off_set,
1775 WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1776 if (ul_ret != HI_SUCCESS) {
1777 oam_warning_log1(0, 0, "{wal_config_mac_filter::wal_get_parameter_from_cmd return err_code [%u]!}\r\n", ul_ret);
1778 return -OAL_EINVAL;
1779 }
1780 ul_mac_cnt = (hi_u32)oal_atoi(parsed_command);
1781
1782 for (ul_i = 0; ul_i < ul_mac_cnt; ul_i++) {
1783 pc_parse_command += off_set;
1784 ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC=", &off_set,
1785 WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1786 if (ul_ret != HI_SUCCESS) {
1787 oam_warning_log1(0, 0, "{wal_config_mac_filter::wal_get_parameter_from_cmd return err_code [%u]!}\r\n",
1788 ul_ret);
1789 return -OAL_EINVAL;
1790 }
1791 /* 5.1 检查参数是否符合MAC长度 */
1792 if (WLAN_MAC_ADDR_LEN * 2 != strlen(parsed_command)) { /* mac len mul 2 */
1793 oam_warning_log0(0, 0, "{wal_config_mac_filter::invalid MAC format}\r\n");
1794 return -OAL_EINVAL;
1795 }
1796 /* 6. 添加过滤设备 */
1797 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1798 /* **************************************************************************
1799 抛事件到wal层处理
1800 ************************************************************************** */
1801 memset_s((hi_u8 *)&st_write_msg, sizeof(st_write_msg), 0, sizeof(st_write_msg));
1802 oal_strtoaddr(parsed_command, st_write_msg.auc_value); /* 将字符 ac_name 转换成数组 mac_add[6] */
1803
1804 us_len = OAL_MAC_ADDR_LEN; /* OAL_SIZEOF(hi_u8); */
1805
1806 if (ul_i == (ul_mac_cnt - 1)) {
1807 /* 等所有的mac地址都添加完成后,才进行关联用户确认,是否需要删除 */
1808 wal_write_msg_hdr_init(&st_write_msg, WLAN_CFGID_ADD_BLACK_LIST, us_len);
1809 } else {
1810 wal_write_msg_hdr_init(&st_write_msg, WLAN_CFGID_ADD_BLACK_LIST_ONLY, us_len);
1811 }
1812
1813 /* 6.1 发送消息 */
1814 l_ret = wal_send_cfg_event(net_dev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + us_len,
1815 (hi_u8 *)&st_write_msg, HI_TRUE, &pst_rsp_msg);
1816 if ((l_ret != HI_SUCCESS) || (pst_rsp_msg == HI_NULL)) {
1817 oam_error_log1(0, 0, "{wal_config_mac_filter:: wal_send_cfg_event return err code %d!}\r\n", l_ret);
1818 return l_ret;
1819 }
1820
1821 /* 6.2 读取返回的错误码 */
1822 ul_err_code = wal_check_and_release_msg_resp(pst_rsp_msg);
1823 if (ul_err_code != HI_SUCCESS) {
1824 oam_error_log1(0, OAM_SF_CFG, "{wal_config_mac_filter::wal_send_cfg_event return err code:[%x]!}\r\n",
1825 ul_err_code);
1826 return -OAL_EFAIL;
1827 }
1828 #endif
1829 }
1830
1831 /* 每次设置完成mac地址过滤后,清空此中间变量 */
1832 memset_s(g_st_ap_config_info.ac_ap_mac_filter_mode, sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode), 0,
1833 sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode));
1834
1835 return HI_SUCCESS;
1836 }
1837
1838 /* ****************************************************************************
1839 功能描述 : deauth auc_mac_addr in ap mode
1840 **************************************************************************** */
wal_kick_sta(oal_net_device_stru * net_dev,hi_u8 * mac_addr,hi_u8 addr_len)1841 static hi_s32 wal_kick_sta(oal_net_device_stru *net_dev, hi_u8 *mac_addr, hi_u8 addr_len)
1842 {
1843 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1844 wal_msg_write_stru st_write_msg;
1845 wal_msg_stru *pst_rsp_msg = HI_NULL;
1846 hi_u32 ul_err_code;
1847 mac_cfg_kick_user_param_stru *pst_kick_user_param;
1848 hi_s32 l_ret;
1849 #endif
1850
1851 if (mac_addr == NULL) {
1852 oam_error_log0(0, 0, "{wal_kick_sta::argument auc_mac_addr is null.\n");
1853 return -OAL_EFAIL;
1854 }
1855 hi_unref_param(addr_len);
1856
1857 #ifdef _PRE_WLAN_FEATURE_CUSTOM_SECURITY
1858
1859 WAL_WRITE_MSG_HDR_INIT(&st_write_msg, WLAN_CFGID_KICK_USER, sizeof(mac_cfg_kick_user_param_stru));
1860
1861 pst_kick_user_param = (mac_cfg_kick_user_param_stru *)(st_write_msg.auc_value);
1862 oal_set_mac_addr(pst_kick_user_param->auc_mac_addr, mac_addr);
1863
1864 pst_kick_user_param->us_reason_code = MAC_AUTH_NOT_VALID;
1865
1866 l_ret = wal_send_cfg_event(net_dev, WAL_MSG_TYPE_WRITE,
1867 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_kick_user_param_stru), (hi_u8 *)&st_write_msg, HI_TRUE,
1868 &pst_rsp_msg);
1869 if ((l_ret != HI_SUCCESS) || (pst_rsp_msg == HI_NULL)) {
1870 oam_error_log1(0, 0, "{wal_kick_sta:: wal_send_cfg_event return err code %d!}\r\n", l_ret);
1871 return l_ret;
1872 }
1873
1874 /* 4.4 读取返回的错误码 */
1875 ul_err_code = wal_check_and_release_msg_resp(pst_rsp_msg);
1876 if (ul_err_code != HI_SUCCESS) {
1877 oam_error_log1(0, OAM_SF_CFG, "{wal_kick_sta::wal_send_cfg_event return err code: [%x]!}\r\n", ul_err_code);
1878 return -OAL_EFAIL;
1879 }
1880 #endif
1881
1882 return HI_SUCCESS;
1883 }
1884
1885 /* ****************************************************************************
1886 功能描述 : netd下发命令设置黑名单或白名单
1887 输入参数 : oal_iw_request_info_stru *pst_info
1888 oal_iwreq_data_union *pst_wrqu
1889 **************************************************************************** */
wal_ioctl_set_mac_filters(oal_net_device_stru * net_dev,oal_iw_request_info_stru * info,oal_iwreq_data_union * wrqu,hi_s8 * pc_extra)1890 static hi_s32 wal_ioctl_set_mac_filters(oal_net_device_stru *net_dev, oal_iw_request_info_stru *info,
1891 oal_iwreq_data_union *wrqu, hi_s8 *pc_extra)
1892 {
1893 mac_vap_stru *pst_vap = HI_NULL;
1894 hi_char *pc_command = HI_NULL;
1895 hi_s32 l_ret;
1896 hi_u32 ul_ret;
1897 hi_char parsed_command[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN];
1898 hi_char *pc_parse_command = HI_NULL;
1899 hi_u32 ul_mac_mode;
1900 hi_u32 ul_mac_cnt;
1901 hi_u8 mac_addr[WLAN_MAC_ADDR_LEN];
1902 hi_char off_set;
1903
1904 if (oal_unlikely(info == HI_NULL || wrqu == HI_NULL || pc_extra == HI_NULL)) {
1905 oam_warning_log3(0, 0,
1906 "{wal_ioctl_set_mac_filters:: param is HI_NULL , pst_info = %p , pst_wrqu = %p , pc_extra = %p}\n", info,
1907 wrqu, pc_extra);
1908 return -OAL_EFAIL;
1909 }
1910
1911 /* 1. 申请内存保存netd 下发的命令和数据 */
1912 pc_command = oal_memalloc((hi_s32)(wrqu->data.length + 1));
1913 if (pc_command == HI_NULL) {
1914 return -OAL_ENOMEM;
1915 }
1916
1917 /* 2. 拷贝netd 命令到内核态中 */
1918 memset_s(pc_command, (hi_u32)(wrqu->data.length + 1), 0, (hi_u32)(wrqu->data.length + 1));
1919 ul_ret =
1920 oal_copy_from_user(pc_command, (hi_u32)(wrqu->data.length), wrqu->data.pointer, (hi_u32)(wrqu->data.length));
1921 if (ul_ret != HI_SUCCESS) {
1922 oam_error_log0(0, 0, "{wal_ioctl_set_mac_filters::oal_copy_from_user: -OAL_EFAIL }\r\n");
1923 oal_free(pc_command);
1924 return -OAL_EFAIL;
1925 }
1926 pc_command[wrqu->data.length] = '\0';
1927
1928 oal_io_print2("wal_ioctl_set_mac_filters,data len:%d, command is:%s\n", wrqu->data.length, pc_command);
1929
1930 pc_parse_command = pc_command;
1931
1932 memset_s(g_st_ap_config_info.ac_ap_mac_filter_mode, sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode), 0,
1933 sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode));
1934 l_ret = strcpy_s(g_st_ap_config_info.ac_ap_mac_filter_mode, sizeof(g_st_ap_config_info.ac_ap_mac_filter_mode),
1935 pc_command);
1936 if (l_ret != EOK) {
1937 oam_error_log0(0, 0, "{wal_ioctl_set_mac_filters::strcpy_s fail }\r\n");
1938 }
1939
1940 pst_vap = oal_net_dev_priv(net_dev);
1941 if (pst_vap == HI_NULL) {
1942 oam_warning_log0(0, 0, "{wal_ioctl_set_mac_filters::netdevice vap is null,just save it.}\r\n");
1943 oal_free(pc_command);
1944 return HI_SUCCESS;
1945 }
1946
1947 /* 3 解析MAC_MODE */
1948 ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC_MODE=", &off_set,
1949 WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1950 if (ul_ret != HI_SUCCESS) {
1951 oam_warning_log1(0, 0, "{wal_ioctl_set_mac_filters::wal_get_parameter_from_cmd return err_code [%u]!}\r\n",
1952 ul_ret);
1953 oal_free(pc_command);
1954 return -OAL_EINVAL;
1955 }
1956 /* 3.1 检查参数是否合法 0,1,2 */
1957 ul_mac_mode = (hi_u32)oal_atoi(parsed_command);
1958 if (ul_mac_mode > 2) { /* mac mode 2 */
1959 oam_warning_log4(0, 0, "{wal_ioctl_set_mac_filters::invalid MAC_MODE[%c%c%c%c]!}", (hi_u8)parsed_command[0],
1960 (hi_u8)parsed_command[1], /* command 0/1 */
1961 (hi_u8)parsed_command[2], (hi_u8)parsed_command[3]); /* command 2/3 */
1962 oal_free(pc_command);
1963 return -OAL_EINVAL;
1964 }
1965
1966 /* 5 解析MAC_CNT */
1967 pc_parse_command += off_set;
1968 ul_ret = wal_get_parameter_from_cmd(pc_parse_command, parsed_command, "MAC_CNT=", &off_set,
1969 WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
1970 if (ul_ret != HI_SUCCESS) {
1971 oam_warning_log1(0, 0, "{wal_ioctl_set_mac_filters::wal_get_parameter_from_cmd return err_code [%u]!}\r\n",
1972 ul_ret);
1973 oal_free(pc_command);
1974 return -OAL_EINVAL;
1975 }
1976 ul_mac_cnt = (hi_u32)oal_atoi(parsed_command);
1977
1978 l_ret = wal_config_mac_filter(net_dev, pc_command);
1979 if (l_ret != HI_SUCCESS) {
1980 oam_warning_log1(0, 0, "{wal_ioctl_set_mac_filters::wal_config_mac_filter return err_code [%u]!}\r\n", l_ret);
1981 }
1982
1983 /* 如果是白名单模式,且下发允许MAC地址为空,即不允许任何设备关联,需要去关联所有已经关联的STA */
1984 if ((ul_mac_cnt == 0) && (ul_mac_mode == 2)) { /* mac mode equal 2 */
1985 oam_warning_log0(0, 0, "{wal_ioctl_set_mac_filters::delete all user!}");
1986
1987 memset_s(mac_addr, WLAN_MAC_ADDR_LEN, 0xff, WLAN_MAC_ADDR_LEN);
1988 l_ret = wal_kick_sta(net_dev, mac_addr, WLAN_MAC_ADDR_LEN);
1989 }
1990
1991 oal_free(pc_command);
1992 return l_ret;
1993 }
1994
1995 /* ****************************************************************************
1996 功能描述 : set ap max user count to hmac
1997 输入参数 : oal_net_device_stru *pst_net_dev
1998 : hi_u32 ul_ap_max_user
1999 **************************************************************************** */
wal_set_ap_max_user(oal_net_device_stru * net_dev,hi_u32 ap_max_user)2000 static hi_s32 wal_set_ap_max_user(oal_net_device_stru *net_dev, hi_u32 ap_max_user)
2001 {
2002 wal_msg_write_stru st_write_msg;
2003 wal_msg_stru *pst_rsp_msg = HI_NULL;
2004 hi_u32 ul_err_code;
2005 hi_s32 l_ret;
2006
2007 oam_warning_log1(0, 0, "{wal_set_ap_max_user:: ap_max_user is : %u.}\r\n", ap_max_user);
2008
2009 if (ap_max_user == 0) {
2010 oam_warning_log1(0, 0, "{wal_set_ap_max_user::invalid ap max user(%u),ignore this set.}\r\n", ap_max_user);
2011 return HI_SUCCESS;
2012 }
2013
2014 wal_write_msg_hdr_init(&st_write_msg, WLAN_CFGID_SET_MAX_USER, sizeof(ap_max_user));
2015 *((hi_u32 *)st_write_msg.auc_value) = ap_max_user;
2016 l_ret = wal_send_cfg_event(net_dev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(ap_max_user),
2017 (hi_u8 *)&st_write_msg, HI_TRUE, &pst_rsp_msg);
2018 if ((l_ret != HI_SUCCESS) || (pst_rsp_msg == HI_NULL)) {
2019 oam_error_log1(0, 0, "{wal_set_ap_max_user:: wal_send_cfg_event return err code %d!}\r\n", l_ret);
2020
2021 return l_ret;
2022 }
2023
2024 /* 读取返回的错误码 */
2025 ul_err_code = wal_check_and_release_msg_resp(pst_rsp_msg);
2026 if (ul_err_code != HI_SUCCESS) {
2027 oam_error_log1(0, OAM_SF_CFG, "{wal_set_ap_max_user::wal_send_cfg_event return err code: [%d]!}\r\n",
2028 ul_err_code);
2029 return -OAL_EFAIL;
2030 }
2031
2032 /* 每次设置最大用户数完成后,都清空为非法值0 */
2033 g_st_ap_config_info.ap_max_user = 0;
2034
2035 return l_ret;
2036 }
2037
2038 /* ****************************************************************************
2039 功能描述 : 设置netd下发APUT config参数 (最大用户数)
2040 输入参数 : oal_iw_request_info_stru *pst_info
2041 oal_iwreq_data_union *pst_wrqu
2042 **************************************************************************** */
wal_ioctl_set_ap_config(oal_net_device_stru * net_dev,oal_iw_request_info_stru * info,oal_iwreq_data_union * wrqu,hi_s8 * pc_extra)2043 static hi_s32 wal_ioctl_set_ap_config(oal_net_device_stru *net_dev, oal_iw_request_info_stru *info,
2044 oal_iwreq_data_union *wrqu, hi_s8 *pc_extra)
2045 {
2046 hi_char *pc_command = HI_NULL;
2047 hi_char *pc_parse_command = HI_NULL;
2048 hi_s32 l_ret = HI_SUCCESS;
2049 hi_u32 ul_ret;
2050 hi_char ac_parse_command[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN];
2051 hi_char off_set;
2052
2053 /* 1. 申请内存保存netd 下发的命令和数据 */
2054 pc_command = oal_memalloc((hi_s32)(wrqu->data.length + 1));
2055 if (pc_command == HI_NULL) {
2056 return -OAL_ENOMEM;
2057 }
2058 /* 2. 拷贝netd 命令到内核态中 */
2059 memset_s(pc_command, (hi_u32)(wrqu->data.length + 1), 0, (hi_u32)(wrqu->data.length + 1));
2060 ul_ret = oal_copy_from_user(pc_command, (hi_u32)(wrqu->data.length),
2061 wrqu->data.pointer, (hi_u32)(wrqu->data.length));
2062 if (ul_ret != HI_SUCCESS) {
2063 oam_error_log0(0, 0, "{wal_ioctl_set_ap_config::oal_copy_from_user: -OAL_EFAIL }\r\n");
2064 oal_free(pc_command);
2065 return -OAL_EFAIL;
2066 }
2067 pc_command[wrqu->data.length] = '\0';
2068
2069 oal_io_print2("wal_ioctl_set_ap_config,data len:%u,command is:%s\n", (hi_u32)wrqu->data.length, pc_command);
2070
2071 pc_parse_command = pc_command;
2072 /* 3. 解析参数 */
2073 /* 3.1 解析ASCII_CMD */
2074 ul_ret = wal_get_parameter_from_cmd(pc_parse_command, ac_parse_command, "ASCII_CMD=", &off_set,
2075 WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
2076 if (ul_ret != HI_SUCCESS) {
2077 oam_warning_log1(0, 0,
2078 "{wal_ioctl_set_ap_config::wal_get_parameter_from_cmd ASCII_CMD return err_code [%u]!}\r\n", ul_ret);
2079 oal_free(pc_command);
2080 return -OAL_EINVAL;
2081 }
2082
2083 if ((0 != strcmp("AP_CFG", ac_parse_command))) {
2084 oam_warning_log0(0, 0, "{wal_ioctl_set_ap_config::sub_command != 'AP_CFG' }");
2085 oal_io_print1("{wal_ioctl_set_ap_config::sub_command %6s...!= 'AP_CFG' }", ac_parse_command);
2086 oal_free(pc_command);
2087 return -OAL_EINVAL;
2088 }
2089
2090 /* 3.2 解析CHANNEL,目前不处理netd下发的channel信息 */
2091 pc_parse_command += off_set;
2092 ul_ret = wal_get_parameter_from_cmd(pc_parse_command, ac_parse_command, "CHANNEL=", &off_set,
2093 WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
2094 if (ul_ret != HI_SUCCESS) {
2095 oam_warning_log1(0, 0,
2096 "{wal_ioctl_set_ap_config::wal_get_parameter_from_cmd CHANNEL return err_code [%u]!}\r\n", ul_ret);
2097 oal_free(pc_command);
2098 return -OAL_EINVAL;
2099 }
2100
2101 /* 3.3 解析MAX_SCB */
2102 pc_parse_command += off_set;
2103 ul_ret = wal_get_parameter_from_cmd(pc_parse_command, ac_parse_command, "MAX_SCB=", &off_set,
2104 WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
2105 if (ul_ret != HI_SUCCESS) {
2106 oam_warning_log1(0, 0,
2107 "{wal_ioctl_set_ap_config::wal_get_parameter_from_cmd MAX_SCB return err_code [%u]!}\r\n", ul_ret);
2108 oal_free(pc_command);
2109 return -OAL_EINVAL;
2110 }
2111
2112 g_st_ap_config_info.ap_max_user = (hi_u32)oal_atoi(ac_parse_command);
2113
2114 oam_warning_log1(0, 0, "{wal_ioctl_set_ap_config:: 1131_debug:: ul_ap_max_user = [%d]!}\r\n",
2115 g_st_ap_config_info.ap_max_user);
2116
2117 if (oal_net_dev_priv(net_dev) != HI_NULL) {
2118 l_ret = wal_set_ap_max_user(net_dev, (hi_u32)oal_atoi(ac_parse_command));
2119 }
2120
2121 /* 5. 结束释放内存 */
2122 oal_free(pc_command);
2123 return l_ret;
2124 }
2125
2126 /* ****************************************************************************
2127 功能描述 : netd下发命令去关联STA
2128 输入参数 : oal_iw_request_info_stru *pst_info
2129 oal_iwreq_data_union *pst_wrqu
2130 **************************************************************************** */
wal_ioctl_set_ap_sta_disassoc(oal_net_device_stru * net_dev,oal_iw_request_info_stru * info,oal_iwreq_data_union * wrqu,hi_s8 * pc_extra)2131 static hi_s32 wal_ioctl_set_ap_sta_disassoc(oal_net_device_stru *net_dev, oal_iw_request_info_stru *info,
2132 oal_iwreq_data_union *wrqu, hi_s8 *pc_extra)
2133 {
2134 hi_char *pc_command = HI_NULL;
2135 hi_s32 l_ret;
2136 hi_u32 ul_ret;
2137 hi_char parsed_command[WAL_IOCTL_PRIV_SUBCMD_MAX_LEN] = {0};
2138 hi_u8 mac_addr[WLAN_MAC_ADDR_LEN] = {0};
2139 hi_char off_set;
2140
2141 /* 1. 申请内存保存netd 下发的命令和数据 */
2142 pc_command = oal_memalloc((hi_s32)(wrqu->data.length + 1));
2143 if (pc_command == HI_NULL) {
2144 return -OAL_ENOMEM;
2145 }
2146
2147 /* 2. 拷贝netd 命令到内核态中 */
2148 memset_s(pc_command, (hi_u32)(wrqu->data.length + 1), 0, (hi_u32)(wrqu->data.length + 1));
2149 ul_ret = oal_copy_from_user(pc_command, (hi_u32)(wrqu->data.length),
2150 wrqu->data.pointer, (hi_u32)(wrqu->data.length));
2151 if (ul_ret != HI_SUCCESS) {
2152 oam_error_log0(0, 0, "{wal_ioctl_set_ap_sta_disassoc::oal_copy_from_user: -OAL_EFAIL }\r\n");
2153 oal_free(pc_command);
2154 return -OAL_EFAIL;
2155 }
2156 pc_command[wrqu->data.length] = '\0';
2157
2158 oal_io_print1("wal_ioctl_set_ap_sta_disassoc,command is:%s\n", pc_command);
2159
2160 /* 3. 解析命令获取MAC */
2161 ul_ret = wal_get_parameter_from_cmd(pc_command, parsed_command, "MAC=", &off_set, WAL_IOCTL_PRIV_SUBCMD_MAX_LEN);
2162 if (ul_ret != HI_SUCCESS) {
2163 oam_warning_log1(0, 0,
2164 "{wal_ioctl_set_ap_sta_disassoc::wal_get_parameter_from_cmd MAC return err_code [%u]!}\r\n", ul_ret);
2165 oal_free(pc_command);
2166 return -OAL_EINVAL;
2167 }
2168 /* 3.1 检查参数是否符合MAC长度 */
2169 if (WLAN_MAC_ADDR_LEN * 2 != strlen(parsed_command)) { /* 返回值不等于mac地址的2倍 */
2170 oam_warning_log0(0, 0, "{wal_ioctl_set_ap_sta_disassoc::invalid MAC format}\r\n");
2171 oal_free(pc_command);
2172 return -OAL_EINVAL;
2173 }
2174 oal_strtoaddr(parsed_command, mac_addr, WLAN_MAC_ADDR_LEN); /* 将字符 ac_name 转换成数组 mac_add[6] */
2175
2176 oam_warning_log0(0, 0, "{wal_ioctl_set_ap_sta_disassoc::Geting CMD from APP to DISASSOC!!}");
2177 l_ret = wal_kick_sta(net_dev, mac_addr, WLAN_MAC_ADDR_LEN);
2178
2179 /* 5. 结束释放内存 */
2180 oal_free(pc_command);
2181 return l_ret;
2182 }
2183 #endif /* #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION) */
2184
2185 /* ****************************************************************************
2186 函 数 名 : wal_set_mac_to_mib
2187 功能描述 : 设置wlan接口mac地址
2188 输入参数 : oal_net_device_stru *pst_net_dev
2189 输出参数 : 无
2190 返 回 值 : 错误码
2191 调用函数 :
2192 被调函数 :
2193 **************************************************************************** */
wal_set_mac_to_mib(oal_net_device_stru * netdev)2194 hi_u32 wal_set_mac_to_mib(oal_net_device_stru *netdev)
2195 {
2196 hi_u32 ret;
2197 wal_msg_write_stru write_msg;
2198 mac_cfg_staion_id_param_stru *param = HI_NULL;
2199
2200 /* 填写WID消息 */
2201 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_STATION_ID, sizeof(mac_cfg_staion_id_param_stru));
2202
2203 /* 设置配置命令参数 */
2204 param = (mac_cfg_staion_id_param_stru *)write_msg.auc_value;
2205 if (memcpy_s(param->auc_station_id, WLAN_MAC_ADDR_LEN, netdev->macAddr, WLAN_MAC_ADDR_LEN) != EOK) {
2206 oam_error_log0(0, 0, "{wal_set_mac_to_mib::mem safe function err!}");
2207 return HI_FAIL;
2208 }
2209
2210 if (strcmp("p2p0", netdev->name) == 0) {
2211 param->p2p_mode = WLAN_P2P_DEV_MODE;
2212 }
2213
2214 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2215 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_staion_id_param_stru), (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2216 if (oal_unlikely(ret != HI_SUCCESS)) {
2217 oam_warning_log1(0, 0, "{wal_set_mac_to_mib::return err code [%u]!}\r\n", ret);
2218 return ret;
2219 }
2220
2221 return HI_SUCCESS;
2222 }
2223
2224 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2225 /* ****************************************************************************
2226 函 数 名 : wal_ioctl_get_iwname
2227 功能描述 : 获得无线的名字, 用来确认无限扩展的存在.
2228 输入参数 : pst_net_dev: 指向net_device的指针
2229 输出参数 : 无
2230 返 回 值 :
2231 调用函数 :
2232 被调函数 :
2233
2234 修改历史 :
2235 1.日 期 : 2013年2月21日
2236 作 者 : HiSilicon
2237 修改内容 : 新生成函数
2238
2239 **************************************************************************** */
wal_ioctl_get_iwname(oal_net_device_stru * netdev,oal_iw_request_info_stru * info,hi_s8 * pc_name,hi_s8 * pc_extra)2240 static hi_u32 wal_ioctl_get_iwname(oal_net_device_stru *netdev, oal_iw_request_info_stru *info, hi_s8 *pc_name,
2241 hi_s8 *pc_extra)
2242 {
2243 hi_s8 ac_iwname[] = "IEEE 802.11";
2244
2245 if (memcpy_s(pc_name, sizeof(ac_iwname), ac_iwname, sizeof(ac_iwname)) != EOK) {
2246 oam_error_log0(0, 0, "{wal_ioctl_get_iwname::mem safe function err!}");
2247 return HI_FAIL;
2248 }
2249 return HI_SUCCESS;
2250 }
2251 #endif
2252
2253 #ifdef _PRE_WLAN_FEATURE_P2P
2254 /* ****************************************************************************
2255 功能描述 : 设置WPS p2p信息元素
2256
2257 修改历史 :
2258 1.日 期 : 2014年11月26日
2259 作 者 : HiSilicon
2260 修改内容 : 新生成函数
2261
2262 **************************************************************************** */
wal_ioctl_set_wps_p2p_ie(oal_net_device_stru * netdev,const hi_u8 * puc_buf,hi_u32 len,en_app_ie_type_uint8 type)2263 hi_u32 wal_ioctl_set_wps_p2p_ie(oal_net_device_stru *netdev, const hi_u8 *puc_buf, hi_u32 len,
2264 en_app_ie_type_uint8 type)
2265 {
2266 wal_msg_write_stru write_msg;
2267 wal_msg_stru *rsp_msg = HI_NULL;
2268 oal_app_ie_stru wps_p2p_ie;
2269
2270 if (len > WLAN_WPS_IE_MAX_SIZE) {
2271 oam_error_log1(0, OAM_SF_CFG, "{wal_ioctl_set_wps_p2p_ie:: wrong ul_len: [%u]!}\r\n", len);
2272 return HI_FAIL;
2273 }
2274
2275 /* 安全编程规则6.6例外(1) 固定长度的结构体进行内存初始化 */
2276 memset_s(&wps_p2p_ie, sizeof(oal_app_ie_stru), 0, sizeof(oal_app_ie_stru));
2277
2278 switch (type) {
2279 case OAL_APP_BEACON_IE:
2280 case OAL_APP_PROBE_RSP_IE:
2281 case OAL_APP_ASSOC_RSP_IE:
2282 wps_p2p_ie.app_ie_type = type;
2283 wps_p2p_ie.ie_len = len;
2284 if (memcpy_s(wps_p2p_ie.auc_ie, sizeof(wps_p2p_ie.auc_ie), puc_buf, len) != EOK) {
2285 oam_error_log0(0, OAM_SF_CFG, "{wal_ioctl_set_wps_p2p_ie::mem safe function err!}");
2286 return HI_FAIL;
2287 }
2288 break;
2289 default:
2290 oam_error_log1(0, OAM_SF_CFG, "{wal_ioctl_set_wps_p2p_ie:: wrong type: [%x]!}\r\n", type);
2291 return HI_FAIL;
2292 }
2293
2294 if (memcpy_s(write_msg.auc_value, sizeof(write_msg.auc_value), &wps_p2p_ie, sizeof(wps_p2p_ie)) != EOK) {
2295 oam_error_log0(0, OAM_SF_CFG, "{wal_ioctl_set_wps_p2p_ie::mem safe function err!}");
2296 return HI_FAIL;
2297 }
2298
2299 /* **************************************************************************
2300 抛事件到wal层处理
2301 ************************************************************************** */
2302 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_WPS_P2P_IE, sizeof(wps_p2p_ie));
2303
2304 /* 发送消息 */
2305 hi_u32 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(wps_p2p_ie),
2306 (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2307 if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
2308 oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_wps_p2p_ie:: wal_alloc_cfg_event return err code %u!}\r\n", ret);
2309 return ret;
2310 }
2311
2312 /* 读取返回的错误码 */
2313 ret = wal_check_and_release_msg_resp(rsp_msg);
2314 if (ret != HI_SUCCESS) {
2315 oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_wps_p2p_ie::wal_send_cfg_event return err code: [%u]!}\r\n", ret);
2316 return ret;
2317 }
2318
2319 return HI_SUCCESS;
2320 }
2321
2322 /* ****************************************************************************
2323 函 数 名 : wal_ioctl_set_p2p_noa
2324 功能描述 : 设置p2p noa节能参数
2325 输入参数 : oal_net_device_stru *pst_net_dev
2326 hi_s8 *pc_paramm
2327 输出参数 : 无
2328 返 回 值 : static hi_u32
2329 调用函数 :
2330 被调函数 :
2331
2332 修改历史 :
2333 1.日 期 : 2015年1月22日
2334 作 者 : HiSilicon
2335 修改内容 : 新生成函数
2336
2337 *************************************************************************** */
wal_ioctl_set_p2p_noa(oal_net_device_stru * netdev,const mac_cfg_p2p_noa_param_stru * p2p_noa_param)2338 hi_u32 wal_ioctl_set_p2p_noa(oal_net_device_stru *netdev, const mac_cfg_p2p_noa_param_stru *p2p_noa_param)
2339 {
2340 wal_msg_write_stru write_msg;
2341 wal_msg_stru *rsp_msg = HI_NULL;
2342 hi_u32 ret;
2343
2344 if (p2p_noa_param != HI_NULL) {
2345 if (memcpy_s(write_msg.auc_value, sizeof(write_msg.auc_value), p2p_noa_param,
2346 sizeof(mac_cfg_p2p_noa_param_stru)) != EOK) {
2347 oam_error_log0(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_noa::mem safe function err!}");
2348 return HI_FAIL;
2349 }
2350 }
2351 /* **************************************************************************
2352 抛事件到wal层处理
2353 ************************************************************************** */
2354 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_P2P_PS_NOA, sizeof(mac_cfg_p2p_noa_param_stru));
2355
2356 /* 发送消息 */
2357 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2358 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_p2p_noa_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2359 if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
2360 oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_noa:: wal_alloc_cfg_event return err code %u!}\r\n", ret);
2361 return ret;
2362 }
2363
2364 /* 读取返回的错误码 */
2365 ret = wal_check_and_release_msg_resp(rsp_msg);
2366 if (ret != HI_SUCCESS) {
2367 oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_noa::wal_send_cfg_event return err code: [%d]!}\r\n", ret);
2368 return ret;
2369 }
2370
2371 return HI_SUCCESS;
2372 }
2373
2374 /* ****************************************************************************
2375 函 数 名 : wal_ioctl_set_p2p_ops
2376 功能描述 : 设置p2p ops节能参数
2377 输入参数 : oal_net_device_stru *pst_net_dev
2378 hi_s8 *pc_paramm
2379 输出参数 : 无
2380 返 回 值 : static hi_u32
2381 调用函数 :
2382 被调函数 :
2383
2384 修改历史 :
2385 1.日 期 : 2015年1月22日
2386 作 者 : HiSilicon
2387 修改内容 : 新生成函数
2388
2389 *************************************************************************** */
wal_ioctl_set_p2p_ops(oal_net_device_stru * netdev,const mac_cfg_p2p_ops_param_stru * p2p_ops_param)2390 hi_u32 wal_ioctl_set_p2p_ops(oal_net_device_stru *netdev, const mac_cfg_p2p_ops_param_stru *p2p_ops_param)
2391 {
2392 wal_msg_write_stru write_msg;
2393 wal_msg_stru *rsp_msg = HI_NULL;
2394 hi_u32 ret;
2395
2396 if (p2p_ops_param != HI_NULL) {
2397 if (memcpy_s(write_msg.auc_value, sizeof(write_msg.auc_value), p2p_ops_param,
2398 sizeof(mac_cfg_p2p_ops_param_stru)) != EOK) {
2399 oam_error_log0(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_ops::mem safe function err!}");
2400 return HI_FAIL;
2401 }
2402 }
2403 /* **************************************************************************
2404 抛事件到wal层处理
2405 ************************************************************************** */
2406 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_SET_P2P_PS_OPS, sizeof(mac_cfg_p2p_ops_param_stru));
2407
2408 /* 发送消息 */
2409 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2410 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_p2p_ops_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2411 if ((ret != HI_SUCCESS) || (rsp_msg == HI_NULL)) {
2412 oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_ops:: wal_alloc_cfg_event return err code %u!}\r\n", ret);
2413 return ret;
2414 }
2415
2416 /* 读取返回的错误码 */
2417 ret = wal_check_and_release_msg_resp(rsp_msg);
2418 if (ret != HI_SUCCESS) {
2419 oam_error_log1(0, OAM_SF_P2P, "{wal_ioctl_set_p2p_ops::wal_send_cfg_event return err code:[%u]!}\r\n", ret);
2420 return ret;
2421 }
2422
2423 return HI_SUCCESS;
2424 }
2425 #endif
2426
2427 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2428 /* ****************************************************************************
2429 函 数 名 : wal_ioctl_reduce_sar
2430 功能描述 : 设置RTS 门限值
2431 输入参数 :
2432 输出参数 : 无
2433 返 回 值 : hi_s32
2434 调用函数 :
2435 被调函数 :
2436
2437 修改历史 :
2438 1.日 期 : 2015年12月17日
2439 作 者 : HiSilicon
2440 修改内容 : 新生成函数
2441
2442 **************************************************************************** */
wal_ioctl_reduce_sar(oal_net_device_stru * netdev,hi_u8 tx_power)2443 static hi_u32 wal_ioctl_reduce_sar(oal_net_device_stru *netdev, hi_u8 tx_power)
2444 {
2445 hi_u32 ret;
2446 wal_msg_write_stru write_msg;
2447
2448 oam_warning_log1(0, 0, "wal_ioctl_reduce_sar::supplicant set tx_power[%d] for reduce SAR purpose.\r\n", tx_power);
2449 if (tx_power > 100) { /* 大于100无效 */
2450 oam_warning_log1(0, OAM_SF_CFG,
2451 "wal_ioctl_reduce_sar::reduce sar failed, reason:invalid tx_power[%d] set by supplicant!", tx_power);
2452 return HI_ERR_CODE_INVALID_CONFIG;
2453 }
2454 /* vap未创建时,不处理supplicant命令 */
2455 if (oal_net_dev_priv(netdev) == NULL) {
2456 oam_warning_log0(0, OAM_SF_CFG, "wal_ioctl_reduce_sar::vap not created yet, ignore the cmd!");
2457 return HI_ERR_WIFI_WAL_INVALID_PARAMETER;
2458 }
2459 /* **************************************************************************
2460 抛事件到wal层处理
2461 ************************************************************************** */
2462 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_REDUCE_SAR, sizeof(hi_u8));
2463 *((hi_u8 *)write_msg.auc_value) = tx_power;
2464 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE, WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(hi_u8),
2465 (hi_u8 *)&write_msg, HI_FALSE, HI_NULL);
2466 if (oal_unlikely(ret != HI_SUCCESS)) {
2467 oam_error_log1(0, 0, "wal_ioctl_reduce_sar::wal_send_cfg_event failed, error no[%u]!\r\n", ret);
2468 return ret;
2469 }
2470 return HI_SUCCESS;
2471 }
2472 #endif
2473
2474 /* ****************************************************************************
2475 函 数 名 : wal_start_vap
2476 功能描述 :
2477 输入参数 : oal_net_device_stru *pst_net_dev
2478 输出参数 : 无
2479 返 回 值 : static hi_u32
2480 调用函数 :
2481 被调函数 :
2482
2483 修改历史 :
2484 1.日 期 : 2015年5月22日
2485 作 者 : HiSilicon
2486 修改内容 : 新生成函数
2487
2488 **************************************************************************** */
wal_start_vap(oal_net_device_stru * netdev)2489 hi_u32 wal_start_vap(oal_net_device_stru *netdev)
2490 {
2491 wal_msg_write_stru write_msg;
2492 hi_u32 ret;
2493 wal_msg_stru *rsp_msg = HI_NULL;
2494 #ifdef _PRE_WLAN_FEATURE_P2P
2495 wlan_p2p_mode_enum_uint8 p2p_mode;
2496 oal_wireless_dev *wdev = HI_NULL;
2497 #endif
2498
2499 if (oal_unlikely(netdev == HI_NULL)) {
2500 oam_error_log0(0, 0, "{wal_start_vap::pst_net_dev is null ptr!}\r\n");
2501 return HI_ERR_CODE_PTR_NULL;
2502 }
2503
2504 /* **************************************************************************
2505 抛事件到wal层处理
2506 ************************************************************************** */
2507 /* 填写消息 */
2508 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_START_VAP, sizeof(mac_cfg_start_vap_param_stru));
2509 ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
2510 #ifdef _PRE_WLAN_FEATURE_P2P
2511 wdev = netdev->ieee80211Ptr;
2512 p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(wdev->iftype);
2513 if (WLAN_P2P_BUTT == p2p_mode) {
2514 oam_error_log0(0, 0, "{wal_start_vap::wal_wireless_iftype_to_mac_p2p_mode return BUFF}\r\n");
2515 return HI_FAIL;
2516 }
2517 ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
2518
2519 oam_warning_log1(0, 0, "{wal_start_vap::en_p2p_mode:%d}\r\n", p2p_mode);
2520 #endif
2521 ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->mgmt_rate_init_flag = HI_TRUE;
2522
2523 /* 发送消息 */
2524 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2525 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_start_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2526 if (oal_unlikely(ret != HI_SUCCESS)) {
2527 oam_warning_log1(0, 0, "{wal_start_vap::wal_alloc_cfg_event return err code %u!}\r\n", ret);
2528 return ret;
2529 }
2530
2531 /* 处理返回消息 */
2532 ret = wal_check_and_release_msg_resp(rsp_msg);
2533 if (ret != HI_SUCCESS) {
2534 oam_warning_log1(0, 0, "{wal_start_vap::hmac start vap fail, err code[%u]!}\r\n", ret);
2535 return ret;
2536 }
2537
2538 if ((oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) == 0) {
2539 oal_netdevice_flags(netdev) |= OAL_IFF_RUNNING;
2540 }
2541
2542 /* AP/Mesh模式,启动VAP后,启动发送队列 */
2543 oal_net_tx_wake_all_queues(); /* 启动发送队列 */
2544
2545 return HI_SUCCESS;
2546 }
2547
2548 /* ****************************************************************************
2549 函 数 名 : wal_stop_vap
2550 功能描述 : 停用vap
2551 输入参数 : oal_net_device_stru: net_device
2552 输出参数 : 无
2553 返 回 值 : 错误码
2554 调用函数 :
2555 被调函数 :
2556
2557 修改历史 :
2558 1.日 期 : 2015年5月25日
2559 作 者 : HiSilicon
2560 修改内容 : 新生成函数
2561
2562 **************************************************************************** */
wal_stop_vap(oal_net_device_stru * netdev)2563 hi_u32 wal_stop_vap(oal_net_device_stru *netdev)
2564 {
2565 wal_msg_write_stru write_msg;
2566 wal_msg_stru *rsp_msg = HI_NULL;
2567 hi_u32 ret;
2568 #ifdef _PRE_WLAN_FEATURE_P2P
2569 wlan_p2p_mode_enum_uint8 p2p_mode;
2570 oal_wireless_dev *wdev = HI_NULL;
2571 #endif
2572
2573 if (netdev == HI_NULL) {
2574 oam_error_log0(0, 0, "{wal_stop_vap::pst_net_dev is null ptr!}\r\n");
2575 return HI_ERR_CODE_PTR_NULL;
2576 }
2577
2578 /* 如果不是up状态,不能直接返回成功,防止netdevice状态与VAP状态不一致的情况 */
2579 if ((oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) == 0) {
2580 oam_warning_log0(0, 0, "{wal_stop_vap::vap is already down,continue to reset hmac vap state.}\r\n");
2581 }
2582
2583 /* **************************************************************************
2584 抛事件到wal层处理
2585 ************************************************************************** */
2586 /* 填写WID消息 */
2587 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_DOWN_VAP, sizeof(mac_cfg_down_vap_param_stru));
2588 ((mac_cfg_down_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
2589 #ifdef _PRE_WLAN_FEATURE_P2P
2590 wdev = netdev->ieee80211Ptr;
2591 p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(wdev->iftype);
2592 if (WLAN_P2P_BUTT == p2p_mode) {
2593 oam_error_log0(0, 0, "{wal_stop_vap::wal_wireless_iftype_to_mac_p2p_mode return BUFF}\r\n");
2594 return HI_FAIL;
2595 }
2596 ((mac_cfg_start_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
2597
2598 oam_warning_log1(0, 0, "{wal_stop_vap::en_p2p_mode:%d}\r\n", p2p_mode);
2599 #endif
2600
2601 /* 发送消息 */
2602 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2603 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_down_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2604
2605 if (HI_SUCCESS != wal_check_and_release_msg_resp(rsp_msg)) {
2606 oam_warning_log0(0, 0, "wal_stop_vap::wal_check_and_release_msg_resp fail");
2607 }
2608
2609 if (oal_unlikely(ret != HI_SUCCESS)) {
2610 oam_warning_log1(0, 0, "{wal_stop_vap::wal_alloc_cfg_event return err code %d!}\r\n", ret);
2611 return ret;
2612 }
2613
2614 return HI_SUCCESS;
2615 }
2616
wal_get_vap_p2p_mode(const oal_wireless_dev * wdev,wlan_vap_mode_enum_uint8 * vap_mode,wlan_p2p_mode_enum_uint8 * p2p_mode)2617 hi_u32 wal_get_vap_p2p_mode(const oal_wireless_dev *wdev, wlan_vap_mode_enum_uint8 *vap_mode,
2618 wlan_p2p_mode_enum_uint8 *p2p_mode)
2619 {
2620 hi_unref_param(p2p_mode);
2621
2622 switch (wdev->iftype) {
2623 case NL80211_IFTYPE_STATION:
2624 *vap_mode = WLAN_VAP_MODE_BSS_STA;
2625 break;
2626 case NL80211_IFTYPE_AP:
2627 *vap_mode = WLAN_VAP_MODE_BSS_AP;
2628 break;
2629 #ifdef _PRE_WLAN_FEATURE_P2P
2630 case NL80211_IFTYPE_P2P_CLIENT:
2631 *vap_mode = WLAN_VAP_MODE_BSS_STA;
2632 *p2p_mode = WLAN_P2P_CL_MODE;
2633 break;
2634 case NL80211_IFTYPE_P2P_GO:
2635 *vap_mode = WLAN_VAP_MODE_BSS_AP;
2636 *p2p_mode = WLAN_P2P_GO_MODE;
2637 break;
2638 case NL80211_IFTYPE_P2P_DEVICE:
2639 *vap_mode = WLAN_VAP_MODE_BSS_STA;
2640 *p2p_mode = WLAN_P2P_DEV_MODE;
2641 break;
2642 #endif
2643 #ifdef _PRE_WLAN_FEATURE_MESH
2644 case NL80211_IFTYPE_MESH_POINT:
2645 *vap_mode = WLAN_VAP_MODE_MESH;
2646 break;
2647 #endif
2648 default:
2649 oam_warning_log1(0, 0, "{wal_get_vap_p2p_mode::iftype[%d] is not supported!}", wdev->iftype);
2650 return HI_ERR_SUCCESS;
2651 }
2652
2653 return HI_CONTINUE;
2654 }
2655
2656 /* ****************************************************************************
2657 函 数 名 : wal_init_wlan_vap
2658 功能描述 : 初始化wlan0,p2p0的vap
2659 输入参数 : oal_net_device_stru *pst_cfg_net_dev
2660 输出参数 : 无
2661 返 回 值 : hi_u32
2662 调用函数 :
2663 被调函数 :
2664
2665 修改历史 :
2666 1.日 期 : 2015年5月22日
2667 作 者 : HiSilicon
2668 修改内容 : 新生成函数
2669
2670 **************************************************************************** */
wal_init_wlan_vap(oal_net_device_stru * netdev)2671 hi_u32 wal_init_wlan_vap(oal_net_device_stru *netdev)
2672 {
2673 wal_msg_stru *rsp_msg = HI_NULL;
2674 wal_msg_write_stru write_msg = {0};
2675 wlan_vap_mode_enum_uint8 vap_mode = 0;
2676 wlan_p2p_mode_enum_uint8 p2p_mode = WLAN_LEGACY_VAP_MODE;
2677 mac_vap_stru *mac_vap = oal_net_dev_priv(netdev);
2678
2679 if (mac_vap != HI_NULL) {
2680 oam_warning_log0(0, 0, "{wal_init_wlan_vap::pst_mac_vap is already exist}\r\n");
2681 return HI_SUCCESS;
2682 }
2683
2684 oal_wireless_dev *wdev = (oal_wireless_dev *)oal_netdevice_wdev(netdev);
2685 oal_net_device_stru *netdev_cfg = oal_get_netdev_by_name(WLAN_CFG_VAP_NAME);
2686 if ((wdev == HI_NULL) || (netdev_cfg == HI_NULL)) {
2687 oam_warning_log2(0, 0, "{wal_init_wlan_vap::wdev[%p]/netdev_cfg[%p] is null}", (uintptr_t)wdev,
2688 (uintptr_t)netdev_cfg);
2689 return HI_ERR_CODE_PTR_NULL;
2690 }
2691
2692 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2693 oal_dev_put(netdev_cfg);
2694 #endif
2695
2696 /* 仅用于WIFI和AP打开时创建VAP */
2697 if (wal_get_vap_p2p_mode(wdev, &vap_mode, &p2p_mode) == HI_ERR_SUCCESS) {
2698 return HI_ERR_SUCCESS;
2699 }
2700
2701 /* **************************************************************************
2702 抛事件到wal层处理
2703 ************************************************************************** */
2704 /* 填写消息 */
2705 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_ADD_VAP, sizeof(mac_cfg_add_vap_param_stru));
2706 ((mac_cfg_add_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
2707 ((mac_cfg_add_vap_param_stru *)write_msg.auc_value)->vap_mode = vap_mode;
2708 ((mac_cfg_add_vap_param_stru *)write_msg.auc_value)->cfg_vap_indx = WLAN_CFG_VAP_ID;
2709 ((mac_cfg_add_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
2710
2711 hi_u32 ret = wal_send_cfg_event(netdev_cfg, WAL_MSG_TYPE_WRITE,
2712 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_add_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2713 if (oal_unlikely(ret != HI_SUCCESS)) {
2714 oam_warning_log1(WLAN_CFG_VAP_ID, 0, "{wal_init_wlan_vap::return err code %u!}\r\n", ret);
2715 return ret;
2716 }
2717
2718 /* 读取返回的错误码 */
2719 ret = wal_check_and_release_msg_resp(rsp_msg);
2720 if (ret != HI_SUCCESS) {
2721 oam_warning_log1(WLAN_CFG_VAP_ID, 0, "{wal_init_wlan_vap::hmac add vap fail, err code[%u]!}\r\n", ret);
2722 return ret;
2723 }
2724
2725 #ifdef _PRE_WLAN_FEATURE_P2P
2726 mac_device_stru *mac_dev = mac_res_get_dev();
2727 mac_vap = oal_net_dev_priv(netdev);
2728 if (mac_vap == HI_NULL) {
2729 oam_error_log0(0, 0, "{wal_init_wlan_vap::oal_net_dev_priv(pst_net_dev) is null ptr.}");
2730 return HI_ERR_CODE_PTR_NULL;
2731 }
2732
2733 if (p2p_mode == WLAN_P2P_DEV_MODE) {
2734 mac_dev->p2p_info.p2p0_vap_idx = mac_vap->vap_id;
2735 }
2736 #endif
2737
2738 return HI_SUCCESS;
2739 }
2740
2741 /* ****************************************************************************
2742 函 数 名 : wal_deinit_wlan_vap
2743 功能描述 : 仅用于WIFI和AP关闭时删除VAP
2744 输入参数 : oal_net_device_stru *pst_net_dev
2745 输出参数 : 无
2746 返 回 值 : hi_u32
2747 调用函数 :
2748 被调函数 :
2749
2750 修改历史 :
2751 1.日 期 : 2015年1月3日
2752 作 者 : HiSilicon
2753 修改内容 : 新生成函数
2754
2755 **************************************************************************** */
wal_deinit_wlan_vap(oal_net_device_stru * netdev)2756 hi_u32 wal_deinit_wlan_vap(oal_net_device_stru *netdev)
2757 {
2758 wal_msg_write_stru write_msg;
2759 wal_msg_stru *rsp_msg = HI_NULL;
2760 mac_vap_stru *mac_vap = HI_NULL;
2761 hi_u32 ret;
2762
2763 #ifdef _PRE_WLAN_FEATURE_P2P
2764 oal_wireless_dev *wdev = GET_NET_DEV_CFG80211_WIRELESS(netdev);
2765 wlan_p2p_mode_enum_uint8 p2p_mode = wal_wireless_iftype_to_mac_p2p_mode(wdev->iftype);
2766 #endif
2767
2768 if (oal_unlikely(netdev == HI_NULL)) {
2769 oam_error_log0(0, 0, "{wal_deinit_wlan_vap::pst_del_vap_param null ptr !}\r\n");
2770 return HI_ERR_CODE_PTR_NULL;
2771 }
2772
2773 mac_vap = oal_net_dev_priv(netdev);
2774 if (mac_vap == HI_NULL) {
2775 oam_warning_log0(0, 0, "{wal_deinit_wlan_vap::pst_mac_vap is already null}\r\n");
2776 return HI_SUCCESS;
2777 }
2778
2779 #ifdef _PRE_WLAN_FEATURE_P2P
2780 if (0 == strcmp("p2p0", netdev->name)) {
2781 p2p_mode = WLAN_P2P_DEV_MODE;
2782 }
2783 oam_warning_log1(mac_vap->vap_id, 0, "{wal_deinit_wlan_vap::en_p2p_mode:%d}\r\n", p2p_mode);
2784 #endif
2785
2786 #ifdef _PRE_WLAN_FEATURE_ANY
2787 if (mac_vap->support_any == HI_TRUE) {
2788 hi_wifi_any_deinit();
2789 }
2790 #endif
2791 /* **************************************************************************
2792 抛事件到wal层处理
2793 ************************************************************************** */
2794 /* 删除vap 时需要将参数赋值 */
2795 ((mac_cfg_del_vap_param_stru *)write_msg.auc_value)->net_dev = netdev;
2796 #ifdef _PRE_WLAN_FEATURE_P2P
2797 ((mac_cfg_del_vap_param_stru *)write_msg.auc_value)->p2p_mode = p2p_mode;
2798 #endif
2799
2800 wal_write_msg_hdr_init(&write_msg, WLAN_CFGID_DEL_VAP, sizeof(mac_cfg_del_vap_param_stru));
2801 ret = wal_send_cfg_event(netdev, WAL_MSG_TYPE_WRITE,
2802 WAL_MSG_WRITE_MSG_HDR_LENGTH + sizeof(mac_cfg_del_vap_param_stru), (hi_u8 *)&write_msg, HI_TRUE, &rsp_msg);
2803
2804 if (HI_SUCCESS != wal_check_and_release_msg_resp(rsp_msg)) {
2805 oam_warning_log0(0, 0, "wal_deinit_wlan_vap::wal_check_and_release_msg_resp fail.");
2806 } else {
2807 oal_net_dev_priv(netdev) = NULL;
2808 }
2809
2810 if (oal_unlikely(ret != HI_SUCCESS)) {
2811 oam_error_log1(mac_vap->vap_id, 0, "{wal_deinit_wlan_vap::return error code %d}\r\n", ret);
2812 }
2813
2814 return ret;
2815 }
2816
2817 /* ****************************************************************************
2818 函 数 名 : wal_get_mac_addr
2819 功能描述 : 判断mac地址是否合法
2820 输入参数 : 无
2821 输出参数 : hi_u8 *buf
2822 返 回 值 : hi_u32
2823 调用函数 :
2824 被调函数 :
2825
2826 修改历史 :
2827 1.日 期 : 2017年1月18日
2828 作 者 : HiSilicon
2829 修改内容 : 新生成函数
2830
2831 **************************************************************************** */
wal_macaddr_check(const hi_u8 * mac_addr)2832 hi_u32 wal_macaddr_check(const hi_u8 *mac_addr)
2833 {
2834 if ((HI_TRUE == mac_addr_is_zero(mac_addr)) || ((mac_addr[0] & 0x1) == 0x1)) {
2835 return HI_FAIL;
2836 }
2837
2838 return HI_SUCCESS;
2839 }
2840
2841
2842 /* ****************************************************************************
2843 功能描述 : wal侧通过change virtual iftype创建vap的接口
2844 修改历史 :
2845 1.日 期 : 2015年12月2日
2846 作 者 : HiSilicon
2847 修改内容 : 新生成函数
2848 2. 日 期 : 2019年2月12日
2849 作 者 : HiSilicon
2850 修改内容 : 修改函数名为wal_setup_vap,将iftype赋值移到函数外
2851
2852 **************************************************************************** */
2853 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
wal_setup_vap(oal_net_device_stru * netdev)2854 hi_u32 wal_setup_vap(oal_net_device_stru *netdev)
2855 {
2856 hi_u32 ret = HI_FAIL;
2857 struct netif *netif = HI_NULL;
2858
2859 if (oal_netdevice_flags(netdev) & OAL_IFF_RUNNING) {
2860 /* 切换到Mesh前如果网络设备处于UP状态,需要先down 网络设备 */
2861 hi_diag_log_msg_i0(0, "wal_setup_vap:stop netdevice.");
2862 wal_netdev_stop(netdev);
2863
2864 ret = wal_deinit_wlan_vap(netdev);
2865 if (ret != HI_SUCCESS) {
2866 hi_diag_log_msg_i0(0, "wal_setup_vap:wlan_deinit_wlan_vap failed");
2867 return ret;
2868 }
2869 }
2870
2871 netif = netif_find((const hi_char *)netdev->name);
2872 if (netif != HI_NULL) {
2873 /* 设置IPv6 linklocal address(SLAAC) */
2874 if ((GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_AP) ||
2875 (GET_NET_DEV_CFG80211_WIRELESS(netdev)->iftype == NL80211_IFTYPE_MESH_POINT)) {
2876 #ifdef _PRE_WLAN_FEATURE_LWIP_IPV6_AUTOCONFIG
2877 (hi_void)netifapi_set_ip6_autoconfig_disabled(netdev->lwip_netif);
2878 (hi_void)netifapi_set_accept_ra(netif, HI_FALSE);
2879 (hi_void)netifapi_set_ipv6_forwarding(netif, HI_TRUE);
2880 (hi_void)netifapi_set_ra_enable(netif, HI_TRUE);
2881 #endif
2882 oam_warning_log0(0, 0, "[ERR]wal_setup_vap:netifapi_netif_add_ip6_linklocal_address failed");
2883 }
2884 }
2885
2886 ret = wal_init_wlan_vap(netdev);
2887
2888 return ret;
2889 }
2890 #elif (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
wal_setup_vap(oal_net_device_stru * net_dev)2891 hi_u32 wal_setup_vap(oal_net_device_stru *net_dev)
2892 {
2893 hi_u32 ret = HI_FAIL;
2894
2895 if (oal_netdevice_flags(net_dev) & OAL_IFF_RUNNING) {
2896 /* 切换到Mesh前如果网络设备处于UP状态,需要先down 网络设备 */
2897 hi_diag_log_msg_i0(0, "wal_setup_vap:stop netdevice.");
2898 wal_netdev_stop(net_dev);
2899
2900 ret = wal_deinit_wlan_vap(net_dev);
2901 if (ret != HI_SUCCESS) {
2902 hi_diag_log_msg_i0(0, "wal_setup_vap:wlan_deinit_wlan_vap failed");
2903 return ret;
2904 }
2905 }
2906
2907 ret = wal_init_wlan_vap(net_dev);
2908
2909 return ret;
2910 }
2911 #endif
2912
2913 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
2914 /* ****************************************************************************
2915 功能描述 : P2P命令字执行
2916 返 回 值 : 统计结果指针
2917 **************************************************************************** */
2918 #ifdef _PRE_WLAN_FEATURE_P2P
wal_p2p_cmd_exec(oal_net_device_stru * netdev,hi_u8 * puc_command,hi_u32 len)2919 hi_u32 wal_p2p_cmd_exec(oal_net_device_stru *netdev, hi_u8 *puc_command, hi_u32 len)
2920 {
2921 if (memcmp(puc_command, CMD_P2P_SET_NOA, strlen(CMD_P2P_SET_NOA)) == 0) {
2922 hi_u32 skip = strlen(CMD_P2P_SET_NOA) + 1;
2923 mac_cfg_p2p_noa_param_stru p2p_noa_param;
2924 if ((skip + sizeof(p2p_noa_param)) > len) {
2925 oam_error_log2(0, 0, "{wal_priv_cmd_exec::CMD_P2P_SET_NOA param len is [%d], need %d.}", len,
2926 skip + sizeof(p2p_noa_param));
2927 return HI_FAIL;
2928 }
2929 if (memcpy_s(&p2p_noa_param, sizeof(mac_cfg_p2p_noa_param_stru), puc_command + skip,
2930 sizeof(mac_cfg_p2p_noa_param_stru)) != EOK) {
2931 oam_error_log0(0, 0, "wal_priv_cmd_exec: copy noa param failed!");
2932 return HI_FAIL;
2933 }
2934 return wal_ioctl_set_p2p_noa(netdev, &p2p_noa_param);
2935 } else if (memcmp(puc_command, CMD_P2P_SET_PS, strlen(CMD_P2P_SET_PS)) == 0) {
2936 hi_u32 skip = strlen(CMD_P2P_SET_PS) + 1;
2937 mac_cfg_p2p_ops_param_stru p2p_ops_param;
2938 if ((skip + sizeof(p2p_ops_param)) > len) {
2939 oam_error_log2(0, 0, "{wal_priv_cmd_exec::CMD_P2P_SET_PS param len is %d, need %d.}", len,
2940 skip + sizeof(p2p_ops_param));
2941 return HI_FAIL;
2942 }
2943 if (memcpy_s(&p2p_ops_param, sizeof(mac_cfg_p2p_ops_param_stru), puc_command + skip,
2944 sizeof(mac_cfg_p2p_ops_param_stru)) != EOK) {
2945 oam_error_log0(0, 0, "wal_priv_cmd_exec: copy ops param failed!");
2946 return HI_FAIL;
2947 }
2948 return wal_ioctl_set_p2p_ops(netdev, &p2p_ops_param);
2949 }
2950 return HI_SUCCESS;
2951 }
2952 #endif
2953
2954 /* ****************************************************************************
2955 功能描述 : 根据命令字执行对应的命令
2956 输入参数 : net device指针
2957 返 回 值 : 统计结果指针
2958 **************************************************************************** */
wal_priv_cmd_exec(oal_net_device_stru * netdev,hi_u8 * puc_command,hi_u32 len)2959 hi_u32 wal_priv_cmd_exec(oal_net_device_stru *netdev, hi_u8 *puc_command, hi_u32 len)
2960 {
2961 if (0 == memcmp(puc_command, CMD_COUNTRY, strlen(CMD_COUNTRY))) {
2962 const hi_s8 *country_code = HI_NULL;
2963 hi_s8 auc_country_code[MAC_CONTRY_CODE_LEN] = {0}; /* 3: 元素个数 */
2964
2965 /* 格式:COUNTRY CN */
2966 if (len < (strlen((hi_s8 *)CMD_COUNTRY) + 3)) { /* 3: 偏移量 */
2967 oam_warning_log0(0, 0, "{wal_priv_cmd_exec::country cn len error.}");
2968 return HI_FAIL;
2969 }
2970 country_code = (hi_char *)puc_command + strlen((hi_char *)CMD_COUNTRY) + 1;
2971 if (memcpy_s(auc_country_code, sizeof(auc_country_code), country_code, 2) != EOK) { /* 复制长度为2 */
2972 oam_error_log0(0, 0, "wal_priv_cmd_exec: copy country code failed!");
2973 return HI_FAIL;
2974 }
2975 return wal_regdomain_update(netdev, auc_country_code, MAC_CONTRY_CODE_LEN);
2976 #ifdef _PRE_WLAN_FEATURE_P2P
2977 } else if (memcmp(puc_command, CMD_SET_AP_WPS_P2P_IE, strlen(CMD_SET_AP_WPS_P2P_IE)) == 0) {
2978 hi_u32 skip = strlen(CMD_SET_AP_WPS_P2P_IE) + 1;
2979 /* 结构体类型 */
2980 oal_app_ie_stru *wps_p2p_ie = (oal_app_ie_stru *)(puc_command + skip);
2981 return wal_ioctl_set_wps_p2p_ie(netdev, wps_p2p_ie->auc_ie, wps_p2p_ie->ie_len, wps_p2p_ie->app_ie_type);
2982 #endif
2983 } else if (memcmp(puc_command, CMD_TX_POWER, strlen(CMD_TX_POWER)) == 0) {
2984 hi_u32 skip_length = strlen((hi_char *)CMD_TX_POWER) + 1;
2985 hi_u8 txpwr = (hi_u8)oal_atoi((hi_char *)puc_command + skip_length);
2986 if (wal_ioctl_reduce_sar(netdev, txpwr) != HI_SUCCESS) {
2987 oam_warning_log0(0, 0, "{wal_priv_cmd_exec::return err code [%u]!}");
2988 /* 驱动打印错误码,返回成功,防止supplicant 累计4次 ioctl失败导致wifi异常重启 */
2989 return HI_SUCCESS;
2990 }
2991 }
2992 #ifdef _PRE_WLAN_FEATURE_P2P
2993 /* p2p相关配置命令执行 */
2994 return wal_p2p_cmd_exec(netdev, puc_command, len);
2995 #endif
2996 return HI_SUCCESS;
2997 }
2998 /* ****************************************************************************
2999 功能描述 : 私有接口函数
3000 输入参数 : net device指针
3001 返 回 值 : 统计结果指针
3002 **************************************************************************** */
wal_priv_cmd(oal_net_device_stru * netdev,oal_ifreq_stru * ifr,hi_s32 cmd)3003 hi_u32 wal_priv_cmd(oal_net_device_stru *netdev, oal_ifreq_stru *ifr, hi_s32 cmd)
3004 {
3005 wal_wifi_priv_cmd_stru priv_cmd = {0};
3006 hi_u8 *puc_command = HI_NULL;
3007 hi_u32 ret;
3008
3009 #ifndef _PRE_HDF_LINUX
3010 if (ifr->ifr_data == HI_NULL) {
3011 return HI_FAIL;
3012 }
3013 if (oal_copy_from_user((hi_u8 *)&priv_cmd, sizeof(wal_wifi_priv_cmd_stru), ifr->ifr_data,
3014 sizeof(wal_wifi_priv_cmd_stru)) != 0) {
3015 return HI_FAIL;
3016 }
3017
3018 if ((priv_cmd.l_total_len > MAX_PRIV_CMD_SIZE) || (priv_cmd.l_total_len < 0)) {
3019 oam_error_log1(0, 0, "{wal_priv_cmd::priavte command len:%d too long}", priv_cmd.l_total_len);
3020 return HI_FAIL;
3021 }
3022 #endif
3023
3024 /* 申请内存保存wpa_supplicant 下发的命令和数据 */
3025 puc_command = oal_memalloc((hi_u32)(priv_cmd.l_total_len + 1)); /* total len 为priv cmd 后面buffer 长度 */
3026 if (puc_command == HI_NULL) {
3027 oam_error_log0(0, 0, "{wal_priv_cmd::mem alloc failed.}");
3028 return HI_FAIL;
3029 }
3030 /* 拷贝wpa_supplicant 命令到内核态中 */
3031 if (memset_s(puc_command, (hi_u32)(priv_cmd.l_total_len + 1), 0, (hi_u32)(priv_cmd.l_total_len + 1)) != EOK) {
3032 oam_error_log0(0, 0, "wal_priv_cmd: mem safe function err!");
3033 oal_free(puc_command);
3034 return HI_FAIL;
3035 }
3036 #ifndef _PRE_HDF_LINUX
3037 ret = oal_copy_from_user(puc_command, (hi_u32)(priv_cmd.l_total_len), ((hi_u8 *)ifr->ifr_data) + 8, /* 数据偏移量8 */
3038 (hi_u32)(priv_cmd.l_total_len));
3039 #endif
3040 if (ret != HI_SUCCESS) {
3041 oam_error_log1(0, 0, "{wal_priv_cmd::oal_copy_from_user: err code [%u] }", ret);
3042 oal_free(puc_command);
3043 return ret;
3044 }
3045 puc_command[priv_cmd.l_total_len] = '\0';
3046 oam_info_log2(0, 0, "{wal_priv_cmd:: private cmd total_len:%d, used_len:%d}",
3047 priv_cmd.l_total_len, priv_cmd.l_used_len);
3048
3049 /* 执行命令字 */
3050 ret = wal_priv_cmd_exec(netdev, puc_command, (hi_u32)priv_cmd.l_total_len);
3051 oal_free(puc_command);
3052 return ret;
3053 }
3054 #endif
3055
3056 #ifdef __cplusplus
3057 #if __cplusplus
3058 }
3059 #endif
3060 #endif
3061