• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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_CHIP_INTERFACE_SUPPORT
17 
18 #include <unistd.h>
19 #include <net/if.h>
20 #include <sys/ioctl.h>
21 #include <sys/socket.h>
22 #include "hal_device_manage.h"
23 #include "wifi_log.h"
24 #include "wifi_sta_hal_interface.h"
25 #include "wifi_p2p_hal_interface.h"
26 #include "wifi_ap_hal_interface.h"
27 #include "wifi_supplicant_hal_interface.h"
28 #include "servmgr_hdi.h"
29 #include "hdf_remote_service.h"
30 #include "wifi_config_center.h"
31 #include "wifi_hisysevent.h"
32 
33 #undef LOG_TAG
34 #define LOG_TAG "HalDeviceManager"
35 
36 namespace OHOS {
37 namespace Wifi {
38 constexpr const char *CHIP_SERVICE_NAME = "chip_interface_service";
39 std::atomic_bool HalDeviceManager::g_chipHdiServiceDied = false;
40 std::mutex HalDeviceManager::mMutex;
41 static HdfRemoteService *g_chipHdiService = nullptr;
42 static RssiReportCallback g_rssiReportCallback = nullptr;
43 static NetlinkReportCallback g_netlinkReportCallback = nullptr;
44 std::map<std::pair<std::string, IfaceType>, InterfaceCacheEntry> HalDeviceManager::mInterfaceInfoCache;
45 std::map<std::string, sptr<IChipIface>> HalDeviceManager::mIWifiStaIfaces;
46 std::map<std::string, sptr<IChipIface>> HalDeviceManager::mIWifiApIfaces;
47 std::map<std::string, sptr<IChipIface>> HalDeviceManager::mIWifiP2pIfaces;
48 sptr<IChipController> HalDeviceManager::g_IWifi = nullptr;
49 sptr<ChipControllerCallback> HalDeviceManager::g_chipControllerCallback = nullptr;
50 sptr<ChipIfaceCallback> HalDeviceManager::g_chipIfaceCallback = nullptr;
51 OnChipServiceDied HalDeviceManager::g_chipHdiServiceDiedCb = nullptr;
52 constexpr int32_t CMD_SET_MAX_CONNECT = 102;
53 constexpr int32_t MAX_CONNECT_DEFAULT = 8;
54 constexpr int32_t CMD_SET_P2P_HIGH_PERF = 103;
55 
HalDeviceManager()56 HalDeviceManager::HalDeviceManager()
57 {
58     LOGI("HalDeviceManager::HalDeviceManager");
59     mInterfaceInfoCache.clear();
60     mIWifiStaIfaces.clear();
61     mIWifiApIfaces.clear();
62     mIWifiP2pIfaces.clear();
63 }
64 
~HalDeviceManager()65 HalDeviceManager::~HalDeviceManager()
66 {
67     LOGI("HalDeviceManager::~HalDeviceManager");
68 #ifndef __UT__
69     StopChipHdi();
70 #endif
71     ResetHalDeviceManagerInfo(false);
72 }
73 
GetInstance()74 HalDeviceManager &HalDeviceManager::GetInstance()
75 {
76     static HalDeviceManager instance;
77     return instance;
78 }
79 
StartChipHdi()80 bool HalDeviceManager::StartChipHdi()
81 {
82     std::lock_guard<std::mutex> lock(mMutex);
83     LOGI("StartChipHdi start...");
84     if (g_IWifi != nullptr) {
85         bool isInit = false;
86         g_IWifi->IsInit(isInit);
87         if (isInit) {
88             LOGI("has start");
89             return true;
90         }
91     }
92     g_IWifi = IChipController::Get(CHIP_SERVICE_NAME, false);
93     CHECK_NULL_AND_RETURN(g_IWifi, false);
94 
95     if (g_chipControllerCallback == nullptr) {
96         g_chipControllerCallback = new (std::nothrow) ChipControllerCallback();
97     }
98     CHECK_NULL_AND_RETURN(g_chipControllerCallback, false);
99     int32_t ret = g_IWifi->RegisterWifiEventCallback(g_chipControllerCallback);
100     if (ret != HDF_SUCCESS) {
101         LOGE("StartChipHdi, call RegisterWifiEventCallback failed! ret:%{public}d", ret);
102         return false;
103     }
104 
105     if (g_chipIfaceCallback == nullptr) {
106         g_chipIfaceCallback = new (std::nothrow) ChipIfaceCallback();
107     }
108 
109     AddChipHdiDeathRecipient();
110 
111     ret = g_IWifi->Init();
112     if (ret != HDF_SUCCESS) {
113         LOGE("StartChipHdi, call Init failed! ret:%{public}d", ret);
114         return false;
115     }
116     LOGI("StartChipHdi success...");
117     return true;
118 }
119 
StopChipHdi()120 void HalDeviceManager::StopChipHdi()
121 {
122     std::lock_guard<std::mutex> lock(mMutex);
123     LOGI("StopChipHdi start...");
124     CHECK_NULL_AND_RETURN_NULL(g_IWifi);
125     int32_t ret = g_IWifi->Release();
126     if (ret != HDF_SUCCESS) {
127         LOGE("StopChipHdi, call Release failed! ret:%{public}d", ret);
128         return;
129     }
130     LOGI("StopChipHdi success...");
131     return;
132 }
133 
CreateStaIface(const IfaceDestoryCallback & ifaceDestoryCallback,const RssiReportCallback & rssiReportCallback,const NetlinkReportCallback & netlinkReportCallback,std::string & ifaceName,int instId)134 bool HalDeviceManager::CreateStaIface(const IfaceDestoryCallback &ifaceDestoryCallback,
135                                       const RssiReportCallback &rssiReportCallback,
136                                       const NetlinkReportCallback &netlinkReportCallback, std::string &ifaceName,
137                                       int instId)
138 {
139     LOGI("CreateStaIface, ifaceName: %{public}s, instId = %{public}d", ifaceName.c_str(), instId);
140     if (!CheckReloadChipHdiService()) {
141         LOGE("CreateStaIface CheckReloadChipHdiService failed");
142         return false;
143     }
144 
145     std::lock_guard<std::mutex> lock(mMutex);
146     sptr<IChipIface> iface = nullptr;
147     if (!CreateIface(IfaceType::STA, ifaceDestoryCallback, ifaceName, iface)) {
148         LOGE("CreateStaIface failed");
149         return false;
150     }
151 
152     CHECK_NULL_AND_RETURN(iface, false);
153     CHECK_NULL_AND_RETURN(g_chipIfaceCallback, false);
154     if (instId == INSTID_WLAN0) {
155         int32_t ret = iface->RegisterChipIfaceCallBack(g_chipIfaceCallback);
156         if (ret != HDF_SUCCESS) {
157             LOGE("CreateStaIface, call RegisterChipIfaceCallBack failed! ret:%{public}d", ret);
158             return false;
159         }
160         g_rssiReportCallback = rssiReportCallback;
161         g_netlinkReportCallback = netlinkReportCallback;
162     } else {
163         LOGE("CreateStaIface wlan1 skip scan callback instId = %{public}d", instId);
164     }
165 
166     mIWifiStaIfaces[ifaceName] = iface;
167     LOGI("CreateStaIface success! ifaceName:%{public}s", ifaceName.c_str());
168     return true;
169 }
170 
CreateApIface(const IfaceDestoryCallback & ifaceDestoryCallback,std::string & ifaceName)171 bool HalDeviceManager::CreateApIface(const IfaceDestoryCallback &ifaceDestoryCallback, std::string &ifaceName)
172 {
173     if (!CheckReloadChipHdiService()) {
174         return false;
175     }
176 
177     std::lock_guard<std::mutex> lock(mMutex);
178     sptr<IChipIface> iface = nullptr;
179     if (!CreateIface(IfaceType::AP, ifaceDestoryCallback, ifaceName, iface)) {
180         LOGE("CreateApIface failed");
181         return false;
182     }
183 
184     mIWifiApIfaces[ifaceName] = iface;
185     LOGI("CreateApIface success! ifaceName:%{public}s", ifaceName.c_str());
186     return true;
187 }
188 
CreateP2pIface(const IfaceDestoryCallback & ifaceDestoryCallback,std::string & ifaceName)189 bool HalDeviceManager::CreateP2pIface(const IfaceDestoryCallback &ifaceDestoryCallback, std::string &ifaceName)
190 {
191     if (!CheckReloadChipHdiService()) {
192         return false;
193     }
194 
195     std::lock_guard<std::mutex> lock(mMutex);
196     sptr<IChipIface> iface = nullptr;
197     if (!CreateIface(IfaceType::P2P, ifaceDestoryCallback, ifaceName, iface)) {
198         LOGE("CreateP2pIface failed");
199         return false;
200     }
201 
202     mIWifiP2pIfaces[ifaceName] = iface;
203     LOGI("CreateP2pIface success! ifaceName:%{public}s", ifaceName.c_str());
204     return true;
205 }
206 
RemoveStaIface(const std::string & ifaceName)207 bool HalDeviceManager::RemoveStaIface(const std::string &ifaceName)
208 {
209     if (!CheckReloadChipHdiService()) {
210         return false;
211     }
212 
213     std::lock_guard<std::mutex> lock(mMutex);
214     LOGI("RemoveStaIface, ifaceName:%{public}s", ifaceName.c_str());
215     auto iter = mIWifiStaIfaces.find(ifaceName);
216     if (iter == mIWifiStaIfaces.end()) {
217         LOGE("RemoveStaIface, not find iface info");
218         return false;
219     }
220 
221     if (!RemoveIface(iter->second, false, IfaceType::STA)) {
222         LOGE("RemoveStaIface, remove iface failed");
223         return false;
224     }
225 
226     LOGI("RemoveStaIface success");
227     return true;
228 }
229 
RemoveApIface(const std::string & ifaceName)230 bool HalDeviceManager::RemoveApIface(const std::string &ifaceName)
231 {
232     if (!CheckReloadChipHdiService()) {
233         return false;
234     }
235 
236     std::lock_guard<std::mutex> lock(mMutex);
237     LOGI("RemoveApIface, ifaceName:%{public}s", ifaceName.c_str());
238     auto iter = mIWifiApIfaces.find(ifaceName);
239     if (iter == mIWifiApIfaces.end()) {
240         LOGE("RemoveApIface, not find iface info");
241         return false;
242     }
243 
244     if (!RemoveIface(iter->second, false, IfaceType::AP)) {
245         LOGE("RemoveApIface, remove iface failed");
246         return false;
247     }
248 
249     LOGI("RemoveApIface success");
250     return true;
251 }
252 
RemoveP2pIface(const std::string & ifaceName)253 bool HalDeviceManager::RemoveP2pIface(const std::string &ifaceName)
254 {
255     if (!CheckReloadChipHdiService()) {
256         return false;
257     }
258 
259     std::lock_guard<std::mutex> lock(mMutex);
260     LOGI("RemoveP2pIface, ifaceName:%{public}s", ifaceName.c_str());
261     auto iter = mIWifiP2pIfaces.find(ifaceName);
262     if (iter == mIWifiP2pIfaces.end()) {
263         LOGE("RemoveP2pIface, not find iface info");
264         return false;
265     }
266 
267     if (!RemoveIface(iter->second, false, IfaceType::P2P)) {
268         LOGE("RemoveP2pIface, remove iface failed");
269         return false;
270     }
271 
272     LOGI("RemoveP2pIface success");
273     return true;
274 }
275 
Scan(const std::string & ifaceName,const ScanParams & scanParams)276 bool HalDeviceManager::Scan(const std::string &ifaceName, const ScanParams &scanParams)
277 {
278     if (!CheckReloadChipHdiService()) {
279         WriteWifiScanApiFailHiSysEvent("HAL_SCAN", WifiScanFailReason::HDI_SERVICE_DIED);
280         return false;
281     }
282 
283     std::lock_guard<std::mutex> lock(mMutex);
284     LOGD("Scan, ifaceName:%{public}s", ifaceName.c_str());
285     auto iter = mIWifiStaIfaces.find(ifaceName);
286     if (iter == mIWifiStaIfaces.end()) {
287         LOGE("Scan, not find iface info");
288         return false;
289     }
290 
291     sptr<IChipIface> &iface = iter->second;
292     CHECK_NULL_AND_RETURN(iface, false);
293     int32_t ret = iface->StartScan(scanParams);
294     if (ret != HDF_SUCCESS) {
295         LOGE("Scan, call StartScan failed! ret:%{public}d", ret);
296         WriteWifiScanApiFailHiSysEvent("HAL_SCAN", WifiScanFailReason::HDI_SCAN_FAIL);
297         return false;
298     }
299 
300     LOGI("Scan success");
301     return true;
302 }
303 
StartPnoScan(const std::string & ifaceName,const PnoScanParams & scanParams)304 bool HalDeviceManager::StartPnoScan(const std::string &ifaceName, const PnoScanParams &scanParams)
305 {
306     if (!CheckReloadChipHdiService()) {
307         WriteWifiScanApiFailHiSysEvent("HAL_PNO_SCAN", WifiScanFailReason::HDI_SERVICE_DIED);
308         return false;
309     }
310 
311     std::lock_guard<std::mutex> lock(mMutex);
312     LOGI("StartPnoScan, ifaceName:%{public}s", ifaceName.c_str());
313     auto iter = mIWifiStaIfaces.find(ifaceName);
314     if (iter == mIWifiStaIfaces.end()) {
315         LOGE("StartPnoScan, not find iface info");
316         return false;
317     }
318 
319     sptr<IChipIface> &iface = iter->second;
320     CHECK_NULL_AND_RETURN(iface, false);
321     int32_t ret = iface->StartPnoScan(scanParams);
322     if (ret != HDF_SUCCESS) {
323         LOGE("StartPnoScan, call StartPnoScan failed! ret:%{public}d", ret);
324         WriteWifiScanApiFailHiSysEvent("HAL_PNO_SCAN", WifiScanFailReason::HDI_PNO_SCAN_FAIL);
325         return false;
326     }
327 
328     LOGI("StartPnoScan success");
329     return true;
330 }
331 
StopPnoScan(const std::string & ifaceName)332 bool HalDeviceManager::StopPnoScan(const std::string &ifaceName)
333 {
334     if (!CheckReloadChipHdiService()) {
335         WriteWifiScanApiFailHiSysEvent("HAL_PNO_SCAN", WifiScanFailReason::HDI_SERVICE_DIED);
336         return false;
337     }
338 
339     std::lock_guard<std::mutex> lock(mMutex);
340     LOGI("StopPnoScan, ifaceName:%{public}s", ifaceName.c_str());
341     auto iter = mIWifiStaIfaces.find(ifaceName);
342     if (iter == mIWifiStaIfaces.end()) {
343         LOGE("StopPnoScan, not find iface info");
344         return false;
345     }
346 
347     sptr<IChipIface> &iface = iter->second;
348     CHECK_NULL_AND_RETURN(iface, false);
349     int32_t ret = iface->StopPnoScan();
350     if (ret != HDF_SUCCESS) {
351         LOGE("StopPnoScan, call StopPnoScan failed! ret:%{public}d", ret);
352         return false;
353     }
354 
355     LOGI("StopPnoScan success");
356     return true;
357 }
358 
GetScanInfos(const std::string & ifaceName,std::vector<ScanResultsInfo> & scanResultsInfo)359 bool HalDeviceManager::GetScanInfos(const std::string &ifaceName, std::vector<ScanResultsInfo> &scanResultsInfo)
360 {
361     if (!CheckReloadChipHdiService()) {
362         WriteWifiScanApiFailHiSysEvent("HAL_GET_SCAN_INFOS", WifiScanFailReason::HDI_SERVICE_DIED);
363         return false;
364     }
365 
366     std::lock_guard<std::mutex> lock(mMutex);
367     LOGD("GetScanInfos, ifaceName:%{public}s", ifaceName.c_str());
368     auto iter = mIWifiStaIfaces.find(ifaceName);
369     if (iter == mIWifiStaIfaces.end()) {
370         LOGE("GetScanInfos, not find iface info");
371         return false;
372     }
373 
374     sptr<IChipIface> &iface = iter->second;
375     CHECK_NULL_AND_RETURN(iface, false);
376     int32_t ret = iface->GetScanInfos(scanResultsInfo);
377     if (ret != HDF_SUCCESS) {
378         LOGE("GetScanInfos, call GetScanInfos failed! ret:%{public}d", ret);
379         WriteWifiScanApiFailHiSysEvent("HAL_GET_SCAN_INFOS", WifiScanFailReason::HDI_GET_SCAN_INFOS_FAIL);
380         return false;
381     }
382 
383     LOGI("GetScanInfos success, scan info size:%{public}d", static_cast<int>(scanResultsInfo.size()));
384     return true;
385 }
386 
GetConnectSignalInfo(const std::string & ifaceName,SignalPollResult & signalPollResult)387 bool HalDeviceManager::GetConnectSignalInfo(const std::string &ifaceName, SignalPollResult &signalPollResult)
388 {
389     if (!CheckReloadChipHdiService()) {
390         return false;
391     }
392 
393     std::lock_guard<std::mutex> lock(mMutex);
394     LOGD("GetConnectSignalInfo, ifaceName:%{public}s", ifaceName.c_str());
395     auto iter = mIWifiStaIfaces.find(ifaceName);
396     if (iter == mIWifiStaIfaces.end()) {
397         LOGE("GetConnectSignalInfo, not find iface info");
398         return false;
399     }
400 
401     sptr<IChipIface> &iface = iter->second;
402     CHECK_NULL_AND_RETURN(iface, false);
403     int32_t ret = iface->GetSignalPollInfo(signalPollResult);
404     if (ret != HDF_SUCCESS) {
405         LOGE("GetConnectSignalInfo, call GetSignalPollInfo failed! ret:%{public}d", ret);
406         return false;
407     }
408 
409     LOGD("GetConnectSignalInfo success");
410     return true;
411 }
412 
SetPmMode(const std::string & ifaceName,int mode)413 bool HalDeviceManager::SetPmMode(const std::string &ifaceName, int mode)
414 {
415     if (!CheckReloadChipHdiService()) {
416         return false;
417     }
418 
419     std::lock_guard<std::mutex> lock(mMutex);
420     LOGI("SetPmMode, ifaceName:%{public}s, mode:%{public}d", ifaceName.c_str(), mode);
421     auto iter = mIWifiStaIfaces.find(ifaceName);
422     if (iter == mIWifiStaIfaces.end()) {
423         LOGE("SetPmMode, not find iface info");
424         return false;
425     }
426 
427     sptr<IChipIface> &iface = iter->second;
428     CHECK_NULL_AND_RETURN(iface, false);
429     int32_t ret = iface->EnablePowerMode(mode);
430     if (ret != HDF_SUCCESS) {
431         LOGE("SetPmMode, call EnablePowerMode failed! ret:%{public}d", ret);
432         return false;
433     }
434 
435     LOGI("SetPmMode success");
436     return true;
437 }
438 
SetDpiMarkRule(const std::string & ifaceName,int uid,int protocol,int enable)439 bool HalDeviceManager::SetDpiMarkRule(const std::string &ifaceName, int uid, int protocol, int enable)
440 {
441     if (!CheckReloadChipHdiService()) {
442         return false;
443     }
444 
445     std::lock_guard<std::mutex> lock(mMutex);
446     LOGI("SetDpiMarkRule, ifaceName:%{public}s, uid:%{public}d, protocol:%{public}d, enable:%{public}d",
447         ifaceName.c_str(), uid, protocol, enable);
448     auto iter = mIWifiStaIfaces.find(ifaceName);
449     if (iter == mIWifiStaIfaces.end()) {
450         LOGE("SetDpiMarkRule, not find iface info");
451         return false;
452     }
453 
454     sptr<IChipIface> &iface = iter->second;
455     CHECK_NULL_AND_RETURN(iface, false);
456     int32_t ret = iface->SetDpiMarkRule(uid, protocol, enable);
457     if (ret != HDF_SUCCESS) {
458         LOGE("SetDpiMarkRule, call SetDpiMarkRule failed! ret:%{public}d", ret);
459         return false;
460     }
461 
462     LOGI("SetDpiMarkRule success");
463     return true;
464 }
465 
SetStaMacAddress(const std::string & ifaceName,const std::string & mac)466 bool HalDeviceManager::SetStaMacAddress(const std::string &ifaceName, const std::string &mac)
467 {
468     if (!CheckReloadChipHdiService()) {
469         return false;
470     }
471 
472     std::lock_guard<std::mutex> lock(mMutex);
473     LOGI("SetStaMacAddress, ifaceName:%{public}s", ifaceName.c_str());
474     auto iter = mIWifiStaIfaces.find(ifaceName);
475     if (iter == mIWifiStaIfaces.end()) {
476         LOGE("SetStaMacAddress, not find iface info");
477         return false;
478     }
479 
480     sptr<IChipIface> &iface = iter->second;
481     CHECK_NULL_AND_RETURN(iface, false);
482     if (iface->SetIfaceState(false) != HDF_SUCCESS) {
483         LOGE("SetStaMacAddress, set network down fail");
484         return false;
485     }
486     int32_t ret = iface->SetMacAddress(mac);
487     if (ret != HDF_SUCCESS) {
488         LOGE("SetStaMacAddress, call SetMacAddress failed! ret:%{public}d", ret);
489     }
490     if (iface->SetIfaceState(true) != HDF_SUCCESS) {
491         LOGE("SetStaMacAddress, set network up fail");
492         return false;
493     }
494 
495     LOGI("SetStaMacAddress success");
496     return true;
497 }
498 
FindIface(const std::string & ifaceName)499 IChipIface *HalDeviceManager::FindIface(const std::string &ifaceName)
500 {
501     if (ifaceName.empty()) {
502         LOGE("find iface is empty");
503         return nullptr;
504     }
505     auto iter = mIWifiStaIfaces.find(ifaceName);
506     if (iter != mIWifiStaIfaces.end()) {
507         LOGE("find sta iface info");
508         return iter->second;
509     }
510     iter = mIWifiApIfaces.find(ifaceName);
511     if (iter != mIWifiApIfaces.end()) {
512         LOGE("find ap iface info");
513         return iter->second;
514     }
515     iter = mIWifiP2pIfaces.find(ifaceName);
516     if (iter != mIWifiP2pIfaces.end()) {
517         LOGE("find p2p iface info");
518         return iter->second;
519     }
520     return nullptr;
521 }
522 
SetNetworkUpDown(const std::string & ifaceName,bool upDown)523 bool HalDeviceManager::SetNetworkUpDown(const std::string &ifaceName, bool upDown)
524 {
525     std::lock_guard<std::mutex> lock(mMutex);
526     IChipIface *iface = FindIface(ifaceName);
527     if (iface == nullptr) {
528         return false;
529     }
530     if (iface->SetIfaceState(upDown) != HDF_SUCCESS) {
531         return false;
532     }
533     return true;
534 }
535 
GetChipsetCategory(const std::string & ifaceName,uint32_t & chipsetCategory)536 bool HalDeviceManager::GetChipsetCategory(const std::string &ifaceName, uint32_t &chipsetCategory)
537 {
538     if (!CheckReloadChipHdiService()) {
539         return false;
540     }
541 
542     std::lock_guard<std::mutex> lock(mMutex);
543     LOGI("GetChipsetCategory, ifaceName:%{public}s", ifaceName.c_str());
544     sptr<IConcreteChip> chip = nullptr;
545     if (!GetChip(ifaceName, IfaceType::STA, chip)) {
546         LOGE("GetChipsetCategory, get chip failed");
547         return false;
548     }
549 
550     CHECK_NULL_AND_RETURN(chip, false);
551     int32_t ret = chip->GetChipCaps(chipsetCategory);
552     if (ret != HDF_SUCCESS) {
553         LOGE("GetChipsetCategory, call GetChipCaps failed! ret:%{public}d", ret);
554         return false;
555     }
556     LOGI("GetChipsetCategory success");
557     return true;
558 }
559 
GetChipsetWifiFeatrureCapability(const std::string & ifaceName,int & chipsetFeatrureCapability)560 bool HalDeviceManager::GetChipsetWifiFeatrureCapability(const std::string &ifaceName, int &chipsetFeatrureCapability)
561 {
562     if (!CheckReloadChipHdiService()) {
563         return false;
564     }
565 
566     std::lock_guard<std::mutex> lock(mMutex);
567     LOGI("GetChipsetWifiFeatrureCapability, ifaceName:%{public}s", ifaceName.c_str());
568     auto iter = mIWifiStaIfaces.find(ifaceName);
569     if (iter == mIWifiStaIfaces.end()) {
570         LOGE("GetChipsetWifiFeatrureCapability, not find iface info");
571         return false;
572     }
573 
574     sptr<IChipIface> &iface = iter->second;
575     CHECK_NULL_AND_RETURN(iface, false);
576     uint32_t capabilities = 0;
577     int32_t ret = iface->GetIfaceCap(capabilities);
578     if (ret != HDF_SUCCESS) {
579         LOGE("GetChipsetWifiFeatrureCapability, call GetIfaceCap failed! ret:%{public}d", ret);
580         return false;
581     }
582     chipsetFeatrureCapability = capabilities;
583     LOGI("GetChipsetWifiFeatrureCapability success");
584     return true;
585 }
586 
GetFrequenciesByBand(const std::string & ifaceName,int32_t band,std::vector<int> & frequencies)587 bool HalDeviceManager::GetFrequenciesByBand(const std::string &ifaceName, int32_t band, std::vector<int> &frequencies)
588 {
589     if (!CheckReloadChipHdiService()) {
590         return false;
591     }
592 
593     std::lock_guard<std::mutex> lock(mMutex);
594     LOGI("GetFrequenciesByBand, ifaceName:%{public}s, band:%{public}d", ifaceName.c_str(), band);
595     auto iter = FindIface(ifaceName);
596     if (iter != nullptr) {
597         std::vector<uint32_t> uifrequencies;
598         int32_t ret = iter->GetSupportFreqs(band, uifrequencies);
599         if (ret != HDF_SUCCESS) {
600             LOGE("GetFrequenciesByBand, call GetSupportFreqs failed! ret:%{public}d", ret);
601             return false;
602         }
603         for (auto item : uifrequencies) {
604             frequencies.emplace_back(item);
605         }
606         return true;
607     }
608     LOGI("GetFrequenciesByBand failed");
609     return false;
610 }
611 
SetPowerModel(const std::string & ifaceName,int model)612 bool HalDeviceManager::SetPowerModel(const std::string &ifaceName, int model)
613 {
614     if (!CheckReloadChipHdiService()) {
615         return false;
616     }
617 
618     std::lock_guard<std::mutex> lock(mMutex);
619     LOGI("SetPowerModel, ifaceName:%{public}s, model:%{public}d", ifaceName.c_str(), model);
620     auto iter = mIWifiApIfaces.find(ifaceName);
621     if (iter == mIWifiApIfaces.end()) {
622         LOGE("SetPowerModel, not find iface info");
623         return false;
624     }
625 
626     sptr<IChipIface> &iface = iter->second;
627     CHECK_NULL_AND_RETURN(iface, false);
628     int32_t ret = iface->SetPowerMode(model);
629     if (ret != HDF_SUCCESS) {
630         LOGE("SetPowerModel, call SetPowerMode failed! ret:%{public}d", ret);
631         return false;
632     }
633 
634     LOGI("SetPowerModel success");
635     return true;
636 }
637 
SetTxPower(int power)638 bool HalDeviceManager::SetTxPower(int power)
639 {
640     if (!CheckReloadChipHdiService()) {
641         return false;
642     }
643 
644     std::lock_guard<std::mutex> lock(mMutex);
645     int32_t staResult = IfaceSetTxPower(WifiConfigCenter::GetInstance().GetStaIfaceName(),
646                                         mIWifiStaIfaces, power);
647     int32_t p2pResult = IfaceSetTxPower(WifiConfigCenter::GetInstance().GetP2pIfaceName(),
648                                         mIWifiP2pIfaces, power);
649     int32_t apResult = IfaceSetTxPower(WifiConfigCenter::GetInstance().GetApIfaceName(),
650                                        mIWifiApIfaces, power);
651     LOGI("SetTxPower, result:sta:%{public}d, p2p:%{public}d, ap:%{public}d",
652         staResult, p2pResult, apResult);
653     if (staResult == HDF_SUCCESS || p2pResult == HDF_SUCCESS || apResult == HDF_SUCCESS) {
654         LOGE("SetTxPower success");
655         return true;
656     }
657     return false;
658 }
659 
IfaceSetTxPower(const std::string & ifaceName,const std::map<std::string,sptr<IChipIface>> & mWifiIfaces,int power)660 int32_t HalDeviceManager::IfaceSetTxPower(
661     const std::string &ifaceName, const std::map<std::string, sptr<IChipIface>> &mWifiIfaces, int power)
662 {
663     int32_t result = HDF_FAILURE;
664     auto iter = mWifiIfaces.find(ifaceName);
665     if (iter != mWifiIfaces.end()) {
666         const sptr<IChipIface> &iface = iter->second;
667         CHECK_NULL_AND_RETURN(iface, false);
668         int32_t result = iface->SetTxPower(power);
669         if (result != HDF_SUCCESS) {
670             LOGE("SetTxPower, call SetTxPower failed! Result:%{public}d", result);
671         }
672         return result;
673     }
674     LOGI("can not find iface:%{public}s", ifaceName.c_str());
675     return result;
676 }
GetPowerModel(const std::string & ifaceName,int & model)677 bool HalDeviceManager::GetPowerModel(const std::string &ifaceName, int &model)
678 {
679     if (!CheckReloadChipHdiService()) {
680         return false;
681     }
682 
683     std::lock_guard<std::mutex> lock(mMutex);
684     LOGI("GetPowerModel, ifaceName:%{public}s", ifaceName.c_str());
685     auto iter = mIWifiApIfaces.find(ifaceName);
686     if (iter == mIWifiApIfaces.end()) {
687         LOGE("GetPowerModel, not find iface info");
688         return false;
689     }
690 
691     sptr<IChipIface> &iface = iter->second;
692     CHECK_NULL_AND_RETURN(iface, false);
693     int32_t ret = iface->GetPowerMode(model);
694     if (ret != HDF_SUCCESS) {
695         LOGE("GetPowerModel, call GetPowerMode failed! ret:%{public}d", ret);
696         return false;
697     }
698 
699     LOGI("GetPowerModel success");
700     return true;
701 }
702 
SetWifiCountryCode(const std::string & ifaceName,const std::string & code)703 bool HalDeviceManager::SetWifiCountryCode(const std::string &ifaceName, const std::string &code)
704 {
705     if (!CheckReloadChipHdiService()) {
706         return false;
707     }
708 
709     std::lock_guard<std::mutex> lock(mMutex);
710     LOGI("SetWifiCountryCode, ifaceName:%{public}s", ifaceName.c_str());
711     auto staIter = mIWifiStaIfaces.find(ifaceName);
712     if (staIter != mIWifiStaIfaces.end()) {
713         sptr<IChipIface> &iface = staIter->second;
714         CHECK_NULL_AND_RETURN(iface, false);
715         int32_t ret = iface->SetCountryCode(code);
716         if (ret != HDF_SUCCESS) {
717             LOGE("SetWifiCountryCode, call SetCountryCode failed! ret:%{public}d", ret);
718             return false;
719         }
720         LOGI("Sta setWifiCountryCode success");
721         return true;
722     }
723 
724     auto apIter = mIWifiApIfaces.find(ifaceName);
725     if (apIter != mIWifiApIfaces.end()) {
726         sptr<IChipIface> &iface = apIter->second;
727         CHECK_NULL_AND_RETURN(iface, false);
728         int32_t ret = iface->SetCountryCode(code);
729         if (ret != HDF_SUCCESS) {
730             LOGE("SetWifiCountryCode, call SetCountryCode failed! ret:%{public}d", ret);
731             return false;
732         }
733         LOGI("Ap setWifiCountryCode success");
734         return true;
735     }
736     LOGE("SetWifiCountryCode, not find iface info");
737     return false;
738 }
739 
SetApMacAddress(const std::string & ifaceName,const std::string & mac)740 bool HalDeviceManager::SetApMacAddress(const std::string &ifaceName, const std::string &mac)
741 {
742     if (!CheckReloadChipHdiService()) {
743         return false;
744     }
745 
746     std::lock_guard<std::mutex> lock(mMutex);
747     LOGI("SetApMacAddress, ifaceName:%{public}s", ifaceName.c_str());
748     auto iter = mIWifiApIfaces.find(ifaceName);
749     if (iter == mIWifiApIfaces.end()) {
750         LOGE("SetApMacAddress, not find iface info");
751         return false;
752     }
753 
754     sptr<IChipIface> &iface = iter->second;
755     CHECK_NULL_AND_RETURN(iface, false);
756     if (iface->SetIfaceState(false) != HDF_SUCCESS) {
757         LOGE("SetStaMacAddress, set network down fail");
758         return false;
759     }
760     int32_t ret = iface->SetMacAddress(mac);
761     if (ret != HDF_SUCCESS) {
762         LOGE("SetApMacAddress, call SetMacAddress failed! ret:%{public}d", ret);
763     }
764     if (iface->SetIfaceState(true) != HDF_SUCCESS) {
765         LOGE("SetStaMacAddress, set network up fail");
766         return false;
767     }
768     LOGI("SetApMacAddress success");
769     return true;
770 }
771 
SendCmdToDriver(const std::string & ifaceName,const std::string & interfaceName,int cmd,const std::string & param,std::string & result)772 bool HalDeviceManager::SendCmdToDriver(const std::string &ifaceName, const std::string &interfaceName,
773     int cmd, const std::string &param, std::string &result)
774 {
775     if (!CheckReloadChipHdiService()) {
776         return false;
777     }
778     std::lock_guard<std::mutex> lock(mMutex);
779     LOGI("SendCmdToDriver, ifaceName:%{public}s, cmd:%{public}d", ifaceName.c_str(), cmd);
780     sptr<IChipIface> iface = nullptr;
781     if (auto iter = mIWifiP2pIfaces.find(ifaceName); iter != mIWifiP2pIfaces.end()) {
782         iface = iter->second;
783     } else if (auto iter = mIWifiApIfaces.find(ifaceName); iter != mIWifiApIfaces.end()) {
784         iface = iter->second;
785     } else {
786         LOGE("SendCmdToDriver, not find iface info");
787         return false;
788     }
789     CHECK_NULL_AND_RETURN(iface, false);
790 
791     std::vector<int8_t> paramBuf;
792     for (auto c : param) {
793         int8_t cc = c;
794         paramBuf.push_back(cc);
795     }
796     std::vector<int8_t> resultBuf;
797     int32_t ret = iface->SendCmdToDriver(interfaceName, cmd, paramBuf, resultBuf);
798     if (ret != HDF_SUCCESS) {
799         LOGE("SendCmdToDriver, call SendCmdToDriver failed! ret:%{public}d", ret);
800     }
801     if (!resultBuf.empty()) {
802         result.assign(resultBuf.begin(), resultBuf.end());
803     }
804     LOGI("SendCmdToDriver success");
805     return true;
806 }
807 
MakeMacFilterString(const std::vector<std::string> & blockList)808 std::string HalDeviceManager::MakeMacFilterString(const std::vector<std::string> &blockList)
809 {
810     if (blockList.empty()) {
811         return "MAC_MODE=0,MAC_CNT=0";
812     }
813     int macCount = static_cast<int>(blockList.size());
814     std::string macs = "MAC_MODE=1,MAC_CNT=" + std::to_string(macCount);
815     for (auto mac : blockList) {
816         mac.erase(std::remove(mac.begin(), mac.end(), ':'), mac.end());
817         macs.append(",MAC=").append(mac);
818     }
819     return macs;
820 }
821 
SetBlockList(const std::string & ifaceName,const std::string & interfaceName,const std::vector<std::string> & blockList)822 bool HalDeviceManager::SetBlockList(const std::string &ifaceName, const std::string &interfaceName,
823     const std::vector<std::string> &blockList)
824 {
825     const int setMacFilterCmd = 100;
826     std::string macFilterStr = MakeMacFilterString(blockList);
827     std::string result;
828     return SendCmdToDriver(ifaceName, interfaceName, setMacFilterCmd, macFilterStr, result);
829 }
830 
DisAssociateSta(const std::string & ifaceName,const std::string & interfaceName,std::string mac)831 bool HalDeviceManager::DisAssociateSta(const std::string &ifaceName, const std::string &interfaceName,
832     std::string mac)
833 {
834     const int disAssociateStaCmd = 101;
835     mac.erase(std::remove(mac.begin(), mac.end(), ':'), mac.end());
836     std::string result;
837     return SendCmdToDriver(ifaceName, interfaceName, disAssociateStaCmd, mac, result);
838 }
839 
SetMaxConnectNum(const std::string & ifaceName,int32_t channel,int32_t maxConn)840 bool HalDeviceManager::SetMaxConnectNum(const std::string &ifaceName, int32_t channel, int32_t maxConn)
841 {
842     if (maxConn > MAX_CONNECT_DEFAULT) {
843         LOGW("SetMaxConnectNum maxConn is over MAX_CONNECT_DEFAULT, maxConn is %{public}d", maxConn);
844         maxConn = MAX_CONNECT_DEFAULT;
845     }
846     std::string param = std::to_string(channel) + '.' + std::to_string(maxConn);
847     LOGI("SetMaxConnectNum param is %{public}s", param.c_str());
848     std::string result;
849     return SendCmdToDriver(ifaceName, ifaceName, CMD_SET_MAX_CONNECT, param, result);
850 }
851 
SetP2pHighPerf(const std::string & ifaceName,bool isEnable)852 bool HalDeviceManager::SetP2pHighPerf(const std::string &ifaceName, bool isEnable)
853 {
854     std::string param = std::to_string(static_cast<int>(isEnable));
855     LOGI("SetP2pHighPerf param is %{public}s", param.c_str());
856     std::string result;
857     return SendCmdToDriver(ifaceName, ifaceName, CMD_SET_P2P_HIGH_PERF, param, result);
858 }
859 
ResetHalDeviceManagerInfo(bool isRemoteDied)860 void HalDeviceManager::ResetHalDeviceManagerInfo(bool isRemoteDied)
861 {
862     std::lock_guard<std::mutex> lock(mMutex);
863     if (isRemoteDied) {
864         WifiP2PHalInterface::GetInstance().StopP2p();
865         WifiStaHalInterface::GetInstance().StopWifi();
866         WifiApHalInterface::GetInstance().StopAp();
867     }
868     if (!g_chipControllerCallback) {
869         g_chipControllerCallback = nullptr;
870     }
871     if (!g_chipIfaceCallback) {
872         g_chipIfaceCallback = nullptr;
873     }
874     if (!g_IWifi) {
875         g_IWifi = nullptr;
876     }
877     mInterfaceInfoCache.clear();
878     mIWifiStaIfaces.clear();
879     mIWifiApIfaces.clear();
880     mIWifiP2pIfaces.clear();
881     if (g_chipHdiServiceDiedCb && isRemoteDied) {
882         g_chipHdiServiceDiedCb();
883     }
884     return;
885 }
886 
CheckReloadChipHdiService()887 bool HalDeviceManager::CheckReloadChipHdiService()
888 {
889     if (!g_chipHdiServiceDied) {
890         if (!CheckChipHdiStarted()) {
891             LOGE("chip hdi is not started");
892             return false;
893         }
894         return true;
895     }
896 
897     if (!StartChipHdi()) {
898         LOGE("reload chip hdi service failed");
899         return false;
900     }
901 
902     g_chipHdiServiceDied = false;
903     LOGI("reload chip hdi service success");
904     return true;
905 }
906 
CheckChipHdiStarted()907 bool HalDeviceManager::CheckChipHdiStarted()
908 {
909     std::lock_guard<std::mutex> lock(mMutex);
910     bool isStarted = false;
911     CHECK_NULL_AND_RETURN(g_IWifi, false);
912     int32_t ret = g_IWifi->IsInit(isStarted);
913     if (ret != HDF_SUCCESS) {
914         LOGE("CheckChipHdiStarted, call IsInit failed! ret:%{public}d", ret);
915         return false;
916     }
917 
918     LOGD("CheckChipHdiStarted, isStarted:%{public}d", isStarted);
919     if (!isStarted) {
920         ret = g_IWifi->Init();
921         if (ret != HDF_SUCCESS) {
922             LOGE("CheckChipHdiStarted, call Init failed! ret:%{public}d", ret);
923             return false;
924         }
925     }
926     return true;
927 }
928 
GetIfaceName(sptr<IChipIface> & iface,std::string & ifaceName)929 bool HalDeviceManager::GetIfaceName(sptr<IChipIface> &iface, std::string &ifaceName)
930 {
931     CHECK_NULL_AND_RETURN(iface, false);
932     int32_t ret = iface->GetIfaceName(ifaceName);
933     if (ret != HDF_SUCCESS) {
934         LOGE("GetIfaceName, call GetIfaceName failed! ret:%{public}d", ret);
935         return false;
936     }
937 
938     LOGI("GetIfaceName, ifaceName:%{public}s", ifaceName.c_str());
939     return true;
940 }
941 
GetIfaceType(sptr<IChipIface> & iface,IfaceType & ifaceType)942 bool HalDeviceManager::GetIfaceType(sptr<IChipIface> &iface, IfaceType &ifaceType)
943 {
944     CHECK_NULL_AND_RETURN(iface, false);
945     int32_t ret = iface->GetIfaceType(ifaceType);
946     if (ret != HDF_SUCCESS) {
947         LOGE("GetIfaceType, call GetIfaceType failed! ret:%{public}d", ret);
948         return false;
949     }
950 
951     LOGI("GetIfaceType, ifaceType:%{public}d", static_cast<int>(ifaceType));
952     return true;
953 }
954 
GetP2pIfaceInfo(WifiChipInfo & wifiChipInfo)955 void HalDeviceManager::GetP2pIfaceInfo(WifiChipInfo &wifiChipInfo)
956 {
957     CHECK_NULL_AND_RETURN_NULL(wifiChipInfo.chip);
958     WifiIfaceInfo wifiIfaceInfo;
959     std::vector<std::string> ifnames;
960     std::vector<WifiIfaceInfo> ifaceInfo;
961 
962     int32_t ret = wifiChipInfo.chip->GetP2pServiceIfNames(ifnames);
963     if (ret == HDF_SUCCESS) {
964         for (uint32_t i = 0; i < ifnames.size(); ++i) {
965             wifiIfaceInfo.Clear();
966             ret = wifiChipInfo.chip->GetP2pService(ifnames[i], wifiIfaceInfo.iface);
967             if (ret != HDF_SUCCESS) {
968                 LOGE("GetIfaceType, call GetP2pService failed! ret:%{public}d", ret);
969                 break;
970             }
971             wifiIfaceInfo.name = ifnames[i];
972             ifaceInfo.emplace_back(wifiIfaceInfo);
973         }
974     } else {
975         LOGE("GetIfaceType, call GetP2pServiceIfNames failed! ret:%{public}d", ret);
976     }
977     wifiChipInfo.ifaces[IfaceType::P2P] = ifaceInfo;
978     return;
979 }
980 
GetApIfaceInfo(WifiChipInfo & wifiChipInfo)981 void HalDeviceManager::GetApIfaceInfo(WifiChipInfo &wifiChipInfo)
982 {
983     CHECK_NULL_AND_RETURN_NULL(wifiChipInfo.chip);
984     WifiIfaceInfo wifiIfaceInfo;
985     std::vector<std::string> ifnames;
986     std::vector<WifiIfaceInfo> ifaceInfo;
987 
988     int32_t ret = wifiChipInfo.chip->GetApServiceIfNames(ifnames);
989     if (ret == HDF_SUCCESS) {
990         for (uint32_t i = 0; i < ifnames.size(); ++i) {
991             wifiIfaceInfo.Clear();
992             ret = wifiChipInfo.chip->GetApService(ifnames[i], wifiIfaceInfo.iface);
993             if (ret != HDF_SUCCESS) {
994                 LOGE("GetApIfaceInfo, call GetApService failed! ret:%{public}d", ret);
995                 break;
996             }
997             wifiIfaceInfo.name = ifnames[i];
998             ifaceInfo.emplace_back(wifiIfaceInfo);
999         }
1000     } else {
1001         LOGE("GetApIfaceInfo, call GetApServiceIfNames failed! ret:%{public}d", ret);
1002     }
1003     wifiChipInfo.ifaces[IfaceType::AP] = ifaceInfo;
1004     return;
1005 }
1006 
GetStaIfaceInfo(WifiChipInfo & wifiChipInfo)1007 void HalDeviceManager::GetStaIfaceInfo(WifiChipInfo &wifiChipInfo)
1008 {
1009     CHECK_NULL_AND_RETURN_NULL(wifiChipInfo.chip);
1010     WifiIfaceInfo wifiIfaceInfo;
1011     std::vector<std::string> ifnames;
1012     std::vector<WifiIfaceInfo> ifaceInfo;
1013 
1014     int32_t ret = wifiChipInfo.chip->GetStaServiceIfNames(ifnames);
1015     if (ret == HDF_SUCCESS) {
1016         for (uint32_t i = 0; i < ifnames.size(); ++i) {
1017             wifiIfaceInfo.Clear();
1018             ret = wifiChipInfo.chip->GetStaService(ifnames[i], wifiIfaceInfo.iface);
1019             if (ret != HDF_SUCCESS) {
1020                 LOGE("GetStaIfaceInfo, call GetStaService failed! ret:%{public}d", ret);
1021                 break;
1022             }
1023             wifiIfaceInfo.name = ifnames[i];
1024             ifaceInfo.emplace_back(wifiIfaceInfo);
1025         }
1026     } else {
1027         LOGE("GetStaIfaceInfo, call GetStaServiceIfNames failed! ret:%{public}d", ret);
1028     }
1029     wifiChipInfo.ifaces[IfaceType::STA] = ifaceInfo;
1030     return;
1031 }
1032 
GetIfaceInfo(WifiChipInfo & wifiChipInfo)1033 bool HalDeviceManager::GetIfaceInfo(WifiChipInfo &wifiChipInfo)
1034 {
1035     GetStaIfaceInfo(wifiChipInfo);
1036     GetApIfaceInfo(wifiChipInfo);
1037     GetP2pIfaceInfo(wifiChipInfo);
1038     return true;
1039 }
1040 
GetChipInfo(uint32_t chipId,WifiChipInfo & wifiChipInfo)1041 bool HalDeviceManager::GetChipInfo(uint32_t chipId, WifiChipInfo &wifiChipInfo)
1042 {
1043     CHECK_NULL_AND_RETURN(g_IWifi, false);
1044     int32_t ret = g_IWifi->GetChipService(chipId, wifiChipInfo.chip);
1045     if (ret != HDF_SUCCESS) {
1046         LOGE("GetChipInfo, call GetChipService failed! ret:%{public}d", ret);
1047         return false;
1048     }
1049 
1050     CHECK_NULL_AND_RETURN(wifiChipInfo.chip, false);
1051     ret = wifiChipInfo.chip->GetChipModes(wifiChipInfo.availableModes);
1052     if (ret != HDF_SUCCESS) {
1053         LOGE("GetChipInfo, call GetChipModes failed! ret:%{public}d", ret);
1054         return false;
1055     }
1056 
1057     ret = wifiChipInfo.chip->GetCurrentMode(wifiChipInfo.currentModeId);
1058     if (ret == HDF_SUCCESS) {
1059         LOGI("GetChipInfo, GetCurrentMode:%{public}d", wifiChipInfo.currentModeId);
1060         wifiChipInfo.currentModeIdValid = true;
1061     } else if (ret == HDF_ERR_INVALID_PARAM) {
1062         LOGI("GetChipInfo, currentModeId not available");
1063     } else {
1064         LOGE("GetChipInfo, call GetCurrentMode failed! ret:%{public}d", ret);
1065         return false;
1066     }
1067 
1068     if (!GetIfaceInfo(wifiChipInfo)) {
1069         LOGE("GetChipInfo, GetIfaceInfo failed!");
1070         return false;
1071     }
1072 
1073     return true;
1074 }
1075 
GetAllChipInfo(std::vector<WifiChipInfo> & wifiChipInfos)1076 bool HalDeviceManager::GetAllChipInfo(std::vector<WifiChipInfo> &wifiChipInfos)
1077 {
1078     LOGI("GetAllChipInfo start");
1079     std::vector<uint32_t> chipIds;
1080     CHECK_NULL_AND_RETURN(g_IWifi, false);
1081     int32_t ret = g_IWifi->GetAvailableChips(chipIds);
1082     if (ret != HDF_SUCCESS) {
1083         LOGE("GetAllChipInfo, call GetAvailableChips failed! ret:%{public}d", ret);
1084         return false;
1085     }
1086 
1087     if (chipIds.empty()) {
1088         LOGE("GetAllChipInfo, chipIds is empty!");
1089         return false;
1090     }
1091 
1092     for (uint32_t i = 0; i < chipIds.size(); ++i) {
1093         WifiChipInfo wifiChipInfo;
1094         if (GetChipInfo(chipIds[i], wifiChipInfo)) {
1095             wifiChipInfo.chipId = chipIds[i];
1096             wifiChipInfos.emplace_back(wifiChipInfo);
1097         }
1098     }
1099 
1100     LOGI("GetAllChipInfo end");
1101     return true;
1102 }
1103 
ValidateInterfaceCache(std::vector<WifiChipInfo> & wifiChipInfos)1104 bool HalDeviceManager::ValidateInterfaceCache(std::vector<WifiChipInfo> &wifiChipInfos)
1105 {
1106     if (mInterfaceInfoCache.empty()) {
1107         LOGI("ValidateInterfaceCache, mInterfaceInfoCache is empty!");
1108         return true;
1109     }
1110 
1111     for (auto &interfaceInfo : mInterfaceInfoCache) {
1112         WifiChipInfo matchingChipInfo;
1113         for (auto &chipInfo : wifiChipInfos) {
1114             if (chipInfo.chipId == interfaceInfo.second.chipId) {
1115                 matchingChipInfo = chipInfo;
1116                 break;
1117             }
1118         }
1119 
1120         if (matchingChipInfo.chip == nullptr) {
1121             LOGE("ValidateInterfaceCache, chipInfo not found!");
1122             return false;
1123         }
1124 
1125         std::vector<WifiIfaceInfo> &ifaceInfos = matchingChipInfo.ifaces[interfaceInfo.second.type];
1126         if (ifaceInfos.empty()) {
1127             LOGE("ValidateInterfaceCache, invalid type!");
1128             return false;
1129         }
1130 
1131         bool matchFound = false;
1132         for (auto &ifaceInfo : ifaceInfos) {
1133             if (ifaceInfo.name == interfaceInfo.second.name) {
1134                 matchFound = true;
1135                 break;
1136             }
1137         }
1138 
1139         if (!matchFound) {
1140             LOGE("ValidateInterfaceCache, ifaceInfo not found!");
1141             return false;
1142         }
1143     }
1144 
1145     LOGI("ValidateInterfaceCache, verify ok!");
1146     return true;
1147 }
1148 
SelectInterfacesToDelete(int excessInterfaces,IfaceType requestedIfaceType,IfaceType existingIfaceType,std::vector<WifiIfaceInfo> & existingIface,std::vector<WifiIfaceInfo> & interfacesToBeRemovedFirst)1149 void HalDeviceManager::SelectInterfacesToDelete(int excessInterfaces, IfaceType requestedIfaceType,
1150     IfaceType existingIfaceType, std::vector<WifiIfaceInfo> &existingIface,
1151     std::vector<WifiIfaceInfo> &interfacesToBeRemovedFirst)
1152 {
1153     bool lookupError = false;
1154     std::vector<WifiIfaceInfo> ifacesToDelete;
1155     for (int i = existingIface.size() - 1; i >= 0; i--) {
1156         WifiIfaceInfo info = existingIface[i];
1157         IfaceType ifaceType = IFACE_TYPE_DEFAULT;
1158         GetIfaceType(info.iface, ifaceType);
1159         auto iter = mInterfaceInfoCache.find(std::pair<std::string, IfaceType>(info.name, ifaceType));
1160         if (iter == mInterfaceInfoCache.end()) {
1161             LOGE("SelectInterfacesToDelete, can't find cache interface info! info name:%{public}s", info.name.c_str());
1162             lookupError = true;
1163             break;
1164         }
1165 
1166         if (AllowedToBeDeleteIfaceTypeForRequestedType(requestedIfaceType, existingIfaceType)) {
1167             ifacesToDelete.emplace_back(info);
1168         }
1169     }
1170 
1171     if (lookupError) {
1172         LOGE("SelectInterfacesToDelete, falling back to arbitrary selection");
1173         for (int i = 0; i < excessInterfaces; ++i) {
1174             interfacesToBeRemovedFirst.emplace_back(existingIface[i]);
1175         }
1176     } else {
1177         int numIfacesToDelete = std::min(excessInterfaces, static_cast<int>(ifacesToDelete.size()));
1178         for (int i = 0; i < numIfacesToDelete; ++i) {
1179             interfacesToBeRemovedFirst.emplace_back(ifacesToDelete[i]);
1180         }
1181     }
1182 
1183     return;
1184 }
1185 
AllowedToBeDeleteIfaceTypeForRequestedType(IfaceType requestedIfaceType,IfaceType existingIfaceType)1186 bool HalDeviceManager::AllowedToBeDeleteIfaceTypeForRequestedType(IfaceType requestedIfaceType,
1187     IfaceType existingIfaceType)
1188 {
1189     LOGI("AllowedToBeDeleteIfaceTypeForRequestedType, requestedIfaceType:%{public}d, existingIfaceType:%{public}d",
1190         requestedIfaceType, existingIfaceType);
1191     if (requestedIfaceType == existingIfaceType) {
1192         LOGI("AllowedToBeDeleteIfaceTypeForRequestedType, not allowed to delete");
1193         return false;
1194     }
1195 
1196     LOGI("AllowedToBeDeleteIfaceTypeForRequestedType, allowed to delete");
1197     return true;
1198 }
1199 
CreateTheNeedChangeChipModeIfaceData(WifiChipInfo & wifiChipInfo,IfaceType createIfaceType,UsableMode & chipMode,IfaceCreationData & ifaceCreationData)1200 bool HalDeviceManager::CreateTheNeedChangeChipModeIfaceData(WifiChipInfo &wifiChipInfo, IfaceType createIfaceType,
1201     UsableMode &chipMode, IfaceCreationData &ifaceCreationData)
1202 {
1203     for (auto type : IFACE_TYPES_BY_PRIORITY) {
1204         if (!wifiChipInfo.ifaces[type].empty()) {
1205             if (!AllowedToBeDeleteIfaceTypeForRequestedType(createIfaceType, type)) {
1206                 LOGE("CreateTheNeedChangeChipModeIfaceData, chip mode need change, not allowed to delete");
1207                 return false;
1208             }
1209         }
1210     }
1211 
1212     ifaceCreationData.chipInfo = wifiChipInfo;
1213     ifaceCreationData.chipModeId = chipMode.modeId;
1214     LOGI("CreateTheNeedChangeChipModeIfaceData, chip mode need change, create a new iface data");
1215     return true;
1216 }
1217 
CanIfaceComboSupportRequest(WifiChipInfo & wifiChipInfo,UsableMode & chipMode,std::vector<int> & chipIfaceCombo,IfaceType createIfaceType,IfaceCreationData & ifaceCreationData)1218 bool HalDeviceManager::CanIfaceComboSupportRequest(WifiChipInfo &wifiChipInfo, UsableMode &chipMode,
1219     std::vector<int> &chipIfaceCombo, IfaceType createIfaceType, IfaceCreationData &ifaceCreationData)
1220 {
1221     if (chipIfaceCombo[createIfaceType] == 0) {
1222         LOGE("CanIfaceComboSupportRequest, request type not support by combo");
1223         return false;
1224     }
1225 
1226     bool isChipModeChangeProposed = wifiChipInfo.currentModeIdValid && wifiChipInfo.currentModeId != chipMode.modeId;
1227     if (isChipModeChangeProposed) {
1228         return CreateTheNeedChangeChipModeIfaceData(wifiChipInfo, createIfaceType, chipMode, ifaceCreationData);
1229     }
1230 
1231     for (auto type : IFACE_TYPES_BY_PRIORITY) {
1232         int tooManyInterfaces = static_cast<int>(wifiChipInfo.ifaces[type].size()) - chipIfaceCombo[type];
1233         if (createIfaceType == type) {
1234             tooManyInterfaces += 1;
1235         }
1236 
1237         if (tooManyInterfaces > 0) {
1238             if (wifiChipInfo.ifaces[type].empty()) {
1239                 LOGE("CanIfaceComboSupportRequest, existing ifaces is empty");
1240                 return false;
1241             }
1242 
1243             if (!AllowedToBeDeleteIfaceTypeForRequestedType(createIfaceType, type)) {
1244                 LOGE("CanIfaceComboSupportRequest, not allowed to delete");
1245                 return false;
1246             }
1247 
1248             SelectInterfacesToDelete(tooManyInterfaces, createIfaceType, type, wifiChipInfo.ifaces[type],
1249                 ifaceCreationData.interfacesToBeRemovedFirst);
1250         }
1251     }
1252 
1253     ifaceCreationData.chipInfo = wifiChipInfo;
1254     ifaceCreationData.chipModeId = chipMode.modeId;
1255     LOGI("CanIfaceComboSupportRequest, create a new iface data");
1256     return true;
1257 }
1258 
ExpandIfaceCombos(ComboIface & chipIfaceCombo,std::vector<std::vector<int>> & expandedIfaceCombos)1259 void HalDeviceManager::ExpandIfaceCombos(ComboIface &chipIfaceCombo,
1260     std::vector<std::vector<int>> &expandedIfaceCombos)
1261 {
1262     int numOfCombos = 1;
1263     for (auto &limit : chipIfaceCombo.limits) {
1264         for (uint32_t i = 0; i < limit.ifaceNum; ++i) {
1265             numOfCombos *= limit.types.size();
1266         }
1267     }
1268 
1269     expandedIfaceCombos.resize(numOfCombos);
1270     for (uint32_t i = 0; i < expandedIfaceCombos.size(); ++i) {
1271         expandedIfaceCombos[i].resize(IFACE_TYPES_BY_PRIORITY.size(), 0);
1272     }
1273 
1274     int span = numOfCombos;
1275     for (auto &limit : chipIfaceCombo.limits) {
1276         for (uint32_t i = 0; i < limit.ifaceNum; ++i) {
1277             span /= limit.types.size();
1278             for (int k = 0; k < numOfCombos; ++k) {
1279                 int ifaceType = limit.types.at((k / span) % limit.types.size());
1280                 expandedIfaceCombos[k][ifaceType]++;
1281             }
1282         }
1283     }
1284 
1285     return;
1286 }
1287 
CompareIfaceCreationData(IfaceCreationData & data1,IfaceCreationData & data2)1288 bool HalDeviceManager::CompareIfaceCreationData(IfaceCreationData &data1, IfaceCreationData &data2)
1289 {
1290     if (data1.isEmpty()) {
1291         return false;
1292     } else if (data2.isEmpty()) {
1293         return true;
1294     }
1295 
1296     for (auto type : IFACE_TYPES_BY_PRIORITY) {
1297         int numIfacesToDelete1 = 0;
1298         if (data1.chipInfo.currentModeIdValid && data1.chipInfo.currentModeId != data1.chipModeId) {
1299             numIfacesToDelete1 = data1.chipInfo.ifaces[type].size();
1300         } else {
1301             numIfacesToDelete1 = data1.interfacesToBeRemovedFirst.size();
1302         }
1303 
1304         int numIfacesToDelete2 = 0;
1305         if (data2.chipInfo.currentModeIdValid && data2.chipInfo.currentModeId != data2.chipModeId) {
1306             numIfacesToDelete2 = data2.chipInfo.ifaces[type].size();
1307         } else {
1308             numIfacesToDelete2 = data2.interfacesToBeRemovedFirst.size();
1309         }
1310 
1311         if (numIfacesToDelete1 < numIfacesToDelete2) {
1312             LOGI("CompareIfaceCreationData, data1 < data2");
1313             return true;
1314         }
1315     }
1316 
1317     return false;
1318 }
1319 
ExecuteChipReconfiguration(IfaceCreationData & ifaceCreationData,IfaceType createIfaceType,sptr<IChipIface> & iface)1320 bool HalDeviceManager::ExecuteChipReconfiguration(IfaceCreationData &ifaceCreationData,
1321     IfaceType createIfaceType, sptr<IChipIface> &iface)
1322 {
1323     if (ifaceCreationData.chipInfo.chip == nullptr) {
1324         LOGE("ExecuteChipReconfiguration, chip is nullptr");
1325         return false;
1326     }
1327 
1328     bool isModeConfigNeeded = !ifaceCreationData.chipInfo.currentModeIdValid
1329         || ifaceCreationData.chipInfo.currentModeId != ifaceCreationData.chipModeId;
1330     if (isModeConfigNeeded) {
1331         for (auto &ifaceInfos : ifaceCreationData.chipInfo.ifaces) {
1332             for (auto &ifaceInfo : ifaceInfos.second) {
1333                 RemoveIface(ifaceInfo.iface, true, createIfaceType);
1334             }
1335         }
1336 
1337         int32_t ret = ifaceCreationData.chipInfo.chip->SetChipMode(ifaceCreationData.chipModeId);
1338         if (ret != HDF_SUCCESS) {
1339             LOGE("ExecuteChipReconfiguration, call SetChipMode failed! ret:%{public}d", ret);
1340             return false;
1341         }
1342     } else {
1343         for (auto &ifaceInfo : ifaceCreationData.interfacesToBeRemovedFirst) {
1344             RemoveIface(ifaceInfo.iface, true, createIfaceType);
1345         }
1346     }
1347 
1348     int32_t ret = HDF_FAILURE;
1349     switch (createIfaceType) {
1350         case IfaceType::STA :
1351             ret = ifaceCreationData.chipInfo.chip->CreateStaService(iface);
1352             break;
1353         case IfaceType::AP :
1354             ret = ifaceCreationData.chipInfo.chip->CreateApService(iface);
1355             break;
1356         case IfaceType::P2P :
1357             ret = ifaceCreationData.chipInfo.chip->CreateP2pService(iface);
1358             break;
1359         default:
1360             LOGE("ExecuteChipReconfiguration, invalid createIfaceType:%{public}d", static_cast<int>(createIfaceType));
1361             break;
1362     }
1363 
1364     if (ret != HDF_SUCCESS) {
1365         LOGE("ExecuteChipReconfiguration, create iface failed! ret:%{public}d, createIfaceType:%{public}d",
1366             ret, static_cast<int>(createIfaceType));
1367         return false;
1368     }
1369 
1370     return true;
1371 }
1372 
FindBestIfaceCreationProposal(std::vector<std::vector<int>> & expandedIfaceCombos,WifiChipInfo & chipInfo,UsableMode & chipMode,IfaceType createIfaceType,IfaceCreationData & bestIfaceCreationProposal)1373 void HalDeviceManager::FindBestIfaceCreationProposal(std::vector<std::vector<int>> &expandedIfaceCombos,
1374     WifiChipInfo &chipInfo, UsableMode &chipMode, IfaceType createIfaceType,
1375     IfaceCreationData &bestIfaceCreationProposal)
1376 {
1377     for (auto &expandedIfaceCombo : expandedIfaceCombos) {
1378         IfaceCreationData currentProposal;
1379         CanIfaceComboSupportRequest(chipInfo, chipMode, expandedIfaceCombo, createIfaceType, currentProposal);
1380         if (CompareIfaceCreationData(currentProposal, bestIfaceCreationProposal)) {
1381             bestIfaceCreationProposal = currentProposal;
1382         }
1383     }
1384     return;
1385 }
1386 
CreateIfaceIfPossible(std::vector<WifiChipInfo> & wifiChipInfos,IfaceType createIfaceType,const IfaceDestoryCallback & ifaceDestoryCallback,std::string & ifaceName,sptr<IChipIface> & iface)1387 bool HalDeviceManager::CreateIfaceIfPossible(std::vector<WifiChipInfo> &wifiChipInfos, IfaceType createIfaceType,
1388     const IfaceDestoryCallback &ifaceDestoryCallback, std::string &ifaceName, sptr<IChipIface> &iface)
1389 {
1390     IfaceCreationData bestIfaceCreationProposal;
1391     for (auto &chipInfo : wifiChipInfos) {
1392         for (auto &chipMode : chipInfo.availableModes) {
1393             for (auto &chipIfaceCombo : chipMode.usableCombo) {
1394                 std::vector<std::vector<int>> expandedIfaceCombos;
1395                 ExpandIfaceCombos(chipIfaceCombo, expandedIfaceCombos);
1396                 FindBestIfaceCreationProposal(expandedIfaceCombos, chipInfo, chipMode, createIfaceType,
1397                     bestIfaceCreationProposal);
1398             }
1399         }
1400     }
1401 
1402     if (bestIfaceCreationProposal.isEmpty()) {
1403         LOGE("CreateIfaceIfPossible, best iface creation data is empty");
1404         return false;
1405     }
1406 
1407     if (!ExecuteChipReconfiguration(bestIfaceCreationProposal, createIfaceType, iface)) {
1408         LOGE("CreateIfaceIfPossible, excute chip reconfiguration failed");
1409         return false;
1410     }
1411 
1412     if (!GetIfaceName(iface, ifaceName)) {
1413         LOGE("CreateIfaceIfPossible, get iface name failed");
1414         return false;
1415     }
1416 
1417     InterfaceCacheEntry cacheEntry;
1418     cacheEntry.chip = bestIfaceCreationProposal.chipInfo.chip;
1419     cacheEntry.chipId = bestIfaceCreationProposal.chipInfo.chipId;
1420     cacheEntry.name = ifaceName;
1421     cacheEntry.type = createIfaceType;
1422     cacheEntry.ifaceDestoryCallback.emplace_back(ifaceDestoryCallback);
1423     mInterfaceInfoCache[std::pair<std::string, IfaceType>(cacheEntry.name, cacheEntry.type)] = cacheEntry;
1424     return true;
1425 }
1426 
CreateIface(IfaceType createIfaceType,const IfaceDestoryCallback & ifaceDestoryCallback,std::string & ifaceName,sptr<IChipIface> & iface)1427 bool HalDeviceManager::CreateIface(IfaceType createIfaceType, const IfaceDestoryCallback &ifaceDestoryCallback,
1428     std::string &ifaceName, sptr<IChipIface> &iface)
1429 {
1430     std::vector<WifiChipInfo> wifiChipInfos;
1431     if (!GetAllChipInfo(wifiChipInfos)) {
1432         LOGE("CreateIface, get all chip info failed");
1433         return false;
1434     }
1435 
1436     if (!ValidateInterfaceCache(wifiChipInfos)) {
1437         LOGE("CreateIface, verify interface cache failed");
1438         return false;
1439     }
1440 
1441     if (!CreateIfaceIfPossible(wifiChipInfos, createIfaceType, ifaceDestoryCallback, ifaceName, iface)) {
1442         LOGE("CreateIface, create iface failed");
1443         return false;
1444     }
1445 
1446     LOGI("CreateIface, create iface success, ifaceName:%{public}s", ifaceName.c_str());
1447     return true;
1448 }
1449 
DispatchIfaceDestoryCallback(std::string & removeIfaceName,IfaceType removeIfaceType,bool isCallback,IfaceType createIfaceType)1450 void HalDeviceManager::DispatchIfaceDestoryCallback(std::string &removeIfaceName, IfaceType removeIfaceType,
1451     bool isCallback, IfaceType createIfaceType)
1452 {
1453     LOGI("DispatchIfaceDestoryCallback, removeIfaceName:%{public}s, removeIfaceType:%{public}d, isCallback:%{public}d,"
1454         " createIfaceType:%{public}d", removeIfaceName.c_str(), removeIfaceType, isCallback, createIfaceType);
1455     switch (removeIfaceType) {
1456         case IfaceType::STA :
1457             if (mIWifiStaIfaces.find(removeIfaceName) != mIWifiStaIfaces.end()) {
1458                 mIWifiStaIfaces.erase(removeIfaceName);
1459             }
1460             if (isCallback) {
1461                 WifiP2PHalInterface::GetInstance().StopP2p();
1462                 WifiStaHalInterface::GetInstance().StopWifi();
1463             }
1464             break;
1465         case IfaceType::AP :
1466             if (mIWifiApIfaces.find(removeIfaceName) != mIWifiApIfaces.end()) {
1467                 mIWifiApIfaces.erase(removeIfaceName);
1468             }
1469             if (isCallback) {
1470                 WifiApHalInterface::GetInstance().StopAp();
1471             }
1472             break;
1473         case IfaceType::P2P :
1474             if (mIWifiP2pIfaces.find(removeIfaceName) != mIWifiP2pIfaces.end()) {
1475                 mIWifiP2pIfaces.erase(removeIfaceName);
1476             }
1477             break;
1478         default:
1479             LOGE("DispatchIfaceDestoryCallback, invalid removeIfaceType:%{public}d", static_cast<int>(removeIfaceType));
1480             break;
1481     }
1482 
1483     auto iter = mInterfaceInfoCache.find(std::pair<std::string, IfaceType>(removeIfaceName, removeIfaceType));
1484     if (iter != mInterfaceInfoCache.end()) {
1485         for (auto &callback : iter->second.ifaceDestoryCallback) {
1486             if (isCallback && callback) {
1487                 callback(removeIfaceName, static_cast<int>(createIfaceType));
1488             }
1489         }
1490         mInterfaceInfoCache.erase(iter);
1491     }
1492 
1493     return;
1494 }
1495 
GetChip(const std::string & removeIfaceName,IfaceType removeIfaceType,sptr<IConcreteChip> & chip)1496 bool HalDeviceManager::GetChip(const std::string &removeIfaceName, IfaceType removeIfaceType, sptr<IConcreteChip> &chip)
1497 {
1498     auto iter = mInterfaceInfoCache.find(std::pair<std::string, IfaceType>(removeIfaceName, removeIfaceType));
1499     if (iter == mInterfaceInfoCache.end()) {
1500         LOGE("GetChip, not find interface cache info");
1501         return false;
1502     }
1503 
1504     chip = iter->second.chip;
1505     return true;
1506 }
1507 
RemoveIface(sptr<IChipIface> & iface,bool isCallback,IfaceType createIfaceType)1508 bool HalDeviceManager::RemoveIface(sptr<IChipIface> &iface, bool isCallback, IfaceType createIfaceType)
1509 {
1510     std::string ifaceName;
1511     if (!GetIfaceName(iface, ifaceName)) {
1512         LOGE("RemoveIface, get iface name failed");
1513         return false;
1514     }
1515 
1516     IfaceType ifaceType = IFACE_TYPE_DEFAULT;
1517     if (!GetIfaceType(iface, ifaceType)) {
1518         LOGI("RemoveIface, get iface type failed");
1519         return false;
1520     }
1521 
1522     sptr<IConcreteChip> chip = nullptr;
1523     if (!GetChip(ifaceName, ifaceType, chip)) {
1524         LOGE("RemoveIface, get chip failed");
1525         return false;
1526     }
1527 
1528     CHECK_NULL_AND_RETURN(chip, false);
1529     int32_t ret = HDF_FAILURE;
1530     switch (ifaceType) {
1531         case IfaceType::STA:
1532             if (ifaceName == "wlan0") {
1533                 LOGE("RemoveIface, IfaceType::STA wlan0");
1534                 if (iface && g_chipIfaceCallback) {
1535                     iface->UnRegisterChipIfaceCallBack(g_chipIfaceCallback);
1536                 }
1537                 g_rssiReportCallback = nullptr;
1538                 g_netlinkReportCallback = nullptr;
1539             }
1540             ret = chip->RemoveStaService(ifaceName);
1541             break;
1542         case IfaceType::AP :
1543             ret = chip->RemoveApService(ifaceName);
1544             break;
1545         case IfaceType::P2P :
1546             ret = chip->RemoveP2pService(ifaceName);
1547             break;
1548         default:
1549             LOGE("RemoveIface, invalid ifaceType:%{public}d", static_cast<int>(ifaceType));
1550             break;
1551     }
1552 
1553     if (ret != HDF_SUCCESS) {
1554         LOGE("RemoveIface, remove iface failed ret:%{public}d, ifaceType:%{public}d", ret, static_cast<int>(ifaceType));
1555         return false;
1556     }
1557 
1558     DispatchIfaceDestoryCallback(ifaceName, ifaceType, isCallback, createIfaceType);
1559     LOGI("RemoveIface success");
1560     return true;
1561 }
1562 
AddChipHdiDeathRecipient()1563 void HalDeviceManager::AddChipHdiDeathRecipient()
1564 {
1565     struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();
1566     if (serviceMgr == nullptr) {
1567         LOGE("%{public}s: failed to get HDIServiceManager", __func__);
1568         return;
1569     }
1570 
1571     g_chipHdiService = serviceMgr->GetService(serviceMgr, CHIP_SERVICE_NAME);
1572     HDIServiceManagerRelease(serviceMgr);
1573     if (g_chipHdiService == nullptr) {
1574         LOGE("%{public}s: failed to get HdfRemoteService", __func__);
1575         return;
1576     }
1577 
1578     static HdfDeathRecipient recipient = {
1579         .OnRemoteDied = [](HdfDeathRecipient *recipient, HdfRemoteService *service) {
1580             LOGI("Chip Hdi service died!");
1581             g_chipHdiServiceDied = true;
1582             ResetHalDeviceManagerInfo(true);
1583             RemoveChipHdiDeathRecipient();
1584             LOGI("Chip Hdi service died process success!");
1585             return;
1586         }
1587     };
1588 
1589     HdfRemoteServiceAddDeathRecipient(g_chipHdiService, &recipient);
1590     LOGI("Chip Hdi service add death recipient success");
1591     return;
1592 }
1593 
RemoveChipHdiDeathRecipient()1594 void HalDeviceManager::RemoveChipHdiDeathRecipient()
1595 {
1596     std::lock_guard<std::mutex> lock(mMutex);
1597     if (g_chipHdiService) {
1598         HdfRemoteServiceRemoveDeathRecipient(g_chipHdiService, nullptr);
1599         g_chipHdiService = nullptr;
1600     }
1601     return;
1602 }
1603 
RegisterChipHdiDeathCallback(OnChipServiceDied cb)1604 void HalDeviceManager::RegisterChipHdiDeathCallback(OnChipServiceDied cb)
1605 {
1606     std::lock_guard<std::mutex> lock(mMutex);
1607     g_chipHdiServiceDiedCb = cb;
1608 }
1609 
OnScanResultsCallback(uint32_t event)1610 int32_t ChipIfaceCallback::OnScanResultsCallback(uint32_t event)
1611 {
1612     LOGD("OnScanResultsCallback, event:%{public}d", event);
1613     OHOS::Wifi::WifiSupplicantHalInterface::GetInstance().NotifyScanResultEvent();
1614     return 0;
1615 }
1616 
OnRssiReport(int32_t index,int32_t c0Rssi,int32_t c1Rssi)1617 int32_t ChipIfaceCallback::OnRssiReport(int32_t index, int32_t c0Rssi, int32_t c1Rssi)
1618 {
1619     LOGI("OnRssiReport, index:%{public}d c0Rssi:%{public}d c1Rssi:%{public}d", index, c0Rssi, c1Rssi);
1620 
1621     if (g_rssiReportCallback) {
1622         g_rssiReportCallback(index, c0Rssi);
1623     }
1624     return 0;
1625 }
1626 
OnWifiNetlinkMessage(uint32_t type,const std::vector<uint8_t> & recvMsg)1627 int32_t ChipIfaceCallback::OnWifiNetlinkMessage(uint32_t type, const std::vector<uint8_t>& recvMsg)
1628 {
1629     LOGI("OnWifiNetlinkMessage, type:%{public}d", type);
1630 
1631     if (g_netlinkReportCallback) {
1632         g_netlinkReportCallback(type, recvMsg);
1633     }
1634     return 0;
1635 }
1636 
1637 }  // namespace Wifi
1638 }  // namespace OHOS
1639 #endif
1640