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 #include <random>
17 #include "wifi_config_center.h"
18 #include "wifi_logger.h"
19 #include "wifi_common_util.h"
20 #include "wifi_global_func.h"
21 #include "wifi_randommac_helper.h"
22
23 DEFINE_WIFILOG_LABEL("WifiConfigCenter");
24
25 namespace OHOS {
26 namespace Wifi {
27 #ifdef DTFUZZ_TEST
28 static WifiConfigCenter* gWifiConfigCenter = nullptr;
29 #endif
GetInstance()30 WifiConfigCenter &WifiConfigCenter::GetInstance()
31 {
32 #ifndef DTFUZZ_TEST
33 static WifiConfigCenter gWifiConfigCenter;
34 return gWifiConfigCenter;
35 #else
36 if (gWifiConfigCenter == nullptr) {
37 gWifiConfigCenter = new (std::nothrow) WifiConfigCenter();
38 }
39 return *gWifiConfigCenter;
40 #endif
41 }
42
WifiConfigCenter()43 WifiConfigCenter::WifiConfigCenter()
44 {
45 mWifiState.emplace(0, static_cast<int>(WifiState::DISABLED));
46 mWifiDetailState.emplace(0, WifiDetailState::STATE_INACTIVE);
47 mStaMidState.emplace(0, WifiOprMidState::CLOSED);
48 mWifiCloseTime.emplace(0, std::chrono::steady_clock::now());
49 mIsAncoConnected.emplace(0, false);
50 mWifiIpInfo.emplace(0, IpInfo());
51 mWifiIpV6Info.emplace(0, IpV6Info());
52 mWifiLinkedInfo.emplace(0, WifiLinkedInfo());
53 mLastSelectedNetworkId.emplace(0, INVALID_NETWORK_ID);
54 mLastSelectedTimeVal.emplace(0, time(NULL));
55 mBssidToTimeoutTime.emplace(0, std::make_pair("", 0));
56 mLastDiscReason.emplace(0, DisconnectedReason::DISC_REASON_DEFAULT);
57 mScanMidState.emplace(0, WifiOprMidState::CLOSED);
58 mScanOnlyMidState.emplace(0, WifiOprMidState::CLOSED);
59 mApMidState.emplace(0, WifiOprMidState::CLOSED);
60 mHotspotState.emplace(0, static_cast<int>(ApState::AP_STATE_CLOSED));
61 powerModel.emplace(0, PowerModel::GENERAL);
62 }
63
~WifiConfigCenter()64 WifiConfigCenter::~WifiConfigCenter()
65 {}
66
Init()67 int WifiConfigCenter::Init()
68 {
69 if (WifiSettings::GetInstance().Init() < 0) {
70 WIFI_LOGE("Init wifi settings failed!");
71 return -1;
72 }
73 wifiScanConfig = std::make_unique<WifiScanConfig>();
74 ClearLocalHid2dInfo();
75 mPersistWifiState[INSTID_WLAN0] = WifiSettings::GetInstance().GetOperatorWifiType(INSTID_WLAN0);
76 mAirplaneModeState = WifiSettings::GetInstance().GetLastAirplaneMode();
77 return 0;
78 }
79
GetWifiScanConfig()80 std::unique_ptr<WifiScanConfig>& WifiConfigCenter::GetWifiScanConfig()
81 {
82 return wifiScanConfig;
83 }
84
SetWifiSelfcureReset(const bool isReset)85 void WifiConfigCenter::SetWifiSelfcureReset(const bool isReset)
86 {
87 mWifiSelfcureReset = isReset;
88 }
89
GetWifiSelfcureReset() const90 bool WifiConfigCenter::GetWifiSelfcureReset() const
91 {
92 return mWifiSelfcureReset.load();
93 }
94
SetWifiSelfcureResetEntered(const bool isReset)95 void WifiConfigCenter::SetWifiSelfcureResetEntered(const bool isReset)
96 {
97 mWifiSelfcureResetEntered = isReset;
98 }
99
GetWifiSelfcureResetEntered() const100 bool WifiConfigCenter::GetWifiSelfcureResetEntered() const
101 {
102 return mWifiSelfcureResetEntered.load();
103 }
104
SetLastNetworkId(const int networkId)105 void WifiConfigCenter::SetLastNetworkId(const int networkId)
106 {
107 mLastNetworkId = networkId;
108 }
109
GetLastNetworkId() const110 int WifiConfigCenter::GetLastNetworkId() const
111 {
112 return mLastNetworkId.load();
113 }
114
SetSelectedCandidateNetworkId(const int networkId)115 void WifiConfigCenter::SetSelectedCandidateNetworkId(const int networkId)
116 {
117 mSelectedCandidateNetworkId = networkId;
118 }
119
GetSelectedCandidateNetworkId() const120 int WifiConfigCenter::GetSelectedCandidateNetworkId() const
121 {
122 return mSelectedCandidateNetworkId.load();
123 }
124
SetWifiAllowSemiActive(bool isAllowed)125 void WifiConfigCenter::SetWifiAllowSemiActive(bool isAllowed)
126 {
127 mWifiAllowSemiActive = isAllowed;
128 }
129
GetWifiAllowSemiActive() const130 bool WifiConfigCenter::GetWifiAllowSemiActive() const
131 {
132 if (IsFactoryMode()) {
133 WIFI_LOGI("factory mode, not allow semi active.");
134 return false;
135 }
136 return mWifiAllowSemiActive.load();
137 }
138
SetWifiStopState(bool state)139 void WifiConfigCenter::SetWifiStopState(bool state)
140 {
141 mWifiStoping = state;
142 }
143
GetWifiStopState() const144 bool WifiConfigCenter::GetWifiStopState() const
145 {
146 return mWifiStoping.load();
147 }
148
SetStaIfaceName(const std::string & ifaceName,int instId)149 void WifiConfigCenter::SetStaIfaceName(const std::string &ifaceName, int instId)
150 {
151 std::unique_lock<std::mutex> lock(mStaMutex);
152 mStaIfaceName[instId] = ifaceName;
153 }
154
GetStaIfaceName(int instId)155 std::string WifiConfigCenter::GetStaIfaceName(int instId)
156 {
157 std::unique_lock<std::mutex> lock(mStaMutex);
158 WIFI_LOGD("GetStaIfaceName instId:%{public}d mStaIfaceName[instId]:%{public}s ",
159 instId, mStaIfaceName[instId].c_str());
160 return mStaIfaceName[instId];
161 }
162
GetWifiState(int instId)163 int WifiConfigCenter::GetWifiState(int instId)
164 {
165 std::unique_lock<std::mutex> lock(mStaMutex);
166 auto iter = mWifiState.find(instId);
167 if (iter != mWifiState.end()) {
168 return iter->second.load();
169 }
170 mWifiState[instId] = static_cast<int>(WifiState::DISABLED);
171 return mWifiState[instId].load();
172 }
173
SetWifiState(int state,int instId)174 int WifiConfigCenter::SetWifiState(int state, int instId)
175 {
176 std::unique_lock<std::mutex> lock(mStaMutex);
177 mWifiState[instId] = state;
178 return 0;
179 }
180
GetWifiDetailState(int instId)181 WifiDetailState WifiConfigCenter::GetWifiDetailState(int instId)
182 {
183 std::unique_lock<std::mutex> lock(mStaMutex);
184 auto iter = mWifiDetailState.find(instId);
185 if (iter != mWifiDetailState.end()) {
186 return iter->second;
187 }
188 mWifiDetailState[instId] = WifiDetailState::STATE_UNKNOWN;
189 return mWifiDetailState[instId];
190 }
191
SetWifiDetailState(WifiDetailState state,int instId)192 int WifiConfigCenter::SetWifiDetailState(WifiDetailState state, int instId)
193 {
194 std::unique_lock<std::mutex> lock(mStaMutex);
195 mWifiDetailState[instId] = state;
196 return 0;
197 }
198
GetWifiMidState(int instId)199 WifiOprMidState WifiConfigCenter::GetWifiMidState(int instId)
200 {
201 std::unique_lock<std::mutex> lock(mStaMutex);
202 auto iter = mStaMidState.find(instId);
203 if (iter != mStaMidState.end()) {
204 return iter->second.load();
205 } else {
206 mStaMidState.emplace(instId, WifiOprMidState::CLOSED);
207 return mStaMidState[instId].load();
208 }
209 }
210
SetWifiMidState(WifiOprMidState expState,WifiOprMidState state,int instId)211 bool WifiConfigCenter::SetWifiMidState(WifiOprMidState expState, WifiOprMidState state, int instId)
212 {
213 WIFI_LOGI("SetWifiMidState expState:%{public}d,state:%{public}d,instId:%{public}d",
214 (int)expState, (int)state, instId);
215 std::unique_lock<std::mutex> lock(mStaMutex);
216 auto iter = mStaMidState.find(instId);
217 if (iter != mStaMidState.end()) {
218 return iter->second.compare_exchange_strong(expState, state);
219 } else {
220 mStaMidState.emplace(instId, state);
221 return true;
222 }
223 return false;
224 }
225
SetWifiMidState(WifiOprMidState state,int instId)226 void WifiConfigCenter::SetWifiMidState(WifiOprMidState state, int instId)
227 {
228 WIFI_LOGI("SetWifiMidState ,state:%{public}d,instId:%{public}d", (int)state, instId);
229 std::unique_lock<std::mutex> lock(mStaMutex);
230 auto ret = mStaMidState.emplace(instId, state);
231 if (!ret.second) {
232 mStaMidState[instId] = state;
233 }
234 }
235
SetWifiStaCloseTime(int instId)236 void WifiConfigCenter::SetWifiStaCloseTime(int instId)
237 {
238 std::unique_lock<std::mutex> lock(mStaMutex);
239 mWifiCloseTime[instId] = std::chrono::steady_clock::now();
240 }
241
GetWifiStaInterval(int instId)242 double WifiConfigCenter::GetWifiStaInterval(int instId)
243 {
244 std::unique_lock<std::mutex> lock(mStaMutex);
245 auto iter = mWifiCloseTime.find(instId);
246 if (iter != mWifiCloseTime.end()) {
247 std::chrono::steady_clock::time_point curr = std::chrono::steady_clock::now();
248 double drMs = std::chrono::duration<double, std::milli>(curr - iter->second).count();
249 return drMs;
250 }
251
252 return 0;
253 }
254
GetWifiConnectedMode(int instId)255 bool WifiConfigCenter::GetWifiConnectedMode(int instId)
256 {
257 std::unique_lock<std::mutex> lock(mStaMutex);
258 return mIsAncoConnected[instId].load();
259 }
260
SetWifiConnectedMode(bool isAncoConnected,int instId)261 void WifiConfigCenter::SetWifiConnectedMode(bool isAncoConnected, int instId)
262 {
263 std::unique_lock<std::mutex> lock(mStaMutex);
264 mIsAncoConnected[instId] = isAncoConnected;
265 }
266
267
SetChangeDeviceConfig(ConfigChange value,const WifiDeviceConfig & config)268 int WifiConfigCenter::SetChangeDeviceConfig(ConfigChange value, const WifiDeviceConfig &config)
269 {
270 std::unique_lock<std::mutex> lock(mStaMutex);
271 mLastRemoveDeviceConfig = std::make_pair((int)value, config);
272 return WIFI_OPT_SUCCESS;
273 }
274
GetChangeDeviceConfig(ConfigChange & value,WifiDeviceConfig & config)275 bool WifiConfigCenter::GetChangeDeviceConfig(ConfigChange& value, WifiDeviceConfig &config)
276 {
277 std::unique_lock<std::mutex> lock(mStaMutex);
278 value = (ConfigChange)mLastRemoveDeviceConfig.first;
279 config = mLastRemoveDeviceConfig.second;
280 return true;
281 }
282
GetIpInfo(IpInfo & info,int instId)283 int WifiConfigCenter::GetIpInfo(IpInfo &info, int instId)
284 {
285 std::unique_lock<std::mutex> lock(mStaMutex);
286 auto iter = mWifiIpInfo.find(instId);
287 if (iter != mWifiIpInfo.end()) {
288 info = iter->second;
289 }
290 return 0;
291 }
292
SaveIpInfo(const IpInfo & info,int instId)293 int WifiConfigCenter::SaveIpInfo(const IpInfo &info, int instId)
294 {
295 std::unique_lock<std::mutex> lock(mStaMutex);
296 mWifiIpInfo[instId] = info;
297 return 0;
298 }
299
GetIpv6Info(IpV6Info & info,int instId)300 int WifiConfigCenter::GetIpv6Info(IpV6Info &info, int instId)
301 {
302 std::unique_lock<std::mutex> lock(mStaMutex);
303 auto iter = mWifiIpV6Info.find(instId);
304 if (iter != mWifiIpV6Info.end()) {
305 info = iter->second;
306 }
307 return 0;
308 }
309
SaveIpV6Info(const IpV6Info & info,int instId)310 int WifiConfigCenter::SaveIpV6Info(const IpV6Info &info, int instId)
311 {
312 std::unique_lock<std::mutex> lock(mStaMutex);
313 mWifiIpV6Info[instId] = info;
314 return 0;
315 }
316
GetAllWifiLinkedInfo()317 std::map<int, WifiLinkedInfo> WifiConfigCenter::GetAllWifiLinkedInfo()
318 {
319 std::unique_lock<std::mutex> lock(mStaMutex);
320 return mWifiLinkedInfo;
321 }
322
GetLinkedInfo(WifiLinkedInfo & info,int instId)323 int WifiConfigCenter::GetLinkedInfo(WifiLinkedInfo &info, int instId)
324 {
325 std::unique_lock<std::mutex> lock(mStaMutex);
326 auto iter = mWifiLinkedInfo.find(instId);
327 if (iter != mWifiLinkedInfo.end()) {
328 info = iter->second;
329 }
330 return 0;
331 }
332
SaveLinkedInfo(const WifiLinkedInfo & info,int instId)333 int WifiConfigCenter::SaveLinkedInfo(const WifiLinkedInfo &info, int instId)
334 {
335 std::unique_lock<std::mutex> lock(mStaMutex);
336 auto iter = mWifiLinkedInfo.find(instId);
337 if (iter != mWifiLinkedInfo.end()) {
338 WifiChannelWidth channelWidth = iter->second.channelWidth;
339 std::string bssid = iter->second.bssid;
340 iter->second = info;
341 if (bssid == info.bssid) {
342 iter->second.channelWidth = channelWidth;
343 }
344 } else {
345 mWifiLinkedInfo.emplace(instId, info);
346 }
347
348 return 0;
349 }
350
SetMacAddress(const std::string & macAddress,int instId)351 int WifiConfigCenter::SetMacAddress(const std::string &macAddress, int instId)
352 {
353 std::unique_lock<std::mutex> lock(mStaMutex);
354 mMacAddress[instId] = macAddress;
355 return 0;
356 }
357
GetMacAddress(std::string & macAddress,int instId)358 int WifiConfigCenter::GetMacAddress(std::string &macAddress, int instId)
359 {
360 std::unique_lock<std::mutex> lock(mStaMutex);
361 auto iter = mMacAddress.find(instId);
362 if (iter != mMacAddress.end()) {
363 macAddress = iter->second;
364 }
365 return 0;
366 }
367
SetUserLastSelectedNetworkId(int networkId,int instId)368 void WifiConfigCenter::SetUserLastSelectedNetworkId(int networkId, int instId)
369 {
370 std::unique_lock<std::mutex> lock(mStaMutex);
371 mLastSelectedNetworkId[instId] = networkId;
372 mLastSelectedTimeVal[instId] = time(NULL);
373 }
374
GetUserLastSelectedNetworkId(int instId)375 int WifiConfigCenter::GetUserLastSelectedNetworkId(int instId)
376 {
377 std::unique_lock<std::mutex> lock(mStaMutex);
378 auto iter = mLastSelectedNetworkId.find(instId);
379 if (iter != mLastSelectedNetworkId.end()) {
380 return iter->second;
381 }
382 return -1;
383 }
384
GetUserLastSelectedNetworkTimeVal(int instId)385 time_t WifiConfigCenter::GetUserLastSelectedNetworkTimeVal(int instId)
386 {
387 std::unique_lock<std::mutex> lock(mStaMutex);
388 auto iter = mLastSelectedTimeVal.find(instId);
389 if (iter != mLastSelectedTimeVal.end()) {
390 return iter->second;
391 }
392 return 0;
393 }
394
GetConnectTimeoutBssid(int instId)395 std::string WifiConfigCenter::GetConnectTimeoutBssid(int instId)
396 {
397 std::unique_lock<std::mutex> lock(mStaMutex);
398 auto iter = mBssidToTimeoutTime.find(instId);
399 if (iter != mBssidToTimeoutTime.end()) {
400 const int timeout = 30; // 30s
401 if (iter->second.second - static_cast<int>(time(NULL)) > timeout) {
402 return "";
403 }
404 return iter->second.first;
405 }
406 return "";
407 }
408
SetConnectTimeoutBssid(std::string & bssid,int instId)409 int WifiConfigCenter::SetConnectTimeoutBssid(std::string &bssid, int instId)
410 {
411 std::unique_lock<std::mutex> lock(mStaMutex);
412 time_t now = time(nullptr);
413 if (now == static_cast<time_t>(-1)) {
414 LOGE("SetConnectTimeoutBssid: call time failed!");
415 return -1;
416 }
417 mBssidToTimeoutTime[instId] = std::make_pair(bssid, static_cast<int>(now));
418 return 0;
419 }
420
SaveDisconnectedReason(DisconnectedReason discReason,int instId)421 void WifiConfigCenter::SaveDisconnectedReason(DisconnectedReason discReason, int instId)
422 {
423 std::unique_lock<std::mutex> lock(mStaMutex);
424 mLastDiscReason[instId] = discReason;
425 }
426
GetDisconnectedReason(DisconnectedReason & discReason,int instId)427 int WifiConfigCenter::GetDisconnectedReason(DisconnectedReason &discReason, int instId)
428 {
429 std::unique_lock<std::mutex> lock(mStaMutex);
430 auto iter = mLastDiscReason.find(instId);
431 if (iter != mLastDiscReason.end()) {
432 discReason = iter->second;
433 }
434 return 0;
435 }
436
InsertWifiCategoryBlackListCache(int blacklistType,const std::string currentBssid,const WifiCategoryBlackListInfo wifiBlackListInfo)437 void WifiConfigCenter::InsertWifiCategoryBlackListCache(int blacklistType, const std::string currentBssid,
438 const WifiCategoryBlackListInfo wifiBlackListInfo)
439 {
440 std::unique_lock<std::mutex> lock(mStaMutex);
441 std::map<std::string, WifiCategoryBlackListInfo> wifiBlackListCache;
442 if (mWifiCategoryBlackListCache.find(blacklistType) != mWifiCategoryBlackListCache.end()) {
443 wifiBlackListCache = mWifiCategoryBlackListCache[blacklistType];
444 }
445 auto iter = wifiBlackListCache.find(currentBssid);
446 if (iter != wifiBlackListCache.end()) {
447 iter->second = wifiBlackListInfo;
448 } else {
449 wifiBlackListCache.emplace(std::make_pair(currentBssid, wifiBlackListInfo));
450 }
451 mWifiCategoryBlackListCache[blacklistType] = wifiBlackListCache;
452 }
453
RemoveWifiCategoryBlackListCache(int blacklistType,const std::string bssid)454 void WifiConfigCenter::RemoveWifiCategoryBlackListCache(int blacklistType, const std::string bssid)
455 {
456 std::unique_lock<std::mutex> lock(mStaMutex);
457 if (mWifiCategoryBlackListCache.find(blacklistType) == mWifiCategoryBlackListCache.end()) {
458 LOGE("%{public}s: dont exist wifi bla type", __func__);
459 return;
460 }
461 std::map<std::string, WifiCategoryBlackListInfo> wifiBlackListCache = mWifiCategoryBlackListCache[blacklistType];
462 if (wifiBlackListCache.find(bssid) != wifiBlackListCache.end()) {
463 wifiBlackListCache.erase(bssid);
464 mWifiCategoryBlackListCache[blacklistType] = wifiBlackListCache;
465 } else {
466 LOGE("%{public}s: don't exist wifi bla list, bssid: %{public}s", __func__, MacAnonymize(bssid).c_str());
467 return;
468 }
469 }
470
GetWifiCategoryBlackListCache(int blacklistType,std::map<std::string,WifiCategoryBlackListInfo> & blackListCache)471 int WifiConfigCenter::GetWifiCategoryBlackListCache(int blacklistType,
472 std::map<std::string, WifiCategoryBlackListInfo> &blackListCache)
473 {
474 std::unique_lock<std::mutex> lock(mStaMutex);
475 if (mWifiCategoryBlackListCache.find(blacklistType) == mWifiCategoryBlackListCache.end()) {
476 LOGE("%{public}s: dont exist wifi bla type", __func__);
477 return -1;
478 }
479 blackListCache = mWifiCategoryBlackListCache[blacklistType];
480 return 0;
481 }
482
UpdateWifiConnectFailListCache(int blacklistType,const std::string bssid,const WifiCategoryConnectFailInfo wifiConnectFailInfo)483 void WifiConfigCenter::UpdateWifiConnectFailListCache(int blacklistType, const std::string bssid,
484 const WifiCategoryConnectFailInfo wifiConnectFailInfo)
485 {
486 std::unique_lock<std::mutex> lock(mStaMutex);
487 auto iter = mWifiConnectFailCache.find(bssid);
488 if (iter != mWifiConnectFailCache.end()
489 && iter->second.actionType >= wifiConnectFailInfo.actionType) {
490 iter->second.connectFailTimes++;
491 } else {
492 mWifiConnectFailCache[bssid] = wifiConnectFailInfo;
493 }
494 }
495
RemoveWifiConnectFailListCache(const std::string bssid)496 void WifiConfigCenter::RemoveWifiConnectFailListCache(const std::string bssid)
497 {
498 std::unique_lock<std::mutex> lock(mStaMutex);
499 if (mWifiConnectFailCache.find(bssid) != mWifiConnectFailCache.end()) {
500 mWifiConnectFailCache.erase(bssid);
501 } else {
502 LOGE("%{public}s: don't exist wifi connect fail list, bssid: %{public}s",
503 __func__, MacAnonymize(bssid).c_str());
504 return;
505 }
506 }
507
GetWifiConnectFailListCache(std::map<std::string,WifiCategoryConnectFailInfo> & connectFailCache)508 int WifiConfigCenter::GetWifiConnectFailListCache(std::map<std::string,
509 WifiCategoryConnectFailInfo> &connectFailCache)
510 {
511 std::unique_lock<std::mutex> lock(mStaMutex);
512 connectFailCache = mWifiConnectFailCache;
513 return 0;
514 }
515
EnableNetwork(int networkId,bool disableOthers,int instId)516 bool WifiConfigCenter::EnableNetwork(int networkId, bool disableOthers, int instId)
517 {
518 if (disableOthers) {
519 SetUserLastSelectedNetworkId(networkId, instId);
520 }
521 return true;
522 }
523
GetScanMidState(int instId)524 WifiOprMidState WifiConfigCenter::GetScanMidState(int instId)
525 {
526 std::unique_lock<std::mutex> lock(mScanMutex);
527 auto iter = mScanMidState.find(instId);
528 if (iter != mScanMidState.end()) {
529 return iter->second.load();
530 } else {
531 mScanMidState.emplace(instId, WifiOprMidState::CLOSED);
532 return mScanMidState[instId].load();
533 }
534 }
535
SetScanMidState(WifiOprMidState expState,WifiOprMidState state,int instId)536 bool WifiConfigCenter::SetScanMidState(WifiOprMidState expState, WifiOprMidState state, int instId)
537 {
538 std::unique_lock<std::mutex> lock(mScanMutex);
539 auto iter = mScanMidState.find(instId);
540 if (iter != mScanMidState.end()) {
541 return iter->second.compare_exchange_strong(expState, state);
542 } else {
543 mScanMidState.emplace(instId, state);
544 return true;
545 }
546 return false;
547 }
548
SetScanMidState(WifiOprMidState state,int instId)549 void WifiConfigCenter::SetScanMidState(WifiOprMidState state, int instId)
550 {
551 std::unique_lock<std::mutex> lock(mScanMutex);
552 auto ret = mScanMidState.emplace(instId, state);
553 if (!ret.second) {
554 mScanMidState[instId] = state;
555 }
556 }
557
GetWifiScanOnlyMidState(int instId)558 WifiOprMidState WifiConfigCenter::GetWifiScanOnlyMidState(int instId)
559 {
560 std::unique_lock<std::mutex> lock(mScanMutex);
561 auto iter = mScanOnlyMidState.find(instId);
562 if (iter != mScanOnlyMidState.end()) {
563 return iter->second.load();
564 } else {
565 mScanOnlyMidState.emplace(instId, WifiOprMidState::CLOSED);
566 return mScanOnlyMidState[instId].load();
567 }
568 }
569
SetWifiScanOnlyMidState(WifiOprMidState expState,WifiOprMidState state,int instId)570 bool WifiConfigCenter::SetWifiScanOnlyMidState(WifiOprMidState expState, WifiOprMidState state, int instId)
571 {
572 std::unique_lock<std::mutex> lock(mScanMutex);
573 auto iter = mScanOnlyMidState.find(instId);
574 if (iter != mScanOnlyMidState.end()) {
575 return iter->second.compare_exchange_strong(expState, state);
576 } else {
577 mScanOnlyMidState.emplace(instId, state);
578 return true;
579 }
580 return false;
581 }
582
SetWifiScanOnlyMidState(WifiOprMidState state,int instId)583 void WifiConfigCenter::SetWifiScanOnlyMidState(WifiOprMidState state, int instId)
584 {
585 std::unique_lock<std::mutex> lock(mScanMutex);
586 auto ret = mScanOnlyMidState.emplace(instId, state);
587 if (!ret.second) {
588 mScanOnlyMidState[instId] = state;
589 }
590 }
591
GetScanControlInfo(ScanControlInfo & info,int instId)592 int WifiConfigCenter::GetScanControlInfo(ScanControlInfo &info, int instId)
593 {
594 std::unique_lock<std::mutex> lock(mScanMutex);
595 auto iter = mScanControlInfo.find(instId);
596 if (iter != mScanControlInfo.end()) {
597 info = iter->second;
598 }
599 return 0;
600 }
601
SetScanControlInfo(const ScanControlInfo & info,int instId)602 int WifiConfigCenter::SetScanControlInfo(const ScanControlInfo &info, int instId)
603 {
604 std::unique_lock<std::mutex> lock(mScanMutex);
605 mScanControlInfo[instId] = info;
606 return 0;
607 }
608
RecordWifiCategory(const std::string bssid,WifiCategory category)609 void WifiConfigCenter::RecordWifiCategory(const std::string bssid, WifiCategory category)
610 {
611 std::unique_lock<std::mutex> lock(mScanMutex);
612 if (bssid.empty()) {
613 return;
614 }
615 auto iter = mWifiCategoryRecord.find(bssid);
616 if (iter != mWifiCategoryRecord.end()) {
617 iter->second = category;
618 } else {
619 mWifiCategoryRecord.emplace(std::make_pair(bssid, category));
620 }
621 }
622
CleanWifiCategoryRecord()623 void WifiConfigCenter::CleanWifiCategoryRecord()
624 {
625 std::unique_lock<std::mutex> lock(mScanMutex);
626 mWifiCategoryRecord.clear();
627 }
628
SetAbnormalApps(const std::vector<std::string> & abnormalAppList)629 void WifiConfigCenter::SetAbnormalApps(const std::vector<std::string> &abnormalAppList)
630 {
631 std::unique_lock<std::mutex> lock(mScanMutex);
632 mAbnormalAppList = abnormalAppList;
633 }
634
GetAbnormalApps(std::vector<std::string> & abnormalAppList)635 int WifiConfigCenter::GetAbnormalApps(std::vector<std::string> &abnormalAppList)
636 {
637 std::unique_lock<std::mutex> lock(mScanMutex);
638 abnormalAppList = mAbnormalAppList;
639 return 0;
640 }
641
SaveScanInfoList(const std::vector<WifiScanInfo> & results)642 int WifiConfigCenter::SaveScanInfoList(const std::vector<WifiScanInfo> &results)
643 {
644 std::unique_lock<std::mutex> lock(mScanMutex);
645 mWifiScanInfoList.clear();
646 mWifiScanInfoList = results;
647 return 0;
648 }
649
ClearScanInfoList()650 int WifiConfigCenter::ClearScanInfoList()
651 {
652 if (HasWifiActive()) {
653 return 0;
654 }
655 #ifdef SUPPORT_RANDOM_MAC_ADDR
656 ClearMacAddrPairs(WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO);
657 #endif
658 std::unique_lock<std::mutex> lock(mScanMutex);
659 mWifiScanInfoList.clear();
660 return 0;
661 }
662
GetScanInfoList(std::vector<WifiScanInfo> & results)663 int WifiConfigCenter::GetScanInfoList(std::vector<WifiScanInfo> &results)
664 {
665 std::unique_lock<std::mutex> lock(mScanMutex);
666 int64_t currentTime = GetElapsedMicrosecondsSinceBoot();
667 for (auto iter = mWifiScanInfoList.begin(); iter != mWifiScanInfoList.end();) {
668 if (iter->disappearCount >= WIFI_DISAPPEAR_TIMES) {
669 #ifdef SUPPORT_RANDOM_MAC_ADDR
670 RemoveMacAddrPairInfo(WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO, iter->bssid);
671 #endif
672 LOGI("ScanInfo remove ssid=%{public}s bssid=%{public}s.\n",
673 SsidAnonymize(iter->ssid).c_str(), MacAnonymize(iter->bssid).c_str());
674 iter = mWifiScanInfoList.erase(iter);
675 continue;
676 }
677 if (iter->timestamp > currentTime - WIFI_GET_SCAN_INFO_VALID_TIMESTAMP) {
678 results.push_back(*iter);
679 }
680 ++iter;
681 }
682 if (results.empty()) {
683 results.assign(mWifiScanInfoList.begin(), mWifiScanInfoList.end());
684 }
685 LOGI("WifiSettings::GetScanInfoList size = %{public}zu", results.size());
686 return 0;
687 }
688
SetWifiLinkedStandardAndMaxSpeed(WifiLinkedInfo & linkInfo)689 int WifiConfigCenter::SetWifiLinkedStandardAndMaxSpeed(WifiLinkedInfo &linkInfo)
690 {
691 std::vector<WifiScanInfo> wifiScanInfoList;
692 wifiScanConfig->GetScanInfoListInner(wifiScanInfoList);
693 for (auto iter = wifiScanInfoList.begin(); iter != wifiScanInfoList.end(); ++iter) {
694 if (iter->bssid == linkInfo.bssid) {
695 linkInfo.wifiStandard = iter->wifiStandard;
696 linkInfo.maxSupportedRxLinkSpeed = iter->maxSupportedRxLinkSpeed;
697 linkInfo.maxSupportedTxLinkSpeed = iter->maxSupportedTxLinkSpeed;
698 break;
699 }
700 }
701 return 0;
702 }
703
CheckScanOnlyAvailable(int instId)704 bool WifiConfigCenter::CheckScanOnlyAvailable(int instId)
705 {
706 return (WifiSettings::GetInstance().GetScanOnlySwitchState(instId)) && (GetAirplaneModeState() == MODE_STATE_CLOSE);
707 }
708
GetConnectedBssid(int instId)709 std::string WifiConfigCenter::GetConnectedBssid(int instId)
710 {
711 WifiLinkedInfo linkedInfo;
712 GetLinkedInfo(linkedInfo, instId);
713 if (linkedInfo.connState == ConnState::CONNECTED) {
714 return linkedInfo.bssid;
715 }
716 return "";
717 }
718
SetSoftapToggledState(bool state)719 void WifiConfigCenter::SetSoftapToggledState(bool state)
720 {
721 mSoftapToggled = state;
722 }
723
GetSoftapToggledState() const724 bool WifiConfigCenter::GetSoftapToggledState() const
725 {
726 return mSoftapToggled.load();
727 }
728
729
SetHotspotIdleTimeout(int time)730 int WifiConfigCenter::SetHotspotIdleTimeout(int time)
731 {
732 mHotspotIdleTimeout = time;
733 return 0;
734 }
735
GetHotspotIdleTimeout() const736 int WifiConfigCenter::GetHotspotIdleTimeout() const
737 {
738 return mHotspotIdleTimeout.load();
739 }
740
SetApIfaceName(const std::string & ifaceName)741 void WifiConfigCenter::SetApIfaceName(const std::string &ifaceName)
742 {
743 std::unique_lock<std::mutex> lock(mApMutex);
744 mApIfaceName = ifaceName;
745 }
746
GetApIfaceName()747 std::string WifiConfigCenter::GetApIfaceName()
748 {
749 std::unique_lock<std::mutex> lock(mApMutex);
750 return mApIfaceName;
751 }
752
GetApMidState(int id)753 WifiOprMidState WifiConfigCenter::GetApMidState(int id)
754 {
755 std::unique_lock<std::mutex> lock(mApMutex);
756 auto iter = mApMidState.find(id);
757 if (iter != mApMidState.end()) {
758 return iter->second.load();
759 } else {
760 mApMidState.emplace(id, WifiOprMidState::CLOSED);
761 return mApMidState[id].load();
762 }
763 }
764
SetApMidState(WifiOprMidState expState,WifiOprMidState state,int id)765 bool WifiConfigCenter::SetApMidState(WifiOprMidState expState, WifiOprMidState state, int id)
766 {
767 std::unique_lock<std::mutex> lock(mApMutex);
768 auto iter = mApMidState.find(id);
769 if (iter != mApMidState.end()) {
770 return iter->second.compare_exchange_strong(expState, state);
771 } else {
772 mApMidState.emplace(id, state);
773 return true;
774 }
775 return false;
776 }
777
SetApMidState(WifiOprMidState state,int id)778 void WifiConfigCenter::SetApMidState(WifiOprMidState state, int id)
779 {
780 std::unique_lock<std::mutex> lock(mApMutex);
781 auto ret = mApMidState.emplace(id, state);
782 if (!ret.second) {
783 mApMidState[id] = state;
784 }
785 }
786
GetHotspotState(int id)787 int WifiConfigCenter::GetHotspotState(int id)
788 {
789 std::unique_lock<std::mutex> lock(mApMutex);
790 auto iter = mHotspotState.find(id);
791 if (iter != mHotspotState.end()) {
792 return iter->second.load();
793 }
794 mHotspotState[id] = static_cast<int>(ApState::AP_STATE_CLOSED);
795 return mHotspotState[id].load();
796 }
797
SetHotspotState(int state,int id)798 int WifiConfigCenter::SetHotspotState(int state, int id)
799 {
800 std::unique_lock<std::mutex> lock(mApMutex);
801 mHotspotState[id] = state;
802 return 0;
803 }
804
SetPowerModel(const PowerModel & model,int id)805 int WifiConfigCenter::SetPowerModel(const PowerModel& model, int id)
806 {
807 std::unique_lock<std::mutex> lock(mApMutex);
808 auto ret = powerModel.emplace(id, model);
809 if (!ret.second) {
810 powerModel[id] = model;
811 }
812 return 0;
813 }
814
GetPowerModel(PowerModel & model,int id)815 int WifiConfigCenter::GetPowerModel(PowerModel& model, int id)
816 {
817 std::unique_lock<std::mutex> lock(mApMutex);
818 auto iter = powerModel.find(id);
819 if (iter != powerModel.end()) {
820 model = iter->second;
821 } else {
822 powerModel[id] = PowerModel::GENERAL;
823 model = powerModel[id];
824 }
825 return 0;
826 }
827
GetStationList(std::vector<StationInfo> & results,int id)828 int WifiConfigCenter::GetStationList(std::vector<StationInfo> &results, int id)
829 {
830 std::unique_lock<std::mutex> lock(mApMutex);
831 for (auto iter = mConnectStationInfo.begin(); iter != mConnectStationInfo.end(); iter++) {
832 results.push_back(iter->second);
833 }
834 return 0;
835 }
836
ManageStation(const StationInfo & info,int mode,int id)837 int WifiConfigCenter::ManageStation(const StationInfo &info, int mode, int id)
838 {
839 std::unique_lock<std::mutex> lock(mApMutex);
840 auto iter = mConnectStationInfo.find(info.bssid);
841 if (mode == MODE_ADD || mode == MODE_UPDATE) {
842 if (iter != mConnectStationInfo.end()) {
843 iter->second = info;
844 } else {
845 mConnectStationInfo.emplace(std::make_pair(info.bssid, info));
846 }
847 #ifdef SUPPORT_RANDOM_MAC_ADDR
848 StoreWifiMacAddrPairInfo(WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO, info.bssid, "");
849 #endif
850 } else if (mode == MODE_DEL) {
851 if (iter != mConnectStationInfo.end()) {
852 mConnectStationInfo.erase(iter);
853 }
854 #ifdef SUPPORT_RANDOM_MAC_ADDR
855 WifiMacAddrInfo randomMacAddrInfo;
856 randomMacAddrInfo.bssid = info.bssid;
857 randomMacAddrInfo.bssidType = RANDOM_DEVICE_ADDRESS;
858 RemoveMacAddrPairs(WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO, randomMacAddrInfo);
859
860 WifiMacAddrInfo realMacAddrInfo;
861 realMacAddrInfo.bssid = info.bssid;
862 realMacAddrInfo.bssidType = REAL_DEVICE_ADDRESS;
863 RemoveMacAddrPairs(WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO, realMacAddrInfo);
864 #endif
865 } else {
866 return -1;
867 }
868 return 0;
869 }
870
ClearStationList(int id)871 int WifiConfigCenter::ClearStationList(int id)
872 {
873 #ifdef SUPPORT_RANDOM_MAC_ADDR
874 ClearMacAddrPairs(WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO);
875 #endif
876 std::unique_lock<std::mutex> lock(mApMutex);
877 mConnectStationInfo.clear();
878 return 0;
879 }
880
SetP2pIfaceName(const std::string & ifaceName)881 void WifiConfigCenter::SetP2pIfaceName(const std::string &ifaceName)
882 {
883 std::unique_lock<std::mutex> lock(mP2pMutex);
884 mP2pIfaceName = ifaceName;
885 }
886
GetP2pIfaceName()887 std::string WifiConfigCenter::GetP2pIfaceName()
888 {
889 std::unique_lock<std::mutex> lock(mP2pMutex);
890 return mP2pIfaceName;
891 }
892
SetHid2dUpperScene(int uid,const Hid2dUpperScene & scene)893 int WifiConfigCenter::SetHid2dUpperScene(int uid, const Hid2dUpperScene &scene)
894 {
895 LOGD("SetHid2dUpperScene uid: %{public}d", uid);
896 std::unique_lock<std::mutex> lock(mP2pMutex);
897 mHid2dUpperScenePair.insert_or_assign(uid, scene);
898 return 0;
899 }
900
GetHid2dUpperScene(int uid,Hid2dUpperScene & scene)901 int WifiConfigCenter::GetHid2dUpperScene(int uid, Hid2dUpperScene &scene)
902 {
903 std::unique_lock<std::mutex> lock(mP2pMutex);
904 auto iter = mHid2dUpperScenePair.find(uid);
905 if (iter != mHid2dUpperScenePair.end()) {
906 scene = iter->second;
907 }
908 return 0;
909 }
910
ClearLocalHid2dInfo(int uid)911 void WifiConfigCenter::ClearLocalHid2dInfo(int uid)
912 {
913 std::unique_lock<std::mutex> lock(mP2pMutex);
914 Hid2dUpperScene scene;
915 scene.mac = "";
916 scene.scene = 0;
917 scene.fps = 0;
918 scene.bw = 0;
919 if (uid != 0) {
920 mHid2dUpperScenePair.insert_or_assign(uid, scene);
921 } else {
922 mHid2dUpperScenePair.insert_or_assign(SOFT_BUS_SERVICE_UID, scene);
923 mHid2dUpperScenePair.insert_or_assign(CAST_ENGINE_SERVICE_UID, scene);
924 mHid2dUpperScenePair.insert_or_assign(MIRACAST_SERVICE_UID, scene);
925 mHid2dUpperScenePair.insert_or_assign(SHARE_SERVICE_UID, scene);
926 mHid2dUpperScenePair.insert_or_assign(MOUSE_CROSS_SERVICE_UID, scene);
927 }
928 }
929
SetP2pEnhanceState(int state)930 int WifiConfigCenter::SetP2pEnhanceState(int state)
931 {
932 mP2pEnhanceState = state;
933 return 0;
934 }
935
GetP2pEnhanceState()936 int WifiConfigCenter::GetP2pEnhanceState()
937 {
938 return mP2pEnhanceState.load();
939 }
940
GetP2pMidState()941 WifiOprMidState WifiConfigCenter::GetP2pMidState()
942 {
943 return mP2pMidState.load();
944 }
945
SetP2pMidState(WifiOprMidState expState,WifiOprMidState state)946 bool WifiConfigCenter::SetP2pMidState(WifiOprMidState expState, WifiOprMidState state)
947 {
948 return mP2pMidState.compare_exchange_strong(expState, state);
949 }
950
SetP2pMidState(WifiOprMidState state)951 void WifiConfigCenter::SetP2pMidState(WifiOprMidState state)
952 {
953 mP2pMidState = state;
954 }
955
SetP2pState(int state)956 int WifiConfigCenter::SetP2pState(int state)
957 {
958 mP2pState = state;
959 return 0;
960 }
961
GetP2pState()962 int WifiConfigCenter::GetP2pState()
963 {
964 return mP2pState.load();
965 }
966
SetP2pDiscoverState(int state)967 int WifiConfigCenter::SetP2pDiscoverState(int state)
968 {
969 mP2pDiscoverState = state;
970 return 0;
971 }
972
GetP2pDiscoverState()973 int WifiConfigCenter::GetP2pDiscoverState()
974 {
975 return mP2pDiscoverState.load();
976 }
977
SetP2pBusinessType(const P2pBusinessType & type)978 int WifiConfigCenter::SetP2pBusinessType(const P2pBusinessType &type)
979 {
980 mP2pBusinessType = type;
981 return 0;
982 }
983
GetP2pBusinessType(P2pBusinessType & type)984 int WifiConfigCenter::GetP2pBusinessType(P2pBusinessType &type)
985 {
986 type = mP2pBusinessType.load();
987 return 0;
988 }
989
SaveP2pCreatorUid(int uid)990 int WifiConfigCenter::SaveP2pCreatorUid(int uid)
991 {
992 mP2pCreatorUid = uid;
993 return 0;
994 }
995
GetP2pCreatorUid()996 int WifiConfigCenter::GetP2pCreatorUid()
997 {
998 return mP2pCreatorUid.load();
999 }
1000
SetExplicitGroup(bool isExplicit)1001 void WifiConfigCenter::SetExplicitGroup(bool isExplicit)
1002 {
1003 mExplicitGroup = isExplicit;
1004 }
1005
IsExplicitGroup(void)1006 bool WifiConfigCenter::IsExplicitGroup(void)
1007 {
1008 return mExplicitGroup.load();
1009 }
1010
GetP2pInfo(WifiP2pLinkedInfo & linkedInfo)1011 int WifiConfigCenter::GetP2pInfo(WifiP2pLinkedInfo &linkedInfo)
1012 {
1013 std::unique_lock<std::mutex> lock(mP2pMutex);
1014 linkedInfo = mWifiP2pInfo;
1015 return 0;
1016 }
1017
SaveP2pInfo(WifiP2pLinkedInfo & linkedInfo)1018 int WifiConfigCenter::SaveP2pInfo(WifiP2pLinkedInfo &linkedInfo)
1019 {
1020 std::unique_lock<std::mutex> lock(mP2pMutex);
1021 mWifiP2pInfo = linkedInfo;
1022 return 0;
1023 }
1024
SetCurrentP2pGroupInfo(const WifiP2pGroupInfo & group)1025 void WifiConfigCenter::SetCurrentP2pGroupInfo(const WifiP2pGroupInfo &group)
1026 {
1027 std::unique_lock<std::mutex> lock(mP2pMutex);
1028 m_P2pGroupInfo = group;
1029 }
1030
GetCurrentP2pGroupInfo()1031 WifiP2pGroupInfo WifiConfigCenter::GetCurrentP2pGroupInfo()
1032 {
1033 std::unique_lock<std::mutex> lock(mP2pMutex);
1034 return m_P2pGroupInfo;
1035 }
1036
SetCoexSupport(bool isSupport)1037 void WifiConfigCenter::SetCoexSupport(bool isSupport)
1038 {
1039 mIsSupportCoex = isSupport;
1040 }
1041
GetCoexSupport() const1042 bool WifiConfigCenter::GetCoexSupport() const
1043 {
1044 return mIsSupportCoex.load();
1045 }
1046
SetScreenState(const int & state)1047 void WifiConfigCenter::SetScreenState(const int &state)
1048 {
1049 mScreenState = state;
1050 }
1051
GetScreenState() const1052 int WifiConfigCenter::GetScreenState() const
1053 {
1054 return mScreenState.load();
1055 }
1056
SetThermalLevel(const int & level)1057 void WifiConfigCenter::SetThermalLevel(const int &level)
1058 {
1059 mThermalLevel = level;
1060 }
1061
GetThermalLevel() const1062 int WifiConfigCenter::GetThermalLevel() const
1063 {
1064 return mThermalLevel.load();
1065 }
1066
SetPowerIdelState(const int & state)1067 void WifiConfigCenter::SetPowerIdelState(const int &state)
1068 {
1069 mPowerIdelState = state;
1070 }
1071
GetPowerIdelState() const1072 int WifiConfigCenter::GetPowerIdelState() const
1073 {
1074 return mPowerIdelState.load();
1075 }
1076
SetGnssFixState(const int & state)1077 void WifiConfigCenter::SetGnssFixState(const int &state)
1078 {
1079 mGnssFixState = state;
1080 }
1081
GetGnssFixState() const1082 int WifiConfigCenter::GetGnssFixState() const
1083 {
1084 return mGnssFixState.load();
1085 }
1086
SetScanGenieState(const int & state)1087 void WifiConfigCenter::SetScanGenieState(const int &state)
1088 {
1089 mScanGenieState = state;
1090 }
1091
GetScanGenieState() const1092 int WifiConfigCenter::GetScanGenieState() const
1093 {
1094 return mScanGenieState.load();
1095 }
1096
SetWifiStateOnAirplaneChanged(const int & state)1097 bool WifiConfigCenter::SetWifiStateOnAirplaneChanged(const int &state)
1098 {
1099 mAirplaneModeState = state;
1100 WifiSettings::GetInstance().SetLastAirplaneMode(state);
1101 if (WifiSettings::GetInstance().GetWifiFlagOnAirplaneMode()) {
1102 if (GetPersistWifiState(INSTID_WLAN0) == WIFI_STATE_DISABLED) {
1103 return true;
1104 }
1105 if (GetPersistWifiState(INSTID_WLAN0) == WIFI_STATE_SEMI_ENABLED && state == MODE_STATE_OPEN) {
1106 SetPersistWifiState(WIFI_STATE_DISABLED, INSTID_WLAN0);
1107 return true;
1108 }
1109 return false;
1110 }
1111 if (state == MODE_STATE_OPEN) {
1112 if (GetPersistWifiState(INSTID_WLAN0) == WIFI_STATE_ENABLED) {
1113 WifiSettings::GetInstance().SetWifiDisabledByAirplane(true);
1114 }
1115 SetPersistWifiState(WIFI_STATE_DISABLED, INSTID_WLAN0);
1116 } else {
1117 if (WifiSettings::GetInstance().GetWifiDisabledByAirplane()) {
1118 SetPersistWifiState(WIFI_STATE_ENABLED, INSTID_WLAN0);
1119 WifiSettings::GetInstance().SetWifiDisabledByAirplane(false);
1120 }
1121 }
1122 return true;
1123 }
1124
GetAirplaneModeState() const1125 int WifiConfigCenter::GetAirplaneModeState() const
1126 {
1127 return mAirplaneModeState.load();
1128 }
1129
GetWifiToggledEnable(int id)1130 int WifiConfigCenter::GetWifiToggledEnable(int id)
1131 {
1132 if (GetAirplaneModeState() == MODE_STATE_OPEN) {
1133 if (GetPersistWifiState(id) == WIFI_STATE_ENABLED) {
1134 return WIFI_STATE_ENABLED;
1135 }
1136 return WIFI_STATE_DISABLED;
1137 }
1138 if (GetPersistWifiState(id) != WIFI_STATE_ENABLED && GetWifiAllowSemiActive()) {
1139 return WIFI_STATE_SEMI_ENABLED;
1140 }
1141 return GetPersistWifiState(id);
1142 }
1143
SetWifiToggledState(int state,int id)1144 void WifiConfigCenter::SetWifiToggledState(int state, int id)
1145 {
1146 if (GetAirplaneModeState() == MODE_STATE_OPEN) {
1147 WifiSettings::GetInstance().SetWifiDisabledByAirplane(false);
1148 if (state == WIFI_STATE_ENABLED) {
1149 WifiSettings::GetInstance().SetWifiFlagOnAirplaneMode(true);
1150 } else {
1151 WifiSettings::GetInstance().SetWifiFlagOnAirplaneMode(false);
1152 state = WIFI_STATE_DISABLED;
1153 }
1154 }
1155 SetPersistWifiState(state, id);
1156 }
1157
SetPowerSavingModeState(const int & state)1158 void WifiConfigCenter::SetPowerSavingModeState(const int &state)
1159 {
1160 mPowerSavingModeState = state;
1161 }
1162
GetPowerSavingModeState() const1163 int WifiConfigCenter::GetPowerSavingModeState() const
1164 {
1165 return mPowerSavingModeState.load();
1166 }
1167
SetFreezeModeState(int state)1168 void WifiConfigCenter::SetFreezeModeState(int state)
1169 {
1170 mFreezeModeState = state;
1171 }
1172
GetFreezeModeState() const1173 int WifiConfigCenter::GetFreezeModeState() const
1174 {
1175 return mFreezeModeState.load();
1176 }
1177
SetNoChargerPlugModeState(int state)1178 void WifiConfigCenter::SetNoChargerPlugModeState(int state)
1179 {
1180 mNoChargerPlugModeState = state;
1181 }
1182
GetNoChargerPlugModeState() const1183 int WifiConfigCenter::GetNoChargerPlugModeState() const
1184 {
1185 return mNoChargerPlugModeState.load();
1186 }
1187
SetThreadStatusFlag(bool state)1188 void WifiConfigCenter::SetThreadStatusFlag(bool state)
1189 {
1190 if (state) {
1191 mThreadStartTime = std::chrono::duration_cast<std::chrono::milliseconds>(
1192 std::chrono::steady_clock::now().time_since_epoch()).count();
1193 }
1194 mThreadStatusFlag_ = state;
1195 }
1196
GetThreadStatusFlag(void) const1197 bool WifiConfigCenter::GetThreadStatusFlag(void) const
1198 {
1199 return mThreadStatusFlag_.load();
1200 }
1201
GetThreadStartTime(void) const1202 uint64_t WifiConfigCenter::GetThreadStartTime(void) const
1203 {
1204 return mThreadStartTime.load();
1205 }
1206
StoreWifiMacAddrPairInfo(WifiMacAddrInfoType type,const std::string & realMacAddr,const std::string & randomAddr)1207 bool WifiConfigCenter::StoreWifiMacAddrPairInfo(WifiMacAddrInfoType type, const std::string &realMacAddr,
1208 const std::string &randomAddr)
1209 {
1210 if (realMacAddr.empty()) {
1211 return false;
1212 }
1213
1214 if (type >= WifiMacAddrInfoType::INVALID_MACADDR_INFO) {
1215 return false;
1216 }
1217
1218 std::string randomMacAddr;
1219 if (randomAddr.empty()) {
1220 WifiRandomMacHelper::GenerateRandomMacAddressByBssid(realMacAddr, randomMacAddr);
1221 } else {
1222 randomMacAddr = randomAddr;
1223 }
1224 LOGD("%{public}s: type:%{public}d, address:%{private}s, randomAddr:%{private}s, randomMacAddr:%{private}s",
1225 __func__, type, realMacAddr.c_str(), randomAddr.c_str(), randomMacAddr.c_str());
1226 WifiMacAddrInfo realMacAddrInfo;
1227 realMacAddrInfo.bssid = realMacAddr;
1228 realMacAddrInfo.bssidType = REAL_DEVICE_ADDRESS;
1229 WifiMacAddrErrCode ret = AddMacAddrPairs(type, realMacAddrInfo, randomMacAddr);
1230 if (ret == WIFI_MACADDR_OPER_SUCCESS) {
1231 WifiMacAddrInfo randomMacAddrInfo;
1232 randomMacAddrInfo.bssid = randomMacAddr;
1233 randomMacAddrInfo.bssidType = RANDOM_DEVICE_ADDRESS;
1234 AddMacAddrPairs(type, randomMacAddrInfo, realMacAddr);
1235 }
1236 return true;
1237 }
1238
GetRandomMacAddr(WifiMacAddrInfoType type,std::string bssid)1239 std::string WifiConfigCenter::GetRandomMacAddr(WifiMacAddrInfoType type, std::string bssid)
1240 {
1241 LOGD("%{public}s: query a random mac address, type:%{public}d, bssid:%{private}s",
1242 __func__, type, bssid.c_str());
1243 WifiMacAddrInfo realMacAddrInfo;
1244 realMacAddrInfo.bssid = bssid;
1245 realMacAddrInfo.bssidType = REAL_DEVICE_ADDRESS;
1246 std::string randomMacAddr = GetMacAddrPairs(type, realMacAddrInfo);
1247 if (!randomMacAddr.empty()) {
1248 LOGD("%{public}s: find the record, bssid:%{private}s, bssidType:%{public}d, randomMacAddr:%{private}s",
1249 __func__, realMacAddrInfo.bssid.c_str(), realMacAddrInfo.bssidType, randomMacAddr.c_str());
1250 return randomMacAddr;
1251 } else {
1252 WifiMacAddrInfo randomMacAddrInfo;
1253 randomMacAddrInfo.bssid = bssid;
1254 randomMacAddrInfo.bssidType = RANDOM_DEVICE_ADDRESS;
1255 randomMacAddr = GetMacAddrPairs(type, realMacAddrInfo);
1256 if (!randomMacAddr.empty()) {
1257 LOGD("%{public}s: find the record, bssid:%{private}s, bssidType:%{public}d, randomMacAddr:%{private}s",
1258 __func__, randomMacAddrInfo.bssid.c_str(), randomMacAddrInfo.bssidType, randomMacAddr.c_str());
1259 return randomMacAddr;
1260 }
1261 }
1262 return "";
1263 }
1264
RemoveMacAddrPairs(WifiMacAddrInfoType type,const WifiMacAddrInfo & macAddrInfo)1265 int WifiConfigCenter::RemoveMacAddrPairs(WifiMacAddrInfoType type, const WifiMacAddrInfo &macAddrInfo)
1266 {
1267 LOGD("remove a mac address pair, type:%{public}d, bssid:%{private}s, bssidType:%{public}d",
1268 type, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType);
1269 std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
1270 switch (type) {
1271 case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
1272 DelMacAddrPairs(mWifiScanMacAddrPair, macAddrInfo);
1273 break;
1274 case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
1275 DelMacAddrPairs(mHotspotMacAddrPair, macAddrInfo);
1276 break;
1277 case WifiMacAddrInfoType::P2P_DEVICE_MACADDR_INFO:
1278 DelMacAddrPairs(mP2pDeviceMacAddrPair, macAddrInfo);
1279 break;
1280 case WifiMacAddrInfoType::P2P_GROUPSINFO_MACADDR_INFO:
1281 DelMacAddrPairs(mP2pGroupsInfoMacAddrPair, macAddrInfo);
1282 break;
1283 case WifiMacAddrInfoType::P2P_CURRENT_GROUP_MACADDR_INFO:
1284 DelMacAddrPairs(mP2pCurrentgroupMacAddrPair, macAddrInfo);
1285 break;
1286 default:
1287 LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
1288 return -1;
1289 }
1290 return 0;
1291 }
1292
GetMacAddrPairs(WifiMacAddrInfoType type,const WifiMacAddrInfo & macAddrInfo)1293 std::string WifiConfigCenter::GetMacAddrPairs(WifiMacAddrInfoType type, const WifiMacAddrInfo &macAddrInfo)
1294 {
1295 LOGD("get a mac address pair, type:%{public}d, bssid:%{private}s, bssidType:%{public}d",
1296 type, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType);
1297 std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
1298 switch (type) {
1299 case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
1300 return GetPairMacAddress(mWifiScanMacAddrPair, macAddrInfo);
1301 case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
1302 return GetPairMacAddress(mHotspotMacAddrPair, macAddrInfo);
1303 case WifiMacAddrInfoType::P2P_DEVICE_MACADDR_INFO:
1304 return GetPairMacAddress(mP2pDeviceMacAddrPair, macAddrInfo);
1305 case WifiMacAddrInfoType::P2P_GROUPSINFO_MACADDR_INFO:
1306 return GetPairMacAddress(mP2pGroupsInfoMacAddrPair, macAddrInfo);
1307 case WifiMacAddrInfoType::P2P_CURRENT_GROUP_MACADDR_INFO:
1308 return GetPairMacAddress(mP2pCurrentgroupMacAddrPair, macAddrInfo);
1309 default:
1310 LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
1311 return "";
1312 }
1313 return "";
1314 }
1315
ClearMacAddrPairs(WifiMacAddrInfoType type)1316 void WifiConfigCenter::ClearMacAddrPairs(WifiMacAddrInfoType type)
1317 {
1318 LOGI("%{public}s type:%{public}d", __func__, type);
1319 std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
1320 switch (type) {
1321 case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
1322 mWifiScanMacAddrPair.clear();
1323 break;
1324 case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
1325 mHotspotMacAddrPair.clear();
1326 break;
1327 case WifiMacAddrInfoType::P2P_DEVICE_MACADDR_INFO:
1328 mP2pDeviceMacAddrPair.clear();
1329 break;
1330 case WifiMacAddrInfoType::P2P_GROUPSINFO_MACADDR_INFO:
1331 mP2pGroupsInfoMacAddrPair.clear();
1332 break;
1333 case WifiMacAddrInfoType::P2P_CURRENT_GROUP_MACADDR_INFO:
1334 mP2pCurrentgroupMacAddrPair.clear();
1335 break;
1336 default:
1337 LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
1338 }
1339 return;
1340 }
1341
HasWifiActive()1342 bool WifiConfigCenter::HasWifiActive()
1343 {
1344 std::unique_lock<std::mutex> lock(mStaMutex);
1345 for (auto &item : mWifiState) {
1346 int state = item.second.load();
1347 if (state == static_cast<int>(WifiState::ENABLING) || state == static_cast<int>(WifiState::ENABLED)) {
1348 LOGD("HasWifiActive: one wifi is active! instId:%{public}d", item.first);
1349 return true;
1350 }
1351 }
1352 LOGD("HasWifiActive: No wifi is active!");
1353 return false;
1354 }
1355
UpdateLinkedInfo(int instId)1356 void WifiConfigCenter::UpdateLinkedInfo(int instId)
1357 {
1358 std::vector<WifiScanInfo> wifiScanInfoList;
1359 wifiScanConfig->GetScanInfoListInner(wifiScanInfoList);
1360 for (auto iter = wifiScanInfoList.begin(); iter != wifiScanInfoList.end(); ++iter) {
1361 if (iter->bssid == mWifiLinkedInfo[instId].bssid) {
1362 if (mWifiLinkedInfo[instId].channelWidth == WifiChannelWidth::WIDTH_INVALID) {
1363 mWifiLinkedInfo[instId].channelWidth = iter->channelWidth;
1364 }
1365 mWifiLinkedInfo[instId].isHiLinkNetwork = iter->isHiLinkNetwork;
1366 break;
1367 }
1368 }
1369 WifiCategory category = wifiScanConfig->GetWifiCategoryRecord(mWifiLinkedInfo[instId].bssid);
1370 mWifiLinkedInfo[instId].supportedWifiCategory = category;
1371 LOGD("WifiSettings UpdateLinkedInfo.");
1372 }
1373
SetPersistWifiState(int state,int instId)1374 void WifiConfigCenter::SetPersistWifiState(int state, int instId)
1375 {
1376 if (instId < 0 || instId >= STA_INSTANCE_MAX_NUM) {
1377 LOGE("SetPersistWifiState invalid instId %{public}d", instId);
1378 return;
1379 }
1380 mPersistWifiState.at(instId) = state;
1381 WifiSettings::GetInstance().SetOperatorWifiType(state, instId);
1382 LOGI("persist wifi state is %{public}d", state);
1383 }
1384
GetPersistWifiState(int instId)1385 int WifiConfigCenter::GetPersistWifiState(int instId)
1386 {
1387 if (instId < 0 || instId >= STA_INSTANCE_MAX_NUM) {
1388 LOGE("GetPersistWifiState invalid instId %{public}d", instId);
1389 return -1;
1390 }
1391 return mPersistWifiState.at(instId);
1392 }
1393
GetPairMacAddress(std::map<WifiMacAddrInfo,std::string> & macAddrInfoMap,const WifiMacAddrInfo & macAddrInfo)1394 std::string WifiConfigCenter::GetPairMacAddress(std::map<WifiMacAddrInfo, std::string>& macAddrInfoMap,
1395 const WifiMacAddrInfo &macAddrInfo)
1396 {
1397 auto iter = macAddrInfoMap.find(macAddrInfo);
1398 if (iter != macAddrInfoMap.end()) {
1399 LOGD("%{public}s: find the record, realMacAddr:%{private}s, bssidType:%{public}d, randomMacAddr:%{private}s",
1400 __func__, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType, iter->second.c_str());
1401 return iter->second;
1402 } else {
1403 LOGD("%{public}s: record not found.", __func__);
1404 }
1405 return "";
1406 }
1407
InsertMacAddrPairs(std::map<WifiMacAddrInfo,std::string> & macAddrInfoMap,const WifiMacAddrInfo & macAddrInfo,std::string & randomMacAddr)1408 WifiMacAddrErrCode WifiConfigCenter::InsertMacAddrPairs(std::map<WifiMacAddrInfo, std::string>& macAddrInfoMap,
1409 const WifiMacAddrInfo &macAddrInfo, std::string& randomMacAddr)
1410 {
1411 auto iter = macAddrInfoMap.find(macAddrInfo);
1412 if (iter != macAddrInfoMap.end()) {
1413 LOGD("%{public}s: the record is existed, macAddr:%{private}s, bssidType:%{public}d, value:%{private}s",
1414 __func__, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType, iter->second.c_str());
1415 return WIFI_MACADDR_HAS_EXISTED;
1416 } else {
1417 macAddrInfoMap.insert(std::make_pair(macAddrInfo, randomMacAddr));
1418 LOGD("%{public}s: add a mac address pair, bssid:%{private}s, bssidType:%{public}d, randomMacAddr:%{private}s",
1419 __func__, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType, randomMacAddr.c_str());
1420 return WIFI_MACADDR_OPER_SUCCESS;
1421 }
1422 }
1423
DelMacAddrPairs(std::map<WifiMacAddrInfo,std::string> & macAddrInfoMap,const WifiMacAddrInfo & macAddrInfo)1424 void WifiConfigCenter::DelMacAddrPairs(std::map<WifiMacAddrInfo, std::string>& macAddrInfoMap,
1425 const WifiMacAddrInfo &macAddrInfo)
1426 {
1427 auto iter = macAddrInfoMap.find(macAddrInfo);
1428 if (iter != macAddrInfoMap.end()) {
1429 if (iter->second.empty()) {
1430 LOGI("%{public}s: invalid record, bssid:%{private}s, bssidType:%{public}d",
1431 __func__, iter->first.bssid.c_str(), iter->first.bssidType);
1432 } else {
1433 LOGD("%{public}s:find the record, realMacAddr:%{private}s, bssidType:%{public}d, randomMacAddr:%{private}s",
1434 __func__, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType, iter->second.c_str());
1435 }
1436 macAddrInfoMap.erase(iter);
1437 }
1438 }
1439
RemoveMacAddrPairInfo(WifiMacAddrInfoType type,std::string bssid)1440 void WifiConfigCenter::RemoveMacAddrPairInfo(WifiMacAddrInfoType type, std::string bssid)
1441 {
1442 LOGD("%{public}s: remove a mac address pair, type:%{public}d, bssid:%{private}s",
1443 __func__, type, bssid.c_str());
1444 WifiMacAddrInfo realMacAddrInfo;
1445 realMacAddrInfo.bssid = bssid;
1446 realMacAddrInfo.bssidType = REAL_DEVICE_ADDRESS;
1447 RemoveMacAddrPairs(type, realMacAddrInfo);
1448
1449 WifiMacAddrInfo randomMacAddrInfo;
1450 randomMacAddrInfo.bssid = bssid;
1451 randomMacAddrInfo.bssidType = RANDOM_DEVICE_ADDRESS;
1452 RemoveMacAddrPairs(type, randomMacAddrInfo);
1453 }
1454
AddMacAddrPairs(WifiMacAddrInfoType type,const WifiMacAddrInfo & macAddrInfo,std::string randomMacAddr)1455 WifiMacAddrErrCode WifiConfigCenter::AddMacAddrPairs(WifiMacAddrInfoType type,
1456 const WifiMacAddrInfo &macAddrInfo, std::string randomMacAddr)
1457 {
1458 if ((type >= WifiMacAddrInfoType::INVALID_MACADDR_INFO) || macAddrInfo.bssid.empty()) {
1459 LOGE("%{public}s: invalid parameter, type:%{public}d, bssid:%{private}s",
1460 __func__, type, macAddrInfo.bssid.c_str());
1461 return WIFI_MACADDR_INVALID_PARAM;
1462 }
1463 std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
1464 switch (type) {
1465 case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
1466 return InsertMacAddrPairs(mWifiScanMacAddrPair, macAddrInfo, randomMacAddr);
1467 case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
1468 return InsertMacAddrPairs(mHotspotMacAddrPair, macAddrInfo, randomMacAddr);
1469 case WifiMacAddrInfoType::P2P_DEVICE_MACADDR_INFO:
1470 return InsertMacAddrPairs(mP2pDeviceMacAddrPair, macAddrInfo, randomMacAddr);
1471 case WifiMacAddrInfoType::P2P_GROUPSINFO_MACADDR_INFO:
1472 return InsertMacAddrPairs(mP2pGroupsInfoMacAddrPair, macAddrInfo, randomMacAddr);
1473 case WifiMacAddrInfoType::P2P_CURRENT_GROUP_MACADDR_INFO:
1474 return InsertMacAddrPairs(mP2pCurrentgroupMacAddrPair, macAddrInfo, randomMacAddr);
1475 default:
1476 LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
1477 break;
1478 }
1479 return WIFI_MACADDR_INVALID_PARAM;
1480 }
1481
GetAllWifiLinkedNetworkId()1482 std::set<int> WifiConfigCenter::GetAllWifiLinkedNetworkId()
1483 {
1484 std::unique_lock<std::mutex> lock(mStaMutex);
1485 std::set<int> wifiLinkedNetworkId;
1486 for (auto iter = mWifiLinkedInfo.begin(); iter != mWifiLinkedInfo.end(); iter++) {
1487 wifiLinkedNetworkId.insert(iter->second.networkId);
1488 }
1489 return wifiLinkedNetworkId;
1490 }
1491 } // namespace Wifi
1492 } // namespace OHOS
1493