• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 Huawei Device Co., Ltd.
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 #ifdef HDI_WPA_INTERFACE_SUPPORT
17 #include "wifi_hdi_wpa_sta_impl.h"
18 #include "wifi_hdi_util.h"
19 #include "wifi_log.h"
20 #include "stub_collector.h"
21 #include "wifi_native_define.h"
22 
23 #undef LOG_TAG
24 #define LOG_TAG "WifiHdiWpaStaImpl"
25 #define COLUMN_INDEX_ZERO 0
26 #define COLUMN_INDEX_ONE 1
27 #define COLUMN_INDEX_TWO 2
28 #define COLUMN_INDEX_THREE 3
29 #define COLUMN_INDEX_FOUR 4
30 #define COLUMN_INDEX_FIVE 5
31 #define REPLY_BUF_LENGTH (4096 * 10)
32 #define ETH_ADDR_LEN 6
33 
34 #ifndef INSTID_WLAN0
35 #define INSTID_WLAN0 (0)
36 #endif
37 #ifndef INSTID_WLAN1
38 #define INSTID_WLAN1 (1)
39 #endif
40 
41 const int QUOTATION_MARKS_FLAG_YES = 0;
42 const int QUOTATION_MARKS_FLAG_NO = 1;
43 
44 static struct IWpaCallback *g_hdiWpaStaCallbackObj[STA_INSTANCE_MAX_NUM];
45 static WpaSsidField g_wpaSsidFields[] = {
46     {DEVICE_CONFIG_SSID, "ssid", QUOTATION_MARKS_FLAG_YES},
47     {DEVICE_CONFIG_PSK, "psk", QUOTATION_MARKS_FLAG_YES},
48     {DEVICE_CONFIG_KEYMGMT, "key_mgmt", QUOTATION_MARKS_FLAG_NO},
49     {DEVICE_CONFIG_PRIORITY, "priority", QUOTATION_MARKS_FLAG_NO},
50     {DEVICE_CONFIG_SCAN_SSID, "scan_ssid", QUOTATION_MARKS_FLAG_NO},
51     {DEVICE_CONFIG_EAP, "eap", QUOTATION_MARKS_FLAG_NO},
52     {DEVICE_CONFIG_IDENTITY, "identity", QUOTATION_MARKS_FLAG_YES},
53     {DEVICE_CONFIG_PASSWORD, "password", QUOTATION_MARKS_FLAG_YES},
54     {DEVICE_CONFIG_BSSID, "bssid", QUOTATION_MARKS_FLAG_NO},
55     {DEVICE_CONFIG_AUTH_ALGORITHMS, "auth_alg", QUOTATION_MARKS_FLAG_NO},
56     {DEVICE_CONFIG_WEP_KEY_IDX, "wep_tx_keyidx", QUOTATION_MARKS_FLAG_NO},
57     {DEVICE_CONFIG_WEP_KEY_0, "wep_key0", QUOTATION_MARKS_FLAG_NO},
58     {DEVICE_CONFIG_WEP_KEY_1, "wep_key1", QUOTATION_MARKS_FLAG_NO},
59     {DEVICE_CONFIG_WEP_KEY_2, "wep_key2", QUOTATION_MARKS_FLAG_NO},
60     {DEVICE_CONFIG_WEP_KEY_3, "wep_key3", QUOTATION_MARKS_FLAG_NO},
61     {DEVICE_CONFIG_EAP_CLIENT_CERT, "client_cert", QUOTATION_MARKS_FLAG_YES},
62     {DEVICE_CONFIG_EAP_PRIVATE_KEY, "private_key", QUOTATION_MARKS_FLAG_YES},
63     {DEVICE_CONFIG_EAP_PHASE2METHOD, "phase2", QUOTATION_MARKS_FLAG_YES},
64     {DEVICE_CONFIG_IEEE80211W, "ieee80211w", QUOTATION_MARKS_FLAG_NO},
65     {DEVICE_CONFIG_ALLOW_PROTOCOLS, "proto", QUOTATION_MARKS_FLAG_NO},
66     {DEVICE_CONFIG_GROUP_CIPHERS, "group", QUOTATION_MARKS_FLAG_NO},
67     {DEVICE_CONFIG_PAIRWISE_CIPHERS, "pairwise", QUOTATION_MARKS_FLAG_NO},
68     {DEVICE_CONFIG_SAE_PASSWD, "sae_password", QUOTATION_MARKS_FLAG_YES},
69     {DEVICE_CONFIG_EAP_CA_CERT, "ca_cert", QUOTATION_MARKS_FLAG_YES},
70     {DEVICE_CONFIG_EAP_CERT_PWD, "private_key_passwd", QUOTATION_MARKS_FLAG_YES},
71     {DEVICE_CONFIG_GROUP_MGMT_CIPHERS, "group_mgmt", QUOTATION_MARKS_FLAG_NO},
72     {DEVICE_CONFIG_WAPI_PSK, "wapi_psk", QUOTATION_MARKS_FLAG_YES},
73     {DEVICE_CONFIG_WAPI_PSK_TYPE, "psk_key_type", QUOTATION_MARKS_FLAG_NO},
74     {DEVICE_CONFIG_WAPI_USER_CERT, "wapi_user_sel_cert", QUOTATION_MARKS_FLAG_YES},
75     {DEVICE_CONFIG_WAPI_CA_CERT, "wapi_ca_cert", QUOTATION_MARKS_FLAG_YES},
76 };
77 
GetInstId(const char * ifaceName)78 static int GetInstId(const char *ifaceName)
79 {
80     int inst = INSTID_WLAN0;
81     if (ifaceName == NULL) {
82         LOGE("GetInstId ifaceName is null");
83         return inst;
84     }
85     for (int instId = 0; instId < STA_INSTANCE_MAX_NUM; instId++) {
86         const char *hdiStaIfname = GetHdiStaIfaceName(instId);
87         if (hdiStaIfname == NULL) {
88             continue;
89         }
90         if (strcmp(ifaceName, hdiStaIfname) == 0) {
91             inst = instId;
92             break;
93         }
94     }
95     LOGI("GetInstId ifaceName = %{public}sm instId = %{public}d", ifaceName, inst);
96     return inst;
97 }
98 
RegisterEventCallback(const char * ifaceName)99 static WifiErrorNo RegisterEventCallback(const char *ifaceName)
100 {
101     LOGI("RegisterEventCallback enter! ifaceName = %{public}s", ifaceName);
102     pthread_mutex_lock(GetWpaObjMutex());
103     int instId = GetInstId(ifaceName);
104     if (g_hdiWpaStaCallbackObj[instId] == NULL) {
105         pthread_mutex_unlock(GetWpaObjMutex());
106         LOGE("RegisterEventCallback: g_hdiWpaStaCallbackObj is NULL");
107         return WIFI_HAL_OPT_FAILED;
108     }
109 
110     struct IWpaInterface *wpaObj = GetWpaInterface();
111     if (wpaObj == NULL) {
112         pthread_mutex_unlock(GetWpaObjMutex());
113         LOGE("RegisterEventCallback: wpaObj is NULL");
114         return WIFI_HAL_OPT_FAILED;
115     }
116 
117     int32_t result = wpaObj->RegisterWpaEventCallback(wpaObj, g_hdiWpaStaCallbackObj[instId], ifaceName);
118     if (result != HDF_SUCCESS) {
119         pthread_mutex_unlock(GetWpaObjMutex());
120         LOGE("RegisterEventCallback: RegisterEventCallback failed result:%{public}d", result);
121         return WIFI_HAL_OPT_FAILED;
122     }
123 
124     pthread_mutex_unlock(GetWpaObjMutex());
125     LOGI("RegisterEventCallback success.");
126     return WIFI_HAL_OPT_OK;
127 }
128 
UnRegisterEventCallback(const char * ifaceName)129 static WifiErrorNo UnRegisterEventCallback(const char *ifaceName)
130 {
131     LOGI("UnRegisterEventCallback enter! ifaceName = %{public}s", ifaceName);
132     if (ifaceName == NULL) {
133         LOGE("UnRegisterEventCallback ifaceName is null");
134         return WIFI_HAL_OPT_FAILED;
135     }
136     pthread_mutex_lock(GetWpaObjMutex());
137     int instId = GetInstId(ifaceName);
138     LOGI("UnRegisterEventCallback enter! instId = %{public}d", instId);
139     if (g_hdiWpaStaCallbackObj[instId] != NULL) {
140         struct IWpaInterface *wpaObj = GetWpaInterface();
141         if (wpaObj == NULL) {
142             pthread_mutex_unlock(GetWpaObjMutex());
143             LOGE("UnRegisterEventCallback: wpaObj is NULL");
144             return WIFI_HAL_OPT_FAILED;
145         }
146 
147         int32_t result = wpaObj->UnregisterWpaEventCallback(wpaObj, g_hdiWpaStaCallbackObj[instId], ifaceName);
148         if (result != HDF_SUCCESS) {
149             pthread_mutex_unlock(GetWpaObjMutex());
150             LOGE("UnRegisterEventCallback: UnregisterEventCallback failed result:%{public}d", result);
151             return WIFI_HAL_OPT_FAILED;
152         }
153         StubCollectorRemoveObject(IWPACALLBACK_INTERFACE_DESC, g_hdiWpaStaCallbackObj[instId]);
154         free(g_hdiWpaStaCallbackObj[instId]);
155         g_hdiWpaStaCallbackObj[instId] = NULL;
156     }
157 
158     pthread_mutex_unlock(GetWpaObjMutex());
159     LOGI("UnRegisterEventCallback success.");
160     return WIFI_HAL_OPT_OK;
161 }
162 
CalcQuotationMarksFlag(int pos,const char value[WIFI_NETWORK_CONFIG_VALUE_LENGTH])163 static int CalcQuotationMarksFlag(int pos, const char value[WIFI_NETWORK_CONFIG_VALUE_LENGTH])
164 {
165     int flag = g_wpaSsidFields[pos].flag;
166     const int HEX_PSK_MAX_LEN = 64;
167     int len = strlen(value);
168     /* if the psk length is 64, it's hex format and don't need quotation marks */
169     if (pos == DEVICE_CONFIG_PSK && len >= HEX_PSK_MAX_LEN) {
170         flag = QUOTATION_MARKS_FLAG_NO;
171     }
172     if (pos == DEVICE_CONFIG_WEP_KEY_0 ||
173         pos == DEVICE_CONFIG_WEP_KEY_1 ||
174         pos == DEVICE_CONFIG_WEP_KEY_2 ||
175         pos == DEVICE_CONFIG_WEP_KEY_3) {
176         const int WEP_KEY_LEN1 = 5;
177         const int WEP_KEY_LEN2 = 13;
178         const int WEP_KEY_LEN3 = 16;
179         /* For wep key, ASCII format need quotation marks, hex format is not required */
180         if (len == WEP_KEY_LEN1 || len == WEP_KEY_LEN2 || len == WEP_KEY_LEN3) {
181             flag = QUOTATION_MARKS_FLAG_YES;
182         }
183     }
184     return flag;
185 }
186 
SetNetwork(int networkId,SetNetworkConfig conf,const char * ifaceName)187 static WifiErrorNo SetNetwork(int networkId, SetNetworkConfig conf, const char *ifaceName)
188 {
189     if (ifaceName == NULL) {
190         LOGE("GetInstId ifaceName is null");
191         return WIFI_HAL_OPT_FAILED;
192     }
193     int pos = -1;
194     for (unsigned i = 0; i < sizeof(g_wpaSsidFields) / sizeof(g_wpaSsidFields[0]); ++i) {
195         if (g_wpaSsidFields[i].field == conf.cfgParam) {
196             pos = i;
197             break;
198         }
199     }
200     if (pos < 0) {
201         LOGE("SetNetwork: unsupported param: %{public}d", conf.cfgParam);
202         return WIFI_HAL_OPT_INVALID_PARAM;
203     }
204 
205     char tmpCfgValue[WIFI_NETWORK_CONFIG_VALUE_LENGTH] = {0};
206     if (CalcQuotationMarksFlag(pos, conf.cfgValue) == QUOTATION_MARKS_FLAG_YES) {
207         if (snprintf_s(tmpCfgValue, sizeof(tmpCfgValue), sizeof(tmpCfgValue) - 1, "\"%s\"", conf.cfgValue) < 0) {
208             LOGE("SetNetwork: snprintf_s failed!");
209             return WIFI_HAL_OPT_FAILED;
210         }
211         if (snprintf_s(conf.cfgValue, sizeof(conf.cfgValue), sizeof(conf.cfgValue) - 1, "%s", tmpCfgValue) < 0) {
212             LOGE("SetNetwork: snprintf_s failed!");
213             return WIFI_HAL_OPT_FAILED;
214         }
215     }
216     pthread_mutex_lock(GetWpaObjMutex());
217     struct IWpaInterface *wpaObj = GetWpaInterface();
218     if (wpaObj == NULL) {
219         LOGE("SetNetwork: wpaObj is NULL");
220         pthread_mutex_unlock(GetWpaObjMutex());
221         return WIFI_HAL_OPT_FAILED;
222     }
223 
224     int32_t result = wpaObj->SetNetwork(wpaObj, ifaceName, networkId, g_wpaSsidFields[pos].fieldName, conf.cfgValue);
225     if (result != HDF_SUCCESS) {
226         LOGE("SetNetwork: SetNetwork failed result:%{public}d", result);
227         pthread_mutex_unlock(GetWpaObjMutex());
228         return WIFI_HAL_OPT_FAILED;
229     }
230     pthread_mutex_unlock(GetWpaObjMutex());
231     LOGI("SetNetwork success. ifaceName = %{public}s", ifaceName);
232     return WIFI_HAL_OPT_OK;
233 }
234 
HdiWpaStaStart(const char * ifaceName,int instId)235 WifiErrorNo HdiWpaStaStart(const char *ifaceName, int instId)
236 {
237     if (ifaceName == NULL) {
238         LOGE("HdiWpaStaStart ifaceName is null");
239         return WIFI_HAL_OPT_FAILED;
240     }
241     LOGI("HdiWpaStaStart enter! ifaceName = %{public}s, instId = %{public}d", ifaceName, instId);
242     if (SetHdiStaIfaceName(ifaceName, instId) != WIFI_HAL_OPT_OK) {
243         LOGE("HdiWpaStaStart: set sta iface name failed!");
244         return WIFI_HAL_OPT_FAILED;
245     }
246 
247     if (CopyConfigFile("wpa_supplicant.conf") != WIFI_HAL_OPT_OK) {
248         LOGE("HdiWpaStaStart: CopyConfigFile failed!");
249         return WIFI_HAL_OPT_FAILED;
250     }
251 
252     if (HdiWpaStart() != WIFI_HAL_OPT_OK) {
253         LOGE("HdiWpaStaStart: HdiWpaStart failed!");
254         return WIFI_HAL_OPT_FAILED;
255     }
256 
257     if (RegisterEventCallback(ifaceName) != WIFI_HAL_OPT_OK) {
258         LOGE("HdiWpaStaStart: RegisterEventCallback failed!");
259         return WIFI_HAL_OPT_FAILED;
260     }
261 
262     if (HdiAddWpaIface(ifaceName, CONFIG_ROOR_DIR "/wpa_supplicant/wpa_supplicant.conf") != WIFI_HAL_OPT_OK) {
263         LOGE("HdiWpaStaStart: HdiAddWpaIface failed!");
264         return WIFI_HAL_OPT_FAILED;
265     }
266 
267     LOGI("HdiWpaStaStart success");
268     return WIFI_HAL_OPT_OK;
269 }
270 
HdiWpaStaStopWifi(int instId)271 static WifiErrorNo HdiWpaStaStopWifi(int instId)
272 {
273     for (int inst = instId; inst < STA_INSTANCE_MAX_NUM; inst++) {
274         const char *ifaceName = GetHdiStaIfaceName(instId);
275         if (ifaceName == NULL) {
276             LOGE("HdiWpaStopWifi ifaceName is null");
277             return WIFI_HAL_OPT_FAILED;
278         }
279         if (HdiRemoveWpaIface(ifaceName) != WIFI_HAL_OPT_OK) {
280             LOGE("HdiWpaStop: HdiRemoveWpaIface failed");
281             return WIFI_HAL_OPT_FAILED;
282         }
283         if (UnRegisterEventCallback(ifaceName) != WIFI_HAL_OPT_OK) {
284             LOGE("HdiWpaStop: UnRegisterEventCallback failed");
285             return WIFI_HAL_OPT_FAILED;
286         }
287         ClearHdiStaIfaceName(instId);
288         LOGI("HdiWpaStaStopWifi success, instId = %{public}d, ifaceName = %{public}s", instId, ifaceName);
289     }
290     return WIFI_HAL_OPT_OK;
291 }
292 
HdiWpaStaStop(int instId)293 WifiErrorNo HdiWpaStaStop(int instId)
294 {
295     LOGI("HdiWpaStaStop enter, instId = %{public}d", instId);
296     if (IsHdiWpaStopped() == WIFI_HAL_OPT_OK) {
297         LOGI("HdiWpa already stopped, HdiWpaStaStop success!");
298         return WIFI_HAL_OPT_OK;
299     }
300 
301     if (instId == INSTID_WLAN1) {
302         const char *ifaceName = GetHdiStaIfaceName(instId);
303         if (ifaceName == NULL) {
304             LOGE("HdiWpaStaStopWifi ifaceName is null");
305             return WIFI_HAL_OPT_FAILED;
306         }
307         if (HdiRemoveWpaIface(ifaceName) != WIFI_HAL_OPT_OK) {
308             LOGE("HdiWpaStaStop: HdiRemoveWpaStaIface failed!");
309             return WIFI_HAL_OPT_FAILED;
310         }
311         if (UnRegisterEventCallback(ifaceName) != WIFI_HAL_OPT_OK) {
312             LOGE("HdiWpaStaStop: UnRegisterEventCallback failed!");
313             return WIFI_HAL_OPT_FAILED;
314         }
315         ClearHdiStaIfaceName(instId);
316         LOGI("HdiWpaStaStopWifi success, instId = %{public}d, ifaceName = %{public}s", instId, ifaceName);
317         return WIFI_HAL_OPT_OK;
318     }
319 
320     if (HdiRemoveWpaIface(GetHdiP2pIfaceName()) != WIFI_HAL_OPT_OK) {
321         LOGE("HdiWpaStaStop: HdiRemoveWpaP2pIface failed!");
322     }
323 
324     HdiWpaStaStopWifi(INSTID_WLAN0);
325 
326     if (HdiWpaStop() != WIFI_HAL_OPT_OK) {
327         LOGE("HdiWpaStaStop: HdiWpaStaStop failed!");
328         return WIFI_HAL_OPT_FAILED;
329     }
330 
331     LOGI("HdiWpaStaStop success");
332     return WIFI_HAL_OPT_OK;
333 }
334 
HdiWpaStaConnect(int networkId,const char * ifaceName)335 WifiErrorNo HdiWpaStaConnect(int networkId, const char *ifaceName)
336 {
337     if (ifaceName == NULL) {
338         LOGE("HdiWpaStaConnect ifaceName is null");
339         return WIFI_HAL_OPT_FAILED;
340     }
341     LOGI("HdiWpaStaConnect enter, networkId:%{public}d, ifaceName = %{public}s", networkId, ifaceName);
342     pthread_mutex_lock(GetWpaObjMutex());
343     struct IWpaInterface *wpaObj = GetWpaInterface();
344     if (wpaObj == NULL) {
345         LOGE("HdiWpaStaConnect: wpaObj is NULL");
346         pthread_mutex_unlock(GetWpaObjMutex());
347         return WIFI_HAL_OPT_FAILED;
348     }
349 
350     int32_t result = wpaObj->SelectNetwork(wpaObj, ifaceName, networkId);
351     if (result != HDF_SUCCESS) {
352         LOGE("HdiWpaStaConnect: SelectNetwork failed result:%{public}d", result);
353         pthread_mutex_unlock(GetWpaObjMutex());
354         return WIFI_HAL_OPT_FAILED;
355     }
356     pthread_mutex_unlock(GetWpaObjMutex());
357     LOGI("HdiWpaStaConnect success.");
358     return WIFI_HAL_OPT_OK;
359 }
360 
HdiWpaStaReconnect(const char * ifaceName)361 WifiErrorNo HdiWpaStaReconnect(const char *ifaceName)
362 {
363     if (ifaceName == NULL) {
364         LOGE("HdiWpaStaReconnect ifaceName is null");
365         return WIFI_HAL_OPT_FAILED;
366     }
367     LOGI("HdiWpaStaReconnect enter! ifaceName = %{public}s", ifaceName);
368     pthread_mutex_lock(GetWpaObjMutex());
369     struct IWpaInterface *wpaObj = GetWpaInterface();
370     if (wpaObj == NULL) {
371         LOGE("HdiWpaStaReconnect: wpaObj is NULL");
372         pthread_mutex_unlock(GetWpaObjMutex());
373         return WIFI_HAL_OPT_FAILED;
374     }
375 
376     int32_t result = wpaObj->Reconnect(wpaObj, ifaceName);
377     if (result != HDF_SUCCESS) {
378         LOGE("HdiWpaStaReconnect: Reconnect failed result:%{public}d", result);
379         pthread_mutex_unlock(GetWpaObjMutex());
380         return WIFI_HAL_OPT_FAILED;
381     }
382     pthread_mutex_unlock(GetWpaObjMutex());
383     LOGI("HdiWpaStaReconnect success.");
384     return WIFI_HAL_OPT_OK;
385 }
386 
HdiWpaStaReassociate(const char * ifaceName)387 WifiErrorNo HdiWpaStaReassociate(const char *ifaceName)
388 {
389     if (ifaceName == NULL) {
390         LOGE("HdiWpaStaReassociate ifaceName is null");
391         return WIFI_HAL_OPT_FAILED;
392     }
393     pthread_mutex_lock(GetWpaObjMutex());
394     struct IWpaInterface *wpaObj = GetWpaInterface();
395     if (wpaObj == NULL) {
396         LOGE("HdiWpaStaReassociate: wpaObj is NULL");
397         pthread_mutex_unlock(GetWpaObjMutex());
398         return WIFI_HAL_OPT_FAILED;
399     }
400 
401     int32_t result = wpaObj->Reassociate(wpaObj, ifaceName);
402     if (result != HDF_SUCCESS) {
403         LOGE("HdiWpaStaReassociate: Reassociate failed result:%{public}d", result);
404         pthread_mutex_unlock(GetWpaObjMutex());
405         return WIFI_HAL_OPT_FAILED;
406     }
407     pthread_mutex_unlock(GetWpaObjMutex());
408     return WIFI_HAL_OPT_OK;
409 }
410 
HdiWpaStaDisconnect(const char * ifaceName)411 WifiErrorNo HdiWpaStaDisconnect(const char *ifaceName)
412 {
413     if (ifaceName == NULL) {
414         LOGE("HdiWpaStaDisconnect ifaceName is null");
415         return WIFI_HAL_OPT_FAILED;
416     }
417     LOGI("HdiWpaStaDisconnect enter! ifaceName = %{public}s", ifaceName);
418     pthread_mutex_lock(GetWpaObjMutex());
419     struct IWpaInterface *wpaObj = GetWpaInterface();
420     if (wpaObj == NULL) {
421         LOGE("HdiWpaStaDisconnect: wpaObj is NULL");
422         pthread_mutex_unlock(GetWpaObjMutex());
423         return WIFI_HAL_OPT_FAILED;
424     }
425 
426     int32_t result = wpaObj->Disconnect(wpaObj, ifaceName);
427     if (result != HDF_SUCCESS) {
428         LOGE("HdiWpaStaDisconnect: Disconnect failed result:%{public}d", result);
429         pthread_mutex_unlock(GetWpaObjMutex());
430         return WIFI_HAL_OPT_FAILED;
431     }
432     pthread_mutex_unlock(GetWpaObjMutex());
433     LOGI("HdiWpaStaDisconnect success.");
434     return WIFI_HAL_OPT_OK;
435 }
436 
ConvertMacToStr(char * mac,int macSize,char * macStr,int strLen)437 int ConvertMacToStr(char *mac, int macSize, char *macStr, int strLen)
438 {
439     if (mac == NULL || macStr == NULL || macSize < ETH_ADDR_LEN || strLen <= HAL_BSSID_LENGTH) {
440         return -1;
441     }
442     const int posZero = 0;
443     const int posOne = 1;
444     const int posTwo = 2;
445     const int posThree = 3;
446     const int posFour = 4;
447     const int posFive = 5;
448     if (snprintf_s(macStr, strLen, strLen - 1, "%02x:%02x:%02x:%02x:%02x:%02x", mac[posZero], mac[posOne], mac[posTwo],
449         mac[posThree], mac[posFour], mac[posFive]) < 0) {
450         return -1;
451     }
452     return 0;
453 }
454 
HdiWpaStaGetDeviceMacAddress(char * macAddr,int macAddrLen,const char * ifaceName)455 WifiErrorNo HdiWpaStaGetDeviceMacAddress(char *macAddr, int macAddrLen, const char *ifaceName)
456 {
457     LOGI("HdiWpaStaGetDeviceMacAddress enter! ifaceName = %{public}s", ifaceName);
458     if (macAddr == NULL) {
459         LOGE("HdiWpaStaGetDeviceMacAddress: invalid parameter!");
460         return WIFI_HAL_OPT_INVALID_PARAM;
461     }
462 
463     struct HdiWpaCmdStatus status;
464     if (memset_s(&status, sizeof(status), 0, sizeof(status)) != EOK) {
465         LOGE("HdiWpaStaGetDeviceMacAddress: memset_s failed!");
466         return WIFI_HAL_OPT_FAILED;
467     }
468     pthread_mutex_lock(GetWpaObjMutex());
469     struct IWpaInterface *wpaObj = GetWpaInterface();
470     if (wpaObj == NULL) {
471         LOGE("HdiWpaStaGetDeviceMacAddress: wpaObj is NULL");
472         pthread_mutex_unlock(GetWpaObjMutex());
473         return WIFI_HAL_OPT_FAILED;
474     }
475 
476     int32_t result = wpaObj->WifiStatus(wpaObj, ifaceName, &status);
477     if (result != HDF_SUCCESS) {
478         LOGE("HdiWpaStaGetDeviceMacAddress: WifiStatus failed result:%{public}d", result);
479         pthread_mutex_unlock(GetWpaObjMutex());
480         return WIFI_HAL_OPT_FAILED;
481     }
482 
483     if ((uint32_t)macAddrLen < status.addressLen) {
484         LOGE("Input mac length %{public}d is little than mac address length %{public}d", macAddrLen, status.addressLen);
485         pthread_mutex_unlock(GetWpaObjMutex());
486         return WIFI_HAL_OPT_BUFFER_TOO_LITTLE;
487     }
488 
489     if (ConvertMacToStr((char *)status.address, status.addressLen, macAddr, macAddrLen) != EOK) {
490         LOGE("HdiWpaStaGetDeviceMacAddress: convertMacToStr failed!");
491         pthread_mutex_unlock(GetWpaObjMutex());
492         return WIFI_HAL_OPT_FAILED;
493     }
494     pthread_mutex_unlock(GetWpaObjMutex());
495     LOGI("HdiWpaStaGetDeviceMacAddress success.");
496     return WIFI_HAL_OPT_OK;
497 }
498 
HdiWpaStaScan()499 WifiErrorNo HdiWpaStaScan()
500 {
501     LOGI("HdiWpaStaScan enter");
502     pthread_mutex_lock(GetWpaObjMutex());
503     struct IWpaInterface *wpaObj = GetWpaInterface();
504     if (wpaObj == NULL) {
505         LOGE("HdiWpaStaScan: wpaObj is NULL");
506         pthread_mutex_unlock(GetWpaObjMutex());
507         return WIFI_HAL_OPT_FAILED;
508     }
509 
510     int32_t result = wpaObj->Scan(wpaObj, GetHdiStaIfaceName(INSTID_WLAN0));
511     if (result != HDF_SUCCESS) {
512         LOGE("HdiWpaStaScan: Scan failed result:%{public}d", result);
513         pthread_mutex_unlock(GetWpaObjMutex());
514         return WIFI_HAL_OPT_FAILED;
515     }
516     pthread_mutex_unlock(GetWpaObjMutex());
517     LOGI("HdiWpaStaScan success.");
518     return WIFI_HAL_OPT_OK;
519 }
520 
GetScanData(unsigned char * resultBuff,ScanInfo * results,int * size)521 static bool GetScanData(unsigned char *resultBuff, ScanInfo *results, int *size)
522 {
523     char *savedPtr = NULL;
524     strtok_r((char *)resultBuff, "\n", &savedPtr);
525     char *token = strtok_r(NULL, "\n", &savedPtr);
526     int j = 0;
527     while (token != NULL) {
528         if (j >= *size) {
529             *size = j;
530             LOGE("GetScanData: get scan info full!");
531             return false;
532         }
533         int length = strlen(token);
534         if (length <= 0 || DelScanInfoLine(&results[j], token, length)) {
535             LOGE("GetScanData: parse scan results line failed!");
536             break;
537         }
538         LOGI("-->>%{public}2d %{private}s %{private}s %{public}d %{public}d %{public}d %{public}d \
539          %{public}d %{public}d %{public}d %{public}d %{public}d %{public}d %{public}d",
540              j, results[j].ssid, results[j].bssid, results[j].freq, results[j].siglv,
541              results[j].centerFrequency0, results[j].centerFrequency1, results[j].channelWidth,
542              results[j].isVhtInfoExist, results[j].isHtInfoExist, results[j].isHeInfoExist, results[j].isErpExist,
543              results[j].maxRates, results[j].extMaxRates);
544         token = strtok_r(NULL, "\n", &savedPtr);
545         j++;
546     }
547         *size = j;
548         return true;
549 }
550 
HdiWpaStaGetScanInfos(int * size,const char * ifaceName)551 ScanInfo *HdiWpaStaGetScanInfos(int *size, const char *ifaceName)
552 {
553     LOGI("HdiWpaStaGetScanInfos enter");
554     if (ifaceName == NULL || size == NULL || *size <= 0) {
555         LOGE("HdiWpaStaGetScanInfos: invalid parameter!");
556         return NULL;
557     }
558 
559     ScanInfo *results = (ScanInfo *)calloc(*size, sizeof(ScanInfo));
560     if (results == NULL) {
561         LOGE("HdiWpaStaGetScanInfos: calloc scanInfo failed!");
562         return NULL;
563     }
564 
565     unsigned int resultBuffLen = REPLY_BUF_LENGTH;
566     unsigned char *resultBuff = (unsigned char *)calloc(resultBuffLen, sizeof(unsigned char));
567     if (resultBuff == NULL) {
568         free(results);
569         results = NULL;
570         LOGE("HdiWpaStaGetScanInfos: calloc failed!");
571         return NULL;
572     }
573     pthread_mutex_lock(GetWpaObjMutex());
574     struct IWpaInterface *wpaObj = GetWpaInterface();
575     if (wpaObj == NULL) {
576         LOGE("HdiWpaStaGetScanInfos: wpaObj is NULL");
577         goto EXIT;
578     }
579 
580     if (wpaObj->ScanResult(wpaObj, ifaceName, resultBuff, &resultBuffLen) != HDF_SUCCESS) {
581         LOGE("HdiWpaStaGetScanInfos: ScanResult failed");
582         goto EXIT;
583     }
584 
585     if (GetScanData(resultBuff, results, size) == false) {
586         goto EXIT;
587         }
588 
589     free(resultBuff);
590     resultBuff = NULL;
591     pthread_mutex_unlock(GetWpaObjMutex());
592     LOGI("HdiWpaStaGetScanInfos success.");
593     return results;
594 EXIT:
595     free(results);
596     results = NULL;
597     free(resultBuff);
598     resultBuff = NULL;
599     pthread_mutex_unlock(GetWpaObjMutex());
600     return NULL;
601 }
602 
HdiWpaStaRemoveNetwork(int networkId,const char * ifaceName)603 WifiErrorNo HdiWpaStaRemoveNetwork(int networkId, const char *ifaceName)
604 {
605     if (ifaceName == NULL) {
606         LOGE("HdiWpaStaRemoveNetwork ifaceName is null");
607         return WIFI_HAL_OPT_FAILED;
608     }
609     LOGI("HdiWpaStaRemoveNetwork enter, networkId:%{public}d, ifaceName = %{public}s", networkId, ifaceName);
610     pthread_mutex_lock(GetWpaObjMutex());
611     struct IWpaInterface *wpaObj = GetWpaInterface();
612     if (wpaObj == NULL) {
613         LOGE("HdiWpaStaRemoveNetwork: wpaObj is NULL");
614         pthread_mutex_unlock(GetWpaObjMutex());
615         return WIFI_HAL_OPT_FAILED;
616     }
617 
618     int32_t result = wpaObj->RemoveNetwork(wpaObj, ifaceName, networkId);
619     if (result != HDF_SUCCESS) {
620         LOGE("HdiWpaStaRemoveNetwork: RemoveNetwork failed result:%{public}d", result);
621         pthread_mutex_unlock(GetWpaObjMutex());
622         return WIFI_HAL_OPT_FAILED;
623     }
624     pthread_mutex_unlock(GetWpaObjMutex());
625     LOGI("HdiWpaStaRemoveNetwork success.");
626     return WIFI_HAL_OPT_OK;
627 }
628 
HdiWpaStaAddNetwork(int * networkId,const char * ifaceName)629 WifiErrorNo HdiWpaStaAddNetwork(int *networkId, const char *ifaceName)
630 {
631     if (ifaceName == NULL) {
632         LOGE("HdiWpaStaAddNetwork ifaceName is null");
633         return WIFI_HAL_OPT_FAILED;
634     }
635     LOGI("HdiWpaStaAddNetwork enter! ifaceName = %{public}s", ifaceName);
636     if (networkId == NULL) {
637         LOGE("HdiWpaStaAddNetwork: invalid parameter!");
638         return WIFI_HAL_OPT_INVALID_PARAM;
639     }
640     pthread_mutex_lock(GetWpaObjMutex());
641     struct IWpaInterface *wpaObj = GetWpaInterface();
642     if (wpaObj == NULL) {
643         LOGE("HdiWpaStaAddNetwork: wpaObj is NULL");
644         pthread_mutex_unlock(GetWpaObjMutex());
645         return WIFI_HAL_OPT_FAILED;
646     }
647 
648     int32_t result = wpaObj->AddNetwork(wpaObj, ifaceName, networkId);
649     if (result != HDF_SUCCESS) {
650         LOGE("HdiWpaStaAddNetwork: AddNetwork failed result:%{public}d", result);
651         pthread_mutex_unlock(GetWpaObjMutex());
652         return WIFI_HAL_OPT_FAILED;
653     }
654     pthread_mutex_unlock(GetWpaObjMutex());
655     LOGI("HdiWpaStaAddNetwork success, networkId:%{public}d", *networkId);
656     return WIFI_HAL_OPT_OK;
657 }
658 
HdiWpaStaEnableNetwork(int networkId,const char * ifaceName)659 WifiErrorNo HdiWpaStaEnableNetwork(int networkId, const char *ifaceName)
660 {
661     if (ifaceName == NULL) {
662         LOGE("HdiWpaStaEnableNetwork ifaceName is null");
663         return WIFI_HAL_OPT_FAILED;
664     }
665     LOGI("HdiWpaStaEnableNetwork enter, networkId:%{public}d, ifaceName = %{public}s", networkId, ifaceName);
666     pthread_mutex_lock(GetWpaObjMutex());
667     struct IWpaInterface *wpaObj = GetWpaInterface();
668     if (wpaObj == NULL) {
669         LOGE("HdiWpaStaEnableNetwork: wpaObj is NULL");
670         pthread_mutex_unlock(GetWpaObjMutex());
671         return WIFI_HAL_OPT_FAILED;
672     }
673 
674     int32_t result = wpaObj->EnableNetwork(wpaObj, ifaceName, networkId);
675     if (result != HDF_SUCCESS) {
676         LOGE("HdiWpaStaEnableNetwork: EnableNetwork failed result:%{public}d", result);
677         pthread_mutex_unlock(GetWpaObjMutex());
678         return WIFI_HAL_OPT_FAILED;
679     }
680     pthread_mutex_unlock(GetWpaObjMutex());
681     LOGI("HdiWpaStaEnableNetwork success.");
682     return WIFI_HAL_OPT_OK;
683 }
684 
HdiWpaStaDisableNetwork(int networkId,const char * ifaceName)685 WifiErrorNo HdiWpaStaDisableNetwork(int networkId, const char *ifaceName)
686 {
687     if (ifaceName == NULL) {
688         LOGE("HdiWpaStaDisableNetwork ifaceName is null");
689         return WIFI_HAL_OPT_FAILED;
690     }
691     LOGI("HdiWpaStaDisableNetwork enter, networkId:%{public}d, ifaceName = %{public}s", networkId, ifaceName);
692     pthread_mutex_lock(GetWpaObjMutex());
693     struct IWpaInterface *wpaObj = GetWpaInterface();
694     if (wpaObj == NULL) {
695         LOGE("HdiWpaStaDisableNetwork: wpaObj is NULL");
696         pthread_mutex_unlock(GetWpaObjMutex());
697         return WIFI_HAL_OPT_FAILED;
698     }
699 
700     int32_t result = wpaObj->DisableNetwork(wpaObj, ifaceName, networkId);
701     if (result != HDF_SUCCESS) {
702         LOGE("HdiWpaStaDisableNetwork: DisableNetwork failed result:%{public}d", result);
703         pthread_mutex_unlock(GetWpaObjMutex());
704         return WIFI_HAL_OPT_FAILED;
705     }
706     pthread_mutex_unlock(GetWpaObjMutex());
707     LOGI("HdiWpaStaDisableNetwork success.");
708     return WIFI_HAL_OPT_OK;
709 }
710 
HdiWpaStaSetNetwork(int networkId,SetNetworkConfig * confs,int size,const char * ifaceName)711 WifiErrorNo HdiWpaStaSetNetwork(int networkId, SetNetworkConfig *confs, int size, const char *ifaceName)
712 {
713     if (ifaceName == NULL) {
714         LOGE("HdiWpaStaSetNetwork ifaceName is null");
715         return WIFI_HAL_OPT_FAILED;
716     }
717     LOGI("HdiWpaStaSetNetwork enter! ifaceName = %{public}s", ifaceName);
718     if (confs == NULL) {
719         LOGE("HdiWpaStaSetNetwork: invalid parameter!");
720         return WIFI_HAL_OPT_INVALID_PARAM;
721     }
722 
723     for (int i = 0; i < size; ++i) {
724         SetNetwork(networkId, confs[i], ifaceName);
725     }
726 
727     return WIFI_HAL_OPT_OK;
728 }
729 
HdiWpaStaSaveConfig(const char * ifaceName)730 WifiErrorNo HdiWpaStaSaveConfig(const char *ifaceName)
731 {
732     if (ifaceName == NULL) {
733         LOGE("HdiWpaStaSaveConfig ifaceName is null");
734         return WIFI_HAL_OPT_FAILED;
735     }
736     LOGI("HdiWpaStaSaveConfig enter! ifaceName = %{public}s", ifaceName);
737     pthread_mutex_lock(GetWpaObjMutex());
738     struct IWpaInterface *wpaObj = GetWpaInterface();
739     if (wpaObj == NULL) {
740         LOGE("HdiWpaStaSaveConfig: wpaObj is NULL");
741         pthread_mutex_unlock(GetWpaObjMutex());
742         return WIFI_HAL_OPT_FAILED;
743     }
744 
745     int32_t result = wpaObj->SaveConfig(wpaObj, ifaceName);
746     if (result != HDF_SUCCESS) {
747         LOGE("HdiWpaStaSaveConfig: SaveConfig failed result:%{public}d", result);
748         pthread_mutex_unlock(GetWpaObjMutex());
749         return WIFI_HAL_OPT_FAILED;
750     }
751     pthread_mutex_unlock(GetWpaObjMutex());
752     LOGI("HdiWpaStaSaveConfig success.");
753     return WIFI_HAL_OPT_OK;
754 }
755 
RegisterHdiWpaStaEventCallback(struct IWpaCallback * callback,const char * ifaceName,int instId)756 WifiErrorNo RegisterHdiWpaStaEventCallback(struct IWpaCallback *callback, const char *ifaceName, int instId)
757 {
758     if (ifaceName == NULL) {
759         LOGE("RegisterHdiWpaStaEventCallback ifaceName is null");
760         return WIFI_HAL_OPT_FAILED;
761     }
762     LOGI("RegisterHdiWpaStaEventCallback enter, ifaceName = %{public}s, instId = %{public}d", ifaceName, instId);
763     pthread_mutex_lock(GetWpaObjMutex());
764     if (callback == NULL || callback->OnEventConnected == NULL) {
765         pthread_mutex_unlock(GetWpaObjMutex());
766         LOGE("RegisterHdiWpaStaEventCallback: invalid parameter!");
767         return WIFI_HAL_OPT_INVALID_PARAM;
768     }
769 
770     if (g_hdiWpaStaCallbackObj[instId] != NULL) {
771         pthread_mutex_unlock(GetWpaObjMutex());
772         LOGI("RegisterHdiWpaStaEventCallback: already register!");
773         return WIFI_HAL_OPT_OK;
774     }
775 
776     g_hdiWpaStaCallbackObj[instId] = (struct IWpaCallback *)malloc(sizeof(struct IWpaCallback));
777     if (g_hdiWpaStaCallbackObj[instId] == NULL) {
778         pthread_mutex_unlock(GetWpaObjMutex());
779         LOGE("RegisterHdiWpaStaEventCallback: IWpaCallback malloc failed!");
780         return WIFI_HAL_OPT_FAILED;
781     }
782     if (memset_s(g_hdiWpaStaCallbackObj[instId], sizeof(struct IWpaCallback), 0, sizeof(struct IWpaCallback)) != EOK) {
783         pthread_mutex_unlock(GetWpaObjMutex());
784         return WIFI_HAL_OPT_FAILED;
785     }
786     g_hdiWpaStaCallbackObj[instId]->OnEventDisconnected = callback->OnEventDisconnected;
787     g_hdiWpaStaCallbackObj[instId]->OnEventConnected = callback->OnEventConnected;
788     g_hdiWpaStaCallbackObj[instId]->OnEventBssidChanged = callback->OnEventBssidChanged;
789     g_hdiWpaStaCallbackObj[instId]->OnEventStateChanged = callback->OnEventStateChanged;
790     g_hdiWpaStaCallbackObj[instId]->OnEventTempDisabled = callback->OnEventTempDisabled;
791     g_hdiWpaStaCallbackObj[instId]->OnEventAssociateReject = callback->OnEventAssociateReject;
792     g_hdiWpaStaCallbackObj[instId]->OnEventWpsOverlap = callback->OnEventWpsOverlap;
793     g_hdiWpaStaCallbackObj[instId]->OnEventWpsTimeout = callback->OnEventWpsTimeout;
794     g_hdiWpaStaCallbackObj[instId]->OnEventAuthTimeout = callback->OnEventAuthTimeout;
795 #ifndef HDI_CHIP_INTERFACE_SUPPORT
796     g_hdiWpaStaCallbackObj[instId]->OnEventScanResult = callback->OnEventScanResult;
797 #endif
798     g_hdiWpaStaCallbackObj[instId]->OnEventStaNotify = callback->OnEventStaNotify;
799     pthread_mutex_unlock(GetWpaObjMutex());
800     LOGI("RegisterHdiWpaStaEventCallback3 success.");
801     return WIFI_HAL_OPT_OK;
802 }
803 
HdiWpaStaStartWpsPbcMode(WifiWpsParam * config,const char * ifaceName)804 WifiErrorNo HdiWpaStaStartWpsPbcMode(WifiWpsParam *config, const char *ifaceName)
805 {
806     if (ifaceName == NULL) {
807         LOGE("HdiWpaStaStartWpsPbcMode ifaceName is null");
808         return WIFI_HAL_OPT_FAILED;
809     }
810     LOGI("HdiWpaStaStartWpsPbcMode enter! ifaceName = %{public}s", ifaceName);
811     if (config == NULL) {
812         LOGE("HdiWpaStaStartWpsPbcMode: invalid parameter!");
813         return WIFI_HAL_OPT_INVALID_PARAM;
814     }
815 
816     struct HdiWifiWpsParam wpsParam = {0};
817     wpsParam.anyFlag = config->anyFlag;
818     wpsParam.multiAp = config->multiAp;
819     wpsParam.bssid = (uint8_t *)config->bssid;
820     wpsParam.bssidLen = strlen(config->bssid);
821     pthread_mutex_lock(GetWpaObjMutex());
822     struct IWpaInterface *wpaObj = GetWpaInterface();
823     if (wpaObj == NULL) {
824         LOGE("HdiWpaStaStartWpsPbcMode: wpaObj is NULL");
825         pthread_mutex_unlock(GetWpaObjMutex());
826         return WIFI_HAL_OPT_FAILED;
827     }
828 
829     int32_t result = wpaObj->WpsPbcMode(wpaObj, ifaceName, &wpsParam);
830     if (result != HDF_SUCCESS) {
831         LOGE("HdiWpaStaStartWpsPbcMode: WpsPbcMode failed result:%{public}d", result);
832         pthread_mutex_unlock(GetWpaObjMutex());
833         return WIFI_HAL_OPT_FAILED;
834     }
835     pthread_mutex_unlock(GetWpaObjMutex());
836     LOGI("HdiWpaStaStartWpsPbcMode success.");
837     return WIFI_HAL_OPT_OK;
838 }
839 
HdiWpaStaStartWpsPinMode(WifiWpsParam * config,int * pinCode,const char * ifaceName)840 WifiErrorNo HdiWpaStaStartWpsPinMode(WifiWpsParam *config, int *pinCode, const char *ifaceName)
841 {
842     if (ifaceName == NULL) {
843         LOGE("HdiWpaStaStartWpsPinMode ifaceName is null");
844         return WIFI_HAL_OPT_FAILED;
845     }
846     LOGI("HdiWpaStaStartWpsPinMode enter! ifaceName = %{public}s", ifaceName);
847     if (config == NULL || pinCode == NULL) {
848         LOGE("HdiWpaStaStartWpsPinMode: invalid parameter!");
849         return WIFI_HAL_OPT_INVALID_PARAM;
850     }
851 
852     struct HdiWifiWpsParam wpsParam = {0};
853     wpsParam.anyFlag = config->anyFlag;
854     wpsParam.multiAp = config->multiAp;
855     wpsParam.bssid = (uint8_t *)config->bssid;
856     wpsParam.bssidLen = strlen(config->bssid);
857     wpsParam.pinCode = (uint8_t *)config->pinCode;
858     wpsParam.pinCodeLen = strlen(config->pinCode);
859     pthread_mutex_lock(GetWpaObjMutex());
860     struct IWpaInterface *wpaObj = GetWpaInterface();
861     if (wpaObj == NULL) {
862         LOGE("HdiWpaStaStartWpsPinMode: wpaObj is NULL");
863         pthread_mutex_unlock(GetWpaObjMutex());
864         return WIFI_HAL_OPT_FAILED;
865     }
866 
867     int32_t result = wpaObj->WpsPinMode(wpaObj, ifaceName, &wpsParam, pinCode);
868     if (result != HDF_SUCCESS) {
869         LOGE("HdiWpaStaStartWpsPinMode: WpsPbcMode failed result:%{public}d", result);
870         pthread_mutex_unlock(GetWpaObjMutex());
871         return WIFI_HAL_OPT_FAILED;
872     }
873     pthread_mutex_unlock(GetWpaObjMutex());
874     LOGI("HdiWpaStaStartWpsPinMode success.");
875     return WIFI_HAL_OPT_OK;
876 }
877 
HdiStopWpsSta(const char * ifaceName)878 WifiErrorNo HdiStopWpsSta(const char *ifaceName)
879 {
880     if (ifaceName == NULL) {
881         LOGE("HdiStopWpsSta ifaceName is null");
882         return WIFI_HAL_OPT_FAILED;
883     }
884     LOGI("HdiStopWpsSta enter! ifaceName = %{public}s", ifaceName);
885     pthread_mutex_lock(GetWpaObjMutex());
886     struct IWpaInterface *wpaObj = GetWpaInterface();
887     if (wpaObj == NULL) {
888         LOGE("HdiStopWpsSta: wpaObj is NULL");
889         pthread_mutex_unlock(GetWpaObjMutex());
890         return WIFI_HAL_OPT_FAILED;
891     }
892 
893     int32_t result = wpaObj->WpsCancel(wpaObj, ifaceName);
894     if (result != HDF_SUCCESS) {
895         LOGE("HdiStopWpsSta: WpsCancel failed result:%{public}d", result);
896         pthread_mutex_unlock(GetWpaObjMutex());
897         return WIFI_HAL_OPT_FAILED;
898     }
899     pthread_mutex_unlock(GetWpaObjMutex());
900     LOGI("HdiStopWpsSta success.");
901     return WIFI_HAL_OPT_OK;
902 }
903 
HdiWpaStaAutoConnect(int enable,const char * ifaceName)904 WifiErrorNo HdiWpaStaAutoConnect(int enable, const char *ifaceName)
905 {
906     if (ifaceName == NULL) {
907         LOGE("HdiWpaStaAutoConnect ifaceName is null");
908         return WIFI_HAL_OPT_FAILED;
909     }
910     LOGI("HdiWpaStaAutoConnect enter, enable:%{public}d, ifaceName = %{public}s", enable, ifaceName);
911     pthread_mutex_lock(GetWpaObjMutex());
912     struct IWpaInterface *wpaObj = GetWpaInterface();
913     if (wpaObj == NULL) {
914         LOGE("HdiWpaStaAutoConnect: wpaObj is NULL");
915         pthread_mutex_unlock(GetWpaObjMutex());
916         return WIFI_HAL_OPT_FAILED;
917     }
918 
919     int32_t result = wpaObj->AutoConnect(wpaObj, ifaceName, enable);
920     if (result != HDF_SUCCESS) {
921         LOGE("HdiWpaStaAutoConnect: AutoConnect failed result:%{public}d", result);
922         pthread_mutex_unlock(GetWpaObjMutex());
923         return WIFI_HAL_OPT_FAILED;
924     }
925     pthread_mutex_unlock(GetWpaObjMutex());
926     LOGI("HdiWpaStaAutoConnect success.");
927     return WIFI_HAL_OPT_OK;
928 }
929 
HdiWpaStaBlocklistClear(const char * ifaceName)930 WifiErrorNo HdiWpaStaBlocklistClear(const char *ifaceName)
931 {
932     if (ifaceName == NULL) {
933         LOGE("HdiWpaStaBlocklistClear ifaceName is null");
934         return WIFI_HAL_OPT_FAILED;
935     }
936     LOGI("HdiWpaStaBlocklistClear enter! ifaceName = %{public}s", ifaceName);
937     pthread_mutex_lock(GetWpaObjMutex());
938     struct IWpaInterface *wpaObj = GetWpaInterface();
939     if (wpaObj == NULL) {
940         LOGE("HdiWpaStaBlocklistClear: wpaObj is NULL");
941         pthread_mutex_unlock(GetWpaObjMutex());
942         return WIFI_HAL_OPT_FAILED;
943     }
944 
945     int32_t result = wpaObj->BlocklistClear(wpaObj, ifaceName);
946     if (result != HDF_SUCCESS) {
947         LOGE("HdiWpaStaBlocklistClear: BlocklistClear failed result:%{public}d", result);
948         pthread_mutex_unlock(GetWpaObjMutex());
949         return WIFI_HAL_OPT_FAILED;
950     }
951     pthread_mutex_unlock(GetWpaObjMutex());
952     LOGI("HdiWpaStaBlocklistClear success.");
953     return WIFI_HAL_OPT_OK;
954 }
955 
HdiWpaStaSetPowerSave(int enable,const char * ifaceName)956 WifiErrorNo HdiWpaStaSetPowerSave(int enable, const char *ifaceName)
957 {
958     if (ifaceName == NULL) {
959         LOGE("HdiWpaStaSetPowerSave ifaceName is null");
960         return WIFI_HAL_OPT_FAILED;
961     }
962     LOGI("HdiWpaStaSetPowerSave enter, enable:%{public}d, ifaceName = %{public}s", enable, ifaceName);
963     pthread_mutex_lock(GetWpaObjMutex());
964     struct IWpaInterface *wpaObj = GetWpaInterface();
965     if (wpaObj == NULL) {
966         LOGE("HdiWpaStaSetPowerSave: wpaObj is NULL");
967         pthread_mutex_unlock(GetWpaObjMutex());
968         return WIFI_HAL_OPT_FAILED;
969     }
970 
971     int32_t result = wpaObj->SetPowerSave(wpaObj, ifaceName, enable);
972     if (result != HDF_SUCCESS) {
973         LOGE("HdiWpaStaSetPowerSave: SetPowerSave failed result:%{public}d", result);
974         pthread_mutex_unlock(GetWpaObjMutex());
975         return WIFI_HAL_OPT_FAILED;
976     }
977     pthread_mutex_unlock(GetWpaObjMutex());
978     LOGI("HdiWpaStaSetPowerSave success.");
979     return WIFI_HAL_OPT_OK;
980 }
981 
HdiWpaStaSetCountryCode(const char * countryCode,const char * ifaceName)982 WifiErrorNo HdiWpaStaSetCountryCode(const char *countryCode, const char *ifaceName)
983 {
984     if (ifaceName == NULL) {
985         LOGE("HdiWpaStaSetCountryCode ifaceName is null");
986         return WIFI_HAL_OPT_FAILED;
987     }
988     LOGI("HdiWpaStaSetCountryCode enter, enable:%{public}s, ifaceName = %{public}s", countryCode, ifaceName);
989     pthread_mutex_lock(GetWpaObjMutex());
990     struct IWpaInterface *wpaObj = GetWpaInterface();
991     if (wpaObj == NULL) {
992         LOGE("HdiWpaStaSetCountryCode: wpaObj is NULL");
993         pthread_mutex_unlock(GetWpaObjMutex());
994         return WIFI_HAL_OPT_FAILED;
995     }
996 
997     int32_t result = wpaObj->SetCountryCode(wpaObj, ifaceName, countryCode);
998     if (result != HDF_SUCCESS) {
999         LOGE("HdiWpaStaSetCountryCode: SetCountryCode failed result:%{public}d", result);
1000         pthread_mutex_unlock(GetWpaObjMutex());
1001         return WIFI_HAL_OPT_FAILED;
1002     }
1003     pthread_mutex_unlock(GetWpaObjMutex());
1004     LOGI("HdiWpaStaSetCountryCode success.");
1005     return WIFI_HAL_OPT_OK;
1006 }
1007 
HdiWpaStaGetCountryCode(char * countryCode,uint32_t size,const char * ifaceName)1008 WifiErrorNo HdiWpaStaGetCountryCode(char *countryCode, uint32_t size, const char *ifaceName)
1009 {
1010     if (ifaceName == NULL) {
1011         LOGE("HdiWpaStaGetCountryCode ifaceName is null");
1012         return WIFI_HAL_OPT_FAILED;
1013     }
1014     LOGI("HdiWpaStaGetCountryCode enter, enable:%{public}s, ifaceName = %{public}s", countryCode, ifaceName);
1015     pthread_mutex_lock(GetWpaObjMutex());
1016     struct IWpaInterface *wpaObj = GetWpaInterface();
1017     if (wpaObj == NULL) {
1018         LOGE("HdiWpaStaGetCountryCode: wpaObj is NULL");
1019         pthread_mutex_unlock(GetWpaObjMutex());
1020         return WIFI_HAL_OPT_FAILED;
1021     }
1022 
1023     int32_t result = wpaObj->GetCountryCode(wpaObj, ifaceName, countryCode, size);
1024     if (result != HDF_SUCCESS) {
1025         LOGE("HdiWpaStaGetCountryCode: SetCountryCode failed result:%{public}d", result);
1026         pthread_mutex_unlock(GetWpaObjMutex());
1027         return WIFI_HAL_OPT_FAILED;
1028     }
1029     pthread_mutex_unlock(GetWpaObjMutex());
1030     LOGI("HdiWpaStaGetCountryCode success.");
1031     return WIFI_HAL_OPT_OK;
1032 }
1033 
HdiWpaStaSetSuspendMode(int mode,const char * ifaceName)1034 WifiErrorNo HdiWpaStaSetSuspendMode(int mode, const char *ifaceName)
1035 {
1036     if (ifaceName == NULL) {
1037         LOGE("HdiWpaStaSetSuspendMode ifaceName is null");
1038         return WIFI_HAL_OPT_FAILED;
1039     }
1040     LOGI("HdiWpaStaSetSuspendMode enter, mode:%{public}d, ifaceName = %{public}s", mode, ifaceName);
1041     pthread_mutex_lock(GetWpaObjMutex());
1042     struct IWpaInterface *wpaObj = GetWpaInterface();
1043     if (wpaObj == NULL) {
1044         LOGE("HdiWpaStaSetSuspendMode: wpaObj is NULL");
1045         pthread_mutex_unlock(GetWpaObjMutex());
1046         return WIFI_HAL_OPT_FAILED;
1047     }
1048 
1049     int32_t result = wpaObj->SetSuspendMode(wpaObj, ifaceName, mode);
1050     if (result != HDF_SUCCESS) {
1051         LOGE("HdiWpaStaSetSuspendMode: SetSuspendMode failed result:%{public}d", result);
1052         pthread_mutex_unlock(GetWpaObjMutex());
1053         return WIFI_HAL_OPT_FAILED;
1054     }
1055     pthread_mutex_unlock(GetWpaObjMutex());
1056     LOGI("HdiWpaStaSetSuspendMode success.");
1057     return WIFI_HAL_OPT_OK;
1058 }
1059 
HdiWpaListNetworks(struct HdiWifiWpaNetworkInfo * networkList,uint32_t * size,const char * ifaceName)1060 WifiErrorNo HdiWpaListNetworks(struct HdiWifiWpaNetworkInfo *networkList, uint32_t *size, const char *ifaceName)
1061 {
1062     if (ifaceName == NULL) {
1063         LOGE("HdiWpaListNetworks ifaceName is null");
1064         return WIFI_HAL_OPT_FAILED;
1065     }
1066     LOGI("HdiWpaListNetworks enter! ifaceName = %{public}s", ifaceName);
1067     pthread_mutex_lock(GetWpaObjMutex());
1068     struct IWpaInterface *wpaObj = GetWpaInterface();
1069     if (wpaObj == NULL) {
1070         LOGE("HdiWpaListNetworks: wpaObj is NULL");
1071         pthread_mutex_unlock(GetWpaObjMutex());
1072         return WIFI_HAL_OPT_FAILED;
1073     }
1074 
1075     int32_t result = wpaObj->ListNetworks(wpaObj, ifaceName, networkList, size);
1076     if (result != HDF_SUCCESS) {
1077         LOGE("HdiWpaListNetworks: ListNetworks failed result:%{public}d", result);
1078         pthread_mutex_unlock(GetWpaObjMutex());
1079         return WIFI_HAL_OPT_FAILED;
1080     }
1081     pthread_mutex_unlock(GetWpaObjMutex());
1082     LOGI("HdiWpaListNetworks success.");
1083     return WIFI_HAL_OPT_OK;
1084 }
1085 
HdiWpaGetNetwork(int32_t networkId,const char * param,char * value,uint32_t valueLen,const char * ifaceName)1086 WifiErrorNo HdiWpaGetNetwork(
1087     int32_t networkId, const char* param, char* value, uint32_t valueLen, const char *ifaceName)
1088 {
1089     if (ifaceName == NULL) {
1090         LOGE("HdiWpaGetNetwork ifaceName is null");
1091         return WIFI_HAL_OPT_FAILED;
1092     }
1093     LOGI("HdiWpaGetNetwork enter,networkId:%{public}d, ifaceName = %{public}s", networkId, ifaceName);
1094     pthread_mutex_lock(GetWpaObjMutex());
1095     struct IWpaInterface *wpaObj = GetWpaInterface();
1096     if (wpaObj == NULL) {
1097         LOGE("HdiWpaGetNetwork: wpaObj is NULL");
1098         pthread_mutex_unlock(GetWpaObjMutex());
1099         return WIFI_HAL_OPT_FAILED;
1100     }
1101 
1102     int32_t result = wpaObj->GetNetwork(wpaObj, ifaceName, networkId, param, value, valueLen);
1103     if (result != HDF_SUCCESS) {
1104         LOGE("HdiWpaGetNetwork: GetNetwork failed result:%{public}d", result);
1105         pthread_mutex_unlock(GetWpaObjMutex());
1106         return WIFI_HAL_OPT_FAILED;
1107     }
1108     pthread_mutex_unlock(GetWpaObjMutex());
1109     LOGI("HdiWpaGetNetwork success.");
1110     return WIFI_HAL_OPT_OK;
1111 }
1112 
HdiWpaStaSetShellCmd(const char * ifName,const char * cmd)1113 WifiErrorNo HdiWpaStaSetShellCmd(const char *ifName, const char *cmd)
1114 {
1115     pthread_mutex_lock(GetWpaObjMutex());
1116     struct IWpaInterface *wpaObj = GetWpaInterface();
1117     if (wpaObj == NULL) {
1118         LOGE("HdiWpaStaSetShellCmd: wpaObj is NULL");
1119         pthread_mutex_unlock(GetWpaObjMutex());
1120         return WIFI_HAL_OPT_FAILED;
1121     }
1122 
1123     int32_t result = wpaObj->StaShellCmd(wpaObj, ifName, cmd);
1124     if (result != HDF_SUCCESS) {
1125         LOGE("HdiWpaStaSetShellCmd: failed to StaShellCmd, result:%{public}d", result);
1126         pthread_mutex_unlock(GetWpaObjMutex());
1127         return WIFI_HAL_OPT_FAILED;
1128     }
1129     pthread_mutex_unlock(GetWpaObjMutex());
1130     LOGI("HdiWpaStaSetShellCmd success.");
1131     return WIFI_HAL_OPT_OK;
1132 }
1133 
HdiWpaStaGetPskPassphrase(const char * ifName,char * psk,uint32_t pskLen)1134 WifiErrorNo HdiWpaStaGetPskPassphrase(const char *ifName, char *psk, uint32_t pskLen)
1135 {
1136     pthread_mutex_lock(GetWpaObjMutex());
1137     struct IWpaInterface *wpaObj = GetWpaInterface();
1138     if (wpaObj == NULL) {
1139         LOGE("GetPskPassphrase: wpaObj is NULL");
1140         pthread_mutex_unlock(GetWpaObjMutex());
1141         return WIFI_HAL_OPT_FAILED;
1142     }
1143 
1144     int32_t result = wpaObj->GetPskPassphrase(wpaObj, ifName, psk, pskLen);
1145     if (result != HDF_SUCCESS) {
1146         LOGE("GetPskPassphrase: failed to StaShellCmd, result:%{public}d", result);
1147         pthread_mutex_unlock(GetWpaObjMutex());
1148         return WIFI_HAL_OPT_FAILED;
1149     }
1150     pthread_mutex_unlock(GetWpaObjMutex());
1151     LOGI("GetPskPassphrase success.");
1152     return WIFI_HAL_OPT_OK;
1153 }
1154 
HdiSetNativeProcessCallback(void (* callback)(int))1155 WifiErrorNo HdiSetNativeProcessCallback(void (*callback)(int))
1156 {
1157     LOGI("%{public}s enter", __func__);
1158     return SetNativeProcessCallback(callback);
1159 }
1160 
1161 #endif