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: 网络适配实现 (此文件为DEMO,需集成方适配修改)
15 */
16 #include "hilink_network_adapter.h"
17
18 #include <stdbool.h>
19 #include <stddef.h>
20 #include "wifi_device.h"
21 #include "wifi_event.h"
22 #include "wifi_device_config.h"
23 #include "hilink_sal_defines.h"
24 #include "hilink_socket_adapter.h"
25 #include "hilink_str_adapter.h"
26 #include "securec.h"
27 #include "hilink_thread_adapter.h"
28 #include "hilink_mem_adapter.h"
29 #include "soc_wifi_api.h"
30 #include "lwip/netifapi.h"
31 #include "nv.h"
32 #include "nv_common_cfg.h"
33 #include "efuse_porting.h"
34
35 #define MAX_IP_LEN 40
36 #define MAX_SCAN_TIMES 4
37 #define DEF_SCAN_TIMEOUT 15
38 #define MS_PER_SECOND 1000
39 #define WIFI_SCANNING 1
40
41 static bool g_isRegisterWifiEvent = false;
42 static bool g_isStaScanSuccess = false;
43 static wifi_event_stru g_eventHandler;
44 static unsigned short g_disconnectReason = 0;
45 static bool g_isReasonRefresh = false;
46 static int g_offline_mode_scan_flag = 0;
47
get_wifi_recovery_type(void)48 unsigned int get_wifi_recovery_type(void)
49 {
50 return (0x01 | 0x02); /* 0x01|0x02 : 连线网络优化功能开启 */
51 }
52
sta_setup_dhcp(void)53 static int sta_setup_dhcp(void)
54 {
55 int ret = 0;
56 struct netif *netif_p = netifapi_netif_find("wlan0");
57 if (netif_p == NULL) {
58 return HILINK_SAL_NOK;
59 }
60 ret = netifapi_dhcp_start(netif_p);
61 if (ret == 0) {
62 return HILINK_SAL_OK;
63 }
64
65 return HILINK_SAL_NOK;
66 }
AddDeviceConfig(wifi_sta_config_stru * config)67 static int AddDeviceConfig(wifi_sta_config_stru *config)
68 {
69 if (config == NULL) {
70 HILINK_SAL_WARN("invalid param\r\n");
71 return HILINK_SAL_PARAM_INVALID;
72 }
73
74 hilink_connect_info_t connect_info;
75 (void)memset_s(&connect_info, sizeof(connect_info), 0, sizeof(connect_info));
76
77 if (memcpy_s(connect_info.ssid, sizeof(connect_info.ssid), config->ssid, strlen((char *)config->ssid)) != EOK) {
78 HILINK_SAL_ERROR("memcpy_s error\r\n");
79 return HILINK_SAL_NOK;
80 }
81
82 if (memcpy_s(connect_info.pwd, sizeof(connect_info.pwd), config->pre_shared_key,
83 strlen((char *)config->pre_shared_key)) != EOK) {
84 HILINK_SAL_ERROR("memcpy_s error\r\n");
85 return HILINK_SAL_NOK;
86 }
87
88 if (memcpy_s(connect_info.bssid, sizeof(connect_info.bssid), config->bssid,
89 sizeof(config->bssid)) != EOK) {
90 HILINK_SAL_ERROR("memcpy_s error\r\n");
91 return HILINK_SAL_NOK;
92 }
93
94 uint32_t nv_ret = ERRCODE_FAIL;
95 nv_ret = uapi_nv_write(NV_ID_HILINK_CONNECT_INFO, (uint8_t *)&connect_info, sizeof(connect_info));
96 if (nv_ret != ERRCODE_SUCC) {
97 HILINK_SAL_ERROR("read write connect info to nv failed\r\n");
98 return HILINK_SAL_NOK;
99 }
100 return HILINK_SAL_OK;
101 }
102
GetDeviceConfigs(wifi_sta_config_stru * config)103 static int GetDeviceConfigs(wifi_sta_config_stru *config)
104 {
105 if (config == NULL) {
106 HILINK_SAL_WARN("invalid param\r\n");
107 return HILINK_SAL_PARAM_INVALID;
108 }
109
110 hilink_connect_info_t connect_info;
111 (void)memset_s(&connect_info, sizeof(connect_info), 0, sizeof(connect_info));
112
113 uint16_t connect_info_len = 0;
114 uint32_t nv_ret = ERRCODE_FAIL;
115 nv_ret = uapi_nv_read(NV_ID_HILINK_CONNECT_INFO, sizeof(hilink_connect_info_t), &connect_info_len,
116 (uint8_t *)&connect_info);
117 if (nv_ret != ERRCODE_SUCC) {
118 HILINK_SAL_ERROR("read hilink connect info from nv failed\r\n");
119 return HILINK_SAL_NOK;
120 }
121
122 if (memcpy_s(config->ssid, sizeof(config->ssid), connect_info.ssid, sizeof(connect_info.ssid)) != EOK) {
123 HILINK_SAL_ERROR("memcpy_s error\r\n");
124 return HILINK_SAL_NOK;
125 }
126
127 if (memcpy_s(config->pre_shared_key, sizeof(config->pre_shared_key), connect_info.pwd, sizeof(connect_info.pwd)) !=
128 EOK) {
129 HILINK_SAL_ERROR("memcpy_s error\r\n");
130 return HILINK_SAL_NOK;
131 }
132
133 if (memcpy_s(config->bssid, sizeof(config->bssid), connect_info.bssid, sizeof(connect_info.bssid)) !=
134 EOK) {
135 HILINK_SAL_ERROR("memcpy_s error\r\n");
136 return HILINK_SAL_NOK;
137 }
138
139 return HILINK_SAL_OK;
140 }
RemoveDevice(void)141 static int RemoveDevice(void)
142 {
143 hilink_connect_info_t connect_info;
144 (void)memset_s(&connect_info, sizeof(connect_info), 0, sizeof(connect_info));
145
146 uint32_t nv_ret = ERRCODE_FAIL;
147 nv_ret = uapi_nv_write(NV_ID_HILINK_CONNECT_INFO, (uint8_t *)&connect_info, sizeof(connect_info));
148 if (nv_ret != ERRCODE_SUCC) {
149 HILINK_SAL_ERROR("remove connect info to nv failed.\r\n");
150 }
151
152 return HILINK_SAL_OK;
153 }
get_softap_local_ip(char * localIp,unsigned char len)154 static int get_softap_local_ip(char *localIp, unsigned char len)
155 {
156 struct netif *lwip_netif = netifapi_netif_find("ap0");
157 if (lwip_netif == NULL) {
158 lwip_netif = netifapi_netif_find("wlan0");
159 if (lwip_netif == NULL) {
160 return HILINK_SAL_GET_IP_ERR;
161 }
162 }
163
164 if (memcpy_s(localIp, len, ip4addr_ntoa(&(lwip_netif->ip_addr.u_addr.ip4)),
165 strlen(ip4addr_ntoa(&(lwip_netif->ip_addr.u_addr.ip4)))) != EOK) {
166 return HILINK_SAL_GET_IP_ERR;
167 }
168
169 return HILINK_SAL_OK;
170 }
HILINK_GetLocalIp(char * localIp,unsigned char len)171 int HILINK_GetLocalIp(char *localIp, unsigned char len)
172 {
173 if ((localIp == NULL) || (len == 0)) {
174 HILINK_SAL_WARN("invalid param\r\n");
175 return HILINK_SAL_PARAM_INVALID;
176 }
177 /* 避免循环调用导致的打印刷屏 */
178 static bool isPrint = false;
179 if (get_softap_local_ip(localIp, len) != HILINK_SAL_OK) {
180 if (!isPrint) {
181 HILINK_SAL_NOTICE("HILINK_GetLocalIp fail.\r\n");
182 isPrint = true;
183 }
184 return HILINK_SAL_GET_IP_ERR;
185 }
186 isPrint = false;
187
188 return HILINK_SAL_OK;
189 }
190
HILINK_GetMacAddr(unsigned char * mac,unsigned char len)191 int HILINK_GetMacAddr(unsigned char *mac, unsigned char len)
192 {
193 if ((mac == NULL) || (len < WIFI_MAC_LEN)) {
194 HILINK_SAL_WARN("invalid param\r\n");
195 return HILINK_SAL_PARAM_INVALID;
196 }
197
198 /* 从efuse获取mac地址 */
199 unsigned char efuse_left_count = 0;
200 if (efuse_read_mac(mac, WIFI_MAC_LEN, &efuse_left_count) != ERRCODE_SUCC) {
201 HILINK_SAL_ERROR("get device macaddr from efuse fail\r\n");
202 return HILINK_SAL_GET_MAC_ERR;
203 }
204
205 return HILINK_SAL_OK;
206 }
207
GetWifiConfigFromOhos(wifi_sta_config_stru * config)208 static int GetWifiConfigFromOhos(wifi_sta_config_stru *config)
209 {
210 if (config == NULL) {
211 HILINK_SAL_WARN("invalid param\r\n");
212 return HILINK_SAL_PARAM_INVALID;
213 }
214
215 wifi_sta_config_stru wifiConfig;
216 (void)memset_s(&wifiConfig, sizeof(wifiConfig), 0, sizeof(wifiConfig));
217
218 static bool isPrint = false;
219 if (GetDeviceConfigs(&wifiConfig) != HILINK_SAL_OK) {
220 if (!isPrint) {
221 HILINK_SAL_ERROR("get device config fail\r\n");
222 isPrint = true;
223 }
224 return HILINK_SAL_GET_WIFI_INFO_ERR;
225 }
226 isPrint = false;
227
228 if (memcpy_s(config, sizeof(wifi_sta_config_stru), &wifiConfig, sizeof(wifi_sta_config_stru)) != EOK) {
229 HILINK_SAL_ERROR("memcpy error\r\n");
230 return HILINK_SAL_MEMCPY_ERR;
231 }
232 return HILINK_SAL_OK;
233 }
234
HILINK_GetWiFiSsid(char * ssid,unsigned int * ssidLen)235 int HILINK_GetWiFiSsid(char *ssid, unsigned int *ssidLen)
236 {
237 if ((ssid == NULL) || (ssidLen == NULL) || (*ssidLen == 0)) {
238 HILINK_SAL_WARN("invalid param\r\n");
239 return HILINK_SAL_PARAM_INVALID;
240 }
241
242 wifi_sta_config_stru result;
243 (void)memset_s(&result, sizeof(result), 0, sizeof(result));
244 /* 避免循环调用导致的打印刷屏 */
245 static bool isPrint = false;
246
247 int ret = GetWifiConfigFromOhos(&result);
248 if ((ret != HILINK_SAL_OK) || (result.ssid[0] == '\0') || (HILINK_Strlen((char *)result.ssid) >=
249 sizeof(result.ssid))) {
250 if (!isPrint) {
251 HILINK_SAL_NOTICE("get wifi ssid fail\r\n");
252 isPrint = true;
253 }
254 /* 初次配网获取不到ssid */
255 return HILINK_SAL_OK;
256 }
257 isPrint = false;
258 if (strcpy_s(ssid, WIFI_MAX_SSID_LEN, (char *)result.ssid) != EOK) {
259 HILINK_SAL_ERROR("strcpy error\r\n");
260 return HILINK_SAL_STRCPY_ERR;
261 }
262 *ssidLen = HILINK_Strlen(ssid);
263
264 return HILINK_SAL_OK;
265 }
266
HILINK_SetWiFiInfo(const char * ssid,unsigned int ssidLen,const char * pwd,unsigned int pwdLen)267 int HILINK_SetWiFiInfo(const char *ssid, unsigned int ssidLen, const char *pwd, unsigned int pwdLen)
268 {
269 wifi_sta_config_stru config;
270 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
271
272 /* 删除旧wifi配置 */
273 if (RemoveDevice() != HILINK_SAL_OK) {
274 HILINK_SAL_ERROR("remove config error\r\n");
275 return HILINK_SAL_REMOVE_WIFI_ERR;
276 }
277
278 if ((ssidLen != 0) && (ssid != NULL)) {
279 if (memcpy_s(config.ssid, sizeof(config.ssid), ssid, ssidLen) != EOK) {
280 HILINK_SAL_ERROR("memcpy error\r\n");
281 return HILINK_SAL_MEMCPY_ERR;
282 }
283 } else {
284 HILINK_SAL_NOTICE("clear wifi info\r\n");
285 return HILINK_SAL_OK;
286 }
287
288 if ((pwdLen != 0) && (pwd != NULL)) {
289 if (memcpy_s(config.pre_shared_key, sizeof(config.pre_shared_key), pwd, pwdLen) != EOK) {
290 HILINK_SAL_ERROR("memcpy error\r\n");
291 return HILINK_SAL_MEMCPY_ERR;
292 }
293 config.security_type = WIFI_SEC_TYPE_WPA2_WPA_PSK_MIX;
294 } else {
295 config.security_type = WIFI_SEC_TYPE_OPEN;
296 }
297
298 int ret = AddDeviceConfig(&config);
299 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
300 if (ret != HILINK_SAL_OK) {
301 HILINK_SAL_ERROR("add device config error %d\r\n", ret);
302 return HILINK_SAL_SET_WIFI_ERR;
303 }
304
305 return HILINK_SAL_OK;
306 }
307
HILINK_ReconnectWiFi(void)308 void HILINK_ReconnectWiFi(void)
309 {
310 if (wifi_sta_disconnect() != ERRCODE_SUCC) {
311 HILINK_SAL_ERROR("disconnect wifi error\r\n");
312 return;
313 }
314 if (HILINK_ConnectWiFi() != HILINK_SAL_OK) {
315 HILINK_SAL_ERROR("connect wifi fail\r\n");
316 return;
317 }
318 }
319
OnWifiScanStateChangedCallback(int state,int size)320 static void OnWifiScanStateChangedCallback(int state, int size)
321 {
322 (void)size;
323 if (state == WIFI_STATE_AVALIABLE) {
324 g_isStaScanSuccess = true;
325 }
326 }
327
OnWifiConnectionChangedCallback(int state,const wifi_linked_info_stru * info,int reason_code)328 static void OnWifiConnectionChangedCallback(int state, const wifi_linked_info_stru *info, int reason_code)
329 {
330 (void)state;
331 (void)info;
332
333 /* 0x8002,0x800e,0x800f: 密码错误场景对端返回的错误码 */
334 if ((reason_code == 0x8002) || (reason_code == 0x800e) || (reason_code == 0x800f)) {
335 g_disconnectReason = 15; /* 15: 密码错误场景统一上报错误码 15 */
336 } else {
337 g_disconnectReason = reason_code;
338 }
339 HILINK_SAL_NOTICE("state: %d, disconnectedReason %u\r\n", state, g_disconnectReason);
340 g_isReasonRefresh = true;
341 }
342
OnHotspotStaJoinCallback(const wifi_sta_info_stru * info)343 static void OnHotspotStaJoinCallback(const wifi_sta_info_stru *info)
344 {
345 (void)info;
346 HILINK_SAL_NOTICE("OnHotspotStaJoinCallback...\r\n");
347 }
348
OnHotspotStaLeaveCallback(const wifi_sta_info_stru * info)349 static void OnHotspotStaLeaveCallback(const wifi_sta_info_stru *info)
350 {
351 (void)info;
352 HILINK_SAL_NOTICE("OnHotspotStaLeaveCallback...\r\n");
353 }
354
OnHotspotStateChangedCallback(int state)355 static void OnHotspotStateChangedCallback(int state)
356 {
357 (void)state;
358 HILINK_SAL_NOTICE("OnHotspotStateChangedCallback, state[%d]\r\n", state);
359 }
360
RegisterWifiEventToOhos(void)361 static int RegisterWifiEventToOhos(void)
362 {
363 if (g_isRegisterWifiEvent) {
364 HILINK_SAL_NOTICE("wifievent has been registered.\r\n");
365 return HILINK_SAL_OK;
366 }
367
368 g_eventHandler.wifi_event_scan_state_changed = OnWifiScanStateChangedCallback;
369 g_eventHandler.wifi_event_connection_changed = OnWifiConnectionChangedCallback;
370 g_eventHandler.wifi_event_softap_sta_join = OnHotspotStaJoinCallback;
371 g_eventHandler.wifi_event_softap_sta_leave = OnHotspotStaLeaveCallback;
372 g_eventHandler.wifi_event_softap_state_changed = OnHotspotStateChangedCallback;
373
374 if (wifi_register_event_cb(&g_eventHandler) != ERRCODE_SUCC) {
375 HILINK_SAL_ERROR("Register wifi event fail.\r\n");
376 return HILINK_SAL_SET_WIFI_ERR;
377 }
378 g_isRegisterWifiEvent = true;
379 return HILINK_SAL_OK;
380 }
381
AdvanceScanWifiByOhos(const wifi_sta_config_stru * config)382 static int AdvanceScanWifiByOhos(const wifi_sta_config_stru *config)
383 {
384 int scanTimeout = DEF_SCAN_TIMEOUT;
385 g_isStaScanSuccess = false;
386
387 wifi_scan_params_stru scanParams;
388 (void)memset_s(&scanParams, sizeof(scanParams), 0, sizeof(scanParams));
389
390 if (memcpy_s(scanParams.ssid, sizeof(scanParams.ssid), config->ssid,
391 HILINK_Strlen((char *)config->ssid)) != EOK) {
392 HILINK_SAL_ERROR("memcpy error\r\n");
393 return HILINK_SAL_MEMCPY_ERR;
394 }
395 scanParams.scan_type = WIFI_SSID_SCAN;
396 scanParams.ssid_len = (char)HILINK_Strlen((char *)config->ssid);
397
398 if (wifi_sta_scan_advance(&scanParams) != ERRCODE_SUCC) {
399 HILINK_SAL_ERROR("wifi advance scan fail\r\n");
400 return HILINK_SAL_SCAN_WIFI_ERR;
401 }
402
403 while (scanTimeout > 0) {
404 HILINK_MilliSleep(MS_PER_SECOND);
405 scanTimeout--;
406 if (g_isStaScanSuccess == true) {
407 break;
408 }
409 }
410 if (scanTimeout == 0) {
411 HILINK_SAL_ERROR("wifi advance scan timeout\r\n");
412 return HILINK_SAL_SCAN_WIFI_ERR;
413 }
414 return HILINK_SAL_OK;
415 }
416
GetScanWifiResultFromOhos(const wifi_sta_config_stru * config,wifi_scan_info_stru * info)417 static bool GetScanWifiResultFromOhos(const wifi_sta_config_stru *config, wifi_scan_info_stru *info)
418 {
419 bool ret = false;
420 unsigned int size = WIFI_SCAN_AP_LIMIT;
421 wifi_scan_info_stru *result = (wifi_scan_info_stru *)HILINK_Malloc(sizeof(wifi_scan_info_stru) * size);
422 if (result == NULL) {
423 HILINK_SAL_ERROR("malloc error\r\n");
424 return false;
425 }
426 (void)memset_s(result, sizeof(wifi_scan_info_stru) * size, 0, sizeof(wifi_scan_info_stru) * size);
427
428 if (wifi_sta_get_scan_info(result, &size) != ERRCODE_SUCC) {
429 HILINK_SAL_ERROR("Get wifi scan info fail.\r\n");
430 HILINK_Free(result);
431 return false;
432 }
433
434 if ((size == 0) || (size > WIFI_SCAN_AP_LIMIT)) {
435 HILINK_SAL_WARN("can not scan any wifi or scan size over limit, size:%u\r\n", size);
436 } else {
437 for (unsigned int i = 0; i < size; ++i) {
438 /* 匹配目标wifi:ssid完全匹配,且WiFi加密类型应同时open或者同时不为open */
439 if ((HILINK_Strcmp((char *)result[i].ssid, (char *)config->ssid) == 0) &&
440 ((config->security_type != WIFI_SEC_TYPE_OPEN && result[i].security_type != WIFI_SEC_TYPE_OPEN) ||
441 (config->security_type == WIFI_SEC_TYPE_OPEN && result[i].security_type == WIFI_SEC_TYPE_OPEN))) {
442 HILINK_SAL_NOTICE("find target ssid success\r\n");
443 if (memcpy_s(info, sizeof(wifi_scan_info_stru), &result[i], sizeof(wifi_scan_info_stru)) != 0) {
444 HILINK_SAL_ERROR("memcpy error\r\n");
445 break;
446 }
447 ret = true;
448 break;
449 }
450 }
451 }
452
453 HILINK_Free(result);
454 return ret;
455 }
456
SetSecurityTypeByScanInfo(wifi_sta_config_stru * config,const wifi_scan_info_stru * info)457 static void SetSecurityTypeByScanInfo(wifi_sta_config_stru *config, const wifi_scan_info_stru *info)
458 {
459 wifi_sta_config_stru tempConfig;
460 (void)memset_s(&tempConfig, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
461 if (memcpy_s(&tempConfig, sizeof(wifi_sta_config_stru), config, sizeof(wifi_sta_config_stru)) != EOK) {
462 HILINK_SAL_ERROR("memcpy_s error\r\n");
463 return;
464 }
465
466 if (memset_s(config->bssid, sizeof(config->bssid), 0, sizeof(config->bssid)) != EOK) {
467 HILINK_SAL_ERROR("memset_s error\r\n");
468 }
469
470 if (info->security_type == WIFI_SEC_TYPE_INVALID) {
471 /* 扫描出的加密方式非法时根据有无密码使用默认的PSK或OPEN加密方式 */
472 config->security_type = (config->pre_shared_key[0] == '\0') ? WIFI_SEC_TYPE_OPEN :
473 WIFI_SEC_TYPE_WPA2_WPA_PSK_MIX;
474 } else {
475 config->security_type = info->security_type;
476 }
477
478 if (config->security_type == WIFI_SEC_TYPE_WEP) {
479 unsigned char pwdLen = HILINK_Strlen((char *)config->pre_shared_key);
480 /* 设置密码,海思要求WEP的5和13位ASCII密码需要用双引号包起来,对应长度需要-2处理 */
481 if ((pwdLen == 5) || (pwdLen == 13)) {
482 char tmpSharedKey[WIFI_MAX_KEY_LEN] = {0};
483 tmpSharedKey[0] = '\"';
484 if (memcpy_s(tmpSharedKey + 1, sizeof(tmpSharedKey) - 2, config->pre_shared_key, pwdLen) != EOK) {
485 (void)memset_s(&tempConfig, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
486 return;
487 }
488 tmpSharedKey[pwdLen + 1] = '\"';
489 if (memcpy_s(config->pre_shared_key, sizeof(config->pre_shared_key), tmpSharedKey,
490 WIFI_MAX_KEY_LEN) != EOK) {
491 (void)memset_s(&tempConfig, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
492 (void)memset_s(tmpSharedKey, sizeof(tmpSharedKey), 0, sizeof(tmpSharedKey));
493 return;
494 }
495 (void)memset_s(tmpSharedKey, sizeof(tmpSharedKey), 0, sizeof(tmpSharedKey));
496 }
497 }
498
499 /* wifi配置与扫描后的结果对比,如果不同,需要刷新wifi配置 */
500 if (HILINK_Memcmp(config, &tempConfig, sizeof(wifi_sta_config_stru)) != 0) {
501 if (RemoveDevice() != HILINK_SAL_OK) {
502 HILINK_SAL_ERROR("remove config error\r\n");
503 (void)memset_s(&tempConfig, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
504 return;
505 }
506 if (AddDeviceConfig(config) != HILINK_SAL_OK) {
507 HILINK_SAL_ERROR("add config fail\r\n");
508 (void)memset_s(&tempConfig, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
509 return;
510 }
511 }
512
513 (void)memset_s(&tempConfig, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
514 return;
515 }
516
HILINK_RestartWiFi(void)517 int HILINK_RestartWiFi(void)
518 {
519 int ret;
520 if (wifi_is_sta_enabled() == 1) {
521 ret = wifi_sta_disable();
522 if (ret != ERRCODE_SUCC) {
523 HILINK_SAL_ERROR("disable wifi error, ret = %d\r\n", ret);
524 return HILINK_SAL_NOK;
525 }
526 }
527
528 ret = wifi_sta_enable();
529 if (ret != ERRCODE_SUCC) {
530 HILINK_SAL_ERROR("disable wifi error, ret = %d\r\n", ret);
531 return HILINK_SAL_NOK;
532 }
533
534 return HILINK_SAL_OK;
535 }
536
AddBssidToWifiConfig(int securityType,const unsigned char * bssid,unsigned int len)537 static int AddBssidToWifiConfig(int securityType, const unsigned char *bssid, unsigned int len)
538 {
539 /* 读取当前WiFi配置 */
540 wifi_sta_config_stru config;
541 (void)memset_s(&config, sizeof(config), 0, sizeof(config));
542 if ((GetWifiConfigFromOhos(&config) != HILINK_SAL_OK) || (config.ssid[0] == '\0')) {
543 HILINK_SAL_ERROR("get wifi config fail\r\n");
544 (void)memset_s(&config, sizeof(config), 0, sizeof(config));
545 return HILINK_SAL_GET_WIFI_INFO_ERR;
546 }
547
548 /* 拷贝bssid */
549 if (memcpy_s(config.bssid, sizeof(config.bssid), bssid, len) != EOK) {
550 HILINK_SAL_ERROR("memcpy bssid failed\r\n");
551 (void)memset_s(&config, sizeof(config), 0, sizeof(config));
552 return HILINK_SAL_MEMCPY_ERR;
553 }
554
555 /* harmonyos中,-1表示无效加密类型,仅更新有效加密类型 */
556 if (securityType != -1) {
557 config.security_type = securityType;
558 }
559
560 /* 更新WiFi配置 */
561 if (RemoveDevice() != HILINK_SAL_OK) {
562 HILINK_SAL_ERROR("remove config error\r\n");
563 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
564 return HILINK_SAL_REMOVE_WIFI_ERR;
565 }
566 if (AddDeviceConfig(&config) != HILINK_SAL_OK) {
567 HILINK_SAL_ERROR("add config fail\r\n");
568 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
569 return HILINK_SAL_ADD_WIFI_ERR;
570 }
571 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
572 return HILINK_SAL_OK;
573 }
574
RemoveBssidFromWifiConfig(void)575 static int RemoveBssidFromWifiConfig(void)
576 {
577 /* 读取当前WiFi配置 */
578 wifi_sta_config_stru config;
579 (void)memset_s(&config, sizeof(config), 0, sizeof(config));
580 if ((GetWifiConfigFromOhos(&config) != HILINK_SAL_OK) || (config.ssid[0] == '\0')) {
581 HILINK_SAL_ERROR("get wifi config fail\r\n");
582 (void)memset_s(&config, sizeof(config), 0, sizeof(config));
583 return HILINK_SAL_GET_WIFI_INFO_ERR;
584 }
585
586 /* 清除bssid */
587 if (memset_s(config.bssid, sizeof(config.bssid), 0, sizeof(config.bssid)) != EOK) {
588 HILINK_SAL_ERROR("memcpy bssid failed\r\n");
589 (void)memset_s(&config, sizeof(config), 0, sizeof(config));
590 return HILINK_SAL_MEMSET_ERR;
591 }
592
593 /* 更新WiFi配置 */
594 if (RemoveDevice() != HILINK_SAL_OK) {
595 HILINK_SAL_ERROR("remove config error\r\n");
596 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
597 return HILINK_SAL_REMOVE_WIFI_ERR;
598 }
599
600 if (AddDeviceConfig(&config) != HILINK_SAL_OK) {
601 HILINK_SAL_ERROR("add config fail\r\n");
602 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
603 return HILINK_SAL_ADD_WIFI_ERR;
604 }
605 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
606 return HILINK_SAL_OK;
607 }
608
HILINK_ConnectWiFiByBssid(int securityType,const unsigned char * bssid,unsigned int len)609 int HILINK_ConnectWiFiByBssid(int securityType, const unsigned char *bssid, unsigned int len)
610 {
611 if ((bssid == NULL) || (len == 0)) {
612 HILINK_SAL_ERROR("invalid param\r\n");
613 return HILINK_SAL_PARAM_INVALID;
614 }
615 /* 初始化WiFi */
616 if (wifi_is_sta_enabled() != 1) {
617 if (wifi_sta_enable() != ERRCODE_SUCC) {
618 HILINK_SAL_ERROR("enable wifi fail\r\n");
619 return HILINK_SAL_SET_WIFI_ERR;
620 }
621 }
622
623 if (RegisterWifiEventToOhos() != HILINK_SAL_OK) {
624 HILINK_SAL_ERROR("register wifi event fail\r\n");
625 return HILINK_SAL_SET_WIFI_ERR;
626 }
627
628 g_isReasonRefresh = false;
629
630 if (AddBssidToWifiConfig(securityType, bssid, len) != HILINK_SAL_OK) {
631 HILINK_SAL_ERROR("add bssid to config failed\r\n");
632 return HILINK_SAL_ADD_WIFI_ERR;
633 }
634
635 int netConnect = WIFI_DISCONNECTED;
636 if (HILINK_GetNetworkState(&netConnect) != HILINK_SAL_OK) {
637 /* 网络状态获取失败,不退出继续连接 */
638 HILINK_SAL_ERROR("get network state failed\r\n");
639 }
640 if (netConnect == WIFI_CONNECTED) {
641 /* 断开当前连接并重连 */
642 if (wifi_sta_disconnect() != ERRCODE_SUCC) {
643 HILINK_SAL_ERROR("disconnect wifi error\r\n");
644 return HILINK_SAL_CONENCT_WIFI_ERR;
645 }
646 }
647
648 wifi_sta_config_stru config;
649 memset_s(&config, sizeof(config), 0, sizeof(config));
650 if (GetWifiConfigFromOhos(&config) != HILINK_SAL_OK) {
651 return HILINK_SAL_GET_WIFI_INFO_ERR;
652 }
653
654 config.ip_type = DHCP;
655 if (wifi_sta_connect(&config) != ERRCODE_SUCC) {
656 HILINK_SAL_ERROR("connect to wifi fail.\n");
657 return HILINK_SAL_CONENCT_WIFI_ERR;
658 }
659
660 if (sta_setup_dhcp() != 0) {
661 HILINK_SAL_ERROR("set sta dhcp failed\r\n");
662 return HILINK_SAL_CONENCT_WIFI_ERR;
663 }
664
665 /* 指定完BSSID连接后及时清除BSSID配置,避免下次自动重连 */
666 if (RemoveBssidFromWifiConfig() != HILINK_SAL_OK) {
667 HILINK_SAL_ERROR("remove bssid to config failed\r\n");
668 return HILINK_SAL_ADD_WIFI_ERR;
669 }
670
671 return HILINK_SAL_OK;
672 }
673
HILINK_GetLastConnectResult(int * result)674 int HILINK_GetLastConnectResult(int *result)
675 {
676 if (result == NULL) {
677 HILINK_SAL_ERROR("invalid param\r\n");
678 return HILINK_SAL_PARAM_INVALID;
679 }
680
681 if (!g_isReasonRefresh) {
682 return HILINK_SAL_NOK;
683 }
684
685 *result = g_disconnectReason;
686 g_isReasonRefresh = false;
687 return HILINK_SAL_OK;
688 }
689
BuildScanParam(const HILINK_APScanParam * param,wifi_scan_params_stru * scanParams)690 static int BuildScanParam(const HILINK_APScanParam *param, wifi_scan_params_stru *scanParams)
691 {
692 HILINK_WifiScanType scanType = param->scanType;
693 HILINK_SAL_DEBUG("scan type: %d\r\n", scanType);
694
695 switch (scanType) {
696 case WIFI_SCAN_TPYE_SSID: {
697 unsigned int ssidLen = HILINK_Strlen((char *)param->ssid);
698 if ((param->ssid[0] == '\0') || (ssidLen != param->ssidLen)) {
699 HILINK_SAL_ERROR("invalid ssid param, len: %u, strlen: %u\r\n", param->ssidLen, ssidLen);
700 return HILINK_SAL_PARAM_INVALID;
701 }
702 if (memcpy_s(scanParams->ssid, sizeof(scanParams->ssid), param->ssid, param->ssidLen) != EOK) {
703 HILINK_SAL_ERROR("memcpy error\r\n");
704 return HILINK_SAL_MEMCPY_ERR;
705 }
706 scanParams->scan_type = WIFI_SSID_SCAN;
707 scanParams->ssid_len = param->ssidLen;
708 break;
709 }
710 case WIFI_SCAN_TPYE_BSSID: {
711 if (memcpy_s(scanParams->bssid, sizeof(scanParams->bssid), param->bssid, sizeof(param->ssid)) != EOK) {
712 HILINK_SAL_ERROR("memcpy error\r\n");
713 return HILINK_SAL_MEMCPY_ERR;
714 }
715 scanParams->scan_type = WIFI_BSSID_SCAN;
716 break;
717 }
718 case WIFI_SCAN_TPYE_FREQ: {
719 scanParams->scan_type = WIFI_CHANNEL_SCAN;
720 break;
721 }
722 default:
723 HILINK_SAL_ERROR("not support scan type, type: %d\r\n", scanType);
724 return HILINK_SAL_PARAM_INVALID;
725 }
726
727 return HILINK_SAL_OK;
728 }
729
HILINK_ScanAP(const HILINK_APScanParam * param)730 int HILINK_ScanAP(const HILINK_APScanParam *param)
731 {
732 if (param == NULL) {
733 HILINK_SAL_ERROR("scan param invalid\r\n");
734 return HILINK_SAL_PARAM_INVALID;
735 }
736
737 /* 激活WiFi */
738 if (wifi_is_sta_enabled() != 1) {
739 if (wifi_sta_enable() != ERRCODE_SUCC) {
740 HILINK_SAL_ERROR("enable wifi fail\r\n");
741 return HILINK_SAL_SET_WIFI_ERR;
742 }
743 }
744 if ((get_wifi_recovery_type() != 0) && (g_offline_mode_scan_flag == 0)) {
745 wifi_scan_strategy_stru scan_strategy;
746 scan_strategy.scan_time = 105; /* 105: 单信道扫描停留时间105ms */
747 scan_strategy.scan_cnt = 2; /* 2: 每个信道扫描2次 */
748 scan_strategy.single_probe_send_times = 1; /* 1: 单信道扫描每次发送一个probe request */
749 scan_strategy.reserved = 0;
750 if (wifi_sta_set_scan_policy(IFTYPE_STA, &scan_strategy) != ERRCODE_SUCC) {
751 HILINK_SAL_ERROR("sta_set_scan_policy failed\r\n");
752 }
753 g_offline_mode_scan_flag = 1; /* 1: 已完成离线优化模式扫描策略设置 */
754 }
755
756 if (RegisterWifiEventToOhos() != HILINK_SAL_OK) {
757 HILINK_SAL_ERROR("register wifi event fail\r\n");
758 return HILINK_SAL_SET_WIFI_ERR;
759 }
760
761 /* 指定WiFi的ssid进行扫描 */
762 g_isStaScanSuccess = false;
763
764 /* 组装扫描参数,填充SSID */
765 wifi_scan_params_stru scanParams;
766 (void)memset_s(&scanParams, sizeof(scanParams), 0, sizeof(scanParams));
767 int ret = BuildScanParam(param, &scanParams);
768 if (ret != HILINK_SAL_OK) {
769 HILINK_SAL_ERROR("build scan param failed\r\n");
770 return ret;
771 }
772 if (wifi_sta_scan_advance(&scanParams) != ERRCODE_SUCC) {
773 HILINK_SAL_ERROR("wifi advance scan fail\r\n");
774 return HILINK_SAL_SCAN_WIFI_ERR;
775 }
776 (void)memset_s(&scanParams, sizeof(scanParams), 0, sizeof(scanParams));
777
778 return HILINK_SAL_OK;
779 }
780
GetScanWifiResultList(wifi_scan_info_stru ** list,unsigned int * listSize)781 static int GetScanWifiResultList(wifi_scan_info_stru **list, unsigned int *listSize)
782 {
783 unsigned int size = WIFI_SCAN_AP_LIMIT;
784 wifi_scan_info_stru *result = (wifi_scan_info_stru *)HILINK_Malloc(sizeof(wifi_scan_info_stru) * size);
785 if (result == NULL) {
786 HILINK_SAL_ERROR("malloc error\r\n");
787 return HILINK_SAL_MALLOC_ERR;
788 }
789 (void)memset_s(result, sizeof(wifi_scan_info_stru) * size, 0, sizeof(wifi_scan_info_stru) * size);
790
791 if (wifi_sta_get_scan_info(result, &size) != ERRCODE_SUCC) {
792 HILINK_SAL_ERROR("Get wifi scan info fail.\r\n");
793 HILINK_Free(result);
794 return HILINK_SAL_SCAN_WIFI_ERR;
795 }
796 *list = result;
797 *listSize = size;
798 return HILINK_SAL_OK;
799 }
800
CopyScanWifiResultList(HILINK_APList * scanList,wifi_scan_info_stru * result,unsigned int resSize)801 static int CopyScanWifiResultList(HILINK_APList *scanList, wifi_scan_info_stru *result, unsigned int resSize)
802 {
803 HILINK_APInfo *info = (HILINK_APInfo *)HILINK_Malloc(sizeof(HILINK_APInfo) * resSize);
804 if (info == NULL) {
805 HILINK_SAL_ERROR("malloc error\r\n");
806 return HILINK_SAL_MALLOC_ERR;
807 }
808 (void)memset_s(info, sizeof(HILINK_APInfo) * resSize, 0, sizeof(HILINK_APInfo) * resSize);
809 for (unsigned int i = 0; i < resSize; i++) {
810 if ((strcpy_s(info[i].ssid, sizeof(info[i].ssid), result[i].ssid) != EOK) ||
811 (memcpy_s(info[i].bssid, sizeof(info[i].bssid), result[i].bssid, sizeof(result[i].bssid)) != EOK)) {
812 HILINK_Free(info);
813 return HILINK_SAL_MEMCPY_ERR;
814 }
815 info[i].rssi = result[i].rssi;
816 info[i].band = result[i].band;
817 info[i].securityType = result[i].security_type;
818 info[i].frequency = result[i].channel_num;
819 }
820 scanList->apList = info;
821 scanList->num = resSize;
822 return HILINK_SAL_OK;
823 }
824
HILINK_GetAPScanResult(HILINK_APList * scanList)825 int HILINK_GetAPScanResult(HILINK_APList *scanList)
826 {
827 if (scanList == NULL) {
828 HILINK_SAL_ERROR("invalid params\r\n");
829 return HILINK_SAL_PARAM_INVALID;
830 }
831
832 if (!g_isStaScanSuccess) {
833 HILINK_SAL_NOTICE("AP scanning is not complete.\r\n");
834 return WIFI_SCANNING;
835 }
836
837 unsigned int size = 0;
838 wifi_scan_info_stru *scanInfo = NULL;
839 int ret = GetScanWifiResultList(&scanInfo, &size);
840 if (ret != HILINK_SAL_OK) {
841 HILINK_SAL_ERROR("get scan wifi list failed, ret = %d.\r\n", ret);
842 return ret;
843 }
844
845 HILINK_SAL_NOTICE("scan result size: %u\r\n", size);
846 if (size == 0) {
847 HILINK_Free(scanInfo);
848 scanList->apList = NULL;
849 scanList->num = 0;
850 return HILINK_SAL_OK;
851 }
852
853 ret = CopyScanWifiResultList(scanList, scanInfo, size);
854 if (ret != HILINK_SAL_OK) {
855 HILINK_SAL_ERROR("copy wifi list failed, ret = %d.\r\n", ret);
856 (void)memset_s(scanInfo, size * sizeof(wifi_scan_info_stru), 0, size * sizeof(wifi_scan_info_stru));
857 HILINK_Free(scanInfo);
858 scanInfo = NULL;
859 return ret;
860 }
861
862 (void)memset_s(scanInfo, size * sizeof(wifi_scan_info_stru), 0, size * sizeof(wifi_scan_info_stru));
863 HILINK_Free(scanInfo);
864 scanInfo = NULL;
865
866 return HILINK_SAL_OK;
867 }
868
HILINK_ConnectWiFi(void)869 int HILINK_ConnectWiFi(void)
870 {
871 int ret;
872 wifi_sta_config_stru config;
873 (void)memset_s(&config, sizeof(config), 0, sizeof(config));
874 wifi_scan_info_stru info;
875 (void)memset_s(&info, sizeof(info), 0, sizeof(info));
876
877 if (wifi_is_sta_enabled() != 1) {
878 if (wifi_sta_enable() != ERRCODE_SUCC) {
879 HILINK_SAL_ERROR("enable wifi fail\r\n");
880 return HILINK_SAL_SET_WIFI_ERR;
881 }
882 }
883
884 if (RegisterWifiEventToOhos() != HILINK_SAL_OK) {
885 HILINK_SAL_ERROR("register wifi event fail\r\n");
886 return HILINK_SAL_SET_WIFI_ERR;
887 }
888
889 if (GetWifiConfigFromOhos(&config) != HILINK_SAL_OK) {
890 HILINK_SAL_ERROR("get wifi config fail\r\n");
891 return HILINK_SAL_GET_WIFI_INFO_ERR;
892 }
893
894 if (config.ssid[0] == '\0') {
895 HILINK_SAL_ERROR("ssid null\r\n");
896 return HILINK_SAL_GET_WIFI_INFO_ERR;
897 }
898
899 for (unsigned int i = 0; i < MAX_SCAN_TIMES; ++i) {
900 if (AdvanceScanWifiByOhos(&config) != HILINK_SAL_OK) {
901 HILINK_SAL_ERROR("advance scan wifi fail\r\n");
902 (void)memset_s(&config, sizeof(wifi_sta_config_stru), 0, sizeof(wifi_sta_config_stru));
903 return HILINK_SAL_SCAN_WIFI_ERR;
904 }
905 if (GetScanWifiResultFromOhos(&config, &info)) {
906 SetSecurityTypeByScanInfo(&config, &info);
907 break;
908 }
909 HILINK_SAL_NOTICE("not find target wifi, try again\r\n");
910 }
911
912 /* 1 5 10 5 :非离线优化模式使能自动重连,单次重连超时时间 5秒,重连间隔10秒 ,最大重连次数3600次 */
913 if (wifi_sta_set_reconnect_policy(1, 5, 10, 3600) != ERRCODE_SUCC) {
914 HILINK_SAL_ERROR("set reconnect policy error.\r\n");
915 }
916
917 config.ip_type = DHCP;
918 if (wifi_sta_connect(&config) != ERRCODE_SUCC) {
919 HILINK_SAL_ERROR("connect to wifi fail.\n");
920 return HILINK_SAL_CONENCT_WIFI_ERR;
921 }
922
923 if (sta_setup_dhcp() != 0) {
924 HILINK_SAL_ERROR("set sta dhcp failed\r\n");
925 return HILINK_SAL_CONENCT_WIFI_ERR;
926 }
927 return HILINK_SAL_OK;
928 }
929
HILINK_GetNetworkState(int * state)930 int HILINK_GetNetworkState(int *state)
931 {
932 if (state == NULL) {
933 HILINK_SAL_WARN("invalid param\r\n");
934 return HILINK_SAL_PARAM_INVALID;
935 }
936
937 wifi_linked_info_stru info;
938 (void)memset_s(&info, sizeof(info), 0, sizeof(info));
939 /* 获取不到linkinfo时认为网络未连接 */
940 if (wifi_sta_get_ap_info(&info) != ERRCODE_SUCC) {
941 info.conn_state = WIFI_DISCONNECTED;
942 }
943
944 *state = (info.conn_state == WIFI_CONNECTED) ? 1 : 0;
945 return HILINK_SAL_OK;
946 }
947
HILINK_GetWiFiBssid(unsigned char * bssid,unsigned char * bssidLen)948 int HILINK_GetWiFiBssid(unsigned char *bssid, unsigned char *bssidLen)
949 {
950 if ((bssid == NULL) || (bssidLen == NULL) || (*bssidLen == 0)) {
951 HILINK_SAL_WARN("invalid param\r\n");
952 return HILINK_SAL_PARAM_INVALID;
953 }
954
955 wifi_linked_info_stru info;
956 (void)memset_s(&info, sizeof(wifi_linked_info_stru), 0, sizeof(wifi_linked_info_stru));
957
958 if (wifi_sta_get_ap_info(&info) != ERRCODE_SUCC) {
959 HILINK_SAL_ERROR("get wifi linked info fail\r\n");
960 return HILINK_SAL_GET_WIFI_INFO_ERR;
961 }
962
963 if (memcpy_s(bssid, *bssidLen, info.bssid, sizeof(info.bssid)) != EOK) {
964 HILINK_SAL_ERROR("memcpy error\r\n");
965 return HILINK_SAL_MEMCPY_ERR;
966 }
967
968 *bssidLen = WIFI_MAC_LEN;
969 return HILINK_SAL_OK;
970 }
971
HILINK_GetWiFiRssi(signed char * rssi)972 int HILINK_GetWiFiRssi(signed char *rssi)
973 {
974 if (rssi == NULL) {
975 HILINK_SAL_WARN("invalid param\r\n");
976 return HILINK_SAL_PARAM_INVALID;
977 }
978
979 wifi_linked_info_stru info;
980 (void)memset_s(&info, sizeof(wifi_linked_info_stru), 0, sizeof(wifi_linked_info_stru));
981 if (wifi_sta_get_ap_info(&info) != ERRCODE_SUCC) {
982 HILINK_SAL_ERROR("get wifi linked info fail\r\n");
983 return HILINK_SAL_GET_WIFI_INFO_ERR;
984 }
985
986 *rssi = (signed char)info.rssi;
987 return HILINK_SAL_OK;
988 }