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