1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: driver_soc_ioctl
15 */
16
17 #include "utils/common.h"
18 #include "driver_soc_ioctl.h"
19 #include "securec.h"
20
21 #ifdef __cplusplus
22 #if __cplusplus
23 extern "C" {
24 #endif
25 #endif
26
drv_soc_ioctl_command_set(const int8 * ifname,const void * buf,unsigned int cmd)27 static int32 drv_soc_ioctl_command_set(const int8 *ifname, const void *buf, unsigned int cmd)
28 {
29 ext_ioctl_command_stru ioctl_cmd;
30 (void)memset_s(&ioctl_cmd, sizeof(ext_ioctl_command_stru), 0, sizeof(ext_ioctl_command_stru));
31 ioctl_cmd.cmd = cmd;
32 ioctl_cmd.buf = buf;
33 return drv_soc_ioctl(ifname, &ioctl_cmd);
34 }
35
drv_soc_eapol_packet_send(const int8 * ifname,const uint8 * src_addr,const uint8 * dst_addr,const uint8 * buf,uint32 length)36 int32 drv_soc_eapol_packet_send(const int8 *ifname, const uint8 *src_addr, const uint8 *dst_addr,
37 const uint8 *buf, uint32 length)
38 {
39 ext_tx_eapol_stru tx_eapol;
40 (void)src_addr;
41 (void)dst_addr;
42 (void)memset_s(&tx_eapol, sizeof(ext_tx_eapol_stru), 0, sizeof(ext_tx_eapol_stru));
43 tx_eapol.puc_buf = buf;
44 tx_eapol.ul_len = length;
45 return drv_soc_ioctl_command_set(ifname, &tx_eapol, EXT_IOCTL_SEND_EAPOL);
46 }
47
drv_soc_eapol_packet_receive(const int8 * ifname,ext_rx_eapol_stru * rx_eapol)48 int32 drv_soc_eapol_packet_receive(const int8 *ifname, ext_rx_eapol_stru *rx_eapol)
49 {
50 if (rx_eapol == NULL)
51 return -EXT_EFAIL;
52 rx_eapol->buf = os_zalloc(EAPOL_PKT_BUF_SIZE);
53 if (rx_eapol->buf == EXT_PTR_NULL) {
54 return -EXT_EFAIL;
55 }
56 rx_eapol->len = EAPOL_PKT_BUF_SIZE;
57 return drv_soc_ioctl_command_set(ifname, rx_eapol, EXT_IOCTL_RECEIVE_EAPOL);
58 }
59
drv_soc_eapol_enable(const int8 * ifname,void (* notify_callback)(void *,void *),void * context)60 int32 drv_soc_eapol_enable(const int8 *ifname, void (*notify_callback)(void *, void *), void *context)
61 {
62 ext_enable_eapol_stru enable_eapol;
63 (void)memset_s(&enable_eapol, sizeof(ext_enable_eapol_stru), 0, sizeof(ext_enable_eapol_stru));
64 enable_eapol.callback = notify_callback;
65 enable_eapol.contex = context;
66
67 return drv_soc_ioctl_command_set(ifname, &enable_eapol, EXT_IOCTL_ENALBE_EAPOL);
68 }
69
drv_soc_eapol_disable(const int8 * ifname)70 int32 drv_soc_eapol_disable(const int8 *ifname)
71 {
72 return drv_soc_ioctl_command_set(ifname, ifname, EXT_IOCTL_DISABLE_EAPOL);
73 }
74
drv_soc_ioctl_get_own_mac(const int8 * ifname,const int8 * mac_addr)75 int32 drv_soc_ioctl_get_own_mac(const int8 *ifname, const int8 *mac_addr)
76 {
77 return drv_soc_ioctl_command_set(ifname, mac_addr, HIIS_IOCTL_GET_ADDR);
78 }
79
80 #ifdef CONFIG_ACS
drv_soc_ioctl_get_survey(const int8 * ifname,const void * buf)81 int32 drv_soc_ioctl_get_survey(const int8 *ifname, const void *buf)
82 {
83 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_GET_SURVEY);
84 }
85 #endif
86
87 #ifdef CONFIG_IEEE80211R
drv_soc_ioctl_update_ft_ies(const int8 * ifname,const void * buf)88 int32 drv_soc_ioctl_update_ft_ies(const int8 *ifname, const void *buf)
89 {
90 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_UPDATE_FT_IES);
91 }
92 #endif /* CONFIG_IEEE80211R */
93
drv_soc_ioctl_set_ap(const int8 * ifname,const void * buf)94 int32 drv_soc_ioctl_set_ap(const int8 *ifname, const void *buf)
95 {
96 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_SET_AP);
97 }
98
drv_soc_ioctl_change_beacon(const int8 * ifname,const void * buf)99 int32 drv_soc_ioctl_change_beacon(const int8 *ifname, const void *buf)
100 {
101 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_CHANGE_BEACON);
102 }
103
drv_soc_ioctl_get_hw_feature(const int8 * ifname,const void * buf)104 int32 drv_soc_ioctl_get_hw_feature(const int8 *ifname, const void *buf)
105 {
106 return drv_soc_ioctl_command_set(ifname, buf, HIIS_IOCTL_GET_HW_FEATURE);
107 }
108
drv_soc_ioctl_send_mlme(const int8 * ifname,const void * buf)109 int32 drv_soc_ioctl_send_mlme(const int8 *ifname, const void *buf)
110 {
111 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_SEND_MLME);
112 }
113
drv_soc_ioctl_new_key(const int8 * ifname,const void * buf)114 int32 drv_soc_ioctl_new_key(const int8 *ifname, const void *buf)
115 {
116 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_NEW_KEY);
117 }
118
drv_soc_ioctl_del_key(const int8 * ifname,const void * buf)119 int32 drv_soc_ioctl_del_key(const int8 *ifname, const void *buf)
120 {
121 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_DEL_KEY);
122 }
123
drv_soc_ioctl_set_key(const int8 * ifname,const void * buf)124 int32 drv_soc_ioctl_set_key(const int8 *ifname, const void *buf)
125 {
126 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_SET_KEY);
127 }
128
drv_soc_ioctl_set_mode(const int8 * ifname,const void * buf)129 int32 drv_soc_ioctl_set_mode(const int8 *ifname, const void *buf)
130 {
131 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_SET_MODE);
132 }
133
drv_soc_ioctl_get_mode(const int8 * ifname,const void * buf)134 int32 drv_soc_ioctl_get_mode(const int8 *ifname, const void *buf)
135 {
136 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_GET_MODE);
137 }
138
drv_soc_ioctl_del_beacon(const int8 * ifname,const void * buf)139 int32 drv_soc_ioctl_del_beacon(const int8 *ifname, const void *buf)
140 {
141 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_DEL_BEACON);
142 }
143
drv_soc_ioctl_set_netdev(const int8 * ifname,const ext_bool_enum_uint8 * netdev)144 int32 drv_soc_ioctl_set_netdev(const int8 *ifname, const ext_bool_enum_uint8 *netdev)
145 {
146 return drv_soc_ioctl_command_set(ifname, netdev, EXT_IOCTL_SET_NETDEV);
147 }
148
drv_soc_ioctl_scan(const int8 * ifname,const void * buf)149 int32 drv_soc_ioctl_scan(const int8 *ifname, const void *buf)
150 {
151 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_SCAN);
152 }
drv_soc_ioctl_wifi_app_service_handle(const int8 * ifname,const void * buf)153 int32 drv_soc_ioctl_wifi_app_service_handle(const int8 *ifname, const void *buf)
154 {
155 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_WIFI_APP_SERVICE);
156 }
157
drv_soc_ioctl_disconnet(const int8 * ifname,const void * buf)158 int32 drv_soc_ioctl_disconnet(const int8 *ifname, const void *buf)
159 {
160 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_DISCONNET);
161 }
162
drv_soc_ioctl_assoc(const int8 * ifname,const void * buf)163 int32 drv_soc_ioctl_assoc(const int8 *ifname, const void *buf)
164 {
165 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_ASSOC);
166 }
167
168 #ifdef _PRE_WLAN_FEATURE_REKEY_OFFLOAD
drv_soc_ioctl_set_rekey_info(const int8 * ifname,const void * buf)169 int32 drv_soc_ioctl_set_rekey_info(const int8 *ifname, const void *buf)
170 {
171 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_SET_REKEY_INFO);
172 }
173 #endif
174
drv_soc_ioctl_send_action(const int8 * ifname,const void * buf)175 int32 drv_soc_ioctl_send_action(const int8 *ifname, const void *buf)
176 {
177 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_SEND_ACTION);
178 }
179
drv_soc_ioctl_mesh_usr_add(const int8 * ifname,const void * buf_addr)180 int32 drv_soc_ioctl_mesh_usr_add(const int8 *ifname, const void *buf_addr)
181 {
182 return drv_soc_ioctl_command_set(ifname, buf_addr, EXT_IOCTL_SET_MESH_USER);
183 }
184
drv_soc_ioctl_mesh_set_mgtk(const int8 * ifname,const void * buf_addr)185 int32 drv_soc_ioctl_mesh_set_mgtk(const int8 *ifname, const void *buf_addr)
186 {
187 return drv_soc_ioctl_command_set(ifname, buf_addr, EXT_IOCTL_SET_MESH_GTK);
188 }
189
drv_soc_get_cmd_from_mesh_flag(enum ext_mesh_enable_flag_type flag_type)190 static int32 drv_soc_get_cmd_from_mesh_flag(enum ext_mesh_enable_flag_type flag_type)
191 {
192 int32 cmd_list[] = {(int32)EXT_IOCTL_EN_ACCEPT_PEER, (int32)EXT_IOCTL_EN_ACCEPT_STA};
193 return cmd_list[flag_type];
194 }
195
drv_soc_ioctl_mesh_enable_flag(const int8 * ifname,enum ext_mesh_enable_flag_type flag_type,const void * buf_addr)196 int32 drv_soc_ioctl_mesh_enable_flag(const int8 *ifname, enum ext_mesh_enable_flag_type flag_type,
197 const void *buf_addr)
198 {
199 if (flag_type >= EXT_MESH_ENABLE_FLAG_BUTT) {
200 return -EXT_EFAIL;
201 }
202
203 return drv_soc_ioctl_command_set(ifname, buf_addr, (unsigned int)drv_soc_get_cmd_from_mesh_flag(flag_type));
204 }
205
drv_soc_ioctl_set_csi_config(const int8 * ifname,const void * csi_config)206 int32 drv_soc_ioctl_set_csi_config(const int8 *ifname, const void *csi_config)
207 {
208 return drv_soc_ioctl_command_set(ifname, csi_config, EXT_IOCTL_SET_CSI_CONFIG);
209 }
210
drv_soc_ioctl_csi_switch(const int8 * ifname,const void * switch_flag)211 int32 drv_soc_ioctl_csi_switch(const int8 *ifname, const void *switch_flag)
212 {
213 return drv_soc_ioctl_command_set(ifname, switch_flag, EXT_IOCTL_CSI_SWITCH);
214 }
215
drv_soc_ioctl_set_usr_app_ie(const int8 * ifname,const void * usr_app_ie)216 int32 drv_soc_ioctl_set_usr_app_ie(const int8 *ifname, const void *usr_app_ie)
217 {
218 return drv_soc_ioctl_command_set(ifname, usr_app_ie, EXT_IOCTL_SET_USR_APP_IE);
219 }
220
drv_soc_ioctl_sta_remove(const int8 * ifname,const void * buf_addr)221 int32 drv_soc_ioctl_sta_remove(const int8 *ifname, const void *buf_addr)
222 {
223 return drv_soc_ioctl_command_set(ifname, buf_addr, EXT_IOCTL_STA_REMOVE);
224 }
225
226 #ifdef CONFIG_WPS_AP
drv_soc_ioctl_set_ap_wps_p2p_ie(const int8 * ifname,const void * buf)227 int32 drv_soc_ioctl_set_ap_wps_p2p_ie(const int8 *ifname, const void *buf)
228 {
229 return drv_soc_ioctl_command_set(ifname, (void *)buf, EXT_IOCTL_SET_AP_WPS_P2P_IE);
230 }
231 #endif
232
233 #ifdef LOS_CONFIG_P2P
drv_soc_ioctl_probe_request_report(const int8 * ifname,const void * buf_addr)234 int32 drv_soc_ioctl_probe_request_report(const int8 *ifname, const void *buf_addr)
235 {
236 return drv_soc_ioctl_command_set(ifname, (void *)buf_addr, EXT_IOCTL_PROBE_REQUEST_REPORT);
237 }
238
drv_soc_ioctl_remain_on_channel(const int8 * ifname,const void * buf_addr)239 int32 drv_soc_ioctl_remain_on_channel(const int8 *ifname, const void *buf_addr)
240 {
241 return drv_soc_ioctl_command_set(ifname, (void *)buf_addr, EXT_IOCTL_REMAIN_ON_CHANNEL);
242 }
243
drv_soc_ioctl_cancel_remain_on_channel(const int8 * ifname,const void * buf_addr)244 int32 drv_soc_ioctl_cancel_remain_on_channel(const int8 *ifname, const void *buf_addr)
245 {
246 return drv_soc_ioctl_command_set(ifname, (void *)buf_addr, EXT_IOCTL_CANCEL_REMAIN_ON_CHANNEL);
247 }
248
drv_soc_ioctl_add_if(const int8 * ifname,const void * buf_addr)249 int32 drv_soc_ioctl_add_if(const int8 *ifname, const void *buf_addr)
250 {
251 return drv_soc_ioctl_command_set(ifname, (void *)buf_addr, EXT_IOCTL_ADD_IF);
252 }
253
drv_soc_ioctl_remove_if(const int8 * ifname,const void * buf_addr)254 int32 drv_soc_ioctl_remove_if(const int8 *ifname, const void *buf_addr)
255 {
256 return drv_soc_ioctl_command_set(ifname, (void *)buf_addr, EXT_IOCTL_REMOVE_IF);
257 }
258
drv_soc_ioctl_get_p2p_addr(const int8 * ifname,const void * buf_addr)259 int32 drv_soc_ioctl_get_p2p_addr(const int8 *ifname, const void *buf_addr)
260 {
261 return drv_soc_ioctl_command_set(ifname, (void *)buf_addr, EXT_IOCTL_GET_P2P_MAC_ADDR);
262 }
263
drv_soc_ioctl_set_p2p_noa(const int8 * ifname,const void * buf_addr)264 int32 drv_soc_ioctl_set_p2p_noa(const int8 *ifname, const void *buf_addr)
265 {
266 return drv_soc_ioctl_command_set(ifname, (void *)buf_addr, EXT_IOCTL_SET_P2P_NOA);
267 }
268
drv_soc_ioctl_set_p2p_powersave(const int8 * ifname,const void * buf_addr)269 int32 drv_soc_ioctl_set_p2p_powersave(const int8 *ifname, const void *buf_addr)
270 {
271 return drv_soc_ioctl_command_set(ifname, (void *)buf_addr, EXT_IOCTL_SET_P2P_POWERSAVE);
272 }
273 #endif /* LOS_CONFIG_P2P */
274
drv_soc_ioctl_get_drv_flags(const int8 * ifname,const void * buf_addr)275 int32 drv_soc_ioctl_get_drv_flags(const int8 *ifname, const void *buf_addr)
276 {
277 return drv_soc_ioctl_command_set(ifname, buf_addr, EXT_IOCTL_GET_DRIVER_FLAGS);
278 }
279
drv_soc_ioctl_set_delay_report(const int8 * ifname,const void * buf)280 int32 drv_soc_ioctl_set_delay_report(const int8 *ifname, const void *buf)
281 {
282 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_DELAY_REPORT);
283 }
284
drv_soc_ioctl_send_ext_auth_status(const int8 * ifname,const void * buf)285 int32 drv_soc_ioctl_send_ext_auth_status(const int8 *ifname, const void *buf)
286 {
287 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_SEND_EXT_AUTH_STATUS);
288 }
289
drv_soc_ioctl_update_dh_ie(const int8 * ifname,const void * buf)290 int32 drv_soc_ioctl_update_dh_ie(const int8 *ifname, const void *buf)
291 {
292 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_UPDATE_DH_IE);
293 }
294
drv_soc_ioctl_add_pmkid(const int8 * ifname,const void * buf)295 int32 drv_soc_ioctl_add_pmkid(const int8 *ifname, const void *buf)
296 {
297 wpa_error_log0(MSG_DEBUG, "drv_soc_ioctl_add_pmkid");
298 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_ADD_PMKID);
299 }
300
drv_soc_ioctl_remove_pmkid(const int8 * ifname,const void * buf)301 int32 drv_soc_ioctl_remove_pmkid(const int8 *ifname, const void *buf)
302 {
303 wpa_error_log0(MSG_DEBUG, "drv_soc_ioctl_remove_pmkid");
304 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_DEL_PMKID);
305 }
306
drv_soc_ioctl_flush_pmkid(const int8 * ifname,const void * buf)307 int32 drv_soc_ioctl_flush_pmkid(const int8 *ifname, const void *buf)
308 {
309 wpa_error_log0(MSG_DEBUG, "drv_soc_ioctl_flush_pmkid");
310 return drv_soc_ioctl_command_set(ifname, buf, EXT_IOCTL_FLUSH_PMKID);
311 }
312
drv_soc_ioctl(const int8 * ifname,const ext_ioctl_command_stru * ioctl_cmd)313 int32 drv_soc_ioctl(const int8 *ifname, const ext_ioctl_command_stru *ioctl_cmd)
314 {
315 int32 ret;
316 if (ioctl_cmd == NULL)
317 return -EXT_EFAIL;
318 wpa_error_log1(MSG_DEBUG, "drv_soc_ioctl ioctl_cmd->cmd=%u.", ioctl_cmd->cmd);
319 osal_printk("drv_soc_ioctl ioctl_cmd->cmd=%u.\r\n", ioctl_cmd->cmd);
320
321 ret = drv_soc_hwal_wpa_ioctl((int8 *)ifname, ioctl_cmd);
322 if (ret != EXT_SUCC) {
323 if ((ret == (-EXT_EINVAL)) && (ioctl_cmd->cmd == EXT_IOCTL_RECEIVE_EAPOL)) {
324 /* When receiving eapol message, the last empty message will be received, which is a normal phenomenon */
325 wpa_warning_log2(MSG_DEBUG, "hwal_wpa_ioctl ioctl_cmd->cmd=%u, lret=%d.", ioctl_cmd->cmd, ret);
326 } else {
327 /* When issuing the del key command, if the driver has deleted the user resource,
328 it will return an error, which is a normal phenomenon */
329 if (ioctl_cmd->cmd != EXT_IOCTL_DEL_KEY) {
330 wpa_error_log2(MSG_DEBUG, "hwal_wpa_ioctl ioctl_cmd->cmd=%u, lret=%d.", ioctl_cmd->cmd, ret);
331 }
332 }
333 return -EXT_EFAIL;
334 }
335 return EXT_SUCC;
336 }
337
338 #ifdef __cplusplus
339 #if __cplusplus
340 }
341 #endif
342 #endif
343