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