• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 FuZhou Lockzhiner Electronic Co., Ltd. All rights reserved.
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  */
15 
16 #include <securec.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 
20 #include "lwip/if_api.h"
21 #include "lwip/netifapi.h"
22 #include "wifi_device_util.h"
23 #include "wifi_hotspot_config.h"
24 #include "utils_file.h"
25 
26 #include "lz_hardware.h"
27 #include "wifi_device.h"
28 
29 #define WIFI_DEVICE_TAG "WIFI_DEVICE"
30 
31 static WifiDeviceConfig g_wifiConfigs[WIFI_MAX_CONFIG_SIZE] = {
32     {0}, {0}, {0}, 0, WIFI_CONFIG_INVALID, 0, 0, UNKNOWN, {0, 0, {0, 0}, 0}
33 };
34 static int g_networkId = -1;
35 static int g_staStatus = WIFI_STA_NOT_ACTIVE;
36 static int g_scan_flag = 0;
37 static WifiEvent *g_event = NULL;
38 
EnableWifi(void)39 WifiErrorCode EnableWifi(void)
40 {
41     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
42         return ERROR_WIFI_UNKNOWN;
43     }
44 
45     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
46         return ERROR_WIFI_UNKNOWN;
47     }
48 
49     if (g_staStatus == WIFI_STA_ACTIVE) {
50         return ERROR_WIFI_BUSY;
51     }
52 
53     if (WifiEnable() != WIFI_SUCCESS) {
54         return ERROR_WIFI_UNKNOWN;
55     }
56 
57     if (WifiStartStation() != WIFI_SUCCESS) {
58         return ERROR_WIFI_UNKNOWN;
59     }
60 
61     g_staStatus = WIFI_STA_ACTIVE;
62     return WIFI_SUCCESS;
63 }
64 
DisableWifi(void)65 WifiErrorCode DisableWifi(void)
66 {
67     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
68         return ERROR_WIFI_UNKNOWN;
69     }
70 
71     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
72         return ERROR_WIFI_UNKNOWN;
73     }
74 
75     if (g_staStatus == WIFI_STA_NOT_ACTIVE) {
76         return ERROR_WIFI_NOT_STARTED;
77     }
78 
79     if (WifiDisable() != WIFI_SUCCESS) {
80         return ERROR_WIFI_UNKNOWN;
81     }
82 
83     g_staStatus = WIFI_STA_NOT_ACTIVE;
84     return WIFI_SUCCESS;
85 }
86 
IsWifiActive(void)87 int IsWifiActive(void)
88 {
89     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
90         return ERROR_WIFI_UNKNOWN;
91     }
92     int ret = g_staStatus;
93     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
94         return ERROR_WIFI_UNKNOWN;
95     }
96 
97     return ret;
98 }
99 
Scan(void)100 WifiErrorCode Scan(void)
101 {
102     /* 定义扫描等待时长,以秒为单位 */
103     unsigned int sleep_seconds = 5;
104 
105     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
106         return ERROR_WIFI_UNKNOWN;
107     }
108 
109     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
110         return ERROR_WIFI_UNKNOWN;
111     }
112 
113     if (WifiStartScan() != WIFI_SUCCESS) {
114         return ERROR_WIFI_UNKNOWN;
115     }
116     g_scan_flag = 1;
117     sleep(sleep_seconds);
118     if (g_event) {
119         g_event->OnWifiScanStateChanged(1, 0);
120     }
121     return WIFI_SUCCESS;
122 }
123 
AdvanceScan(WifiScanParams * params)124 WifiErrorCode AdvanceScan(WifiScanParams *params)
125 {
126     unsigned int sleep_sec = 5;
127 
128     if (params == NULL) {
129         return ERROR_WIFI_UNKNOWN;
130     }
131 
132     if (params->scanType == WIFI_BSSID_SCAN) {
133         if (params->bssid[0] == 0) {
134             return ERROR_WIFI_UNKNOWN;
135         }
136     }
137 
138     if (params->scanType == WIFI_SSID_SCAN) {
139         if (params->ssidLen == 0) {
140             return ERROR_WIFI_UNKNOWN;
141         }
142     }
143 
144     if (params->scanType == WIFI_FREQ_SCAN) {
145         if (params->freqs == 0) {
146             return ERROR_WIFI_UNKNOWN;
147         }
148     }
149 
150     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
151         return ERROR_WIFI_UNKNOWN;
152     }
153 
154     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
155         return ERROR_WIFI_UNKNOWN;
156     }
157 
158     if (LockWifiEventLock() != WIFI_SUCCESS) {
159         return ERROR_WIFI_UNKNOWN;
160     }
161     if (UnlockWifiEventLock() != WIFI_SUCCESS) {
162         return ERROR_WIFI_UNKNOWN;
163     }
164 
165     if (WifiStartScan() != WIFI_SUCCESS) {
166         return ERROR_WIFI_UNKNOWN;
167     }
168     g_scan_flag = 1;
169     sleep(sleep_sec);
170     if (g_event) {
171         g_event->OnWifiScanStateChanged(1, 0);
172     }
173 
174     return WIFI_SUCCESS;
175 }
176 
GetScanInfoList(WifiScanInfo * result,unsigned int * size)177 WifiErrorCode GetScanInfoList(WifiScanInfo* result, unsigned int* size)
178 {
179     WifiScanResult *scanResult;
180     unsigned int scanSize;
181 
182     if (result == NULL || size == NULL || *size == 0) {
183         return ERROR_WIFI_INVALID_ARGS;
184     }
185 
186     if (WifiGetScanResult(&scanResult, &scanSize) != WIFI_SUCCESS) {
187         if (g_scan_flag == 0) {
188             *size = 0;
189             return WIFI_SUCCESS;
190         }
191 
192         return ERROR_WIFI_UNKNOWN;
193     }
194 
195     if (g_scan_flag) {
196         g_scan_flag = 0;
197     }
198 
199     for (int i = 0; i < scanSize; i++) {
200         memcpy_s(result[i].ssid, WIFI_MAX_SSID_LEN, scanResult[i].ssid, WIFI_MAX_SSID_LEN);
201         memcpy_s(result[i].bssid, WIFI_MAC_LEN, scanResult[i].bssid, WIFI_MAC_LEN);
202         result[i].securityType = scanResult[i].securityType;
203         result[i].rssi = scanResult[i].rssi;
204         result[i].band = scanResult[i].band;
205         result[i].frequency = scanResult[i].frequency;
206     }
207 
208     *size = scanSize;
209     return WIFI_SUCCESS;
210 }
211 
AddDeviceConfig(const WifiDeviceConfig * config,int * result)212 WifiErrorCode AddDeviceConfig(const WifiDeviceConfig* config, int* result)
213 {
214     if (config == NULL || result == NULL) {
215         return ERROR_WIFI_INVALID_ARGS;
216     }
217 
218     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
219         return ERROR_WIFI_UNKNOWN;
220     }
221 
222     int netId = WIFI_CONFIG_INVALID;
223     for (int i = 0; i < WIFI_MAX_CONFIG_SIZE; i++) {
224         if (g_wifiConfigs[i].netId != i) {
225             netId = i;
226             break;
227         }
228     }
229 
230     if (netId == WIFI_CONFIG_INVALID) {
231         LZ_HARDWARE_LOGD(WIFI_DEVICE_TAG, "AddDeviceConfig: wifi config is full, delete one first");
232         if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
233             return ERROR_WIFI_UNKNOWN;
234         }
235         return ERROR_WIFI_BUSY;
236     }
237 
238     int err = memcpy_s(&g_wifiConfigs[netId], sizeof(WifiDeviceConfig), config, sizeof(WifiDeviceConfig));
239     if (err != EOK) {
240         if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
241             return ERROR_WIFI_UNKNOWN;
242         }
243         LZ_HARDWARE_LOGD(WIFI_DEVICE_TAG, "AddDeviceConfig: memcpy failed, err = %d", err);
244         return ERROR_WIFI_UNKNOWN;
245     }
246 
247     g_wifiConfigs[netId].netId = netId;
248 
249     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
250         return ERROR_WIFI_UNKNOWN;
251     }
252 
253     *result = netId;
254     return WIFI_SUCCESS;
255 }
256 
GetDeviceConfigs(WifiDeviceConfig * result,unsigned int * size)257 WifiErrorCode GetDeviceConfigs(WifiDeviceConfig* result, unsigned int* size)
258 {
259     if (result == NULL || size == NULL) {
260         return ERROR_WIFI_INVALID_ARGS;
261     }
262 
263     unsigned int retIndex = 0;
264 
265     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
266         return ERROR_WIFI_UNKNOWN;
267     }
268 
269     for (int i = 0; i < WIFI_MAX_CONFIG_SIZE; i++) {
270         if (g_wifiConfigs[i].netId != i) {
271             continue;
272         }
273 
274         int err = memcpy_s(&result[retIndex], sizeof(WifiDeviceConfig), &g_wifiConfigs[i], sizeof(WifiDeviceConfig));
275         if (err != EOK) {
276             if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
277                 return ERROR_WIFI_UNKNOWN;
278             }
279             LZ_HARDWARE_LOGD(WIFI_DEVICE_TAG, "GetDeviceConfig: memcpy failed, err = %d", err);
280             return ERROR_WIFI_UNKNOWN;
281         }
282 
283         retIndex++;
284         if (*size < retIndex) {
285             if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
286                 return ERROR_WIFI_UNKNOWN;
287             }
288             return ERROR_WIFI_INVALID_ARGS;
289         }
290     }
291 
292     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
293         return ERROR_WIFI_UNKNOWN;
294     }
295 
296     if (retIndex == 0) {
297         return ERROR_WIFI_NOT_AVAILABLE;
298     }
299 
300     *size = retIndex;
301     return WIFI_SUCCESS;
302 }
303 
ConnectTo(int networkId)304 WifiErrorCode ConnectTo(int networkId)
305 {
306     if (networkId >= WIFI_MAX_CONFIG_SIZE || networkId < 0) {
307         return ERROR_WIFI_INVALID_ARGS;
308     }
309 
310     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
311         return ERROR_WIFI_UNKNOWN;
312     }
313 
314     if (g_staStatus != WIFI_STA_ACTIVE) {
315         return ERROR_WIFI_UNKNOWN;
316     }
317 
318     if (g_wifiConfigs[networkId].netId != networkId) {
319         if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
320             return ERROR_WIFI_UNKNOWN;
321         }
322         return ERROR_WIFI_NOT_AVAILABLE;
323     }
324 
325     g_networkId = networkId;
326 
327     if (WifiConnect(g_wifiConfigs[networkId].ssid,
328                     g_wifiConfigs[networkId].preSharedKey) != WIFI_SUCCESS) {
329         if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
330             return ERROR_WIFI_UNKNOWN;
331         }
332         return ERROR_WIFI_UNKNOWN;
333     }
334 
335     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
336         return ERROR_WIFI_UNKNOWN;
337     }
338 
339     if (LockWifiEventLock() != WIFI_SUCCESS) {
340         return ERROR_WIFI_UNKNOWN;
341     }
342     if (UnlockWifiEventLock() != WIFI_SUCCESS) {
343         return ERROR_WIFI_UNKNOWN;
344     }
345     return WIFI_SUCCESS;
346 }
347 
Disconnect(void)348 WifiErrorCode Disconnect(void)
349 {
350     if (g_staStatus != WIFI_STA_ACTIVE) {
351         return ERROR_WIFI_UNKNOWN;
352     }
353 
354     if (WifiDisconnect(0) != WIFI_SUCCESS) {
355         return ERROR_WIFI_UNKNOWN;
356     }
357     return WIFI_SUCCESS;
358 }
359 
RemoveDevice(int networkId)360 WifiErrorCode RemoveDevice(int networkId)
361 {
362     if (networkId >= WIFI_MAX_CONFIG_SIZE || networkId < 0) {
363         return ERROR_WIFI_INVALID_ARGS;
364     }
365     if (LockWifiGlobalLock() != WIFI_SUCCESS) {
366         return ERROR_WIFI_UNKNOWN;
367     }
368 
369     if (memset_s(&g_wifiConfigs[networkId], sizeof(WifiDeviceConfig),
370                  0, sizeof(WifiDeviceConfig)) != EOK) {
371         LZ_HARDWARE_LOGE(WIFI_DEVICE_TAG, "RemoveDevice: memset failed");
372     }
373     g_wifiConfigs[networkId].netId = WIFI_CONFIG_INVALID;
374 
375     if (UnlockWifiGlobalLock() != WIFI_SUCCESS) {
376         return ERROR_WIFI_UNKNOWN;
377     }
378     return WIFI_SUCCESS;
379 }
380 
GetLocalWifiGw(int * const gw)381 int GetLocalWifiGw(int *const gw)
382 {
383     struct netif *netif = netif_find("wlan0");
384     if (netif == NULL) {
385         LZ_HARDWARE_LOGE(WIFI_DEVICE_TAG, "GetLocalWifiGw: netif get fail\n");
386         return ERROR_WIFI_UNKNOWN;
387     }
388 
389     *gw = ip_addr_get_ip4_u32(&netif->gw);
390     return WIFI_SUCCESS;
391 }
392 
SetLocalWifiGw(void)393 int SetLocalWifiGw(void)
394 {
395     int index_max = 10;
396     ip4_addr_t gw;
397     int i;
398     struct netif *netif;
399 
400     for (i = 0; i < index_max; i++) {
401         netif = netif_get_by_index(i);
402         if (netif != NULL) {
403             LZ_HARDWARE_LOGE(WIFI_DEVICE_TAG, "%c %c num:%d %s",
404                              netif->name[0], netif->name[1], netif->num,
405                              inet_ntoa(ip_addr_get_ip4_u32(&netif->ip_addr)));
406         }
407     }
408 
409     netif = netif_find("wlan0");
410     if (netif == NULL) {
411         LZ_HARDWARE_LOGE(WIFI_DEVICE_TAG, "SetLocalWifiGw: netif get fail\n");
412         return ERROR_WIFI_UNKNOWN;
413     }
414     IP4_ADDR(&gw, 0, 0, 0, 0);
415     netifapi_netif_set_default(netif);
416     return WIFI_SUCCESS;
417 }
418 
GetLocalWifiNetmask(int * const netmask)419 int GetLocalWifiNetmask(int *const netmask)
420 {
421     struct netif *netif = netif_find("wlan0");
422     if (netif == NULL) {
423         LZ_HARDWARE_LOGE(WIFI_DEVICE_TAG, "GetLocalWifiNetmask: netif get fail\n");
424         return ERROR_WIFI_UNKNOWN;
425     }
426 
427     *netmask = ip_addr_get_ip4_u32(&netif->netmask);
428     return WIFI_SUCCESS;
429 }
430 
GetLocalWifiIp(int * const ip)431 static int GetLocalWifiIp(int * const ip)
432 {
433     struct netif *netif = netif_find("wlan0");
434     if (netif == NULL) {
435         LZ_HARDWARE_LOGE(WIFI_DEVICE_TAG, "GetLocalWifiIp: netif get fail\n");
436         return ERROR_WIFI_UNKNOWN;
437     }
438 
439     *ip = ip_addr_get_ip4_u32(&netif->ip_addr);
440     return WIFI_SUCCESS;
441 }
442 
GetLinkedInfo(WifiLinkedInfo * result)443 WifiErrorCode GetLinkedInfo(WifiLinkedInfo* result)
444 {
445     WifiConnInfo connInfo;
446 
447     if (result == NULL) {
448         return ERROR_WIFI_INVALID_ARGS;
449     }
450 
451     if (WifiGetConnectInfo(&connInfo) != WIFI_SUCCESS) {
452         return ERROR_WIFI_UNKNOWN;
453     }
454 
455     if (connInfo.status == LZ_HARDWARE_WIFI_CONNECTED) {
456         result->connState = WIFI_CONNECTED;
457         result->rssi = 0;
458     } else {
459         result->connState = WIFI_DISCONNECTED;
460     }
461 
462     if (GetLocalWifiIp(&(result->ipAddress)) != EOK) {
463         return ERROR_WIFI_UNKNOWN;
464     }
465 
466     return WIFI_SUCCESS;
467 }
468 
RegisterWifiEvent(WifiEvent * event)469 WifiErrorCode RegisterWifiEvent(WifiEvent* event)
470 {
471     if (event == NULL) {
472         return ERROR_WIFI_INVALID_ARGS;
473     }
474     g_event = event;
475     g_event->OnWifiScanStateChanged(1, 0);
476     return WIFI_SUCCESS;
477 }
478 
UnRegisterWifiEvent(const WifiEvent * event)479 WifiErrorCode UnRegisterWifiEvent(const WifiEvent* event)
480 {
481     if (event == NULL) {
482         return ERROR_WIFI_INVALID_ARGS;
483     }
484 
485     if (LockWifiEventLock() != WIFI_SUCCESS) {
486         return ERROR_WIFI_UNKNOWN;
487     }
488     g_event = NULL;
489     if (UnlockWifiEventLock() != WIFI_SUCCESS) {
490         return ERROR_WIFI_UNKNOWN;
491     }
492     return WIFI_SUCCESS;
493 }
494 
GetDeviceMacAddress(unsigned char * result)495 WifiErrorCode GetDeviceMacAddress(unsigned char* result)
496 {
497     if (result == NULL) {
498         return ERROR_WIFI_INVALID_ARGS;
499     }
500 
501     return WIFI_SUCCESS;
502 }
503