• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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