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 ¶m, 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