• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #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