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