• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 #include "wifi_settings.h"
16 #include <algorithm>
17 #include <chrono>
18 #include "define.h"
19 #include "wifi_cert_utils.h"
20 #include "wifi_global_func.h"
21 #include "wifi_log.h"
22 #include "wifi_config_country_freqs.h"
23 #include <random>
24 #ifdef FEATURE_ENCRYPTION_SUPPORT
25 #include "wifi_encryption_util.h"
26 #endif
27 namespace OHOS {
28 namespace Wifi {
GetInstance()29 WifiSettings &WifiSettings::GetInstance()
30 {
31     static WifiSettings gWifiSettings;
32     return gWifiSettings;
33 }
34 
WifiSettings()35 WifiSettings::WifiSettings()
36     : mWifiStaCapabilities(0),
37       mWifiState(0),
38       mScanAlwaysActive(false),
39       mP2pState(static_cast<int>(P2pState::P2P_STATE_CLOSED)),
40       mP2pDiscoverState(0),
41       mP2pConnectState(0),
42       mApMaxConnNum(0),
43       mMaxNumConfigs(0),
44       mLastSelectedNetworkId(-1),
45       mLastSelectedTimeVal(0),
46       mScreenState(MODE_STATE_OPEN),
47       mAirplaneModeState(MODE_STATE_CLOSE),
48       mAppRunningModeState(ScanMode::SYS_FOREGROUND_SCAN),
49       mPowerSavingModeState(MODE_STATE_CLOSE),
50       mFreezeModeState(MODE_STATE_CLOSE),
51       mNoChargerPlugModeState(MODE_STATE_CLOSE),
52       mHotspotIdleTimeout(HOTSPOT_IDLE_TIMEOUT_INTERVAL_MS),
53       mLastDiscReason(DisconnectedReason::DISC_REASON_DEFAULT),
54       explicitGroup(false)
55 {
56     mHotspotState[0] = static_cast<int>(ApState::AP_STATE_CLOSED);
57     powerModel[0] = PowerModel::GENERAL;
58     mThermalLevel = static_cast<int>(ThermalLevel::NORMAL);
59     mValidChannels.clear();
60 }
61 
~WifiSettings()62 WifiSettings::~WifiSettings()
63 {
64     SyncDeviceConfig();
65     SyncHotspotConfig();
66     SyncBlockList();
67     SyncWifiP2pGroupInfoConfig();
68     SyncP2pVendorConfig();
69     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
70     SyncWifiConfig();
71 }
72 
InitWifiConfig()73 void WifiSettings::InitWifiConfig()
74 {
75     if (mSavedWifiConfig.LoadConfig() < 0) {
76         return;
77     }
78     std::vector<WifiConfig> tmp;
79     mSavedWifiConfig.GetValue(tmp);
80     if (tmp.size() > 0) {
81         mWifiConfig = tmp[0];
82         mScanAlwaysActive = mWifiConfig.scanAlwaysSwitch;
83     }
84     return;
85 }
86 
InitHotspotConfig()87 void WifiSettings::InitHotspotConfig()
88 {
89     /* init hotspot config */
90     if (mSavedHotspotConfig.LoadConfig() >= 0) {
91         std::vector<HotspotConfig> tmp;
92         mSavedHotspotConfig.GetValue(tmp);
93         if (tmp.size() > 0) {
94             for (size_t i = 0; i < tmp.size(); i++) {
95                 mHotspotConfig[i] = tmp[i];
96             }
97         } else {
98             InitDefaultHotspotConfig();
99         }
100     } else {
101         InitDefaultHotspotConfig();
102     }
103     /* init block list info */
104     if (mSavedBlockInfo.LoadConfig() >= 0) {
105         std::vector<StationInfo> tmp;
106         mSavedBlockInfo.GetValue(tmp);
107         for (std::size_t i = 0; i < tmp.size(); ++i) {
108             StationInfo &item = tmp[i];
109             mBlockListInfo.emplace(item.bssid, item);
110         }
111     }
112     return;
113 }
114 
InitP2pVendorConfig()115 void WifiSettings::InitP2pVendorConfig()
116 {
117     if (mSavedWifiP2pVendorConfig.LoadConfig() >= 0) {
118         std::vector<P2pVendorConfig> tmp;
119         mSavedWifiP2pVendorConfig.GetValue(tmp);
120         if (tmp.size() > 0) {
121             mP2pVendorConfig = tmp[0];
122         } else {
123             InitDefaultP2pVendorConfig();
124         }
125     } else {
126         InitDefaultP2pVendorConfig();
127     }
128     return;
129 }
130 
Init()131 int WifiSettings::Init()
132 {
133     mCountryCode = "CN";
134     InitSettingsNum();
135 
136     /* read ini config */
137     mSavedDeviceConfig.SetConfigFilePath(DEVICE_CONFIG_FILE_PATH);
138     mSavedHotspotConfig.SetConfigFilePath(HOTSPOT_CONFIG_FILE_PATH);
139     mSavedBlockInfo.SetConfigFilePath(BLOCK_LIST_FILE_PATH);
140     mSavedWifiConfig.SetConfigFilePath(WIFI_CONFIG_FILE_PATH);
141     mSavedWifiP2pGroupInfo.SetConfigFilePath(WIFI_P2P_GROUP_INFO_FILE_PATH);
142     mSavedWifiP2pVendorConfig.SetConfigFilePath(WIFI_P2P_VENDOR_CONFIG_FILE_PATH);
143     mTrustListPolicies.SetConfigFilePath(WIFI_TRUST_LIST_POLICY_FILE_PATH);
144     mMovingFreezePolicy.SetConfigFilePath(WIFI_MOVING_FREEZE_POLICY_FILE_PATH);
145     mSavedWifiStoreRandomMac.SetConfigFilePath(WIFI_STA_RANDOM_MAC_FILE_PATH);
146     InitWifiConfig();
147     ReloadDeviceConfig();
148     InitHotspotConfig();
149     InitP2pVendorConfig();
150     ReloadWifiP2pGroupInfoConfig();
151     InitScanControlInfo();
152     ReloadTrustListPolicies();
153     ReloadMovingFreezePolicy();
154     ReloadStaRandomMac();
155 #ifdef FEATURE_ENCRYPTION_SUPPORT
156     SetUpHks();
157 #endif
158     IncreaseNumRebootsSinceLastUse();
159     return 0;
160 }
161 
GetWifiStaCapabilities() const162 int WifiSettings::GetWifiStaCapabilities() const
163 {
164     return mWifiStaCapabilities;
165 }
166 
SetWifiStaCapabilities(int capabilities)167 int WifiSettings::SetWifiStaCapabilities(int capabilities)
168 {
169     mWifiStaCapabilities = capabilities;
170     return 0;
171 }
172 
GetWifiState() const173 int WifiSettings::GetWifiState() const
174 {
175     return mWifiState.load();
176 }
177 
SetWifiState(int state)178 int WifiSettings::SetWifiState(int state)
179 {
180     mWifiState = state;
181     return 0;
182 }
183 
GetScanAlwaysState() const184 bool WifiSettings::GetScanAlwaysState() const
185 {
186     return mScanAlwaysActive.load();
187 }
188 
SetScanAlwaysState(bool isActive)189 int WifiSettings::SetScanAlwaysState(bool isActive)
190 {
191     mScanAlwaysActive = isActive;
192     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
193     mWifiConfig.scanAlwaysSwitch = isActive;
194     SyncWifiConfig();
195     return 0;
196 }
197 
SaveScanInfoList(const std::vector<WifiScanInfo> & results)198 int WifiSettings::SaveScanInfoList(const std::vector<WifiScanInfo> &results)
199 {
200     std::unique_lock<std::mutex> lock(mInfoMutex);
201     mWifiScanInfoList = results;
202     return 0;
203 }
204 
ClearScanInfoList()205 int WifiSettings::ClearScanInfoList()
206 {
207     std::unique_lock<std::mutex> lock(mInfoMutex);
208     mWifiScanInfoList.clear();
209     return 0;
210 }
211 
GetScanInfoList(std::vector<WifiScanInfo> & results)212 int WifiSettings::GetScanInfoList(std::vector<WifiScanInfo> &results)
213 {
214     struct timespec clkTime = {0, 0};
215     clock_gettime(CLOCK_MONOTONIC, &clkTime);
216     int64_t curr = static_cast<int64_t>(clkTime.tv_sec) * MSEC * MSEC + clkTime.tv_nsec / MSEC; /* us */
217     std::unique_lock<std::mutex> lock(mInfoMutex);
218     for (auto iter = mWifiScanInfoList.begin(); iter != mWifiScanInfoList.end(); ++iter) {
219         if (iter->timestamp + WIFI_GET_SCAN_INFO_VALID_TIMESTAMP * MSEC * MSEC < curr) {
220             continue;
221         }
222         results.push_back(*iter);
223     }
224     return 0;
225 }
226 
SetWifiLinkedStandardAndMaxSpeed(WifiLinkedInfo & linkInfo)227 int WifiSettings::SetWifiLinkedStandardAndMaxSpeed(WifiLinkedInfo &linkInfo)
228 {
229     std::unique_lock<std::mutex> lock(mInfoMutex);
230     for (auto iter = mWifiScanInfoList.begin(); iter != mWifiScanInfoList.end(); ++iter) {
231         if (iter->bssid == linkInfo.bssid) {
232             linkInfo.wifiStandard = iter->wifiStandard;
233             linkInfo.maxSupportedRxLinkSpeed = iter->maxSupportedRxLinkSpeed;
234             linkInfo.maxSupportedTxLinkSpeed = iter->maxSupportedTxLinkSpeed;
235             break;
236         }
237     }
238     return 0;
239 }
240 
GetScanControlInfo(ScanControlInfo & info)241 int WifiSettings::GetScanControlInfo(ScanControlInfo &info)
242 {
243     std::unique_lock<std::mutex> lock(mInfoMutex);
244     info = mScanControlInfo;
245     return 0;
246 }
247 
GetP2pInfo(WifiP2pLinkedInfo & linkedInfo)248 int WifiSettings::GetP2pInfo(WifiP2pLinkedInfo &linkedInfo)
249 {
250     std::unique_lock<std::mutex> lock(mInfoMutex);
251     linkedInfo = mWifiP2pInfo;
252     return 0;
253 }
254 
SaveP2pInfo(WifiP2pLinkedInfo & linkedInfo)255 int WifiSettings::SaveP2pInfo(WifiP2pLinkedInfo &linkedInfo)
256 {
257     std::unique_lock<std::mutex> lock(mInfoMutex);
258     mWifiP2pInfo = linkedInfo;
259     return 0;
260 }
261 
SetScanControlInfo(const ScanControlInfo & info)262 int WifiSettings::SetScanControlInfo(const ScanControlInfo &info)
263 {
264     std::unique_lock<std::mutex> lock(mInfoMutex);
265     mScanControlInfo = info;
266     return 0;
267 }
268 
AddDeviceConfig(const WifiDeviceConfig & config)269 int WifiSettings::AddDeviceConfig(const WifiDeviceConfig &config)
270 {
271     std::unique_lock<std::mutex> lock(mConfigMutex);
272     auto iter = mWifiDeviceConfig.find(config.networkId);
273     if (iter != mWifiDeviceConfig.end()) {
274         iter->second = config;
275     } else {
276         mWifiDeviceConfig.emplace(std::make_pair(config.networkId, config));
277     }
278     return config.networkId;
279 }
280 
RemoveDevice(int networkId)281 int WifiSettings::RemoveDevice(int networkId)
282 {
283     std::unique_lock<std::mutex> lock(mConfigMutex);
284     auto iter = mWifiDeviceConfig.find(networkId);
285     if (iter != mWifiDeviceConfig.end()) {
286         if (!iter->second.wifiEapConfig.clientCert.empty()) {
287             if (WifiCertUtils::UninstallCert(iter->second.wifiEapConfig.clientCert) != 0) {
288                 LOGE("uninstall cert %{public}s fail", iter->second.wifiEapConfig.clientCert.c_str());
289             } else {
290                 LOGD("uninstall cert %{public}s success", iter->second.wifiEapConfig.clientCert.c_str());
291             }
292         }
293         mWifiDeviceConfig.erase(iter);
294     }
295     return 0;
296 }
297 
ClearDeviceConfig(void)298 void WifiSettings::ClearDeviceConfig(void)
299 {
300     std::unique_lock<std::mutex> lock(mConfigMutex);
301     for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
302         if (iter->second.wifiEapConfig.clientCert.empty()) {
303             continue;
304         }
305         if (WifiCertUtils::UninstallCert(iter->second.wifiEapConfig.clientCert) != 0) {
306             LOGE("uninstall cert %{public}s fail", iter->second.wifiEapConfig.clientCert.c_str());
307         } else {
308             LOGD("uninstall cert %{public}s success", iter->second.wifiEapConfig.clientCert.c_str());
309         }
310     }
311     mWifiDeviceConfig.clear();
312     return;
313 }
314 
GetDeviceConfig(std::vector<WifiDeviceConfig> & results)315 int WifiSettings::GetDeviceConfig(std::vector<WifiDeviceConfig> &results)
316 {
317     if (!deviceConfigLoadFlag.test_and_set()) {
318         LOGD("Reload wifi config");
319         ReloadDeviceConfig();
320     }
321     std::unique_lock<std::mutex> lock(mConfigMutex);
322     for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
323         results.push_back(iter->second);
324     }
325     return 0;
326 }
327 
GetDeviceConfig(const int & networkId,WifiDeviceConfig & config)328 int WifiSettings::GetDeviceConfig(const int &networkId, WifiDeviceConfig &config)
329 {
330     if (!deviceConfigLoadFlag.test_and_set()) {
331         LOGD("Reload wifi config");
332         ReloadDeviceConfig();
333     }
334     std::unique_lock<std::mutex> lock(mConfigMutex);
335     for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
336         if (iter->second.networkId == networkId) {
337             config = iter->second;
338             return 0;
339         }
340     }
341     return -1;
342 }
343 
GetDeviceConfig(const std::string & index,const int & indexType,WifiDeviceConfig & config)344 int WifiSettings::GetDeviceConfig(const std::string &index, const int &indexType, WifiDeviceConfig &config)
345 {
346     if (!deviceConfigLoadFlag.test_and_set()) {
347         LOGD("Reload wifi config");
348         ReloadDeviceConfig();
349     }
350     std::unique_lock<std::mutex> lock(mConfigMutex);
351     if (indexType == DEVICE_CONFIG_INDEX_SSID) {
352         for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
353             if (iter->second.ssid == index) {
354                 config = iter->second;
355                 return 0;
356             }
357         }
358     } else {
359         for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
360             if (iter->second.bssid == index) {
361                 config = iter->second;
362                 return 0;
363             }
364         }
365     }
366     return -1;
367 }
368 
GetDeviceConfig(const std::string & ssid,const std::string & keymgmt,WifiDeviceConfig & config)369 int WifiSettings::GetDeviceConfig(const std::string &ssid, const std::string &keymgmt, WifiDeviceConfig &config)
370 {
371     if (!deviceConfigLoadFlag.test_and_set()) {
372         LOGD("Reload wifi config");
373         ReloadDeviceConfig();
374     }
375     std::unique_lock<std::mutex> lock(mConfigMutex);
376     for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
377         if ((iter->second.ssid == ssid) && (iter->second.keyMgmt == keymgmt)) {
378             config = iter->second;
379             return 0;
380         }
381     }
382     return -1;
383 }
384 
GetHiddenDeviceConfig(std::vector<WifiDeviceConfig> & results)385 int WifiSettings::GetHiddenDeviceConfig(std::vector<WifiDeviceConfig> &results)
386 {
387     if (!deviceConfigLoadFlag.test_and_set()) {
388         LOGD("Reload wifi config");
389         ReloadDeviceConfig();
390     }
391     std::unique_lock<std::mutex> lock(mConfigMutex);
392     for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
393         if (iter->second.hiddenSSID) {
394             results.push_back(iter->second);
395         }
396     }
397     return 0;
398 }
399 
SetDeviceState(int networkId,int state,bool bSetOther)400 int WifiSettings::SetDeviceState(int networkId, int state, bool bSetOther)
401 {
402     if (state < 0 || state >= (int)WifiDeviceConfigStatus::UNKNOWN) {
403         return -1;
404     }
405     std::unique_lock<std::mutex> lock(mConfigMutex);
406     auto iter = mWifiDeviceConfig.find(networkId);
407     if (iter == mWifiDeviceConfig.end()) {
408         return -1;
409     }
410     iter->second.status = state;
411     if (bSetOther && state == (int)WifiDeviceConfigStatus::ENABLED) {
412         for (iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); ++iter) {
413             if (iter->first != networkId && iter->second.status == state) {
414                 iter->second.status = 1;
415             }
416         }
417     }
418     return 0;
419 }
420 
SetDeviceAfterConnect(int networkId)421 int WifiSettings::SetDeviceAfterConnect(int networkId)
422 {
423     std::unique_lock<std::mutex> lock(mConfigMutex);
424     auto iter = mWifiDeviceConfig.find(networkId);
425     if (iter == mWifiDeviceConfig.end()) {
426         return -1;
427     }
428     LOGD("Set Device After Connect");
429     iter->second.lastConnectTime = time(0);
430     iter->second.numRebootsSinceLastUse = 0;
431     iter->second.numAssociation++;
432     return 0;
433 }
434 
GetCandidateConfig(const int uid,const int & networkId,WifiDeviceConfig & config)435 int WifiSettings::GetCandidateConfig(const int uid, const int &networkId, WifiDeviceConfig &config)
436 {
437     std::vector<WifiDeviceConfig> configs;
438     if (GetAllCandidateConfig(uid, configs) != 0) {
439         return -1;
440     }
441 
442     for (const auto &it : configs) {
443         if (it.networkId == networkId) {
444             config = it;
445             return it.networkId;
446         }
447     }
448     return -1;
449 }
450 
GetAllCandidateConfig(const int uid,std::vector<WifiDeviceConfig> & configs)451 int WifiSettings::GetAllCandidateConfig(const int uid, std::vector<WifiDeviceConfig> &configs)
452 {
453     if (!deviceConfigLoadFlag.test_and_set()) {
454         LOGD("Reload wifi config");
455         ReloadDeviceConfig();
456     }
457 
458     std::unique_lock<std::mutex> lock(mConfigMutex);
459     bool found = false;
460     for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
461         if (iter->second.uid == uid) {
462             configs.push_back(iter->second);
463             found = true;
464         }
465     }
466     return found ? 0 : -1;
467 }
468 
SyncWifiP2pGroupInfoConfig()469 int WifiSettings::SyncWifiP2pGroupInfoConfig()
470 {
471     std::unique_lock<std::mutex> lock(mP2pMutex);
472     mSavedWifiP2pGroupInfo.SetValue(mGroupInfoList);
473     return mSavedWifiP2pGroupInfo.SaveConfig();
474 }
475 
ReloadWifiP2pGroupInfoConfig()476 int WifiSettings::ReloadWifiP2pGroupInfoConfig()
477 {
478     std::unique_lock<std::mutex> lock(mP2pMutex);
479     if (mSavedWifiP2pGroupInfo.LoadConfig()) {
480         return -1;
481     }
482     mSavedWifiP2pGroupInfo.GetValue(mGroupInfoList);
483     return 0;
484 }
485 
SetWifiP2pGroupInfo(const std::vector<WifiP2pGroupInfo> & groups)486 int WifiSettings::SetWifiP2pGroupInfo(const std::vector<WifiP2pGroupInfo> &groups)
487 {
488     std::unique_lock<std::mutex> lock(mP2pMutex);
489     mGroupInfoList = groups;
490     return 0;
491 }
492 
IncreaseDeviceConnFailedCount(const std::string & index,const int & indexType,int count)493 int WifiSettings::IncreaseDeviceConnFailedCount(const std::string &index, const int &indexType, int count)
494 {
495     std::unique_lock<std::mutex> lock(mConfigMutex);
496     if (indexType == DEVICE_CONFIG_INDEX_SSID) {
497         for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
498             if (iter->second.ssid == index) {
499                 iter->second.connFailedCount += count;
500                 return 0;
501             }
502         }
503     } else {
504         for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
505             if (iter->second.bssid == index) {
506                 iter->second.connFailedCount += count;
507                 return 0;
508             }
509         }
510     }
511     return -1;
512 }
513 
SetDeviceConnFailedCount(const std::string & index,const int & indexType,int count)514 int WifiSettings::SetDeviceConnFailedCount(const std::string &index, const int &indexType, int count)
515 {
516     std::unique_lock<std::mutex> lock(mConfigMutex);
517     if (indexType == DEVICE_CONFIG_INDEX_SSID) {
518         for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
519             if (iter->second.ssid == index) {
520                 iter->second.connFailedCount = count;
521                 return 0;
522             }
523         }
524     } else {
525         for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
526             if (iter->second.bssid == index) {
527                 iter->second.connFailedCount = count;
528                 return 0;
529             }
530         }
531     }
532     return -1;
533 }
534 
RemoveWifiP2pGroupInfo()535 int WifiSettings::RemoveWifiP2pGroupInfo()
536 {
537     std::unique_lock<std::mutex> lock(mP2pMutex);
538     mGroupInfoList.clear();
539     return 0;
540 }
541 
GetWifiP2pGroupInfo(std::vector<WifiP2pGroupInfo> & groups)542 int WifiSettings::GetWifiP2pGroupInfo(std::vector<WifiP2pGroupInfo> &groups)
543 {
544     std::unique_lock<std::mutex> lock(mP2pMutex);
545     groups = mGroupInfoList;
546     return 0;
547 }
548 
IncreaseNumRebootsSinceLastUse()549 int WifiSettings::IncreaseNumRebootsSinceLastUse()
550 {
551     std::unique_lock<std::mutex> lock(mConfigMutex);
552     for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); iter++) {
553         iter->second.numRebootsSinceLastUse++;
554     }
555     return 0;
556 }
557 
RemoveExcessDeviceConfigs(std::vector<WifiDeviceConfig> & configs) const558 int WifiSettings::RemoveExcessDeviceConfigs(std::vector<WifiDeviceConfig> &configs) const
559 {
560     int maxNumConfigs = mMaxNumConfigs;
561     if (maxNumConfigs < 0) {
562         return 1;
563     }
564     int numExcessNetworks = static_cast<int>(configs.size()) - maxNumConfigs;
565     if (numExcessNetworks <= 0) {
566         return 1;
567     }
568     LOGI("Remove %d configs", numExcessNetworks);
569     sort(configs.begin(), configs.end(), [](WifiDeviceConfig a, WifiDeviceConfig b) {
570         if (a.status != b.status) {
571             return (a.status == 0) < (b.status == 0);
572         } else if (a.lastConnectTime != b.lastConnectTime) {
573             return a.lastConnectTime < b.lastConnectTime;
574         } else if (a.numRebootsSinceLastUse != b.numRebootsSinceLastUse) {
575             return a.numRebootsSinceLastUse > b.numRebootsSinceLastUse;
576         } else if (a.numAssociation != b.numAssociation) {
577             return a.numAssociation < b.numAssociation;
578         } else {
579             return a.networkId < b.networkId;
580         }
581     });
582     configs.erase(configs.begin(), configs.begin() + numExcessNetworks);
583     return 0;
584 }
585 
SyncDeviceConfig()586 int WifiSettings::SyncDeviceConfig()
587 {
588 #ifndef CONFIG_NO_CONFIG_WRITE
589     std::unique_lock<std::mutex> lock(mConfigMutex);
590     std::vector<WifiDeviceConfig> tmp;
591     for (auto iter = mWifiDeviceConfig.begin(); iter != mWifiDeviceConfig.end(); ++iter) {
592         if (!iter->second.isEphemeral) {
593             tmp.push_back(iter->second);
594         }
595     }
596     RemoveExcessDeviceConfigs(tmp);
597     mSavedDeviceConfig.SetValue(tmp);
598     return mSavedDeviceConfig.SaveConfig();
599 #else
600     return 0;
601 #endif
602 }
603 
ReloadDeviceConfig()604 int WifiSettings::ReloadDeviceConfig()
605 {
606 #ifndef CONFIG_NO_CONFIG_WRITE
607     int ret = mSavedDeviceConfig.LoadConfig();
608     if (ret < 0) {
609         deviceConfigLoadFlag.clear();
610         LOGD("Loading device config failed: %{public}d", ret);
611         return -1;
612     }
613     deviceConfigLoadFlag.test_and_set();
614     std::vector<WifiDeviceConfig> tmp;
615     mSavedDeviceConfig.GetValue(tmp);
616     std::unique_lock<std::mutex> lock(mConfigMutex);
617     mWifiDeviceConfig.clear();
618     for (std::size_t i = 0; i < tmp.size(); ++i) {
619         WifiDeviceConfig &item = tmp[i];
620         item.networkId = i;
621         mWifiDeviceConfig.emplace(item.networkId, item);
622     }
623     return 0;
624 #else
625     std::unique_lock<std::mutex> lock(mConfigMutex);
626     mWifiDeviceConfig.clear();
627     return 0;
628 #endif
629 }
630 
AddWpsDeviceConfig(const WifiDeviceConfig & config)631 int WifiSettings::AddWpsDeviceConfig(const WifiDeviceConfig &config)
632 {
633     int ret = mSavedDeviceConfig.LoadConfig();
634     if (ret < 0) {
635         LOGE("Add Wps config loading config failed: %{public}d", ret);
636         return -1;
637     }
638     std::vector<WifiDeviceConfig> tmp;
639     mSavedDeviceConfig.GetValue(tmp);
640     std::unique_lock<std::mutex> lock(mConfigMutex);
641     mWifiDeviceConfig.clear();
642     mWifiDeviceConfig.emplace(0, config);
643     for (std::size_t i = 0; i < tmp.size(); ++i) {
644         WifiDeviceConfig &item = tmp[i];
645         item.networkId = i + 1;
646         mWifiDeviceConfig.emplace(item.networkId, item);
647     }
648     return 0;
649 }
650 
GetIpInfo(IpInfo & info)651 int WifiSettings::GetIpInfo(IpInfo &info)
652 {
653     std::unique_lock<std::mutex> lock(mInfoMutex);
654     info = mWifiIpInfo;
655     return 0;
656 }
657 
SaveIpInfo(const IpInfo & info)658 int WifiSettings::SaveIpInfo(const IpInfo &info)
659 {
660     std::unique_lock<std::mutex> lock(mInfoMutex);
661     mWifiIpInfo = info;
662     return 0;
663 }
664 
GetIpv6Info(IpV6Info & info)665 int WifiSettings::GetIpv6Info(IpV6Info &info)
666 {
667     std::unique_lock<std::mutex> lock(mInfoMutex);
668     info = mWifiIpV6Info;
669     return 0;
670 }
671 
SaveIpV6Info(const IpV6Info & info)672 int WifiSettings::SaveIpV6Info(const IpV6Info &info)
673 {
674     std::unique_lock<std::mutex> lock(mInfoMutex);
675     mWifiIpV6Info = info;
676     return 0;
677 }
678 
GetLinkedInfo(WifiLinkedInfo & info)679 int WifiSettings::GetLinkedInfo(WifiLinkedInfo &info)
680 {
681     std::unique_lock<std::mutex> lock(mInfoMutex);
682     if (mWifiLinkedInfo.channelWidth == WifiChannelWidth::WIDTH_INVALID) {
683         GetLinkedChannelWidth();
684     }
685     info = mWifiLinkedInfo;
686     return 0;
687 }
688 
SaveLinkedInfo(const WifiLinkedInfo & info)689 int WifiSettings::SaveLinkedInfo(const WifiLinkedInfo &info)
690 {
691     std::unique_lock<std::mutex> lock(mInfoMutex);
692     WifiChannelWidth channelWidth = mWifiLinkedInfo.channelWidth;
693     std::string bssid = mWifiLinkedInfo.bssid;
694     mWifiLinkedInfo = info;
695     if (bssid == info.bssid) {
696         mWifiLinkedInfo.channelWidth = channelWidth;
697     }
698 
699     return 0;
700 }
701 
SetMacAddress(const std::string & macAddress)702 int WifiSettings::SetMacAddress(const std::string &macAddress)
703 {
704     std::unique_lock<std::mutex> lock(mStaMutex);
705     mMacAddress = macAddress;
706     return 0;
707 }
708 
GetMacAddress(std::string & macAddress)709 int WifiSettings::GetMacAddress(std::string &macAddress)
710 {
711     std::unique_lock<std::mutex> lock(mStaMutex);
712     macAddress = mMacAddress;
713     return 0;
714 }
715 
ReloadStaRandomMac()716 int WifiSettings::ReloadStaRandomMac()
717 {
718     if (mSavedWifiStoreRandomMac.LoadConfig()) {
719         return -1;
720     }
721     std::unique_lock<std::mutex> lock(mStaMutex);
722     mWifiStoreRandomMac.clear();
723     mSavedWifiStoreRandomMac.GetValue(mWifiStoreRandomMac);
724     return 0;
725 }
726 
727 const static uint32_t COMPARE_MAC_OFFSET = 2;
728 const static uint32_t COMPARE_MAC_LENGTH = 17 - 4;
729 
CompareMac(const std::string & mac1,const std::string & mac2)730 bool CompareMac(const std::string &mac1, const std::string &mac2)
731 {
732     return memcmp(mac1.c_str() + COMPARE_MAC_OFFSET, mac2.c_str() + COMPARE_MAC_OFFSET, COMPARE_MAC_LENGTH) == 0;
733 }
734 
AddRandomMac(WifiStoreRandomMac & randomMacInfo)735 bool WifiSettings::AddRandomMac(WifiStoreRandomMac &randomMacInfo)
736 {
737     std::unique_lock<std::mutex> lock(mStaMutex);
738     bool isConnected = false;
739 
740     for (auto &ele : mWifiStoreRandomMac) {
741         if ((randomMacInfo.ssid == ele.ssid) && (randomMacInfo.keyMgmt == ele.keyMgmt)) {
742             ele.peerBssid = randomMacInfo.peerBssid;
743             randomMacInfo.randomMac = ele.randomMac;
744             isConnected = true;
745             break;
746         } else if (CompareMac(randomMacInfo.peerBssid, ele.peerBssid) && (randomMacInfo.keyMgmt == ele.keyMgmt) &&
747                    (randomMacInfo.keyMgmt == "NONE")) {
748             isConnected = false;
749         } else if (CompareMac(randomMacInfo.peerBssid, ele.peerBssid) && (randomMacInfo.keyMgmt == ele.keyMgmt) &&
750                    (randomMacInfo.keyMgmt != "NONE")) {
751             ele.ssid = randomMacInfo.ssid;
752             randomMacInfo.randomMac = ele.randomMac;
753             isConnected = true;
754         } else {
755             isConnected = false;
756         }
757     }
758 
759     if (!isConnected) {
760         mWifiStoreRandomMac.push_back(randomMacInfo);
761     }
762 
763     mSavedWifiStoreRandomMac.SetValue(mWifiStoreRandomMac);
764     mSavedWifiStoreRandomMac.SaveConfig();
765     return isConnected;
766 }
767 
GetRandomMac(WifiStoreRandomMac & randomMacInfo)768 bool WifiSettings::GetRandomMac(WifiStoreRandomMac &randomMacInfo)
769 {
770     std::unique_lock<std::mutex> lock(mStaMutex);
771     for (auto &item : mWifiStoreRandomMac) {
772         if (CompareMac(item.peerBssid, randomMacInfo.peerBssid) && item.ssid == randomMacInfo.ssid) {
773             randomMacInfo.randomMac = item.randomMac;
774             return true;
775         }
776     }
777     return false;
778 }
779 
RemoveRandomMac(const std::string & bssid,const std::string & randomMac)780 bool WifiSettings::RemoveRandomMac(const std::string &bssid, const std::string &randomMac)
781 {
782     std::unique_lock<std::mutex> lock(mStaMutex);
783     for (auto it = mWifiStoreRandomMac.begin(); it != mWifiStoreRandomMac.end(); it++) {
784         if (CompareMac(it->peerBssid, bssid) && it->randomMac == randomMac) {
785             mWifiStoreRandomMac.erase(it);
786             mSavedWifiStoreRandomMac.SetValue(mWifiStoreRandomMac);
787             mSavedWifiStoreRandomMac.SaveConfig();
788             return true;
789         }
790     }
791     return false;
792 }
793 
SetCountryCode(const std::string & countryCode)794 int WifiSettings::SetCountryCode(const std::string &countryCode)
795 {
796     std::unique_lock<std::mutex> lock(mStaMutex);
797     std::string tmpCode = countryCode;
798     std::transform(countryCode.begin(), countryCode.end(), tmpCode.begin(), ::toupper);
799     mCountryCode = tmpCode;
800     return 0;
801 }
802 
GetCountryCode(std::string & countryCode)803 int WifiSettings::GetCountryCode(std::string &countryCode)
804 {
805     std::unique_lock<std::mutex> lock(mStaMutex);
806     countryCode = mCountryCode;
807     return 0;
808 }
809 
GetHotspotState(int id)810 int WifiSettings::GetHotspotState(int id)
811 {
812     auto iter = mHotspotState.find(id);
813     if (iter != mHotspotState.end()) {
814         return iter->second.load();
815     }
816     mHotspotState[id] = static_cast<int>(ApState::AP_STATE_CLOSED);
817     return mHotspotState[id].load();
818 }
819 
SetHotspotState(int state,int id)820 int WifiSettings::SetHotspotState(int state, int id)
821 {
822     mHotspotState[id] = state;
823     return 0;
824 }
825 
SetHotspotConfig(const HotspotConfig & config,int id)826 int WifiSettings::SetHotspotConfig(const HotspotConfig &config, int id)
827 {
828     std::unique_lock<std::mutex> lock(mApMutex);
829     mHotspotConfig[id] = config;
830     return 0;
831 }
832 
GetHotspotConfig(HotspotConfig & config,int id)833 int WifiSettings::GetHotspotConfig(HotspotConfig &config, int id)
834 {
835     std::unique_lock<std::mutex> lock(mApMutex);
836     auto iter = mHotspotConfig.find(id);
837     if (iter != mHotspotConfig.end()) {
838         config = iter->second;
839     }
840     return 0;
841 }
842 
SetHotspotIdleTimeout(int time)843 int WifiSettings::SetHotspotIdleTimeout(int time)
844 {
845     mHotspotIdleTimeout = time;
846     return 0;
847 }
848 
GetHotspotIdleTimeout() const849 int WifiSettings::GetHotspotIdleTimeout() const
850 {
851     return mHotspotIdleTimeout;
852 }
853 
SyncHotspotConfig()854 int WifiSettings::SyncHotspotConfig()
855 {
856     std::unique_lock<std::mutex> lock(mApMutex);
857     std::vector<HotspotConfig> tmp;
858 
859     for (int i = 0; i < AP_INSTANCE_MAX_NUM; i++) {
860         auto iter = mHotspotConfig.find(i);
861         if (iter != mHotspotConfig.end()) {
862             tmp.push_back(iter->second);
863         }
864     }
865     mSavedHotspotConfig.SetValue(tmp);
866     mSavedHotspotConfig.SaveConfig();
867 
868     return 0;
869 }
870 
SetP2pVendorConfig(const P2pVendorConfig & config)871 int WifiSettings::SetP2pVendorConfig(const P2pVendorConfig &config)
872 {
873     std::unique_lock<std::mutex> lock(mP2pMutex);
874     mP2pVendorConfig = config;
875     return 0;
876 }
877 
GetP2pVendorConfig(P2pVendorConfig & config)878 int WifiSettings::GetP2pVendorConfig(P2pVendorConfig &config)
879 {
880     std::unique_lock<std::mutex> lock(mP2pMutex);
881     config = mP2pVendorConfig;
882     return 0;
883 }
884 
SyncP2pVendorConfig()885 int WifiSettings::SyncP2pVendorConfig()
886 {
887     std::unique_lock<std::mutex> lock(mP2pMutex);
888     std::vector<P2pVendorConfig> tmp;
889     tmp.push_back(mP2pVendorConfig);
890     mSavedWifiP2pVendorConfig.SetValue(tmp);
891     return mSavedWifiP2pVendorConfig.SaveConfig();
892 }
893 
GetStationList(std::vector<StationInfo> & results,int id)894 int WifiSettings::GetStationList(std::vector<StationInfo> &results, int id)
895 {
896     std::unique_lock<std::mutex> lock(mInfoMutex);
897     for (auto iter = mConnectStationInfo.begin(); iter != mConnectStationInfo.end(); iter++) {
898         results.push_back(iter->second);
899     }
900     return 0;
901 }
902 
ManageStation(const StationInfo & info,int mode,int id)903 int WifiSettings::ManageStation(const StationInfo &info, int mode, int id)
904 {
905     std::unique_lock<std::mutex> lock(mInfoMutex);
906     auto iter = mConnectStationInfo.find(info.bssid);
907     if (MODE_ADD == mode || MODE_UPDATE == mode) {
908         if (iter != mConnectStationInfo.end()) {
909             iter->second = info;
910         } else {
911             mConnectStationInfo.emplace(std::make_pair(info.bssid, info));
912         }
913     #ifdef SUPPORT_RANDOM_MAC_ADDR
914         WifiSettings::GetInstance().StoreWifiMacAddrPairInfo(WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO, info.bssid);
915     #endif
916     } else if (MODE_DEL == mode) {
917         if (iter != mConnectStationInfo.end()) {
918             mConnectStationInfo.erase(iter);
919         }
920     #ifdef SUPPORT_RANDOM_MAC_ADDR
921         WifiMacAddrInfo randomMacAddrInfo;
922         randomMacAddrInfo.bssid = info.bssid;
923         randomMacAddrInfo.bssidType = RANDOM_DEVICE_ADDRESS;
924         WifiSettings::GetInstance().RemoveMacAddrPairs(WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO, randomMacAddrInfo);
925 
926         WifiMacAddrInfo realMacAddrInfo;
927         realMacAddrInfo.bssid = info.bssid;
928         realMacAddrInfo.bssidType = REAL_DEVICE_ADDRESS;
929         WifiSettings::GetInstance().RemoveMacAddrPairs(WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO, realMacAddrInfo);
930     #endif
931     } else {
932         return -1;
933     }
934     return 0;
935 }
936 
FindConnStation(const StationInfo & info,int id)937 int WifiSettings::FindConnStation(const StationInfo &info, int id)
938 {
939     std::unique_lock<std::mutex> lock(mInfoMutex);
940     auto iter = mConnectStationInfo.find(info.bssid);
941     if (iter == mConnectStationInfo.end()) {
942         return -1;
943     }
944     return 0;
945 }
946 
ClearStationList(int id)947 int WifiSettings::ClearStationList(int id)
948 {
949     std::unique_lock<std::mutex> lock(mInfoMutex);
950     mConnectStationInfo.clear();
951     return 0;
952 }
953 
GetBlockList(std::vector<StationInfo> & results,int id)954 int WifiSettings::GetBlockList(std::vector<StationInfo> &results, int id)
955 {
956     std::unique_lock<std::mutex> lock(mInfoMutex);
957     for (auto iter = mBlockListInfo.begin(); iter != mBlockListInfo.end(); iter++) {
958         results.push_back(iter->second);
959     }
960     return 0;
961 }
962 
ManageBlockList(const StationInfo & info,int mode,int id)963 int WifiSettings::ManageBlockList(const StationInfo &info, int mode, int id)
964 {
965     std::unique_lock<std::mutex> lock(mInfoMutex);
966     auto iter = mBlockListInfo.find(info.bssid);
967     if (MODE_ADD == mode || MODE_UPDATE == mode) {
968         if (iter != mBlockListInfo.end()) {
969             iter->second = info;
970         } else {
971             mBlockListInfo.emplace(std::make_pair(info.bssid, info));
972         }
973     } else if (MODE_DEL == mode) {
974         if (iter != mBlockListInfo.end()) {
975             mBlockListInfo.erase(iter);
976         }
977     } else {
978         return -1;
979     }
980     return 0;
981 }
982 
SyncBlockList()983 int WifiSettings::SyncBlockList()
984 {
985     std::unique_lock<std::mutex> lock(mInfoMutex);
986     std::vector<StationInfo> tmp;
987     for (auto iter = mBlockListInfo.begin(); iter != mBlockListInfo.end(); ++iter) {
988         tmp.push_back(iter->second);
989     }
990     mSavedBlockInfo.SetValue(tmp);
991     return mSavedBlockInfo.SaveConfig();
992 }
993 
GetValidBands(std::vector<BandType> & bands)994 int WifiSettings::GetValidBands(std::vector<BandType> &bands)
995 {
996     std::unique_lock<std::mutex> lock(mInfoMutex);
997 
998     auto it = mValidChannels.find(BandType::BAND_2GHZ);
999     if (it != mValidChannels.end() && it->second.size() > 0) {
1000         bands.push_back(BandType::BAND_2GHZ);
1001     }
1002     it = mValidChannels.find(BandType::BAND_5GHZ);
1003     if (it != mValidChannels.end() && it->second.size() > 0) {
1004         bands.push_back(BandType::BAND_5GHZ);
1005     }
1006     return 0;
1007 }
1008 
SetValidChannels(const ChannelsTable & channelsInfo)1009 int WifiSettings::SetValidChannels(const ChannelsTable &channelsInfo)
1010 {
1011     std::unique_lock<std::mutex> lock(mInfoMutex);
1012     mValidChannels = channelsInfo;
1013 
1014     return 0;
1015 }
1016 
GetValidChannels(ChannelsTable & channelsInfo)1017 int WifiSettings::GetValidChannels(ChannelsTable &channelsInfo)
1018 {
1019     std::unique_lock<std::mutex> lock(mInfoMutex);
1020     channelsInfo = mValidChannels;
1021 
1022     return 0;
1023 }
1024 
ClearValidChannels()1025 int WifiSettings::ClearValidChannels()
1026 {
1027     std::unique_lock<std::mutex> lock(mInfoMutex);
1028     mValidChannels.clear();
1029     return 0;
1030 }
1031 
SetPowerModel(const PowerModel & model,int id)1032 int WifiSettings::SetPowerModel(const PowerModel& model, int id)
1033 {
1034     std::unique_lock<std::mutex> lock(mInfoMutex);
1035     auto ret = powerModel.emplace(id, model);
1036     if (!ret.second) {
1037         powerModel[id] = model;
1038     }
1039     return 0;
1040 }
1041 
GetPowerModel(PowerModel & model,int id)1042 int WifiSettings::GetPowerModel(PowerModel& model, int id)
1043 {
1044     std::unique_lock<std::mutex> lock(mInfoMutex);
1045     auto iter = powerModel.find(id);
1046     if (iter != powerModel.end()) {
1047         model = iter->second;
1048     } else {
1049         powerModel[id] = PowerModel::GENERAL;
1050         model = powerModel[id];
1051     }
1052     return 0;
1053 }
1054 
SetP2pState(int state)1055 int WifiSettings::SetP2pState(int state)
1056 {
1057     mP2pState = state;
1058     return 0;
1059 }
1060 
GetP2pState()1061 int WifiSettings::GetP2pState()
1062 {
1063     return mP2pState.load();
1064 }
1065 
SetP2pDiscoverState(int state)1066 int WifiSettings::SetP2pDiscoverState(int state)
1067 {
1068     mP2pDiscoverState = state;
1069     return 0;
1070 }
1071 
GetP2pDiscoverState()1072 int WifiSettings::GetP2pDiscoverState()
1073 {
1074     return mP2pDiscoverState.load();
1075 }
1076 
SetP2pConnectedState(int state)1077 int WifiSettings::SetP2pConnectedState(int state)
1078 {
1079     mP2pConnectState = state;
1080     return 0;
1081 }
1082 
GetP2pConnectedState()1083 int WifiSettings::GetP2pConnectedState()
1084 {
1085     return mP2pConnectState.load();
1086 }
1087 
GetSignalLevel(const int & rssi,const int & band)1088 int WifiSettings::GetSignalLevel(const int &rssi, const int &band)
1089 {
1090     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1091     int level = 0;
1092     do {
1093         if (band == static_cast<int>(BandType::BAND_2GHZ)) {
1094             if (rssi < mWifiConfig.firstRssiLevel2G) {
1095                 break;
1096             }
1097             ++level;
1098             if (rssi < mWifiConfig.secondRssiLevel2G) {
1099                 break;
1100             }
1101             ++level;
1102             if (rssi < mWifiConfig.thirdRssiLevel2G) {
1103                 break;
1104             }
1105             ++level;
1106             if (rssi < mWifiConfig.fourthRssiLevel2G) {
1107                 break;
1108             }
1109             ++level;
1110         }
1111         if (band == static_cast<int>(BandType::BAND_5GHZ)) {
1112             if (rssi < mWifiConfig.firstRssiLevel5G) {
1113                 break;
1114             }
1115             ++level;
1116             if (rssi < mWifiConfig.secondRssiLevel5G) {
1117                 break;
1118             }
1119             ++level;
1120             if (rssi < mWifiConfig.thirdRssiLevel5G) {
1121                 break;
1122             }
1123             ++level;
1124             if (rssi < mWifiConfig.fourthRssiLevel5G) {
1125                 break;
1126             }
1127             ++level;
1128         }
1129     } while (0);
1130     return level;
1131 }
1132 
GetApMaxConnNum()1133 int WifiSettings::GetApMaxConnNum()
1134 {
1135     return mApMaxConnNum;
1136 }
1137 
InitDefaultHotspotConfig()1138 void WifiSettings::InitDefaultHotspotConfig()
1139 {
1140     HotspotConfig cfg;
1141     cfg.SetSecurityType(KeyMgmt::WPA_PSK);
1142     cfg.SetBand(BandType::BAND_2GHZ);
1143     cfg.SetChannel(AP_CHANNEL_DEFAULT);
1144     cfg.SetMaxConn(GetApMaxConnNum());
1145     cfg.SetSsid("OHOS_" + GetRandomStr(RANDOM_STR_LEN));
1146     cfg.SetPreSharedKey("12345678");
1147     auto ret = mHotspotConfig.emplace(0, cfg);
1148     if (!ret.second) {
1149         mHotspotConfig[0] = cfg;
1150     }
1151 }
1152 
InitDefaultP2pVendorConfig()1153 void WifiSettings::InitDefaultP2pVendorConfig()
1154 {
1155     mP2pVendorConfig.SetRandomMacSupport(false);
1156     mP2pVendorConfig.SetIsAutoListen(false);
1157     mP2pVendorConfig.SetDeviceName("");
1158     mP2pVendorConfig.SetPrimaryDeviceType("");
1159     mP2pVendorConfig.SetSecondaryDeviceType("");
1160 }
1161 
InitSettingsNum()1162 void WifiSettings::InitSettingsNum()
1163 {
1164     /* query drivers capability, support max connection num. */
1165     mApMaxConnNum = MAX_AP_CONN;
1166     mMaxNumConfigs = MAX_CONFIGS_NUM;
1167 }
1168 
InitScanControlForbidList(void)1169 void WifiSettings::InitScanControlForbidList(void)
1170 {
1171     /* Disable external scanning during scanning. */
1172     ScanForbidMode forbidMode;
1173     forbidMode.scanMode = ScanMode::ALL_EXTERN_SCAN;
1174     forbidMode.scanScene = SCAN_SCENE_SCANNING;
1175     mScanControlInfo.scanForbidList.push_back(forbidMode);
1176 
1177     /* Disable external scanning when the screen is shut down. */
1178     forbidMode.scanMode = ScanMode::ALL_EXTERN_SCAN;
1179     forbidMode.scanScene = SCAN_SCENE_SCREEN_OFF;
1180     mScanControlInfo.scanForbidList.push_back(forbidMode);
1181 
1182     /* Disable all scans in connection */
1183     forbidMode.scanMode = ScanMode::ALL_EXTERN_SCAN;
1184     forbidMode.scanScene = SCAN_SCENE_CONNECTING;
1185     mScanControlInfo.scanForbidList.push_back(forbidMode);
1186     forbidMode.scanMode = ScanMode::PNO_SCAN;
1187     forbidMode.scanScene = SCAN_SCENE_CONNECTING;
1188     mScanControlInfo.scanForbidList.push_back(forbidMode);
1189     forbidMode.scanMode = ScanMode::SYSTEM_TIMER_SCAN;
1190     forbidMode.scanScene = SCAN_SCENE_CONNECTING;
1191     mScanControlInfo.scanForbidList.push_back(forbidMode);
1192 
1193     /* Deep sleep disables all scans. */
1194     forbidMode.scanMode = ScanMode::ALL_EXTERN_SCAN;
1195     forbidMode.scanScene = SCAN_SCENE_DEEP_SLEEP;
1196     mScanControlInfo.scanForbidList.push_back(forbidMode);
1197     forbidMode.scanMode = ScanMode::PNO_SCAN;
1198     forbidMode.scanScene = SCAN_SCENE_DEEP_SLEEP;
1199     mScanControlInfo.scanForbidList.push_back(forbidMode);
1200     forbidMode.scanMode = ScanMode::SYSTEM_TIMER_SCAN;
1201     forbidMode.scanScene = SCAN_SCENE_DEEP_SLEEP;
1202     mScanControlInfo.scanForbidList.push_back(forbidMode);
1203 
1204     /* PNO scanning disabled */
1205     forbidMode.scanMode = ScanMode::PNO_SCAN;
1206     forbidMode.scanScene = SCAN_SCENE_CONNECTED;
1207     mScanControlInfo.scanForbidList.push_back(forbidMode);
1208     return;
1209 }
1210 
InitScanControlIntervalList(void)1211 void WifiSettings::InitScanControlIntervalList(void)
1212 {
1213     /* Foreground app: 4 times in 2 minutes for a single application */
1214     ScanIntervalMode scanIntervalMode;
1215     scanIntervalMode.scanScene = SCAN_SCENE_FREQUENCY_ORIGIN;
1216     scanIntervalMode.scanMode = ScanMode::APP_FOREGROUND_SCAN;
1217     scanIntervalMode.isSingle = true;
1218     scanIntervalMode.intervalMode = IntervalMode::INTERVAL_FIXED;
1219     scanIntervalMode.interval = FOREGROUND_SCAN_CONTROL_INTERVAL;
1220     scanIntervalMode.count = FOREGROUND_SCAN_CONTROL_TIMES;
1221     mScanControlInfo.scanIntervalList.push_back(scanIntervalMode);
1222 
1223     /* Backend apps: once every 30 minutes */
1224     scanIntervalMode.scanScene = SCAN_SCENE_FREQUENCY_ORIGIN;
1225     scanIntervalMode.scanMode = ScanMode::APP_BACKGROUND_SCAN;
1226     scanIntervalMode.isSingle = false;
1227     scanIntervalMode.intervalMode = IntervalMode::INTERVAL_FIXED;
1228     scanIntervalMode.interval = BACKGROUND_SCAN_CONTROL_INTERVAL;
1229     scanIntervalMode.count = BACKGROUND_SCAN_CONTROL_TIMES;
1230     mScanControlInfo.scanIntervalList.push_back(scanIntervalMode);
1231 
1232     /* no charger plug */
1233     /* All app: If the scanning interval is less than 5s for five  */
1234     /* consecutive times, the scanning can be performed only after */
1235     /* the scanning interval is greater than 5s. */
1236     const int frequencyContinueInterval = 5;
1237     const int frequencyContinueCount = 5;
1238     scanIntervalMode.scanScene = SCAN_SCENE_FREQUENCY_CUSTOM;
1239     scanIntervalMode.scanMode = ScanMode::ALL_EXTERN_SCAN;
1240     scanIntervalMode.isSingle = false;
1241     scanIntervalMode.intervalMode = IntervalMode::INTERVAL_CONTINUE;
1242     scanIntervalMode.interval = frequencyContinueInterval;
1243     scanIntervalMode.count = frequencyContinueCount;
1244     mScanControlInfo.scanIntervalList.push_back(scanIntervalMode);
1245 
1246     /* no charger plug */
1247     /* Single app: If all scanning interval in 10 times is less than */
1248     /* the threshold (20s), the app is added to the blocklist and  */
1249     /* cannot initiate scanning. */
1250     const int frequencyBlocklistInterval = 20;
1251     const int frequencyBlocklistCount = 10;
1252     scanIntervalMode.scanScene = SCAN_SCENE_FREQUENCY_CUSTOM;
1253     scanIntervalMode.scanMode = ScanMode::ALL_EXTERN_SCAN;
1254     scanIntervalMode.isSingle = true;
1255     scanIntervalMode.intervalMode = IntervalMode::INTERVAL_BLOCKLIST;
1256     scanIntervalMode.interval = frequencyBlocklistInterval;
1257     scanIntervalMode.count = frequencyBlocklistCount;
1258     mScanControlInfo.scanIntervalList.push_back(scanIntervalMode);
1259 
1260     /* PNO scanning every 20 seconds */
1261     scanIntervalMode.scanScene = SCAN_SCENE_ALL;
1262     scanIntervalMode.scanMode = ScanMode::PNO_SCAN;
1263     scanIntervalMode.isSingle = false;
1264     scanIntervalMode.intervalMode = IntervalMode::INTERVAL_FIXED;
1265     scanIntervalMode.interval = PNO_SCAN_CONTROL_INTERVAL;
1266     scanIntervalMode.count = PNO_SCAN_CONTROL_TIMES;
1267     mScanControlInfo.scanIntervalList.push_back(scanIntervalMode);
1268 
1269     /*
1270      * The system scans for 20 seconds, multiplies 2 each time,
1271      * and performs scanning every 160 seconds.
1272      */
1273     scanIntervalMode.scanScene = SCAN_SCENE_ALL;
1274     scanIntervalMode.scanMode = ScanMode::SYSTEM_TIMER_SCAN;
1275     scanIntervalMode.isSingle = false;
1276     scanIntervalMode.intervalMode = IntervalMode::INTERVAL_EXP;
1277     scanIntervalMode.interval = SYSTEM_TIMER_SCAN_CONTROL_INTERVAL;
1278     scanIntervalMode.count = SYSTEM_TIMER_SCAN_CONTROL_TIMES;
1279     mScanControlInfo.scanIntervalList.push_back(scanIntervalMode);
1280     return;
1281 }
1282 
InitScanControlInfo()1283 void WifiSettings::InitScanControlInfo()
1284 {
1285     InitScanControlForbidList();
1286     InitScanControlIntervalList();
1287 }
1288 
GetLinkedChannelWidth()1289 void WifiSettings::GetLinkedChannelWidth()
1290 {
1291     for (auto iter = mWifiScanInfoList.begin(); iter != mWifiScanInfoList.end(); ++iter) {
1292         if (iter->bssid == mWifiLinkedInfo.bssid) {
1293             mWifiLinkedInfo.channelWidth = iter->channelWidth;
1294             return;
1295         }
1296     }
1297     LOGD("WifiSettings GetLinkedChannelWidth failed.");
1298 }
1299 
UpdateLinkedChannelWidth(const std::string bssid,WifiChannelWidth channelWidth)1300 void WifiSettings::UpdateLinkedChannelWidth(const std::string bssid, WifiChannelWidth channelWidth)
1301 {
1302     std::unique_lock<std::mutex> lock(mInfoMutex);
1303     if (bssid == mWifiLinkedInfo.bssid) {
1304         mWifiLinkedInfo.channelWidth = channelWidth;
1305     }
1306 }
1307 
EnableNetwork(int networkId,bool disableOthers)1308 bool WifiSettings::EnableNetwork(int networkId, bool disableOthers)
1309 {
1310     if (disableOthers) {
1311         SetUserLastSelectedNetworkId(networkId);
1312     }
1313     return true;
1314 }
1315 
SetUserLastSelectedNetworkId(int networkId)1316 void WifiSettings::SetUserLastSelectedNetworkId(int networkId)
1317 {
1318     mLastSelectedNetworkId = networkId;
1319     mLastSelectedTimeVal = time(NULL);
1320 }
1321 
GetUserLastSelectedNetworkId()1322 int WifiSettings::GetUserLastSelectedNetworkId()
1323 {
1324     return mLastSelectedNetworkId;
1325 }
1326 
GetUserLastSelectedNetworkTimeVal()1327 time_t WifiSettings::GetUserLastSelectedNetworkTimeVal()
1328 {
1329     return mLastSelectedTimeVal;
1330 }
1331 
SyncWifiConfig()1332 int WifiSettings::SyncWifiConfig()
1333 {
1334     std::vector<WifiConfig> tmp;
1335     tmp.push_back(mWifiConfig);
1336     mSavedWifiConfig.SetValue(tmp);
1337     return mSavedWifiConfig.SaveConfig();
1338 }
1339 
GetOperatorWifiType()1340 int WifiSettings::GetOperatorWifiType()
1341 {
1342     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1343     return mWifiConfig.staAirplaneMode;
1344 }
1345 
SetOperatorWifiType(int type)1346 int WifiSettings::SetOperatorWifiType(int type)
1347 {
1348     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1349     mWifiConfig.staAirplaneMode = type;
1350     SyncWifiConfig();
1351     return 0;
1352 }
1353 
GetCanOpenStaWhenAirplaneMode()1354 bool WifiSettings::GetCanOpenStaWhenAirplaneMode()
1355 {
1356     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1357     return mWifiConfig.canOpenStaWhenAirplane;
1358 }
1359 
GetStaLastRunState()1360 bool WifiSettings::GetStaLastRunState()
1361 {
1362     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1363     return mWifiConfig.staLastState;
1364 }
1365 
SetStaLastRunState(bool bRun)1366 int WifiSettings::SetStaLastRunState(bool bRun)
1367 {
1368     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1369     mWifiConfig.staLastState = bRun;
1370     SyncWifiConfig();
1371     return 0;
1372 }
1373 
GetDhcpIpType()1374 int WifiSettings::GetDhcpIpType()
1375 {
1376     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1377     return mWifiConfig.dhcpIpType;
1378 }
1379 
SetDhcpIpType(int dhcpIpType)1380 int WifiSettings::SetDhcpIpType(int dhcpIpType)
1381 {
1382     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1383     mWifiConfig.dhcpIpType = dhcpIpType;
1384     SyncWifiConfig();
1385     return 0;
1386 }
1387 
GetDefaultWifiInterface()1388 std::string WifiSettings::GetDefaultWifiInterface()
1389 {
1390     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1391     return mWifiConfig.defaultWifiInterface;
1392 }
1393 
SetScreenState(const int & state)1394 void WifiSettings::SetScreenState(const int &state)
1395 {
1396     mScreenState = state;
1397 }
1398 
GetScreenState() const1399 int WifiSettings::GetScreenState() const
1400 {
1401     return mScreenState;
1402 }
1403 
SetAirplaneModeState(const int & state)1404 void WifiSettings::SetAirplaneModeState(const int &state)
1405 {
1406     mAirplaneModeState = state;
1407 }
1408 
GetAirplaneModeState() const1409 int WifiSettings::GetAirplaneModeState() const
1410 {
1411     return mAirplaneModeState.load();
1412 }
1413 
SetAppRunningState(ScanMode appRunMode)1414 void WifiSettings::SetAppRunningState(ScanMode appRunMode)
1415 {
1416     if (static_cast<int>(appRunMode) < static_cast<int>(ScanMode::APP_FOREGROUND_SCAN) ||
1417         static_cast<int>(appRunMode) > static_cast<int>(ScanMode::SYS_BACKGROUND_SCAN)) {
1418         return;
1419     }
1420     mAppRunningModeState = appRunMode;
1421 }
1422 
GetAppRunningState() const1423 ScanMode WifiSettings::GetAppRunningState() const
1424 {
1425     return mAppRunningModeState;
1426 }
1427 
SetPowerSavingModeState(const int & state)1428 void WifiSettings::SetPowerSavingModeState(const int &state)
1429 {
1430     mPowerSavingModeState = state;
1431 }
1432 
GetPowerSavingModeState() const1433 int WifiSettings::GetPowerSavingModeState() const
1434 {
1435     return mPowerSavingModeState;
1436 }
1437 
SetAppPackageName(const std::string & appPackageName)1438 void WifiSettings::SetAppPackageName(const std::string &appPackageName)
1439 {
1440     mAppPackageName = appPackageName;
1441 }
1442 
GetAppPackageName() const1443 const std::string WifiSettings::GetAppPackageName() const
1444 {
1445     return mAppPackageName;
1446 }
1447 
SetFreezeModeState(int state)1448 void WifiSettings::SetFreezeModeState(int state)
1449 {
1450     mFreezeModeState = state;
1451 }
1452 
GetFreezeModeState() const1453 int WifiSettings::GetFreezeModeState() const
1454 {
1455     return mFreezeModeState;
1456 }
1457 
SetNoChargerPlugModeState(int state)1458 void WifiSettings::SetNoChargerPlugModeState(int state)
1459 {
1460     mNoChargerPlugModeState = state;
1461 }
1462 
GetNoChargerPlugModeState() const1463 int WifiSettings::GetNoChargerPlugModeState() const
1464 {
1465     return mNoChargerPlugModeState;
1466 }
1467 
SetWhetherToAllowNetworkSwitchover(bool bSwitch)1468 int WifiSettings::SetWhetherToAllowNetworkSwitchover(bool bSwitch)
1469 {
1470     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1471     mWifiConfig.whetherToAllowNetworkSwitchover = bSwitch;
1472     SyncWifiConfig();
1473     return 0;
1474 }
1475 
GetWhetherToAllowNetworkSwitchover()1476 bool WifiSettings::GetWhetherToAllowNetworkSwitchover()
1477 {
1478     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1479     return mWifiConfig.whetherToAllowNetworkSwitchover;
1480 }
1481 
SetScoretacticsScoreSlope(const int & score)1482 int WifiSettings::SetScoretacticsScoreSlope(const int &score)
1483 {
1484     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1485     mWifiConfig.scoretacticsScoreSlope = score;
1486     SyncWifiConfig();
1487     return 0;
1488 }
1489 
GetScoretacticsScoreSlope()1490 int WifiSettings::GetScoretacticsScoreSlope()
1491 {
1492     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1493     return mWifiConfig.scoretacticsScoreSlope;
1494 }
1495 
SetScoretacticsInitScore(const int & score)1496 int WifiSettings::SetScoretacticsInitScore(const int &score)
1497 {
1498     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1499     mWifiConfig.scoretacticsInitScore = score;
1500     SyncWifiConfig();
1501     return 0;
1502 }
1503 
GetScoretacticsInitScore()1504 int WifiSettings::GetScoretacticsInitScore()
1505 {
1506     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1507     return mWifiConfig.scoretacticsInitScore;
1508 }
1509 
SetScoretacticsSameBssidScore(const int & score)1510 int WifiSettings::SetScoretacticsSameBssidScore(const int &score)
1511 {
1512     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1513     mWifiConfig.scoretacticsSameBssidScore = score;
1514     SyncWifiConfig();
1515     return 0;
1516 }
1517 
GetScoretacticsSameBssidScore()1518 int WifiSettings::GetScoretacticsSameBssidScore()
1519 {
1520     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1521     return mWifiConfig.scoretacticsSameBssidScore;
1522 }
1523 
SetScoretacticsSameNetworkScore(const int & score)1524 int WifiSettings::SetScoretacticsSameNetworkScore(const int &score)
1525 {
1526     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1527     mWifiConfig.scoretacticsSameNetworkScore = score;
1528     SyncWifiConfig();
1529     return 0;
1530 }
1531 
GetScoretacticsSameNetworkScore()1532 int WifiSettings::GetScoretacticsSameNetworkScore()
1533 {
1534     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1535     return mWifiConfig.scoretacticsSameNetworkScore;
1536 }
1537 
SetScoretacticsFrequency5GHzScore(const int & score)1538 int WifiSettings::SetScoretacticsFrequency5GHzScore(const int &score)
1539 {
1540     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1541     mWifiConfig.scoretacticsFrequency5GHzScore = score;
1542     SyncWifiConfig();
1543     return 0;
1544 }
1545 
GetScoretacticsFrequency5GHzScore()1546 int WifiSettings::GetScoretacticsFrequency5GHzScore()
1547 {
1548     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1549     return mWifiConfig.scoretacticsFrequency5GHzScore;
1550 }
1551 
SetScoretacticsLastSelectionScore(const int & score)1552 int WifiSettings::SetScoretacticsLastSelectionScore(const int &score)
1553 {
1554     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1555     mWifiConfig.scoretacticsLastSelectionScore = score;
1556     SyncWifiConfig();
1557     return 0;
1558 }
1559 
GetScoretacticsLastSelectionScore()1560 int WifiSettings::GetScoretacticsLastSelectionScore()
1561 {
1562     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1563     return mWifiConfig.scoretacticsLastSelectionScore;
1564 }
1565 
SetScoretacticsSecurityScore(const int & score)1566 int WifiSettings::SetScoretacticsSecurityScore(const int &score)
1567 {
1568     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1569     mWifiConfig.scoretacticsSecurityScore = score;
1570     SyncWifiConfig();
1571     return 0;
1572 }
1573 
GetScoretacticsSecurityScore()1574 int WifiSettings::GetScoretacticsSecurityScore()
1575 {
1576     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1577     return mWifiConfig.scoretacticsSecurityScore;
1578 }
1579 
SetScoretacticsNormalScore(const int & score)1580 int WifiSettings::SetScoretacticsNormalScore(const int &score)
1581 {
1582     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1583     mWifiConfig.scoretacticsNormalScore = score;
1584     SyncWifiConfig();
1585     return 0;
1586 }
1587 
GetScoretacticsNormalScore()1588 int WifiSettings::GetScoretacticsNormalScore()
1589 {
1590     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1591     return mWifiConfig.scoretacticsNormalScore;
1592 }
1593 
SetSavedDeviceAppraisalPriority(const int & priority)1594 int WifiSettings::SetSavedDeviceAppraisalPriority(const int &priority)
1595 {
1596     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1597     mWifiConfig.savedDeviceAppraisalPriority = priority;
1598     SyncWifiConfig();
1599     return 0;
1600 }
1601 
GetSavedDeviceAppraisalPriority()1602 int WifiSettings::GetSavedDeviceAppraisalPriority()
1603 {
1604     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1605     return mWifiConfig.savedDeviceAppraisalPriority;
1606 }
1607 
IsModulePreLoad(const std::string & name)1608 bool WifiSettings::IsModulePreLoad(const std::string &name)
1609 {
1610     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1611     if (name == WIFI_SERVICE_STA) {
1612         return mWifiConfig.preLoadSta;
1613     } else if (name == WIFI_SERVICE_SCAN) {
1614         return mWifiConfig.preLoadScan;
1615     } else if (name == WIFI_SERVICE_AP) {
1616         return mWifiConfig.preLoadAp;
1617     } else if (name == WIFI_SERVICE_P2P) {
1618         return mWifiConfig.preLoadP2p;
1619     } else if (name == WIFI_SERVICE_AWARE) {
1620         return mWifiConfig.preLoadAware;
1621     } else if (name == WIFI_SERVICE_ENHANCE) {
1622         return mWifiConfig.preLoadEnhance;
1623     } else {
1624         return false;
1625     }
1626 }
1627 
GetSupportHwPnoFlag()1628 bool WifiSettings::GetSupportHwPnoFlag()
1629 {
1630     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1631     return mWifiConfig.supportHwPnoFlag;
1632 }
1633 
GetMinRssi2Dot4Ghz()1634 int WifiSettings::GetMinRssi2Dot4Ghz()
1635 {
1636     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1637     return mWifiConfig.minRssi2Dot4Ghz;
1638 }
1639 
GetMinRssi5Ghz()1640 int WifiSettings::GetMinRssi5Ghz()
1641 {
1642     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1643     return mWifiConfig.minRssi5Ghz;
1644 }
1645 
GetStrDnsBak()1646 std::string WifiSettings::GetStrDnsBak()
1647 {
1648     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1649     return mWifiConfig.strDnsBak;
1650 }
1651 
IsLoadStabak()1652 bool WifiSettings::IsLoadStabak()
1653 {
1654     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1655     return mWifiConfig.isLoadStabak;
1656 }
1657 
SetRealMacAddress(const std::string & macAddress)1658 int WifiSettings::SetRealMacAddress(const std::string &macAddress)
1659 {
1660     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1661     mWifiConfig.realMacAddress = macAddress;
1662     SyncWifiConfig();
1663     return 0;
1664 }
1665 
GetRealMacAddress(std::string & macAddress)1666 int WifiSettings::GetRealMacAddress(std::string &macAddress)
1667 {
1668     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1669     macAddress = mWifiConfig.realMacAddress;
1670     return 0;
1671 }
1672 
SetP2pDeviceName(const std::string & deviceName)1673 int WifiSettings::SetP2pDeviceName(const std::string &deviceName)
1674 {
1675     std::unique_lock<std::mutex> lock(mP2pMutex);
1676     mP2pVendorConfig.SetDeviceName(deviceName);
1677     std::vector<P2pVendorConfig> tmp;
1678     tmp.push_back(mP2pVendorConfig);
1679     mSavedWifiP2pVendorConfig.SetValue(tmp);
1680     return mSavedWifiP2pVendorConfig.SaveConfig();
1681 }
1682 
ReloadTrustListPolicies()1683 const std::vector<TrustListPolicy> WifiSettings::ReloadTrustListPolicies()
1684 {
1685     std::unique_lock<std::mutex> lock(mStaMutex);
1686     mTrustListPolicies.LoadConfig();
1687     if (mTrustListPolicies.GetValue().size() <= 0) {
1688         std::vector<TrustListPolicy> policies;
1689         TrustListPolicy policy;
1690         policies.push_back(policy);
1691         mTrustListPolicies.SetValue(policies);
1692         mTrustListPolicies.SaveConfig();
1693         mTrustListPolicies.LoadConfig();
1694     }
1695 
1696     return mTrustListPolicies.GetValue();
1697 }
1698 
ReloadMovingFreezePolicy()1699 const MovingFreezePolicy WifiSettings::ReloadMovingFreezePolicy()
1700 {
1701     std::unique_lock<std::mutex> lock(mStaMutex);
1702     mMovingFreezePolicy.LoadConfig();
1703 
1704     if (mMovingFreezePolicy.GetValue().size() <= 0) {
1705         std::vector<MovingFreezePolicy> policies;
1706         MovingFreezePolicy policy;
1707         policies.push_back(policy);
1708         mMovingFreezePolicy.SetValue(policies);
1709         mMovingFreezePolicy.SaveConfig();
1710         mMovingFreezePolicy.LoadConfig();
1711     }
1712 
1713     if (mMovingFreezePolicy.GetValue().size() <= 0) {
1714         return mFPolicy;
1715     }
1716     return mMovingFreezePolicy.GetValue()[0];
1717 }
1718 
GetConnectTimeoutBssid()1719 std::string WifiSettings::GetConnectTimeoutBssid()
1720 {
1721     std::unique_lock<std::mutex> lock(mStaMutex);
1722     const int timeout = 30; // 30s
1723     if (mBssidToTimeoutTime.second - static_cast<int>(time(0)) > timeout) {
1724         return "";
1725     }
1726     return mBssidToTimeoutTime.first;
1727 }
1728 
SetConnectTimeoutBssid(std::string & bssid)1729 int WifiSettings::SetConnectTimeoutBssid(std::string &bssid)
1730 {
1731     std::unique_lock<std::mutex> lock(mStaMutex);
1732     time_t now = time(0);
1733     mBssidToTimeoutTime = std::make_pair(bssid, static_cast<int>(now));
1734     return 0;
1735 }
1736 
SetDefaultFrequenciesByCountryBand(const BandType band,std::vector<int> & frequencies)1737 void WifiSettings::SetDefaultFrequenciesByCountryBand(const BandType band, std::vector<int> &frequencies)
1738 {
1739     std::string countryCode;
1740     if (GetCountryCode(countryCode)) {
1741         return;
1742     }
1743 
1744     for (auto& item : g_countryDefaultFreqs) {
1745         if (item.countryCode == countryCode && item.band == band) {
1746             frequencies = item.freqs;
1747         }
1748     }
1749 }
1750 
SetExplicitGroup(bool isExplicit)1751 void WifiSettings::SetExplicitGroup(bool isExplicit)
1752 {
1753     explicitGroup = isExplicit;
1754 }
1755 
IsExplicitGroup(void)1756 bool WifiSettings::IsExplicitGroup(void)
1757 {
1758     return explicitGroup;
1759 }
1760 
SetThermalLevel(const int & level)1761 void WifiSettings::SetThermalLevel(const int &level)
1762 {
1763     mThermalLevel = level;
1764 }
1765 
GetThermalLevel() const1766 int WifiSettings::GetThermalLevel() const
1767 {
1768     return mThermalLevel;
1769 }
1770 
SetThreadStatusFlag(bool state)1771 void WifiSettings::SetThreadStatusFlag(bool state)
1772 {
1773     if (state) {
1774         mThreadStartTime = std::chrono::duration_cast<std::chrono::milliseconds>(
1775         std::chrono::steady_clock::now().time_since_epoch()).count();
1776     }
1777     mThreadStatusFlag_ = state;
1778 }
1779 
GetThreadStatusFlag(void) const1780 bool WifiSettings::GetThreadStatusFlag(void) const
1781 {
1782     return mThreadStatusFlag_;
1783 }
1784 
GetThreadStartTime(void) const1785 uint64_t WifiSettings::GetThreadStartTime(void) const
1786 {
1787     return mThreadStartTime;
1788 }
1789 
SaveDisconnectedReason(DisconnectedReason discReason)1790 void WifiSettings::SaveDisconnectedReason(DisconnectedReason discReason)
1791 {
1792     mLastDiscReason = discReason;
1793 }
1794 
GetDisconnectedReason(DisconnectedReason & discReason) const1795 int WifiSettings::GetDisconnectedReason(DisconnectedReason &discReason) const
1796 {
1797     discReason = mLastDiscReason;
1798     return 0;
1799 }
1800 
SetScanOnlySwitchState(const int & state)1801 void WifiSettings::SetScanOnlySwitchState(const int &state)
1802 {
1803     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1804     mWifiConfig.scanOnlySwitch = state;
1805     SyncWifiConfig();
1806 }
1807 
GetScanOnlySwitchState()1808 int WifiSettings::GetScanOnlySwitchState()
1809 {
1810     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1811     return mWifiConfig.scanOnlySwitch;
1812 }
1813 
CheckScanOnlyAvailable()1814 bool WifiSettings::CheckScanOnlyAvailable()
1815 {
1816     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1817     return mWifiConfig.scanOnlySwitch && (MODE_STATE_CLOSE == mAirplaneModeState);
1818 }
1819 
GetStaApExclusionType()1820 int WifiSettings::GetStaApExclusionType()
1821 {
1822     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1823     return mWifiConfig.staApExclusionType;
1824 }
1825 
SetStaApExclusionType(int type)1826 int WifiSettings::SetStaApExclusionType(int type)
1827 {
1828     std::unique_lock<std::mutex> lock(mWifiConfigMutex);
1829     mWifiConfig.staApExclusionType = type;
1830     SyncWifiConfig();
1831     return 0;
1832 }
1833 #ifdef SUPPORT_RANDOM_MAC_ADDR
GetPairMacAddress(std::map<WifiMacAddrInfo,std::string> & macAddrInfoMap,const WifiMacAddrInfo & macAddrInfo)1834 static std::string GetPairMacAddress(std::map<WifiMacAddrInfo,
1835     std::string>& macAddrInfoMap, const WifiMacAddrInfo &macAddrInfo)
1836 {
1837     auto iter = macAddrInfoMap.find(macAddrInfo);
1838     if (iter != macAddrInfoMap.end()) {
1839         LOGD("%{public}s: find the record, realMacAddr:%{private}s, bssidType:%{public}d, randomMacAddr:%{private}s",
1840             __func__, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType, iter->second.c_str());
1841         return iter->second;
1842     } else {
1843         LOGD("%{public}s: record not found.", __func__);
1844     }
1845     return "";
1846 }
1847 
InsertMacAddrPairs(std::map<WifiMacAddrInfo,std::string> & macAddrInfoMap,const WifiMacAddrInfo & macAddrInfo,std::string & randomMacAddr)1848 static WifiMacAddrErrCode InsertMacAddrPairs(std::map<WifiMacAddrInfo,
1849     std::string>& macAddrInfoMap, const WifiMacAddrInfo &macAddrInfo, std::string& randomMacAddr)
1850 {
1851     auto iter = macAddrInfoMap.find(macAddrInfo);
1852     if (iter != macAddrInfoMap.end()) {
1853         LOGD("%{public}s: the record is existed, macAddr:%{private}s, bssidType:%{public}d, value:%{private}s",
1854             __func__, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType, iter->second.c_str());
1855         return WIFI_MACADDR_HAS_EXISTED;
1856     } else {
1857         macAddrInfoMap.insert(std::make_pair(macAddrInfo, randomMacAddr));
1858         LOGD("%{public}s: add a mac address pair, bssid:%{private}s, bssidType:%{public}d, randomMacAddr:%{private}s",
1859             __func__, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType, randomMacAddr.c_str());
1860         return WIFI_MACADDR_OPER_SUCCESS;
1861     }
1862 }
1863 
DelMacAddrPairs(std::map<WifiMacAddrInfo,std::string> & macAddrInfoMap,const WifiMacAddrInfo & macAddrInfo)1864 static void DelMacAddrPairs(std::map<WifiMacAddrInfo, std::string>& macAddrInfoMap, const WifiMacAddrInfo &macAddrInfo)
1865 {
1866     auto iter = macAddrInfoMap.find(macAddrInfo);
1867     if (iter != macAddrInfoMap.end()) {
1868         if (iter->second.empty()) {
1869             LOGI("invalid record, bssid:%{private}s, bssidType:%{public}d",
1870                 iter->first.bssid.c_str(), iter->first.bssidType);
1871         } else {
1872             LOGD("%{public}s: find the record, realMacAddr:%{private}s, bssidType:%{public}d, randomMacAddr:%{private}s",
1873                 __func__, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType, iter->second.c_str());
1874         }
1875         macAddrInfoMap.erase(iter);
1876     }
1877 }
1878 
PrintPairMacAddress(std::map<WifiMacAddrInfo,std::string> & result)1879 static void PrintPairMacAddress(std::map<WifiMacAddrInfo, std::string>& result)
1880 {
1881     LOGI("total records: %{public}d", (int)result.size());
1882     int idx = 0;
1883     for (auto iter = result.begin(); iter != result.end(); iter++) {
1884         LOGI("Index:%{public}d, bssid:%{private}s, bssidType:%{public}d, value:%{private}s",
1885             ++idx, iter->first.bssid.c_str(), iter->first.bssidType, iter->second.c_str());
1886     }
1887 }
1888 
GenerateRandomMacAddress(std::string peerBssid,std::string & randomMacAddr)1889 void WifiSettings::GenerateRandomMacAddress(std::string peerBssid, std::string &randomMacAddr)
1890 {
1891     LOGD("enter GenerateRandomMacAddress");
1892     constexpr int arraySize = 4;
1893     constexpr int macBitSize = 12;
1894     constexpr int firstBit = 1;
1895     constexpr int lastBit = 11;
1896     constexpr int two = 2;
1897     constexpr int hexBase = 16;
1898     constexpr int octBase = 8;
1899     int ret = 0;
1900     char strMacTmp[arraySize] = {0};
1901     std::mt19937_64 gen(std::chrono::high_resolution_clock::now().time_since_epoch().count()
1902         + std::hash<std::string>{}(peerBssid));
1903     for (int i = 0; i < macBitSize; i++) {
1904         if (i != firstBit) {
1905             std::uniform_int_distribution<> distribution(0, hexBase - 1);
1906             ret = sprintf_s(strMacTmp, arraySize, "%x", distribution(gen));
1907         } else {
1908             std::uniform_int_distribution<> distribution(0, octBase - 1);
1909             ret = sprintf_s(strMacTmp, arraySize, "%x", two * distribution(gen));
1910         }
1911         if (ret == -1) {
1912             LOGE("GenerateRandomMacAddress failed, sprintf_s return -1!");
1913         }
1914         randomMacAddr += strMacTmp;
1915         if ((i % two) != 0 && (i != lastBit)) {
1916             randomMacAddr.append(":");
1917         }
1918     }
1919     LOGD("exit GenerateRandomMacAddress, randomMacAddr:%{private}s", randomMacAddr.c_str());
1920 }
1921 
StoreWifiMacAddrPairInfo(WifiMacAddrInfoType type,const std::string & realMacAddr)1922 bool WifiSettings::StoreWifiMacAddrPairInfo(WifiMacAddrInfoType type, const std::string &realMacAddr)
1923 {
1924     if (realMacAddr.empty()) {
1925         LOGE("StoreWifiMacAddrPairInfo: address is empty");
1926         return false;
1927     }
1928 
1929     if (type >= WifiMacAddrInfoType::INVALID_MACADDR_INFO) {
1930         LOGE("StoreWifiMacAddrPairInfo: invalid type[%{public}d]", type);
1931         return false;
1932     }
1933 
1934     std::string randomMacAddr;
1935     WifiSettings::GetInstance().GenerateRandomMacAddress(realMacAddr, randomMacAddr);
1936     LOGI("%{public}s: type:%{public}d, address:%{private}s, randomMacAddr:%{private}s",
1937         __func__, type, realMacAddr.c_str(), randomMacAddr.c_str());
1938     WifiMacAddrInfo realMacAddrInfo;
1939     realMacAddrInfo.bssid = realMacAddr;
1940     realMacAddrInfo.bssidType = REAL_DEVICE_ADDRESS;
1941     WifiMacAddrErrCode ret = WifiSettings::GetInstance().AddMacAddrPairs(type, realMacAddrInfo, randomMacAddr);
1942     if (ret == WIFI_MACADDR_OPER_SUCCESS) {
1943         WifiMacAddrInfo randomMacAddrInfo;
1944         randomMacAddrInfo.bssid = randomMacAddr;
1945         randomMacAddrInfo.bssidType = RANDOM_DEVICE_ADDRESS;
1946         WifiSettings::GetInstance().AddMacAddrPairs(type, randomMacAddrInfo, realMacAddr);
1947     }
1948     return true;
1949 }
1950 
AddMacAddrPairs(WifiMacAddrInfoType type,const WifiMacAddrInfo & macAddrInfo,std::string randomMacAddr)1951 WifiMacAddrErrCode WifiSettings::AddMacAddrPairs(WifiMacAddrInfoType type,
1952     const WifiMacAddrInfo &macAddrInfo, std::string randomMacAddr)
1953 {
1954     if ((type >= WifiMacAddrInfoType::INVALID_MACADDR_INFO) || macAddrInfo.bssid.empty()) {
1955         LOGE("%{public}s: invalid parameter, type:%{public}d, bssid:%{private}s",
1956             __func__, type, macAddrInfo.bssid.c_str());
1957         return WIFI_MACADDR_INVALID_PARAM;
1958     }
1959     std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
1960     switch (type) {
1961         case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
1962             return InsertMacAddrPairs(mWifiScanMacAddrPair, macAddrInfo, randomMacAddr);
1963         case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
1964             return InsertMacAddrPairs(mHotspotMacAddrPair, macAddrInfo, randomMacAddr);
1965         case WifiMacAddrInfoType::P2P_MACADDR_INFO:
1966             return InsertMacAddrPairs(mP2pMacAddrPair, macAddrInfo, randomMacAddr);
1967         default:
1968             LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
1969             break;
1970     }
1971     return WIFI_MACADDR_INVALID_PARAM;
1972 }
1973 
RemoveMacAddrPairs(WifiMacAddrInfoType type,const WifiMacAddrInfo & macAddrInfo)1974 int WifiSettings::RemoveMacAddrPairs(WifiMacAddrInfoType type, const WifiMacAddrInfo &macAddrInfo)
1975 {
1976     std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
1977     switch (type) {
1978         case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
1979             DelMacAddrPairs(mWifiScanMacAddrPair, macAddrInfo);
1980             break;
1981         case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
1982             DelMacAddrPairs(mHotspotMacAddrPair, macAddrInfo);
1983             break;
1984         case WifiMacAddrInfoType::P2P_MACADDR_INFO:
1985             DelMacAddrPairs(mP2pMacAddrPair, macAddrInfo);
1986             break;
1987         default:
1988             LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
1989             return -1;
1990     }
1991     return 0;
1992 }
1993 
GetMacAddrPairs(WifiMacAddrInfoType type,const WifiMacAddrInfo & macAddrInfo)1994 std::string WifiSettings::GetMacAddrPairs(WifiMacAddrInfoType type, const WifiMacAddrInfo &macAddrInfo)
1995 {
1996     LOGD("get a mac address pair, type:%{public}d, bssid:%{private}s, bssidType:%{public}d",
1997         type, macAddrInfo.bssid.c_str(), macAddrInfo.bssidType);
1998     std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
1999     switch (type) {
2000         case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
2001             return GetPairMacAddress(mWifiScanMacAddrPair, macAddrInfo);
2002         case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
2003             return GetPairMacAddress(mHotspotMacAddrPair, macAddrInfo);
2004         case WifiMacAddrInfoType::P2P_MACADDR_INFO:
2005             return GetPairMacAddress(mP2pMacAddrPair, macAddrInfo);
2006         default:
2007             LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
2008             return "";
2009     }
2010     return "";
2011 }
2012 
PrintMacAddrPairs(WifiMacAddrInfoType type)2013 void WifiSettings::PrintMacAddrPairs(WifiMacAddrInfoType type)
2014 {
2015     std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
2016     switch (type) {
2017         case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
2018             PrintPairMacAddress(mWifiScanMacAddrPair);
2019             break;
2020         case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
2021             PrintPairMacAddress(mHotspotMacAddrPair);
2022             break;
2023         case WifiMacAddrInfoType::P2P_MACADDR_INFO:
2024             PrintPairMacAddress(mP2pMacAddrPair);
2025             break;
2026         default:
2027             LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
2028             break;
2029     }
2030 }
2031 
ClearMacAddrPairs(WifiMacAddrInfoType type)2032 void WifiSettings::ClearMacAddrPairs(WifiMacAddrInfoType type)
2033 {
2034     LOGI("%{public}s type:%{public}d", __func__, type);
2035     std::unique_lock<std::mutex> lock(mMacAddrPairMutex);
2036     switch (type) {
2037         case WifiMacAddrInfoType::WIFI_SCANINFO_MACADDR_INFO:
2038             mWifiScanMacAddrPair.clear();
2039             break;
2040         case WifiMacAddrInfoType::HOTSPOT_MACADDR_INFO:
2041             mHotspotMacAddrPair.clear();
2042             break;
2043         case WifiMacAddrInfoType::P2P_MACADDR_INFO:
2044             mP2pMacAddrPair.clear();
2045             break;
2046         default:
2047             LOGE("%{public}s: invalid mac address type, type:%{public}d", __func__, type);
2048     }
2049     return;
2050 }
2051 #endif
2052 }  // namespace Wifi
2053 }  // namespace OHOS
2054