wifi2 wifi 需求

Signed-off-by: shenqihang <shenqihang@huawei.com>
This commit is contained in:
xionglei 2024-09-13 15:38:52 +08:00 committed by shenqihang
parent 452e2044be
commit bc50242294
73 changed files with 3483 additions and 243 deletions

View File

@ -65,7 +65,8 @@
"wifi_feature_network_selection",
"wifi_feature_with_hdi_chip_supported",
"wifi_feature_with_vap_manager",
"wifi_feature_with_sta_asset"
"wifi_feature_with_sta_asset",
"wifi_feature_wifi_pro_ctrl"
],
"adapted_system_type": [
"small",

View File

@ -78,6 +78,7 @@
/* -----------Feature service name-------------- */
#define WIFI_SERVICE_STA "StaService" /* STA */
#define WIFI_SERVICE_SELFCURE "SelfCureService" /* SELFCURE */
#define WIFI_SERVICE_WIFIPRO "WifiProService" /* WIFIPRO */
#define WIFI_SERVICE_AP "ApService" /* AP */
#define WIFI_SERVICE_P2P "P2pService" /* P2P */
#define WIFI_SERVICE_SCAN "ScanService" /* SCAN */

View File

@ -292,7 +292,8 @@ enum class FilterTag {
HAS_INTERNET_NETWORK_SELECTOR_FILTER_TAG,
RECOVERY_NETWORK_SELECTOR_FILTER_TAG,
PORTAL_NETWORK_SELECTOR_FILTER_TAG,
IT_NETWORK_SELECTOR_FILTER_TAG
IT_NETWORK_SELECTOR_FILTER_TAG,
NOT_P2P_ENHANCE_FREQ_AT_5G_FILTER_TAG,
};
enum class TagType {

View File

@ -659,6 +659,7 @@ struct WifiDeviceConfig {
WifiWapiConfig wifiWapiConfig;
IpInfo lastDhcpResult;
bool isShared;
int64_t lastTrySwitchWifiTimestamp { -1 };
WifiDeviceConfig()
{

View File

@ -49,6 +49,7 @@ group("wifi_manage") {
deps += [
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap:wifi_ap_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common:wifi_common_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro:wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure:wifi_self_cure",
]
if (wifi_feature_with_p2p) {

View File

@ -189,6 +189,7 @@ if (defined(ohos_lite)) {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",
@ -499,6 +500,7 @@ if (defined(ohos_lite)) {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common:wifi_common_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native:wifi_native",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p:wifi_p2p_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro:wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan:wifi_scan_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure:wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta:wifi_sta_service",
@ -557,6 +559,10 @@ if (defined(ohos_lite)) {
defines += [ "SUPPORT_ClOUD_WIFI_ASSET" ]
}
if (wifi_feature_wifi_pro_ctrl) {
defines += [ "FEATURE_WIFI_PRO_SUPPORT" ]
}
if (defined(global_parts_info) &&
defined(global_parts_info.telephony_core_service)) {
external_deps += [ "core_service:tel_core_service_api" ]

View File

@ -109,6 +109,7 @@ if (defined(ohos_lite)) {
}
install_enable = true
include_dirs = [
"network_black_list",
"$WIFI_ROOT_DIR/base/utils",
"$WIFI_ROOT_DIR/interfaces/inner_api",
"$WIFI_ROOT_DIR/frameworks/native/interfaces",
@ -132,6 +133,7 @@ if (defined(ohos_lite)) {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",
@ -146,6 +148,7 @@ if (defined(ohos_lite)) {
"app_network_speed_limit/app_network_speed_limit_service.cpp",
"app_network_speed_limit/speed_limit_configs_writer.cpp",
"block_connect_service.cpp",
"network_black_list/network_black_list_manager.cpp",
"wifi_app_state_aware.cpp",
"wifi_auth_center.cpp",
"wifi_channel_helper.cpp",
@ -215,6 +218,10 @@ if (defined(ohos_lite)) {
"FEATURE_SELF_CURE_SUPPORT",
]
if (wifi_feature_wifi_pro_ctrl) {
defines += [ "FEATURE_WIFI_PRO_SUPPORT" ]
}
if (is_asan) {
defines += [ "DTFUZZ_TEST" ]
}

View File

@ -0,0 +1,170 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <ctime>
#include <vector>
#include "wifi_timer.h"
#include "network_black_list_manager.h"
#include "wifi_logger.h"
#include "wifi_common_util.h"
namespace OHOS {
namespace Wifi {
DEFINE_WIFILOG_LABEL("NetworkBlockListManager");
namespace {
constexpr int64_t BLOCKLIST_VALID_TIME = 120; // s
constexpr int32_t MAX_CONNECT_FAILED_TIMES = 2;
}
NetworkBlockListManager::NetworkBlockListManager()
{}
NetworkBlockListManager::~NetworkBlockListManager()
{}
NetworkBlockListManager &NetworkBlockListManager::GetInstance()
{
static NetworkBlockListManager gNetworkBlockListManager;
return gNetworkBlockListManager;
}
void NetworkBlockListManager::AddWifiBlocklist(const std::string &bssid)
{
if (bssid.empty()) {
WIFI_LOGI("AddWifiBlocklist, bssid is invalid");
return;
}
WIFI_LOGI("AddWifiBlocklist, bssid:%{public}s", MacAnonymize(bssid).c_str());
time_t now = time(nullptr);
if (now < 0) {
WIFI_LOGI("AddWifiBlocklist, time return invalid.");
}
{
std::lock_guard<std::mutex> lock(mutex_);
wifiBlockMap_[bssid] = static_cast<int64_t>(now) + BLOCKLIST_VALID_TIME;
}
uint32_t timerId = 0;
WifiTimer::GetInstance()->Register([this]() {this->RemoveWifiBlocklist();}, timerId, BLOCKLIST_VALID_TIME);
}
void NetworkBlockListManager::RemoveWifiBlocklist()
{
std::lock_guard<std::mutex> lock(mutex_);
if (wifiBlockMap_.empty()) {
WIFI_LOGI("RemoveWifiBlocklist, wifiBlackMap is empty");
return;
}
time_t now = time(nullptr);
if (now < 0) {
WIFI_LOGI("RemoveWifiBlocklist, time return invalid.");
}
for (auto &[bssid, timeOut] : wifiBlockMap_) {
if (static_cast<int64_t>(now) >= timeOut) {
WIFI_LOGI("RemoveWifiBlocklist, bssid:%{public}s", MacAnonymize(bssid).c_str());
wifiBlockMap_.erase(bssid);
}
}
}
bool NetworkBlockListManager::IsInWifiBlocklist(const std::string &bssid)
{
if (bssid.empty()) {
return false;
}
std::lock_guard<std::mutex> lock(mutex_);
if (wifiBlockMap_.empty()) {
return false;
}
auto iter = wifiBlockMap_.find(bssid);
return iter != wifiBlockMap_.end();
}
void NetworkBlockListManager::AddAbnormalWifiBlocklist(const std::string &bssid)
{
if (bssid.empty()) {
WIFI_LOGI("AddAbnormalWifiBlocklist, bssid is invalid");
return;
}
std::lock_guard<std::mutex> lock(mutex_);
abnormalWifiBlockVec_.emplace_back(bssid);
}
void NetworkBlockListManager::CleanAbnormalWifiBlocklist()
{
std::lock_guard<std::mutex> lock(mutex_);
std::vector<std::string> tempVec;
abnormalWifiBlockVec_.swap(tempVec);
}
bool NetworkBlockListManager::IsInAbnormalWifiBlocklist(const std::string &bssid)
{
if (abnormalWifiBlockVec_.empty()) {
return false;
}
std::lock_guard<std::mutex> lock(mutex_);
for (auto &black: abnormalWifiBlockVec_) {
if (black == bssid) {
return true;
}
}
return false;
}
void NetworkBlockListManager::CleanTempWifiBlockList()
{
std::lock_guard<std::mutex> lock(mutex_);
std::map<std::string, int32_t> tempMap;
tempWifiBlockMap_.swap(tempMap);
}
bool NetworkBlockListManager::IsInTempWifiBlockList(const std::string &bssid)
{
if (tempWifiBlockMap_.empty()) {
return false;
}
std::lock_guard<std::mutex> lock(mutex_);
return tempWifiBlockMap_.find(bssid) != tempWifiBlockMap_.end();
}
bool NetworkBlockListManager::IsFailedMultiTimes(const std::string &bssid)
{
if (bssid.empty()) {
return false;
}
std::lock_guard<std::mutex> lock(mutex_);
int32_t counter = 1;
auto iter = tempWifiBlockMap_.find(bssid);
if (iter != tempWifiBlockMap_.end()) {
counter++;
iter->second = counter;
} else {
tempWifiBlockMap_[bssid] = counter;
}
return counter >= MAX_CONNECT_FAILED_TIMES;
}
} // namespace Wifi
} // namespace OHOS

View File

@ -0,0 +1,49 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_WIFI_NETWORK_BLACK_LIST_MANAGER_H
#define OHOS_WIFI_NETWORK_BLACK_LIST_MANAGER_H
#include <map>
#include <vector>
#include "wifi_log.h"
namespace OHOS {
namespace Wifi {
class NetworkBlockListManager {
public:
NetworkBlockListManager();
~NetworkBlockListManager();
static NetworkBlockListManager &GetInstance();
void AddWifiBlocklist(const std::string &bssid);
bool IsInWifiBlocklist(const std::string &bssid);
void AddAbnormalWifiBlocklist(const std::string &bssid);
void CleanAbnormalWifiBlocklist();
void CleanTempWifiBlockList();
bool IsInAbnormalWifiBlocklist(const std::string &bssid);
bool IsInTempWifiBlockList(const std::string &bssid);
bool IsFailedMultiTimes(const std::string &bssid);
private:
std::mutex mutex_;
std::map<std::string, int64_t> wifiBlockMap_;
std::vector<std::string> abnormalWifiBlockVec_;
std::map<std::string, int32_t> tempWifiBlockMap_;
void RemoveWifiBlocklist();
};
} // namespace Wifi
} // namespace OHOS
#endif

View File

@ -599,6 +599,9 @@ ErrCode ConcreteMangerMachine::SwitchSemiFromEnable()
WIFI_LOGE("SwitchSemiFromEnable, Instance get sta service is null!");
WifiConfigCenter::GetInstance().SetWifiMidState(WifiOprMidState::CLOSED, mid);
WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_STA, mid);
#ifdef FEATURE_WIFI_PRO_SUPPORT
WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_WIFIPRO, mid);
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_SELFCURE, mid);
#endif

View File

@ -173,11 +173,7 @@ ErrCode WifiServiceScheduler::AutoStopStaService(int instId)
IStaService *pService = WifiServiceManager::GetInstance().GetStaServiceInst(instId);
if (pService == nullptr) {
WIFI_LOGE("AutoStopStaService, Instance get sta service is null!");
WifiConfigCenter::GetInstance().SetWifiMidState(WifiOprMidState::CLOSED, instId);
WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_STA, instId);
#ifdef FEATURE_SELF_CURE_SUPPORT
WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_SELFCURE, instId);
#endif
HandleGetStaFailed(instId);
return WIFI_OPT_SUCCESS;
}
DispatchWifiCloseRes(OperateResState::CLOSE_WIFI_CLOSING, instId);
@ -247,6 +243,18 @@ ErrCode WifiServiceScheduler::AutoStopWifi2Service(int instId)
return WIFI_OPT_SUCCESS;
}
void WifiServiceScheduler::HandleGetStaFailed(int instId)
{
WifiConfigCenter::GetInstance().SetWifiMidState(WifiOprMidState::CLOSED, instId);
WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_STA, instId);
#ifdef FEATURE_WIFI_PRO_SUPPORT
WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_WIFIPRO, instId);
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_SELFCURE, instId);
#endif
}
ErrCode WifiServiceScheduler::AutoStartScanOnly(int instId, std::string &staIfName)
{
WifiOprMidState curState = WifiConfigCenter::GetInstance().GetWifiScanOnlyMidState(instId);
@ -389,6 +397,7 @@ ErrCode WifiServiceScheduler::PostStartWifi(int instId)
ErrCode errCode = WifiManager::GetInstance().GetWifiP2pManager()->AutoStartP2pService();
if (errCode != WIFI_OPT_SUCCESS && errCode != WIFI_OPT_OPEN_SUCC_WHEN_OPENED) {
WIFI_LOGE("AutoStartStaService, AutoStartP2pService failed!");
return WIFI_OPT_FAILED;
}
#endif
return WIFI_OPT_SUCCESS;
@ -407,18 +416,16 @@ ErrCode WifiServiceScheduler::StartWifiStaService(int instId)
return WIFI_OPT_FAILED;
}
WIFI_LOGD("StartWifiStaService GetStaServiceInst instId:%{public}d", instId);
#ifdef FEATURE_SELF_CURE_SUPPORT
if (instId == INSTID_WLAN0) {
if (StartSelfCureService(instId) != WIFI_OPT_SUCCESS) {
WIFI_LOGE("StartSelfCureService failed!");
}
}
#endif
IStaService *pService = WifiServiceManager::GetInstance().GetStaServiceInst(instId);
if (pService == nullptr) {
WIFI_LOGE("StartWifiStaService Create %{public}s service failed!", WIFI_SERVICE_STA);
return WIFI_OPT_FAILED;
}
if (StartDependentService(instId) != WIFI_OPT_SUCCESS) {
return WIFI_OPT_FAILED;
}
WIFI_LOGD("StartWifiStaService InitStaService instId:%{public}d", instId);
if (InitStaService(pService, instId) != WIFI_OPT_SUCCESS) {
WIFI_LOGE("StartWifiStaService InitStaService failed!");
@ -446,6 +453,28 @@ ErrCode WifiServiceScheduler::StartWifiStaService(int instId)
return WIFI_OPT_SUCCESS;
}
ErrCode WifiServiceScheduler::StartDependentService(int instId)
{
if (instId != INSTID_WLAN0) {
return WIFI_OPT_SUCCESS;
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
if (StartWifiProService(instId) != WIFI_OPT_SUCCESS) {
WIFI_LOGE("StartWifiProService failed!");
return WIFI_OPT_FAILED;
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
if (StartSelfCureService(instId) != WIFI_OPT_SUCCESS) {
WIFI_LOGE("StartSelfCureService failed!");
return WIFI_OPT_FAILED;
}
#endif
return WIFI_OPT_SUCCESS;
}
ErrCode WifiServiceScheduler::InitStaService(IStaService *pService, int instId)
{
if (pService == nullptr) {
@ -498,6 +527,41 @@ ErrCode WifiServiceScheduler::InitStaService(IStaService *pService, int instId)
return WIFI_OPT_SUCCESS;
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
ErrCode WifiServiceScheduler::StartWifiProService(int instId)
{
if (WifiServiceManager::GetInstance().CheckAndEnforceService(WIFI_SERVICE_WIFIPRO) < 0) {
WIFI_LOGE("Load %{public}s service failed!", WIFI_SERVICE_WIFIPRO);
return WIFI_OPT_FAILED;
}
IWifiProService *pWifiProService = WifiServiceManager::GetInstance().GetWifiProServiceInst(instId);
if (pWifiProService == nullptr) {
WIFI_LOGE("Create %{public}s service failed!", WIFI_SERVICE_WIFIPRO);
return WIFI_OPT_FAILED;
}
ErrCode errCode = pWifiProService->InitWifiProService();
if (errCode != WIFI_OPT_SUCCESS) {
WIFI_LOGE("Service enable wifi pro failed, ret %{public}d!", static_cast<int>(errCode));
return WIFI_OPT_FAILED;
}
IStaService *pService = WifiServiceManager::GetInstance().GetStaServiceInst(instId);
if (pService == nullptr) {
WIFI_LOGE("Get %{public}s service failed!", WIFI_SERVICE_STA);
return WIFI_OPT_FAILED;
}
errCode = pService->RegisterStaServiceCallback(pWifiProService->GetStaCallback());
if (errCode != WIFI_OPT_SUCCESS) {
WIFI_LOGE("WifiPro register sta service callback failed!");
return WIFI_OPT_FAILED;
}
return WIFI_OPT_SUCCESS;
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
ErrCode WifiServiceScheduler::StartSelfCureService(int instId)
{

View File

@ -62,6 +62,11 @@ private:
ErrCode PostStartWifi2(int instId);
ErrCode InitStaService(IStaService *pService, int instId);
ErrCode StartWifiStaService(int instId);
ErrCode StartDependentService(int instId);
void HandleGetStaFailed(int instId);
#ifdef FEATURE_WIFI_PRO_SUPPORT
ErrCode StartWifiProService(int instId);
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
ErrCode StartSelfCureService(int instId);
#endif

View File

@ -0,0 +1,99 @@
# Copyright (C) 2023-2023 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//build/ohos.gni")
import("//foundation/communication/wifi/wifi/wifi.gni")
ohos_static_library("wifi_pro") {
branch_protector_ret = "pac_ret"
sanitize = {
cfi = true # Enable/disable control flow integrity detection
boundary_sanitize = true # Enable boundary san detection
cfi_cross_dso = true # Cross-SO CFI Checks
integer_overflow = true # Enable integer overflow detection
ubsan = true # Enable some Ubsan options
debug = false
}
include_dirs = [
"$WIFI_ROOT_DIR/frameworks/native/interfaces",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/config",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/common",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/wifi_hal_interface",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/network_black_list",
]
sources = [
"$WIFI_ROOT_DIR/frameworks/native/src/network_selection.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/external_wifi_common_builder_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/external_wifi_filter_builder_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selection_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selection_utils.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selector_factory.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selector_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_comparator_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_filter_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_scorer_impl.cpp",
"wifi_pro_interface.cpp",
"wifi_pro_service.cpp",
"wifi_pro_state_machine.cpp",
"wifi_pro_utils.cpp",
]
deps = [
"$WIFI_ROOT_DIR/base:wifi_base",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common:wifi_common_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit:wifi_toolkit",
"$WIFI_ROOT_DIR/utils:wifi_utils",
]
external_deps = [
"ability_runtime:app_manager",
"c_utils:utils",
"hilog:libhilog",
"init:libbegetutil",
"netmanager_base:net_conn_manager_if",
]
defines = []
if (wifi_feature_wifi_pro_ctrl) {
defines += [ "FEATURE_WIFI_PRO_SUPPORT" ]
}
defines += [ "FEATURE_SELF_CURE_SUPPORT" ]
cflags = memory_optimization_cflags
cflags_cc = memory_optimization_cflags_cc
cflags_cc += [
"-std=c++17",
"-Wall",
]
ldflags = [
"-fPIC",
"-Wl,-E",
]
part_name = "wifi"
subsystem_name = "communication"
}

View File

@ -0,0 +1,51 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_WIFI_IWIFI_PRO_SERVICE_H
#define OHOS_WIFI_IWIFI_PRO_SERVICE_H
#include "wifi_errcode.h"
#include "wifi_msg.h"
#include "sta_service_callback.h"
namespace OHOS {
namespace Wifi {
class IWifiProService {
public:
virtual ~IWifiProService() = default;
/**
* @Description wifiPro service initialization function.
*
* @return ErrCode - success: WIFI_OPT_SUCCESS, failed: WIFI_OPT_FAILED
*/
virtual ErrCode InitWifiProService() = 0;
/**
* @Description Get register sta callback
*
* @return StaServiceCallback - sta callback
*/
virtual StaServiceCallback GetStaCallback() const = 0;
/**
* @Description deal scan results
*
* @return results - scan results
*/
virtual void DealScanResult(const std::vector<InterScanInfo> &results) = 0;
};
} // namespace Wifi
} // namespace OHOS
#endif

View File

@ -0,0 +1,91 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_WIFI_PRO_COMMON_H
#define OHOS_WIFI_PRO_COMMON_H
namespace OHOS {
namespace Wifi {
#define FRIEND_GTEST(test_typename) friend class test_typename##Test
constexpr int32_t ROAM_SCENE = 1;
constexpr int32_t PORTAL_AP_UNAUTHORIZED = 1;
constexpr int32_t TYPE_USER_PREFERENCE = 1;
constexpr int32_t THRESHOD_RSSI = -82;
constexpr int32_t UPGRADE_RSSI_THRESH = 10;
constexpr int64_t WIFI_SWITCH_RECORD_MAX_TIME = 1000 * 60 * 60 * 24 * 14; // 14天,单位:ms
constexpr int32_t WIFI_DEFAULT_SCORE = -1;
constexpr int32_t WIFI_LEVEL_TWO_SCORE = 20;
constexpr int32_t WIFI_LEVEL_THREE_SCORE = 60;
constexpr int32_t WIFI_LEVEL_FOUR_SCORE = 80;
constexpr int32_t WIFI_CATEGORY_WIFI6 = 2;
constexpr int32_t WIFI_CATEGORY_WIFI6_PLUS = 3;
constexpr int32_t WIFI_CATEGORY_WIFI7 = 4;
constexpr int32_t WIFI_CATEGORY_WIFI7_PLUS = 5;
constexpr int32_t WIFI_CATEGORY_WIFI5_SCORE = 1;
constexpr int32_t WIFI_CATEGORY_WIFI6_NONE_160M_SCORE = 2;
constexpr int32_t WIFI_CATEGORY_WIFI6_160M_SCORE = 3;
constexpr int32_t WIFI_CATEGORY_WIFI6_PLUS_NONE_160M_SCORE = 4;
constexpr int32_t WIFI_CATEGORY_WIFI6_PLUS_160M_SCORE = 5;
constexpr int32_t WIFI_CATEGORY_WIFI7_MLSR_SCORE = 6;
constexpr int32_t WIFI_CATEGORY_WIFI7_PLUS_EMLSR_SCORE = 7;
constexpr int32_t WIFI_HIGHER_SECURITY_TYPE = 5;
constexpr int32_t CHANNEL_WIDTH_160MHZ = 3;
enum WifiProCommond {
EVENT_NOTIFY_WIFI_PRO_SWITCH_CHANGED = 0,
EVENT_WIFI_CONNECT_STATE_CHANGED = 1,
EVENT_DISCONNECT_DISCONNECTED = 2,
EVENT_HANDLE_SCAN_RESULT = 3,
EVENT_WIFI2WIFI_SELECT_NETWORK_RESULT = 4,
EVENT_WIFI2WIFI_FAILED = 5,
EVENT_WIFI_RSSI_CHANGED = 11,
EVENT_CHECK_WIFI_INTERNET_RESULT = 13,
EVENT_HTTP_REACHABLE_RESULT = 27,
EVENT_REQUEST_SCAN_DELAY = 28,
};
enum SigLevel {
SIG_LEVEL_0 = 0,
SIG_LEVEL_1 = 1,
SIG_LEVEL_2 = 2,
SIG_LEVEL_3 = 3,
SIG_LEVEL_4 = 4,
SIG_LEVEL_MAX = 4,
};
inline const int32_t QUICK_SCAN_INTERVAL[SIG_LEVEL_MAX] = { 10000, 10000, 15000, 30000 };
inline const int32_t NORMAL_SCAN_INTERVAL[SIG_LEVEL_MAX] = { 15000, 15000, 30000, 60000 };
inline const int32_t QUICK_SCAN_MAX_COUNTER[SIG_LEVEL_MAX] = { 20, 20, 10, 10 };
inline const int32_t NORMAL_SCAN_MAX_COUNTER[SIG_LEVEL_MAX] = { 4, 4, 2, 2 };
enum WifiSwitchReason {
// current ap triggers wifi switch because of no internet
WIFI_SWITCH_REASON_NO_INTERNET = 1,
// current ap triggers wifi switch because of rssi poor
WIFI_SWITCH_REASON_POOR_RSSI = 2,
// current ap triggers wifi switch because of internet block under poor rssi
WIFI_SWITCH_REASON_STRONG_RSSI_INTERNET_SLOW = 3,
// current ap triggers wifi switch because of internet block under strong rssi
WIFI_SWITCH_REASON_POOR_RSSI_INTERNET_SLOW = 4,
// current ap triggers wifi switch because of checking wifi in background
WIFI_SWITCH_REASON_BACKGROUND_CHECK_AVAILABLE_WIFI = 5,
};
} // namespace Wifi
} // namespace OHOS
#endif

View File

@ -0,0 +1,106 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "define.h"
#include "wifi_logger.h"
#include "wifi_pro_interface.h"
#include "wifi_pro_service.h"
namespace OHOS {
namespace Wifi {
DEFINE_WIFILOG_LABEL("WifiProInterface");
WifiProInterface::WifiProInterface(int32_t instId) : instId_(instId)
{
WIFI_LOGI("Enter WifiProInterface");
}
WifiProInterface::~WifiProInterface()
{
WIFI_LOGI("Enter ~WifiProInterface");
}
ErrCode WifiProInterface::InitWifiProService()
{
WIFI_LOGI("Enter WifiProInterface::InitWifiProService");
std::lock_guard<std::mutex> lock(mutex);
if (pWifiProService == nullptr) {
pWifiProService = std::make_shared<WifiProService>(instId_);
if (pWifiProService == nullptr) {
WIFI_LOGE("Alloc pWifiProService failed.");
return WIFI_OPT_FAILED;
}
InitCallback();
if (pWifiProService->InitWifiProService() != WIFI_OPT_SUCCESS) {
WIFI_LOGE("InitWifiProService failed.");
return WIFI_OPT_FAILED;
}
}
return WIFI_OPT_SUCCESS;
}
void WifiProInterface::InitCallback()
{
using namespace std::placeholders;
WIFI_LOGI("Enter WifiProInterface::InitCallback");
staCallback_.callbackModuleName = "WifiProService";
staCallback_.OnStaConnChanged = [this](OperateResState state, const WifiLinkedInfo &linkedInfo, int32_t instId) {
this->DealStaConnChanged(state, linkedInfo, instId);
};
staCallback_.OnStaRssiLevelChanged = [this](int32_t rssi, int32_t instId) {
this->DealRssiLevelChanged(rssi, instId);
};
}
void WifiProInterface::DealStaConnChanged(OperateResState state, const WifiLinkedInfo &linkedInfo, int32_t instId)
{
WIFI_LOGI("Enter WifiProInterface::DealStaConnChanged");
std::lock_guard<std::mutex> lock(mutex);
if (pWifiProService == nullptr) {
WIFI_LOGI("pWifiProService is null");
return;
}
pWifiProService->HandleStaConnChanged(state, linkedInfo);
}
void WifiProInterface::DealRssiLevelChanged(int32_t rssi, int32_t instId)
{
WIFI_LOGI("Enter WifiProInterface::DealRssiLevelChanged");
std::lock_guard<std::mutex> lock(mutex);
if (pWifiProService == nullptr) {
WIFI_LOGI("pWifiProService is null");
return;
}
pWifiProService->HandleRssiLevelChanged(rssi);
}
void WifiProInterface::DealScanResult(const std::vector<InterScanInfo> &results)
{
WIFI_LOGI("Enter WifiProInterface::DealScanResult");
std::lock_guard<std::mutex> lock(mutex);
if (pWifiProService == nullptr) {
WIFI_LOGI("pWifiProService is null");
return;
}
pWifiProService->HandleScanResult(results);
}
StaServiceCallback WifiProInterface::GetStaCallback() const
{
return staCallback_;
}
} // namespace Wifi
} // namespace OHOS

View File

@ -0,0 +1,77 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_WIFI_WIFI_PRO_INTERFACE_H
#define OHOS_WIFI_WIFI_PRO_INTERFACE_H
#include "iwifi_pro_service.h"
#include "define.h"
#include "wifi_pro_common.h"
namespace OHOS {
namespace Wifi {
class WifiProService;
class WifiProInterface : public IWifiProService {
FRIEND_GTEST(WifiProInterface);
public:
explicit WifiProInterface(int32_t instId = 0);
~WifiProInterface() override;
/**
* @Description self cure service initialization function.
*
* @return success: WIFI_OPT_SUCCESS, failed: WIFI_OPT_FAILED
*/
ErrCode InitWifiProService() override;
/**
* @Description Get register sta callback
*
* @return StaServiceCallback - sta callback
*/
StaServiceCallback GetStaCallback() const override;
/**
* @Description deal scan results
*
* @return results - scan results
*/
void DealScanResult(const std::vector<InterScanInfo> &results) override;
private:
/**
* @Description deal sta connection change
*
* @param state - OperateResState
* @param info - const WifiLinkedInfo
*/
void DealStaConnChanged(OperateResState state, const WifiLinkedInfo &linkedInfo, int32_t instId = 0);
/**
* @Description rssi level changed
*
* @param rssi
*/
void DealRssiLevelChanged(int32_t rssi, int32_t instId = 0);
private:
std::mutex mutex;
std::shared_ptr<WifiProService> pWifiProService { nullptr };
int32_t instId_ { 0 };
StaServiceCallback staCallback_;
void InitCallback();
};
} // namespace Wifi
} // namespace OHOS
#endif

View File

@ -0,0 +1,138 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <memory>
#include "wifi_logger.h"
#include "wifi_msg.h"
#include "wifi_pro_service.h"
#include "wifi_pro_utils.h"
#include "wifi_common_util.h"
#ifndef FALLTHROUGH_INTENDED
#define FALLTHROUGH_INTENDED [[clang::fallthrough]] // NOLINT
#endif
namespace OHOS {
namespace Wifi {
DEFINE_WIFILOG_LABEL("WifiProService");
WifiProService::WifiProService(int32_t instId)
: instId_(instId)
{
WIFI_LOGI("Enter WifiProService");
}
WifiProService::~WifiProService()
{
WIFI_LOGI("Enter ~WifiProService");
}
ErrCode WifiProService::InitWifiProService()
{
WIFI_LOGI("Enter InitSelfCureService.");
pWifiProStateMachine_ = std::make_shared<WifiProStateMachine>(instId_);
if (pWifiProStateMachine_ == nullptr) {
WIFI_LOGE("Alloc WifiProStateMachine failed.");
return WIFI_OPT_FAILED;
}
if (pWifiProStateMachine_->Initialize() != WIFI_OPT_SUCCESS) {
WIFI_LOGE("Init WifiProStateMachine failed.");
return WIFI_OPT_FAILED;
}
return WIFI_OPT_SUCCESS;
}
void WifiProService::HandleStaConnChanged(OperateResState state, const WifiLinkedInfo &linkedInfo)
{
WIFI_LOGI("WifiProService wifi connection state change, state:%{public}d,connState:%{public}d,"
"supplicantState:%{public}d.", state, linkedInfo.connState, static_cast<int32_t>(linkedInfo.supplicantState));
if (pWifiProStateMachine_ == nullptr) {
WIFI_LOGE("%{public}s pWifiProStateMachine_ is null.", __FUNCTION__);
return;
}
switch (state) {
case OperateResState::CONNECT_AP_CONNECTED:
FALLTHROUGH_INTENDED;
case OperateResState::DISCONNECT_DISCONNECTED:
NotifyWifiConnectStateChanged(state, linkedInfo);
break;
case OperateResState::CONNECT_CHECK_PORTAL:
FALLTHROUGH_INTENDED;
case OperateResState::CONNECT_NETWORK_DISABLED:
FALLTHROUGH_INTENDED;
case OperateResState::CONNECT_ENABLE_NETWORK_FAILED:
FALLTHROUGH_INTENDED;
case OperateResState::CONNECT_CONNECTING_TIMEOUT:
FALLTHROUGH_INTENDED;
case OperateResState::CONNECT_NETWORK_ENABLED:
NotifyCheckWifiInternetResult(state);
break;
case OperateResState::CONNECT_CONNECTION_REJECT:
FALLTHROUGH_INTENDED;
case OperateResState::CONNECT_PASSWORD_WRONG:
FALLTHROUGH_INTENDED;
case OperateResState::CONNECT_OBTAINING_IP_FAILED:
NotifyWifi2WifiFailed();
break;
default:
break;
}
}
void WifiProService::NotifyWifi2WifiFailed()
{
WIFI_LOGI("NotifyWifi2WifiFailed: wifi2wifi failed");
pWifiProStateMachine_->SendMessage(EVENT_WIFI2WIFI_FAILED);
}
void WifiProService::NotifyWifiConnectStateChanged(OperateResState state, const WifiLinkedInfo &linkedInfo)
{
WIFI_LOGI("NotifyWifiConnectStateChanged:networkId:%{public}d, ssid:%{public}s,"
"bssid:%{public}s", linkedInfo.networkId, MacAnonymize(linkedInfo.ssid).c_str(),
MacAnonymize(linkedInfo.bssid).c_str());
pWifiProStateMachine_->SendMessage(EVENT_WIFI_CONNECT_STATE_CHANGED, static_cast<int32_t>(state),
linkedInfo.networkId, linkedInfo.bssid);
}
void WifiProService::NotifyCheckWifiInternetResult(OperateResState state)
{
WIFI_LOGI("NotifyCheckWifiInternetResult: wifi internet result:%{public}d", static_cast<int32_t>(state));
pWifiProStateMachine_->SendMessage(EVENT_CHECK_WIFI_INTERNET_RESULT, static_cast<int32_t>(state));
}
void WifiProService::HandleRssiLevelChanged(int32_t rssi)
{
WIFI_LOGI("WifiProService::HandleRssiLevelChanged, %{public}d.", rssi);
if (pWifiProStateMachine_ == nullptr) {
WIFI_LOGE("%{public}s pWifiProStateMachine_ is null.", __FUNCTION__);
return;
}
pWifiProStateMachine_->SendMessage(EVENT_WIFI_RSSI_CHANGED, rssi);
}
void WifiProService::HandleScanResult(const std::vector<InterScanInfo> &scanInfos)
{
WIFI_LOGI("Enter WifiProService::HandleScanResult.");
if (pWifiProStateMachine_ == nullptr) {
WIFI_LOGE("%{public}s pWifiProStateMachine_ is null.", __FUNCTION__);
return;
}
pWifiProStateMachine_->SendMessage(EVENT_HANDLE_SCAN_RESULT, scanInfos);
}
} // namespace Wifi
} // namespace OHOS

View File

@ -0,0 +1,46 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_WIFI_PRO_SERVICE_H
#define OHOS_WIFI_PRO_SERVICE_H
#include "define.h"
#include "wifi_log.h"
#include "wifi_errcode.h"
#include "wifi_internal_msg.h"
#include "wifi_pro_state_machine.h"
namespace OHOS {
namespace Wifi {
class WifiProService {
FRIEND_GTEST(WifiProService);
public:
explicit WifiProService(int32_t instId = 0);
~WifiProService();
ErrCode InitWifiProService();
void HandleStaConnChanged(OperateResState state, const WifiLinkedInfo &linkedInfo);
void HandleRssiLevelChanged(int32_t rssi);
void HandleScanResult(const std::vector<InterScanInfo> &scanInfos);
private:
std::shared_ptr<WifiProStateMachine> pWifiProStateMachine_ { nullptr };
int32_t instId_ { 0 };
void NotifyWifi2WifiFailed();
void NotifyWifiConnectStateChanged(OperateResState state, const WifiLinkedInfo &linkedInfo);
void NotifyCheckWifiInternetResult(OperateResState state);
};
} // namespace Wifi
} // namespace OHOS
#endif

View File

@ -0,0 +1,942 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include <vector>
#include "iscan_service.h"
#include "wifi_config_center.h"
#include "wifi_logger.h"
#include "wifi_msg.h"
#include "wifi_pro_state_machine.h"
#include "wifi_service_manager.h"
#include "wifi_pro_utils.h"
#include "network_black_list_manager.h"
namespace OHOS {
namespace Wifi {
namespace {
const std::string WIFI_PRO_STATE_MACHINE = "WifiProStateMachine";
constexpr int32_t DEFAULT_RSSI = -200;
constexpr int32_t DEFAULT_SCAN_INTERVAL = 10 * 1000; // ms
}
DEFINE_WIFILOG_LABEL("WifiProStateMachine");
WifiProStateMachine::WifiProStateMachine(int32_t instId)
: StateMachine(WIFI_PRO_STATE_MACHINE),
instId_(instId)
{
WIFI_LOGI("Enter WifiProStateMachine");
}
WifiProStateMachine::~WifiProStateMachine()
{
WIFI_LOGI("Enter ~WifiProStateMachine");
StopHandlerThread();
ParsePointer(pDefaultState_);
ParsePointer(pWifiProEnableState_);
ParsePointer(pWifiProDisabledState_);
ParsePointer(pWifiConnectedState_);
ParsePointer(pWifiDisConnectedState_);
ParsePointer(pWifiLinkMonitorState_);
}
void WifiProStateMachine::BuildStateTree()
{
StatePlus(pDefaultState_, nullptr);
StatePlus(pWifiProEnableState_, pDefaultState_);
StatePlus(pWifiProDisabledState_, pDefaultState_);
StatePlus(pWifiConnectedState_, pWifiProEnableState_);
StatePlus(pWifiDisConnectedState_, pWifiProEnableState_);
StatePlus(pWifiLinkMonitorState_, pWifiProEnableState_);
}
ErrCode WifiProStateMachine::InitWifiProStates()
{
WIFI_LOGI("Enter InitWifiProStates");
int32_t tmpErrNumber;
pDefaultState_ = new (std::nothrow)DefaultState(this);
tmpErrNumber = JudgmentEmpty(pDefaultState_);
pWifiProEnableState_ = new (std::nothrow)WifiProEnableState(this);
tmpErrNumber += JudgmentEmpty(pWifiProEnableState_);
pWifiProDisabledState_ = new (std::nothrow)WifiProDisabledState(this);
tmpErrNumber += JudgmentEmpty(pWifiProDisabledState_);
pWifiConnectedState_ = new (std::nothrow)WifiConnectedState(this);
tmpErrNumber += JudgmentEmpty(pWifiConnectedState_);
pWifiDisConnectedState_ = new (std::nothrow)WifiDisConnectedState(this);
tmpErrNumber += JudgmentEmpty(pWifiDisConnectedState_);
pWifiLinkMonitorState_ = new (std::nothrow)WifiLinkMonitorState(this);
tmpErrNumber += JudgmentEmpty(pWifiLinkMonitorState_);
if (tmpErrNumber != 0) {
WIFI_LOGE("InitWifiProStates someone state is null");
return WIFI_OPT_FAILED;
}
return WIFI_OPT_SUCCESS;
}
ErrCode WifiProStateMachine::Initialize()
{
if (!InitialStateMachine(WIFI_PRO_STATE_MACHINE)) {
WIFI_LOGE("Initial WifiProStateMachine failed.");
return WIFI_OPT_FAILED;
}
if (InitWifiProStates() == WIFI_OPT_FAILED) {
return WIFI_OPT_FAILED;
}
BuildStateTree();
SetFirstState(pWifiProEnableState_);
StartStateMachine();
return WIFI_OPT_SUCCESS;
}
bool WifiProStateMachine::IsKeepCurrWifiConnected()
{
if (WifiProUtils::IsUserSelectNetwork() && (!isWifiNoInternet_)) {
WIFI_LOGI("IsKeepCurrWifiConnected, user select network.");
return true;
}
if (WifiProUtils::IsAppInWhiteLists()) {
WIFI_LOGI("IsKeepCurrWifiConnected, in app white lists.");
return true;
}
// AP+STA scene, do not switch
WifiOprMidState curState = WifiConfigCenter::GetInstance().GetApMidState(instId_);
if (curState == WifiOprMidState::RUNNING) {
WIFI_LOGI("IsKeepCurrWifiConnected, ap is running, do not switch");
return true;
}
return false;
}
bool WifiProStateMachine::HasWifiSwitchRecord()
{
RefreshConnectedNetWork();
if (pCurrWifiInfo_ == nullptr) {
return false;
}
if (pCurrWifiDeviceConfig_ != nullptr && pCurrWifiDeviceConfig_->lastTrySwitchWifiTimestamp > 0) {
int64_t now = WifiProUtils::GetCurrentTimeMs();
// less than 14 days
if (now - pCurrWifiDeviceConfig_->lastTrySwitchWifiTimestamp < WIFI_SWITCH_RECORD_MAX_TIME) {
WIFI_LOGI("HasWifiSwitchRecord, has switch record in 14 days");
return true;
}
}
return false;
}
void WifiProStateMachine::RefreshConnectedNetWork()
{
WifiLinkedInfo linkedInfo;
WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo);
WIFI_LOGI("RefreshConnectedNetWork, connState:%{public}d,"
"supplicantState:%{public}d.", linkedInfo.connState, static_cast<int32_t>(linkedInfo.supplicantState));
if (!WifiProUtils::IsSupplicantConnecting(linkedInfo.supplicantState)) {
currentBssid_ = "";
currentSsid_ = "";
currentRssi_ = DEFAULT_RSSI;
return;
}
pCurrWifiInfo_ = std::make_shared<WifiLinkedInfo>(linkedInfo);
currentBssid_ = linkedInfo.bssid;
currentSsid_ = linkedInfo.ssid;
currentRssi_ = linkedInfo.rssi;
std::vector<WifiDeviceConfig> configs;
WifiSettings::GetInstance().GetDeviceConfig(configs);
if (configs.empty()) {
WIFI_LOGI("RefreshConnectedNetWork, config is empty");
return;
}
for (auto &wifiDeviceConfig : configs) {
if (wifiDeviceConfig.networkId == linkedInfo.networkId) {
WIFI_LOGI("RefreshConnectedNetWork, find device config,connState:%{public}d,"
"networkId:%{public}d.", linkedInfo.connState, linkedInfo.networkId);
pCurrWifiDeviceConfig_ = std::make_shared<WifiDeviceConfig>(wifiDeviceConfig);
}
}
}
bool WifiProStateMachine::IsReachWifiScanThreshold(int32_t signalLevel)
{
WIFI_LOGI("IsReachWifiScanThreshold, rssiLevel:%{public}d.", signalLevel);
if (signalLevel == SIG_LEVEL_4) {
return false;
}
if (signalLevel < SIG_LEVEL_3) {
return true;
}
if (HasWifiSwitchRecord()) {
WIFI_LOGI("IsReachWifiScanThreshold, ap is not strong enough, and has switch record.");
return true;
}
if (HasAvailableSsidToSwitch()) {
WIFI_LOGI("IsReachWifiScanThreshold, ap is not strong enough, and has available ap.");
return true;
}
WIFI_LOGI("IsReachWifiScanThreshold, ap is not strong enough, no need to switch.");
return false;
}
bool WifiProStateMachine::HasAvailableSsidToSwitch()
{
return false;
}
/* --------------------------- state machine default state ------------------------------ */
WifiProStateMachine::DefaultState::DefaultState(WifiProStateMachine *pWifiProStateMachine)
: State("DefaultState"),
pWifiProStateMachine_(pWifiProStateMachine)
{
WIFI_LOGD("DefaultState construct success.");
}
WifiProStateMachine::DefaultState::~DefaultState() {}
void WifiProStateMachine::DefaultState::GoInState()
{
WIFI_LOGI("Enter DefaultState GoInState function.");
}
void WifiProStateMachine::DefaultState::GoOutState()
{
WIFI_LOGI("Enter DefaultState GoOutState function.");
}
bool WifiProStateMachine::DefaultState::ExecuteStateMsg(InternalMessagePtr msg)
{
if (msg == nullptr) {
return false;
}
WIFI_LOGD("DefaultState-msgCode=%{public}d is received.", msg->GetMessageName());
switch (msg->GetMessageName()) {
case EVENT_NOTIFY_WIFI_PRO_SWITCH_CHANGED:
HandleWifiProSwitchChanged(msg);
break;
default:
return false;
}
return true;
}
void WifiProStateMachine::DefaultState::HandleWifiProSwitchChanged(const InternalMessagePtr msg)
{
// the wifiPro switch is on by default
pWifiProStateMachine_->isWifiProEnabled_ = true;
WIFI_LOGI("state transition: DefaultState -> WifiProEnableState.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiProEnableState_);
}
/* --------------------------- state machine enbale state ------------------------------ */
WifiProStateMachine::WifiProEnableState::WifiProEnableState(WifiProStateMachine *pWifiProStateMachine)
: State("WifiProEnableState"),
pWifiProStateMachine_(pWifiProStateMachine)
{
WIFI_LOGD("Enter WifiProEnableState.");
}
WifiProStateMachine::WifiProEnableState::~WifiProEnableState()
{
WIFI_LOGD("Enter ~WifiProEnableState.");
}
void WifiProStateMachine::WifiProEnableState::GoInState()
{
WIFI_LOGI("WifiProEnableState GoInState function.");
pWifiProStateMachine_->isWifiNoInternet_ = false;
TransitionNetState();
}
void WifiProStateMachine::WifiProEnableState::GoOutState()
{
WIFI_LOGI("WifiProEnableState GoOutState function.");
}
bool WifiProStateMachine::WifiProEnableState::ExecuteStateMsg(InternalMessagePtr msg)
{
if (msg == nullptr) {
return false;
}
WIFI_LOGD("WifiProEnableState-msgCode=%{public}d is received.", msg->GetMessageName());
switch (msg->GetMessageName()) {
case EVENT_WIFI_CONNECT_STATE_CHANGED:
HandleWifiConnectStateChangedInEnableState(msg);
break;
default:
return false;
}
return true;
}
void WifiProStateMachine::WifiProEnableState::TransitionNetState()
{
if (WifiProUtils::IsWifiConnected(pWifiProStateMachine_->instId_)) {
WIFI_LOGI("state transition: WifiProEnableState -> WifiConnectedState.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiConnectedState_);
} else {
WIFI_LOGI("state transition: WifiProEnableState -> WifiDisConnectedStat.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiDisConnectedState_);
}
}
void WifiProStateMachine::WifiProEnableState::HandleWifiConnectStateChangedInEnableState(const InternalMessagePtr msg)
{
int32_t state = msg->GetParam1();
if (state == static_cast<int32_t>(OperateResState::CONNECT_AP_CONNECTED)) {
WIFI_LOGI("state transition: WifiProEnableState -> WifiConnectedState.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiConnectedState_);
} else if (state == static_cast<int32_t>(OperateResState::DISCONNECT_DISCONNECTED)) {
WIFI_LOGI("state transition: WifiProEnableState -> WifiDisConnectedStat.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiDisConnectedState_);
} else {
return;
}
}
/* --------------------------- state machine disbaled state ------------------------------ */
WifiProStateMachine::WifiProDisabledState::WifiProDisabledState(WifiProStateMachine *pWifiProStateMachine)
: State("WifiProDisabledState"),
pWifiProStateMachine_(pWifiProStateMachine)
{
WIFI_LOGD("WifiProDisabledState construct success.");
}
WifiProStateMachine::WifiProDisabledState::~WifiProDisabledState() {}
void WifiProStateMachine::WifiProDisabledState::GoInState()
{
WIFI_LOGI("WifiProDisabledState GoInState function.");
}
void WifiProStateMachine::WifiProDisabledState::GoOutState()
{
WIFI_LOGI("WifiProDisabledState GoOutState function.");
}
bool WifiProStateMachine::WifiProDisabledState::ExecuteStateMsg(InternalMessagePtr msg)
{
if (msg == nullptr) {
return false;
}
WIFI_LOGD("WifiProDisabledState-msgCode=%{public}d is received.", msg->GetMessageName());
switch (msg->GetMessageName()) {
case EVENT_NOTIFY_WIFI_PRO_SWITCH_CHANGED:
HandleWifiProSwitchChanged(msg);
break;
default:
return false;
}
return true;
}
void WifiProStateMachine::WifiProDisabledState::HandleWifiProSwitchChanged(const InternalMessagePtr msg)
{
pWifiProStateMachine_->isWifiProEnabled_ = static_cast<bool>(msg->GetParam1());
if (pWifiProStateMachine_->isWifiProEnabled_) {
WIFI_LOGI("state transition: WifiProDisabledState -> WifiProEnableState.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiProEnableState_);
}
}
/* --------------------------- state machine connected state ------------------------------ */
WifiProStateMachine::WifiConnectedState::WifiConnectedState(WifiProStateMachine *pWifiProStateMachine)
: State("WifiConnectedState"),
pWifiProStateMachine_(pWifiProStateMachine)
{
WIFI_LOGD("WifiConnectedState construct success.");
}
WifiProStateMachine::WifiConnectedState::~WifiConnectedState() {}
void WifiProStateMachine::WifiConnectedState::GoInState()
{
WIFI_LOGI("WifiConnectedState GoInState function.");
pWifiProStateMachine_->RefreshConnectedNetWork();
WifiLinkedInfo linkedInfo;
WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo);
auto &networkBlackListManager = NetworkBlockListManager::GetInstance();
if (networkBlackListManager.IsInTempWifiBlockList(linkedInfo.bssid)) {
networkBlackListManager.CleanTempWifiBlockList();
}
InitConnectedState();
}
void WifiProStateMachine::WifiConnectedState::GoOutState()
{
WIFI_LOGI("WifiConnectedState GoOutState function.");
return;
}
bool WifiProStateMachine::WifiConnectedState::ExecuteStateMsg(InternalMessagePtr msg)
{
if (msg == nullptr) {
return false;
}
WIFI_LOGD("WifiConnectedState-msgCode=%{public}d is received.", msg->GetMessageName());
switch (msg->GetMessageName()) {
case EVENT_CHECK_WIFI_INTERNET_RESULT:
HandleCheckWifiInternetResultWithConnected(msg);
break;
default:
return false;
}
return true;
}
void WifiProStateMachine::WifiConnectedState::InitConnectedState()
{
if (pWifiProStateMachine_->duanBandHandoverType_ == ROAM_SCENE) {
pWifiProStateMachine_->duanBandHandoverType_ = 0;
} else {
pWifiProStateMachine_->isWifiNoInternet_ = false;
}
}
void WifiProStateMachine::WifiConnectedState::HandleCheckWifiInternetResultWithConnected(const InternalMessagePtr msg)
{
int32_t state = msg->GetParam1();
WIFI_LOGI("Enter HandleCheckWifiInternetResultWithConnected, state:%{public}d.", state);
if (state == static_cast<int32_t>(OperateResState::CONNECT_NETWORK_DISABLED)) {
HandleWifiInternetResultWithNoInet(state);
} else if (state == static_cast<int32_t>(OperateResState::CONNECT_CHECK_PORTAL)) {
HandleWifiInternetResultWithPortal(state);
} else {
HandleWifiInternetResultWithInet(state);
}
}
void WifiProStateMachine::WifiConnectedState::HandleWifiInternetResultWithInet(int32_t state)
{
pWifiProStateMachine_->isWifiNoInternet_ = false;
UpdateWifiAgentScore(state);
}
void WifiProStateMachine::WifiConnectedState::UpdateWifiAgentScore(int32_t state)
{
if (!pWifiProStateMachine_->disconnectToConnectedState_) {
if (state == static_cast<int32_t>(OperateResState::CONNECT_NETWORK_DISABLED)) {
WIFI_LOGI("UpdateWifiAgentScore, wifi network has no internet.");
} else if (state == static_cast<int32_t>(OperateResState::CONNECT_CHECK_PORTAL)) {
WIFI_LOGI("UpdateWifiAgentScore, wifi network is portal.");
} else {
WIFI_LOGI("state transition: WifiConnectedState -> WifiLinkMonitorState.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiLinkMonitorState_);
}
return;
}
pWifiProStateMachine_->disconnectToConnectedState_ = false;
}
void WifiProStateMachine::WifiConnectedState::HandleWifiInternetResultWithPortal(int32_t state)
{
// portal scene
WIFI_LOGI("Enter HandleWifiInternetResultWithPortal.");
}
void WifiProStateMachine::WifiConnectedState::HandleWifiInternetResultWithNoInet(int32_t state)
{
// no internet scene
WIFI_LOGI("Enter HandleWifiInternetResultWithNoInet.");
pWifiProStateMachine_->isWifiNoInternet_ = true;
UpdateWifiAgentScore(state);
}
/* --------------------------- state machine disconnected state ------------------------------ */
WifiProStateMachine::WifiDisConnectedState::WifiDisConnectedState(WifiProStateMachine *pWifiProStateMachine)
: State("WifiDisConnectedState"),
pWifiProStateMachine_(pWifiProStateMachine)
{
WIFI_LOGD("WifiDisConnectedState construct success.");
}
WifiProStateMachine::WifiDisConnectedState::~WifiDisConnectedState() {}
void WifiProStateMachine::WifiDisConnectedState::GoInState()
{
WIFI_LOGI("WifiDisConnectedState GoInState function.");
}
void WifiProStateMachine::WifiDisConnectedState::GoOutState()
{
WIFI_LOGI("WifiDisConnectedState GoOutState function.");
}
bool WifiProStateMachine::WifiDisConnectedState::ExecuteStateMsg(InternalMessagePtr msg)
{
if (msg == nullptr) {
return false;
}
WIFI_LOGD("WifiDisConnectedState-msgCode=%{public}d is received.", msg->GetMessageName());
switch (msg->GetMessageName()) {
case EVENT_WIFI_CONNECT_STATE_CHANGED:
HandleWifiConnectStateChangedInDisConnectedState(msg);
break;
default:
return false;
}
return true;
}
void WifiProStateMachine::WifiDisConnectedState::HandleWifiConnectStateChangedInDisConnectedState(
const InternalMessagePtr msg)
{
WIFI_LOGD("Enter HandleWifiConnectStateChangedInDisConnectedState.");
int32_t state = msg->GetParam1();
if (state == static_cast<int32_t>(OperateResState::CONNECT_AP_CONNECTED)) {
WIFI_LOGI("state transition: WifiDisConnectedState -> WifiConnectedState.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiConnectedState_);
}
}
/* --------------------------- state machine link monitor state ------------------------------ */
WifiProStateMachine::WifiLinkMonitorState::WifiLinkMonitorState(WifiProStateMachine *pWifiProStateMachine)
: State("WifiLinkMonitorState"),
pWifiProStateMachine_(pWifiProStateMachine)
{
WIFI_LOGD("WifiLinkMonitorState construct success.");
}
WifiProStateMachine::WifiLinkMonitorState::~WifiLinkMonitorState() {}
void WifiProStateMachine::WifiLinkMonitorState::GoInState()
{
WIFI_LOGI("WifiLinkMonitorState GoInState function.");
WifiLinkMonitorStateInit();
}
void WifiProStateMachine::WifiLinkMonitorState::WifiLinkMonitorStateInit()
{
rssiLevel0Or1ScanedCounter_ = 0;
rssiLevel2Or3ScanedCounter_ = 0;
isScanTriggered_ = false;
isWifi2WifiSwitching_ = false;
targetBssid_ = "";
}
void WifiProStateMachine::WifiLinkMonitorState::GoOutState()
{
WIFI_LOGI("WifiLinkMonitorState GoOutState function.");
return;
}
bool WifiProStateMachine::WifiLinkMonitorState::ExecuteStateMsg(InternalMessagePtr msg)
{
if (msg == nullptr) {
return false;
}
WIFI_LOGD("WifiLinkMonitorState-msgCode=%{public}d is received.", msg->GetMessageName());
switch (msg->GetMessageName()) {
case EVENT_WIFI_RSSI_CHANGED:
HandleRssiChangedInMonitor(msg);
break;
case EVENT_WIFI_CONNECT_STATE_CHANGED:
HandleConnectStateChangedInMonitor(msg);
break;
case EVENT_REQUEST_SCAN_DELAY:
HandleReuqestScanInMonitor(msg);
break;
case EVENT_HANDLE_SCAN_RESULT:
HandleScanResultInMonitor(msg);
break;
case EVENT_CHECK_WIFI_INTERNET_RESULT:
HandleHttpResultInLinkMonitorState(msg);
break;
case EVENT_WIFI2WIFI_FAILED:
HandleWifi2WifiFailed(false);
break;
default:
return false;
}
return true;
}
void WifiProStateMachine::WifiLinkMonitorState::HandleHttpResultInLinkMonitorState(const InternalMessagePtr msg)
{
int32_t operateResState = msg->GetParam1();
bool isWifiNoInternet = (operateResState != static_cast<int32_t>(OperateResState::CONNECT_NETWORK_ENABLED));
if (isWifiNoInternet) {
pWifiProStateMachine_->isWifiNoInternet_ = true;
} else {
pWifiProStateMachine_->isWifiNoInternet_ = false;
}
}
void WifiProStateMachine::WifiLinkMonitorState::HandleRssiChangedInMonitor(const InternalMessagePtr msg)
{
pWifiProStateMachine_->currentRssi_ = msg->GetParam1();
if ((isWifi2WifiSwitching_) || (pWifiProStateMachine_->isWifiNoInternet_)) {
WIFI_LOGI("MonitorState, isWifi2WifiSwitching:%{public}d,isWifiNoInternet:%{public}d.",
isWifi2WifiSwitching_, pWifiProStateMachine_->isWifiNoInternet_);
return;
}
int32_t signalLevel = WifiProUtils::GetSignalLevel(pWifiProStateMachine_->instId_);
WIFI_LOGI("MonitorState, signalLevel:%{public}d.", signalLevel);
bool hasSwitchRecord = pWifiProStateMachine_->HasWifiSwitchRecord();
if (signalLevel == SIG_LEVEL_4 && hasSwitchRecord) {
rssiLevel2Or3ScanedCounter_ = 0;
rssiLevel0Or1ScanedCounter_ = 0;
}
if (!pWifiProStateMachine_->IsReachWifiScanThreshold(signalLevel)) {
WIFI_LOGI("HandleRssiChangedInMonitor, StopTimer EVENT_REQUEST_SCAN_DELAY.");
pWifiProStateMachine_->StopTimer(EVENT_REQUEST_SCAN_DELAY);
return;
}
if (!IsSatisfiedWifiOperationCondition()) {
return;
}
pWifiProStateMachine_->StopTimer(EVENT_REQUEST_SCAN_DELAY);
pWifiProStateMachine_->SendMessage(EVENT_REQUEST_SCAN_DELAY, static_cast<int32_t>(hasSwitchRecord));
}
void WifiProStateMachine::WifiLinkMonitorState::HandleReuqestScanInMonitor(const InternalMessagePtr msg)
{
if (msg == nullptr) {
WIFI_LOGI("HandleReuqestScanInMonitor, msg is nullptr.");
return;
}
// selfcure onging, pending scan for 10s
ISelfCureService *pSelfCureService =
WifiServiceManager::GetInstance().GetSelfCureServiceInst(pWifiProStateMachine_->instId_);
bool hasSwitchRecord = static_cast<bool>(msg->GetParam1());
if (pSelfCureService != nullptr && pSelfCureService->IsSelfCureOnGoing()) {
WIFI_LOGI("HandleReuqestScanInMonitor: self cure is ongoing.");
pWifiProStateMachine_->StopTimer(EVENT_REQUEST_SCAN_DELAY);
pWifiProStateMachine_->MessageExecutedLater(EVENT_REQUEST_SCAN_DELAY, hasSwitchRecord, DEFAULT_SCAN_INTERVAL);
return;
}
int32_t signalLevel = WifiProUtils::GetSignalLevel(pWifiProStateMachine_->instId_);
if (!pWifiProStateMachine_->IsReachWifiScanThreshold(signalLevel)) {
return;
}
if (WifiProUtils::IsUserSelectNetwork() && signalLevel == SIG_LEVEL_2) {
WIFI_LOGI("HandleReuqestScanInMonitor, user select network and signal = 2.");
return;
}
TryStartScan(hasSwitchRecord, signalLevel);
}
void WifiProStateMachine::WifiLinkMonitorState::TryStartScan(bool hasSwitchRecord, int32_t signalLevel)
{
// calculate the interval and the max scan counter.
IScanService *pScanService = WifiServiceManager::GetInstance().GetScanServiceInst(pWifiProStateMachine_->instId_);
if (pScanService == nullptr) {
WIFI_LOGI("TryStartScan, pService is nullptr.");
return;
}
int32_t scanInterval = WifiProUtils::GetScanInterval(hasSwitchRecord, signalLevel);
int32_t scanMaxCounter = WifiProUtils::GetMaxCounter(hasSwitchRecord, signalLevel);
if ((signalLevel == SIG_LEVEL_2 || signalLevel == SIG_LEVEL_3) &&
rssiLevel2Or3ScanedCounter_ < scanMaxCounter) {
WIFI_LOGI("TryStartScan, start scan, signalLevel:%{public}d,"
"rssiLevel2Or3ScanedCounter:%{public}d.", signalLevel, rssiLevel2Or3ScanedCounter_);
rssiLevel2Or3ScanedCounter_++;
pScanService->Scan(true);
isScanTriggered_ = true;
pWifiProStateMachine_->MessageExecutedLater(EVENT_REQUEST_SCAN_DELAY, hasSwitchRecord, scanInterval);
} else if ((signalLevel < SIG_LEVEL_2) && (rssiLevel0Or1ScanedCounter_ < scanMaxCounter)) {
WIFI_LOGI("TryStartScan, start scan, signalLevel:%{public}d,"
"rssiLevel0Or1ScanedCounter:%{public}d.", signalLevel, rssiLevel0Or1ScanedCounter_);
rssiLevel0Or1ScanedCounter_++;
pScanService->Scan(true);
isScanTriggered_ = true;
pWifiProStateMachine_->MessageExecutedLater(EVENT_REQUEST_SCAN_DELAY, hasSwitchRecord, scanInterval);
} else {
WIFI_LOGI("TryStartScan, do not scan, signalLevel:%{public}d,scanMaxCounter:%{public}d.",
signalLevel, scanMaxCounter);
}
}
void WifiProStateMachine::WifiLinkMonitorState::HandleScanResultInMonitor(const InternalMessagePtr msg)
{
if (msg == nullptr) {
WIFI_LOGI("HandleScanResultInMonitor, msg is nullptr.");
return;
}
std::vector<InterScanInfo> scanInfos;
msg->GetMessageObj(scanInfos);
if (!isScanTriggered_) {
WIFI_LOGI("HandleScanResultInMonitor, scan is not triggered, skip network selection.");
return;
}
WIFI_LOGI("start to wifi2wifi select network.");
std::unique_ptr<NetworkSelectionManager> pNetworkSelectionManager = std::make_unique<NetworkSelectionManager>();
NetworkSelectionResult networkSelectionResult;
if (pNetworkSelectionManager->SelectNetwork(networkSelectionResult, NetworkSelectType::WIFI2WIFI, scanInfos)) {
int32_t networkId = networkSelectionResult.wifiDeviceConfig.networkId;
std::string &bssid = networkSelectionResult.interScanInfo.bssid;
std::string &ssid = networkSelectionResult.interScanInfo.ssid;
WIFI_LOGI("Wifi2Wifi select network result networkId: %{public}d, ssid: %{public}s, bssid: %{public}s.",
networkId, SsidAnonymize(ssid).c_str(), MacAnonymize(bssid).c_str());
targetBssid_ = networkSelectionResult.interScanInfo.bssid;
isScanTriggered_ = false;
HandleCheckResultInMonitor(networkSelectionResult);
} else {
WIFI_LOGI("wifi to wifi step X: Wifi2Wifi select network fail.");
Wifi2WifiFailed();
}
}
bool WifiProStateMachine::WifiLinkMonitorState::IsSatisfiedWifiOperationCondition()
{
if (pWifiProStateMachine_->isWifiNoInternet_) {
WIFI_LOGI("IsSatisfiedWifiOperationCondition, wifi no internet.");
return false;
}
if (isWifi2WifiSwitching_) {
WIFI_LOGI("IsSatisfiedWifiOperationCondition, wifi2Wifi is processing.");
return false;
}
ISelfCureService *pSelfCureService =
WifiServiceManager::GetInstance().GetSelfCureServiceInst(pWifiProStateMachine_->instId_);
if (pSelfCureService != nullptr && pSelfCureService->IsSelfCureOnGoing()) {
WIFI_LOGI("IsSatisfiedWifiOperationCondition, self cure ongoing.");
return false;
}
return true;
}
void WifiProStateMachine::WifiLinkMonitorState::HandleConnectStateChangedInMonitor(
const InternalMessagePtr msg)
{
if (msg == nullptr) {
WIFI_LOGI("HandleConnectStateChangedInMonitor, msg is nullptr.");
return;
}
WIFI_LOGI("receive wifi2wifi Result,isWifi2WifiSwitching = %{public}d.", isWifi2WifiSwitching_);
int32_t state = msg->GetParam1();
std::string bssid;
msg->GetMessageObj(bssid);
if (state == static_cast<int32_t>(OperateResState::CONNECT_AP_CONNECTED)) {
if (!isWifi2WifiSwitching_) {
return;
}
if (targetBssid_ != bssid) {
WIFI_LOGI("selected bssid and switched bssid are not same:selected bssid:%{public}s,"
"switched bssid:%{public}s,",
MacAnonymize(targetBssid_).c_str(), MacAnonymize(bssid).c_str());
NetworkBlockListManager::GetInstance().AddWifiBlocklist(bssid);
HandleWifi2WifiFailed(true);
} else {
HandleWifi2WifiSucsess();
}
} else if (state == static_cast<int32_t>(OperateResState::DISCONNECT_DISCONNECTED)) {
WIFI_LOGI("Monitor State, network disconnected");
if (!isWifi2WifiSwitching_) {
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiDisConnectedState_);
}
} else {
return;
}
}
void WifiProStateMachine::WifiLinkMonitorState::HandleWifi2WifiSucsess()
{
WIFI_LOGI("Enter HandleWifi2WifiSucsess");
auto &networkBlackListManager = NetworkBlockListManager::GetInstance();
networkBlackListManager.AddWifiBlocklist(pWifiProStateMachine_->badBssid_);
networkBlackListManager.CleanTempWifiBlockList();
pWifiProStateMachine_->RefreshConnectedNetWork();
isWifi2WifiSwitching_ = false;
WIFI_LOGI("state transition: WifiLinkMonitorState -> WifiConnectedState.");
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiConnectedState_);
}
void WifiProStateMachine::WifiLinkMonitorState::HandleWifi2WifiFailed(bool isConnected)
{
WIFI_LOGI("wifi to wifi step X: wifi to Wifi Failed Finally.");
auto &networkBlackListManager = NetworkBlockListManager::GetInstance();
if (networkBlackListManager.IsFailedMultiTimes(targetBssid_)) {
WIFI_LOGI("HandleWifi2WifiFailed, add to abnormal black list:%{public}s.",
MacAnonymize(targetBssid_).c_str());
networkBlackListManager.AddAbnormalWifiBlocklist(targetBssid_);
networkBlackListManager.CleanTempWifiBlockList();
}
isWifi2WifiSwitching_ = false;
isScanTriggered_ = false;
pWifiProStateMachine_->badBssid_ = "";
targetBssid_ = "";
if (isConnected) {
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiConnectedState_);
} else {
pWifiProStateMachine_->SwitchState(pWifiProStateMachine_->pWifiDisConnectedState_);
}
}
void WifiProStateMachine::WifiLinkMonitorState::HandleCheckResultInMonitor(
const NetworkSelectionResult &networkSelectionResult)
{
WIFI_LOGI("wifi to wifi step 2: receive good ap in monitor state.");
if (!IsSatisfiedWifiOperationCondition()) {
WIFI_LOGI("wifi to wifi step 3: target AP is not reach handover threshold.");
return;
}
// rssi conditions and Wifi2WifiThreshold conditions have been considered when selecting a network.
WIFI_LOGI("wifi to wifi step 3: target AP reach handover threshold.");
// User preference is not considered for now
TryWifiHandoverPreferentially(networkSelectionResult);
}
void WifiProStateMachine::WifiLinkMonitorState::TryWifiHandoverPreferentially(
const NetworkSelectionResult &networkSelectionResult)
{
int32_t signalLevel = WifiProUtils::GetSignalLevel(pWifiProStateMachine_->instId_);
if (!pWifiProStateMachine_->IsReachWifiScanThreshold(signalLevel)) {
WIFI_LOGI("TryWifiHandoverPreferentially, do not reach wifi scan threshold.");
return;
}
// Non-default network does not switch
if (!WifiProUtils::IsDefaultNet()) {
WIFI_LOGI("TryWifiHandoverPreferentially, not default network, do not switch wifi.");
return;
}
WIFI_LOGW("try wifi --> wifi only, current rssi:%{public}d.", signalLevel);
TryWifiRoveOut(networkSelectionResult);
}
void WifiProStateMachine::WifiLinkMonitorState::TryWifiRoveOut(const NetworkSelectionResult &networkSelectionResult)
{
WIFI_LOGI("wifi to wifi step 4: try wifi Rove Out.");
if (pWifiProStateMachine_->IsKeepCurrWifiConnected()) {
return;
}
HandleWifiRoveOut(networkSelectionResult);
}
void WifiProStateMachine::WifiLinkMonitorState::HandleWifiRoveOut(const NetworkSelectionResult &networkSelectionResult)
{
bool isCallingInCs = IsCallingInCs();
if ((isDisableWifiAutoSwitch_) || isCallingInCs) {
WIFI_LOGW("isDisableWifiAutoSwitch:%{public}d, isCallingInCs:%{public}d.",
isDisableWifiAutoSwitch_, isCallingInCs);
return;
}
TryWifi2Wifi(networkSelectionResult);
}
void WifiProStateMachine::WifiLinkMonitorState::TryWifi2Wifi(const NetworkSelectionResult &networkSelectionResult)
{
pWifiProStateMachine_->badBssid_ = pWifiProStateMachine_->currentBssid_;
pWifiProStateMachine_->badSsid_ = pWifiProStateMachine_->currentSsid_;
pWifiProStateMachine_->StopTimer(EVENT_REQUEST_SCAN_DELAY);
if (pWifiProStateMachine_->isWifiNoInternet_) {
pWifiProStateMachine_->wifiSwitchReason_ = WIFI_SWITCH_REASON_NO_INTERNET;
} else {
pWifiProStateMachine_->wifiSwitchReason_ = WIFI_SWITCH_REASON_POOR_RSSI;
}
if (!HandleWifiToWifi(pWifiProStateMachine_->wifiSwitchReason_, networkSelectionResult)) {
WIFI_LOGI("wifi to wifi step X: HandleWifiToWifi Failed.");
Wifi2WifiFailed();
}
}
void WifiProStateMachine::WifiLinkMonitorState::Wifi2WifiFailed()
{
isWifi2WifiSwitching_ = false;
isScanTriggered_ = false;
pWifiProStateMachine_->badBssid_ = "";
targetBssid_ = "";
}
bool WifiProStateMachine::WifiLinkMonitorState::HandleWifiToWifi(int32_t switchReason,
const NetworkSelectionResult &networkSelectionResult)
{
WIFI_LOGI("wifi to wifi step 5: handle wifi2wifi command.");
if (switchReason == WIFI_SWITCH_REASON_POOR_RSSI) {
WIFI_LOGI("wifi to wifi step 5.5: direct wifi 2 wifi handover.");
UpdateWifiSwitchTimeStamp();
return TrySwitchWifiNetwork(networkSelectionResult);
}
return true;
}
void WifiProStateMachine::WifiLinkMonitorState::UpdateWifiSwitchTimeStamp()
{
int64_t now = WifiProUtils::GetCurrentTimeMs();
WifiLinkedInfo linkedInfo;
WifiDeviceConfig config;
WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo);
if (WifiSettings::GetInstance().GetDeviceConfig(linkedInfo.networkId, config) == 0) {
config.lastTrySwitchWifiTimestamp = now;
WifiSettings::GetInstance().AddDeviceConfig(config);
WifiSettings::GetInstance().SyncDeviceConfig();
} else {
WIFI_LOGI("UpdateWifiSwitchTimeStamp, get device config failed");
}
}
bool WifiProStateMachine::WifiLinkMonitorState::TrySwitchWifiNetwork(
const NetworkSelectionResult &networkSelectionResult)
{
int32_t networkId = networkSelectionResult.wifiDeviceConfig.networkId;
WIFI_LOGI("wifi to wifi step 7: start to connect to new wifi. networkId:%{public}d", networkId);
IStaService *pStaService = WifiServiceManager::GetInstance().GetStaServiceInst(pWifiProStateMachine_->instId_);
if (pStaService == nullptr) {
WIFI_LOGE("TrySwitchWifiNetwork, pStaService is invalid");
return false;
}
isWifi2WifiSwitching_ = true;
if (pStaService->ConnectToNetwork(networkId, NETWORK_SELECTED_BY_AUTO) != WIFI_OPT_SUCCESS) {
WIFI_LOGE("TrySwitchWifiNetwork, ConnectToNetwork failed.");
return false;
}
return true;
}
bool WifiProStateMachine::WifiLinkMonitorState::IsCallingInCs()
{
return false;
}
bool WifiProStateMachine::WifiLinkMonitorState::IsFullscreen()
{
return false;
}
} // namespace Wifi
} // namespace OHOS

View File

@ -0,0 +1,229 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_WIFI_PRO_STATE_MACHINE_H
#define OHOS_WIFI_PRO_STATE_MACHINE_H
#include "define.h"
#include "wifi_log.h"
#include "wifi_errcode.h"
#include "state_machine.h"
#include "wifi_pro_common.h"
#include "network_selection_manager.h"
namespace OHOS {
namespace Wifi {
class WifiProStateMachine : public StateMachine {
FRIEND_GTEST(WifiProStateMachine);
public:
explicit WifiProStateMachine(int32_t instId = 0);
~WifiProStateMachine();
/**
* @Description Definition of DefaultState class in WifiProStateMachine.
*
*/
class DefaultState : public State {
public:
explicit DefaultState(WifiProStateMachine *pWifiProStateMachine);
~DefaultState() override;
void GoInState() override;
void GoOutState() override;
bool ExecuteStateMsg(InternalMessagePtr msg) override;
private:
WifiProStateMachine *pWifiProStateMachine_ { nullptr };
void HandleWifiProSwitchChanged(const InternalMessagePtr msg);
};
/**
* @Description Definition of WifiProEnableState class in WifiProStateMachine.
*
*/
class WifiProEnableState : public State {
public:
explicit WifiProEnableState(WifiProStateMachine *pWifiProStateMachine);
~WifiProEnableState() override;
void GoInState() override;
void GoOutState() override;
bool ExecuteStateMsg(InternalMessagePtr msg) override;
private:
WifiProStateMachine *pWifiProStateMachine_ { nullptr };
void TransitionNetState();
void HandleWifiConnectStateChangedInEnableState(const InternalMessagePtr msg);
};
/**
* @Description Definition of WifiProDisabledState class in WifiProStateMachine.
*
*/
class WifiProDisabledState : public State {
public:
explicit WifiProDisabledState(WifiProStateMachine *pWifiProStateMachine);
~WifiProDisabledState() override;
void GoInState() override;
void GoOutState() override;
bool ExecuteStateMsg(InternalMessagePtr msg) override;
private:
WifiProStateMachine *pWifiProStateMachine_ { nullptr};
void HandleWifiProSwitchChanged(const InternalMessagePtr msg);
};
/**
* @Description Definition of WifiConnectedState class in WifiProStateMachine.
*
*/
class WifiConnectedState : public State {
public:
explicit WifiConnectedState(WifiProStateMachine *pWifiProStateMachine);
~WifiConnectedState() override;
void GoInState() override;
void GoOutState() override;
bool ExecuteStateMsg(InternalMessagePtr msg) override;
private:
WifiProStateMachine *pWifiProStateMachine_ { nullptr };
int32_t internetFailureDetectedCount_ { 0 };
void InitConnectedState();
void HandleCheckWifiInternetResultWithConnected(const InternalMessagePtr msg);
void HandleWifiInternetResultInLinkMonitorState();
void HandleWifiInternetResultWithNoInet(int32_t state);
void HandleWifiInternetResultWithPortal(int32_t state);
void HandleWifiInternetResultWithInet(int32_t state);
void UpdateWifiAgentScore(int32_t state);
};
/**
* @Description Definition of WifiDisConnectedState class in WifiProStateMachine.
*
*/
class WifiDisConnectedState : public State {
public:
explicit WifiDisConnectedState(WifiProStateMachine *pWifiProStateMachine);
~WifiDisConnectedState() override;
void GoInState() override;
void GoOutState() override;
bool ExecuteStateMsg(InternalMessagePtr msg) override;
private:
WifiProStateMachine *pWifiProStateMachine_ { nullptr };
void HandleWifiConnectStateChangedInDisConnectedState(const InternalMessagePtr msg);
};
/**
* @Description Definition of WifiLinkMonitorState class in WifiProStateMachine.
*
*/
class WifiLinkMonitorState : public State {
public:
explicit WifiLinkMonitorState(WifiProStateMachine *pWifiProStateMachine);
~WifiLinkMonitorState() override;
void GoInState() override;
void GoOutState() override;
bool ExecuteStateMsg(InternalMessagePtr msg) override;
private:
WifiProStateMachine *pWifiProStateMachine_ { nullptr};
bool isScanTriggered_ { false };
bool isWifi2WifiSwitching_ { false };
bool isDisableWifiAutoSwitch_ { false };
int32_t rssiLevel2Or3ScanedCounter_ { 0 };
int32_t rssiLevel0Or1ScanedCounter_ { 0 };
std::string targetBssid_;
NetworkSelectionResult networkSelectionResult_;
void WifiLinkMonitorStateInit();
void HandleCheckResultInMonitor(const NetworkSelectionResult &networkSelectionResult);
bool IsSatisfiedWifiOperationCondition();
bool IsFullscreen();
void TryWifiHandoverPreferentially(const NetworkSelectionResult &networkSelectionResult);
void TryWifiRoveOut(const NetworkSelectionResult &networkSelectionResult);
void HandleWifiRoveOut(const NetworkSelectionResult &networkSelectionResult);
bool IsCallingInCs();
void TryWifi2Wifi(const NetworkSelectionResult &networkSelectionResult);
void HandleConnectStateChangedInMonitor(const InternalMessagePtr msg);
void HandleRssiChangedInMonitor(const InternalMessagePtr msg);
void HandleReuqestScanInMonitor(const InternalMessagePtr msg);
void HandleScanResultInMonitor(const InternalMessagePtr msg);
void TryStartScan(bool hasSwitchRecord, int32_t signalLevel);
void HandleHttpResultInLinkMonitorState(const InternalMessagePtr msg);
void HandleWifi2WifiSucsess();
void HandleWifi2WifiFailed(bool isConnected);
void Wifi2WifiFailed();
bool HandleWifiToWifi(int32_t switchReason, const NetworkSelectionResult &networkSelectionResult);
void UpdateWifiSwitchTimeStamp();
bool TrySwitchWifiNetwork(const NetworkSelectionResult &networkSelectionResult);
};
ErrCode Initialize();
private:
/**
* @Description Destruct state.
*
*/
template <typename T>
inline void ParsePointer(T *&pointer)
{
if (pointer != nullptr) {
delete pointer;
pointer = nullptr;
}
}
template <typename T>
inline ErrCode JudgmentEmpty(T *&pointer)
{
if (pointer == nullptr) {
return WIFI_OPT_FAILED;
}
return WIFI_OPT_SUCCESS;
}
/**
* @Description Build state tree
*
*/
void BuildStateTree();
ErrCode InitWifiProStates();
private:
int32_t instId_ { 0 };
DefaultState *pDefaultState_ { nullptr };
WifiProEnableState *pWifiProEnableState_ { nullptr };
WifiProDisabledState *pWifiProDisabledState_ { nullptr };
WifiConnectedState *pWifiConnectedState_ { nullptr };
WifiDisConnectedState *pWifiDisConnectedState_ { nullptr };
WifiLinkMonitorState *pWifiLinkMonitorState_ { nullptr };
/* 0:unknow 1:singleAP 2:Mixed Type */
int32_t duanBandHandoverType_ { 0 };
int32_t wiFiNoInternetReason_ { 0 };
bool disconnectToConnectedState_ { false };
bool isWifiProEnabled_ { true }; // enabled by default, it should be assigned according to the settings.
bool isWifiNoInternet_ { false };
std::string badBssid_ { 0 };
std::string badSsid_ { 0 };
int32_t wifiSwitchReason_ { 0 };
int32_t currentRssi_ { 0 };
std::string currentBssid_;
std::string currentSsid_;
std::shared_ptr<WifiLinkedInfo> pCurrWifiInfo_ { nullptr };
std::shared_ptr<WifiDeviceConfig> pCurrWifiDeviceConfig_ { nullptr };
bool IsKeepCurrWifiConnected();
bool IsReachWifiScanThreshold(int32_t signalLevel);
bool HasWifiSwitchRecord();
void RefreshConnectedNetWork();
bool HasAvailableSsidToSwitch();
};
} // namespace Wifi
} // namespace OHOS
#endif

View File

@ -0,0 +1,98 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sys/time.h>
#include "net_conn_client.h"
#include "wifi_net_observer.h"
#include "parameters.h"
#include "wifi_config_center.h"
#include "wifi_logger.h"
#include "wifi_msg.h"
#include "wifi_pro_utils.h"
namespace OHOS {
namespace Wifi {
DEFINE_WIFILOG_LABEL("WifiProUtils");
int32_t WifiProUtils::GetSignalLevel(int32_t instId)
{
WifiLinkedInfo linkedInfo;
WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo);
return WifiSettings::GetInstance().GetSignalLevel(linkedInfo.rssi, linkedInfo.band, instId);
}
bool WifiProUtils::IsWifiConnected(int32_t instId)
{
WifiLinkedInfo linkedInfo;
WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo, instId);
return linkedInfo.connState == ConnState::CONNECTED;
}
int32_t WifiProUtils::GetScanInterval(bool hasWifiSwitchRecord, int32_t rssiLevel)
{
if (rssiLevel >= SIG_LEVEL_MAX) {
WIFI_LOGI("GetScanInterval, invalid rssiLevel:%{public}d.", rssiLevel);
return 0;
}
return hasWifiSwitchRecord ? QUICK_SCAN_INTERVAL[rssiLevel] : NORMAL_SCAN_INTERVAL[rssiLevel];
}
int32_t WifiProUtils::GetMaxCounter(bool hasWifiSwitchRecord, int32_t rssiLevel)
{
if (rssiLevel >= SIG_LEVEL_MAX) {
WIFI_LOGI("GetMaxCounter, invalid rssiLevel:%{public}d.", rssiLevel);
return 0;
}
return hasWifiSwitchRecord ? QUICK_SCAN_MAX_COUNTER[rssiLevel] : NORMAL_SCAN_MAX_COUNTER[rssiLevel];
}
int64_t WifiProUtils::GetCurrentTimeMs()
{
auto timePoint = std::chrono::system_clock::now().time_since_epoch();
return std::chrono::duration_cast<std::chrono::milliseconds>(timePoint).count();
}
bool WifiProUtils::IsUserSelectNetwork()
{
return system::GetParameter("persist.wifi.is_connect_from_user", "") == "1";
}
bool WifiProUtils::IsSupplicantConnecting(SupplicantState supplicantState)
{
return supplicantState == SupplicantState::AUTHENTICATING ||
supplicantState == SupplicantState::ASSOCIATING ||
supplicantState == SupplicantState::ASSOCIATED ||
supplicantState == SupplicantState::FOUR_WAY_HANDSHAKE ||
supplicantState == SupplicantState::GROUP_HANDSHAKE ||
supplicantState == SupplicantState::COMPLETED;
}
bool WifiProUtils::IsDefaultNet()
{
NetManagerStandard::NetHandle defaultNet;
NetManagerStandard::NetConnClient::GetInstance().GetDefaultNet(defaultNet);
NetStateObserver netStateObserver;
int32_t wifiNetId = netStateObserver.GetWifiNetId();
WIFI_LOGI("IsDefaultNet, default netId:%{public}d, wifiNetId:%{public}d.", defaultNet.GetNetId(), wifiNetId);
return defaultNet.GetNetId() == wifiNetId;
}
bool WifiProUtils::IsAppInWhiteLists()
{
return false;
}
} // namespace Wifi
} // namespace OHOS

View File

@ -0,0 +1,42 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_WIFI_PRO_UTILS_H
#define OHOS_WIFI_PRO_UTILS_H
#include "wifi_log.h"
#include "wifi_pro_common.h"
namespace OHOS {
namespace Wifi {
class WifiProUtils {
FRIEND_GTEST(WifiProUtils);
public:
WifiProUtils() = default;
~WifiProUtils() = default;
static int32_t GetSignalLevel(int32_t instId);
static bool IsWifiConnected(int32_t instId);
static int32_t GetScanInterval(bool hasWifiSwitchRecord, int32_t rssiLevel);
static int32_t GetMaxCounter(bool hasWifiSwitchRecord, int32_t rssiLevel);
static int64_t GetCurrentTimeMs();
static bool IsUserSelectNetwork();
static bool IsSupplicantConnecting(SupplicantState supplicantState);
static bool IsDefaultNet();
static bool IsAppInWhiteLists();
};
} // namespace Wifi
} // namespace OHOS
#endif

View File

@ -38,6 +38,7 @@ ohos_static_library("wifi_self_cure") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/config",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/log",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",

View File

@ -25,6 +25,9 @@
#endif
#include "scan_interface.h"
#include "sta_interface.h"
#ifdef FEATURE_WIFI_PRO_SUPPORT
#include "wifi_pro_interface.h"
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
#include "self_cure_interface.h"
#endif
@ -54,6 +57,9 @@ int WifiServiceManager::Init()
#ifdef FEATURE_AP_SUPPORT
mApServiceHandle.Clear();
#endif
#ifdef FEATURE_WIFI_PRO_SUPPORT
mWifiProServiceHandle.Clear();
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
mSelfCureServiceHandle.Clear();
#endif
@ -128,6 +134,22 @@ int WifiServiceManager::LoadStaService(const std::string &dlname, int instId, bo
return 0;
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
int32_t WifiServiceManager::LoadWifiProService(bool bCreate, int32_t instId)
{
WIFI_LOGI("WifiServiceManager::LoadWifiProService");
std::unique_lock<std::mutex> lock(mWifiProMutex);
if (mWifiProServiceHandle.pService[instId]) {
WIFI_LOGI("WifiServiceManager::LoadWifiProService pService is not NULL");
return 0;
}
IWifiProService *service = new WifiProInterface();
WIFI_LOGI("WifiServiceManager::LoadWifiProService new pService %{public}d", instId);
mWifiProServiceHandle.pService[instId] = service;
return 0;
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
int WifiServiceManager::LoadSelfCureService(const std::string &dlname, bool bCreate)
{
@ -214,6 +236,12 @@ int WifiServiceManager::LoadEnhanceService(const std::string &dlname, bool bCrea
int WifiServiceManager::CheckAndEnforceService(const std::string &name, int instId, bool bCreate)
{
WIFI_LOGD("WifiServiceManager::CheckAndEnforceService name: %{public}s", name.c_str());
#ifdef FEATURE_WIFI_PRO_SUPPORT
if (name == WIFI_SERVICE_WIFIPRO) {
return LoadWifiProService(bCreate, instId);
}
#endif
std::string dlname;
if (GetServiceDll(name, dlname) < 0) {
WIFI_LOGE("%{public}s does not support", name.c_str());
@ -260,6 +288,21 @@ IStaService *WifiServiceManager::GetStaServiceInst(int instId)
return nullptr;
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
IWifiProService *WifiServiceManager::GetWifiProServiceInst(int32_t instId)
{
WIFI_LOGD("WifiServiceManager::GetWifiProServiceInst, instId: %{public}d", instId);
std::unique_lock<std::mutex> lock(mWifiProMutex);
auto iter = mWifiProServiceHandle.pService.find(instId);
if (iter != mWifiProServiceHandle.pService.end()) {
WIFI_LOGD("find a new WifiPro service instance, instId: %{public}d", instId);
return iter->second;
}
return nullptr;
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
ISelfCureService *WifiServiceManager::GetSelfCureServiceInst(int instId)
{
@ -343,6 +386,28 @@ IEnhanceService *WifiServiceManager::GetEnhanceServiceInst()
#endif
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
NO_SANITIZE("cfi") int32_t WifiServiceManager::UnloadWifiProService(bool bPreLoad, int32_t instId)
{
WIFI_LOGI("WifiServiceManager::UnloadWifiProService, instId: %{public}d", instId);
std::unique_lock<std::mutex> lock(mWifiProMutex);
auto iter = mWifiProServiceHandle.pService.find(instId);
if (iter != mWifiProServiceHandle.pService.end()) {
if (iter->second != nullptr) {
delete iter->second;
iter->second = nullptr;
}
mWifiProServiceHandle.pService.erase(iter);
}
if (!bPreLoad && mWifiProServiceHandle.pService.empty()) {
mWifiProServiceHandle.Clear();
}
return 0;
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
NO_SANITIZE("cfi") int WifiServiceManager::UnloadSelfCureService(bool bPreLoad, int instId)
{
@ -468,6 +533,11 @@ int WifiServiceManager::UnloadService(const std::string &name, int id)
if (name == WIFI_SERVICE_STA) {
return UnloadStaService(bPreLoad, id);
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
if (name == WIFI_SERVICE_WIFIPRO) {
return UnloadWifiProService(bPreLoad, id);
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
if (name == WIFI_SERVICE_SELFCURE) {
return UnloadSelfCureService(bPreLoad, id);
@ -509,6 +579,9 @@ void WifiServiceManager::UninstallAllService()
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
UnloadSelfCureService(false);
#endif
#ifdef FEATURE_WIFI_PRO_SUPPORT
UnloadWifiProService(false);
#endif
return;
}

View File

@ -32,6 +32,9 @@
#ifdef FEATURE_SELF_CURE_SUPPORT
#include "iself_cure_service.h"
#endif
#ifdef FEATURE_WIFI_PRO_SUPPORT
#include "iwifi_pro_service.h"
#endif
namespace OHOS {
namespace Wifi {
@ -47,6 +50,20 @@ struct StaServiceHandle {
}
};
#ifdef FEATURE_WIFI_PRO_SUPPORT
struct WifiProServiceHandle {
std::map<int, IWifiProService *> pService;
WifiProServiceHandle()
{}
~WifiProServiceHandle()
{}
void Clear()
{
pService.clear();
}
};
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
struct SelfCureServiceHandle {
std::map<int, ISelfCureService *> pService;
@ -161,6 +178,15 @@ public:
ISelfCureService *GetSelfCureServiceInst(int instId = 0);
#endif
#ifdef FEATURE_WIFI_PRO_SUPPORT
/**
* @Description Get the WifiPro Service Inst object
*
* @return IWifiProService* - wifi pro service pointer, if wifi pro not supported, nullptr is returned
*/
IWifiProService *GetWifiProServiceInst(int32_t instId);
#endif
/**
* @Description Get the Scan Service Inst object
*
@ -216,6 +242,10 @@ private:
int GetServiceDll(const std::string &name, std::string &dlname);
int LoadStaService(const std::string &dlname, int insId, bool bCreate);
int UnloadStaService(bool bPreLoad, int instId = 0);
#ifdef FEATURE_WIFI_PRO_SUPPORT
int32_t LoadWifiProService(bool bCreate, int32_t instId = 0);
int32_t UnloadWifiProService(bool bPreLoad, int32_t instId = 0);
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
int LoadSelfCureService(const std::string &dlname, bool bCreate);
int UnloadSelfCureService(bool bPreLoad, int instId = 0);
@ -235,12 +265,16 @@ private:
private:
std::mutex mStaMutex;
std::mutex mSelfCureMutex;
std::mutex mWifiProMutex;
std::mutex mScanMutex;
std::mutex mP2pMutex;
std::mutex mApMutex;
std::mutex mEnhanceMutex;
std::unordered_map<std::string, std::string> mServiceDllMap;
StaServiceHandle mStaServiceHandle;
#ifdef FEATURE_WIFI_PRO_SUPPORT
WifiProServiceHandle mWifiProServiceHandle;
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
SelfCureServiceHandle mSelfCureServiceHandle;
#endif

View File

@ -66,6 +66,7 @@ local_base_include_dirs = [
"$WIFI_ROOT_DIR/services/wifi_standard/include",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_country_code",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_network_stats",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/network_black_list",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select",
]

View File

@ -16,6 +16,7 @@
#ifndef OHOS_WIFI_STA_SERVICE_H
#define OHOS_WIFI_STA_SERVICE_H
#include "sta_define.h"
#include "wifi_errcode.h"
#ifndef OHOS_ARCH_LITE
#include "app_state_data.h"
@ -62,12 +63,13 @@ public:
* @Description Connecting to a specified network.
*
* @param networkId - interior saved network index.(in)
* @param type - select network type: SelectedType
* @Output: Return operating results to Interface Service after enable wifi
successfully through callback function instead of returning
result immediately.
* @Return success: WIFI_OPT_SUCCESS fail: WIFI_OPT_FAILED
*/
virtual ErrCode ConnectToNetwork(int networkId) = 0;
virtual ErrCode ConnectToNetwork(int networkId, int type = NETWORK_SELECTED_BY_USER) = 0;
/**
* @Description roam to target bssid

View File

@ -16,17 +16,19 @@
#include "network_selection_utils.h"
#include "network_status_history_manager.h"
#include "wifi_common_util.h"
#ifdef FEATURE_ITNETWORK_PREFERRED_SUPPORT
#include "wifi_config_center.h"
#include "wifi_p2p_msg.h"
#include "wifi_logger.h"
#ifdef FEATURE_ITNETWORK_PREFERRED_SUPPORT
#include "parameter.h"
#endif
namespace OHOS::Wifi::NetworkSelection {
namespace {
constexpr int32_t SCAN_5GHZ_BAND = 2;
}
#ifdef FEATURE_ITNETWORK_PREFERRED_SUPPORT
DEFINE_WIFILOG_LABEL("NetworkSelectionUtils")
#endif
bool NetworkSelectionUtils::IsOpenNetwork(const NetworkCandidate &networkCandidate)
{
@ -82,6 +84,50 @@ std::string NetworkSelectionUtils::GetScoreResultsInfo(const std::vector<ScoreRe
return scoreMsg.str();
}
bool NetworkSelectionUtils::IsConfigOpenType(const NetworkCandidate &networkCandidate)
{
return !(IsOpenNetwork(networkCandidate) || NetworkSelectionUtils::IsScanResultForOweNetwork(networkCandidate)) &&
!HasWepKeys(networkCandidate.wifiDeviceConfig);
}
bool NetworkSelectionUtils::HasWepKeys(const WifiDeviceConfig &wifiConfig)
{
for (int32_t i = 0; i < WEPKEYS_SIZE; i++) {
if (!wifiConfig.wepKeys[i].empty()) {
return true;
}
}
return false;
}
bool NetworkSelectionUtils::IsEnterprise(const NetworkCandidate &networkCandidate)
{
auto &keyMgmt = networkCandidate.wifiDeviceConfig.keyMgmt;
bool isEnterpriseSecurityType = (keyMgmt == KEY_MGMT_EAP) || (keyMgmt == KEY_MGMT_SUITE_B_192) ||
(keyMgmt == KEY_MGMT_WAPI_CERT);
auto &eap = networkCandidate.wifiDeviceConfig.wifiEapConfig.eap;
return isEnterpriseSecurityType && (eap != EAP_METHOD_NONE);
}
bool NetworkSelectionUtils::IsConfigOpenOrEapType(const NetworkCandidate &networkCandidate)
{
return IsConfigOpenType(networkCandidate) || IsEnterprise(networkCandidate);
}
bool NetworkSelectionUtils::IsSameFreqAsP2p(const NetworkCandidate &networkCandidate)
{
WifiP2pGroupInfo group = WifiConfigCenter::GetInstance().GetCurrentP2pGroupInfo();
auto &interScanInfo = networkCandidate.interScanInfo;
int32_t p2pFrequency = group.GetFrequency();
if (interScanInfo.band == SCAN_5GHZ_BAND && p2pFrequency == interScanInfo.frequency) {
return true;
} else {
WIFI_LOGI("IsSameFreqAsP2p, p2p frequency:%{public}d and scanInfo frequency:%{public}d are not same",
p2pFrequency, interScanInfo.frequency);
}
return false;
}
#ifdef FEATURE_ITNETWORK_PREFERRED_SUPPORT
bool NetworkSelectionUtils::CheckDeviceTypeByVendorCountry()
{

View File

@ -70,6 +70,40 @@ public:
*/
static std::string GetScoreResultsInfo(const std::vector<ScoreResult> &scoreResults);
/**
* check if wifi is open.
*
* @param networkCandidate candidate network.
* @return return ture if the candidate network is Open, else false.
*/
static bool IsConfigOpenType(const NetworkCandidate &networkCandidate);
/**
* check if wifi is Is enterprise.
*
* @param networkCandidate candidate network.
* @return return ture if the candidate network is enterprise, else false.
*/
static bool IsEnterprise(const NetworkCandidate &networkCandidate);
/**
* check if wifi is open or enterprise.
*
* @param networkCandidate candidate network.
* @return return ture if the candidate network is enterprise, else false.
*/
static bool IsConfigOpenOrEapType(const NetworkCandidate &networkCandidate);
/**
* check if wifi has web keys.
*
* @param networkCandidate candidate network.
* @return return ture if wifi device config has web keys, else false.
*/
static bool HasWepKeys(const WifiDeviceConfig &wifiConfig);
static bool IsSameFreqAsP2p(const NetworkCandidate &networkCandidate);
#ifdef FEATURE_ITNETWORK_PREFERRED_SUPPORT
/**
* Get vendor country from param to determine it is ItDevice.

View File

@ -24,6 +24,8 @@ NetworkSelectorFactory::NetworkSelectorFactory()
{
handleFuncMap[static_cast<uint32_t>(NetworkSelectType::AUTO_CONNECT)] =
&NetworkSelectorFactory::CreateAutoConnectNetworkSelector;
handleFuncMap[static_cast<uint32_t>(NetworkSelectType::WIFI2WIFI)] =
&NetworkSelectorFactory::CreateWifi2WifiNetworkSelector;
}
std::optional<std::unique_ptr<NetworkSelection::INetworkSelector>> NetworkSelectorFactory::GetNetworkSelector(
@ -41,4 +43,9 @@ std::unique_ptr<NetworkSelection::INetworkSelector> NetworkSelectorFactory::Crea
{
return std::make_unique<NetworkSelection::AutoConnectIntegrator>();
}
std::unique_ptr<NetworkSelection::INetworkSelector> NetworkSelectorFactory::CreateWifi2WifiNetworkSelector()
{
return std::make_unique<NetworkSelection::Wifi2WifiIntegrator>();
}
} // namespace OHOS::Wifi

View File

@ -22,7 +22,11 @@
#include "wifi_errcode.h"
namespace OHOS::Wifi {
enum class NetworkSelectType { AUTO_CONNECT };
enum class NetworkSelectType {
AUTO_CONNECT,
WIFI2WIFI
};
class NetworkSelectorFactory {
public:
NetworkSelectorFactory();
@ -42,6 +46,12 @@ public:
* @return the network selector
*/
std::unique_ptr<NetworkSelection::INetworkSelector> CreateAutoConnectNetworkSelector();
/**
* the function to create wifi2wifi networkSelector
* @return the network selector
*/
std::unique_ptr<NetworkSelection::INetworkSelector> CreateWifi2WifiNetworkSelector();
private:
HandleFuncMap handleFuncMap;
};

View File

@ -60,6 +60,37 @@ bool AutoConnectIntegrator::Nominate(NetworkCandidate &networkCandidate)
return false;
}
void Wifi2WifiIntegrator::GetCandidatesFromSubNetworkSelector()
{
for (const auto &subNetworkSelector : subNetworkSelectors) {
subNetworkSelector->GetBestCandidates(networkCandidates);
}
}
Wifi2WifiIntegrator::Wifi2WifiIntegrator() : CompositeNetworkSelector("Wifi2WifiIntegrator")
{
auto andFilters = make_shared<AndWifiFilter>();
andFilters->AddFilter(make_shared<NotCurrentNetworkFilter>());
andFilters->AddFilter(make_shared<NotNetworkBlackListFilter>());
ExternalWifiFilterBuildManager::GetInstance().BuildFilter(FilterTag::NOT_P2P_ENHANCE_FREQ_AT_5G_FILTER_TAG,
*andFilters);
andFilters->AddFilter(make_shared<NotP2pFreqAt5gFilter>());
andFilters->AddFilter(make_shared<SignalLevelFilter>());
andFilters->AddFilter(make_shared<WifiSwitchThresholdFilter>());
andFilters->AddFilter(make_shared<ValidConfigNetworkFilter>());
SetWifiFilter(andFilters);
AddSubNetworkSelector(make_shared<PreferredApSelector>());
}
bool Wifi2WifiIntegrator::Nominate(NetworkCandidate &networkCandidate)
{
for (auto &networkSelector : subNetworkSelectors) {
networkSelector->TryNominate(networkCandidate);
}
return false;
}
SavedNetworkTracker::SavedNetworkTracker() : CompositeNetworkSelector("savedNetworkTracker")
{
auto andFilter = make_shared<AndWifiFilter>();
@ -294,4 +325,19 @@ bool NoInternetNetworkSelector::Filter(NetworkCandidate &networkCandidate)
TryNominate(networkCandidate);
return false;
}
PreferredApSelector::PreferredApSelector() : SimpleFilterNetworkSelector("PreferredApSelector")
{
// The filtering conditions have already been done outside, so no further filtering is needed here.
auto networkScoreComparator = make_shared<WifiScorerComparator>(m_networkSelectorName);
networkScoreComparator->AddScorer(make_shared<ApQualityScorer>("ApQualityScorer"));
networkScoreComparator->AddScorer(make_shared<RssiScorer>());
SetWifiComparator(networkScoreComparator);
}
bool PreferredApSelector::Filter(NetworkCandidate &networkCandidate)
{
TryNominate(networkCandidate);
return false;
}
}

View File

@ -28,6 +28,15 @@ protected:
void GetCandidatesFromSubNetworkSelector() override;
};
class Wifi2WifiIntegrator : public CompositeNetworkSelector {
public:
Wifi2WifiIntegrator();
~Wifi2WifiIntegrator() = default;
protected:
bool Nominate(NetworkCandidate &networkCandidate) override;
void GetCandidatesFromSubNetworkSelector() override;
};
class SavedNetworkTracker final: public CompositeNetworkSelector {
public:
SavedNetworkTracker();
@ -90,5 +99,12 @@ public:
protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
class PreferredApSelector final: public SimpleFilterNetworkSelector {
public:
PreferredApSelector();
protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
}
#endif

View File

@ -16,20 +16,30 @@
#include "wifi_filter_impl.h"
#include "network_selection_utils.h"
#include "network_status_history_manager.h"
#include "wifi_config_center.h"
#include "wifi_logger.h"
#include "wifi_settings.h"
#include "network_black_list_manager.h"
#include "wifi_ap_msg.h"
#ifndef OHOS_ARCH_LITE
#include "wifi_app_state_aware.h"
#endif
namespace OHOS::Wifi::NetworkSelection {
DEFINE_WIFILOG_LABEL("WifiFilter")
namespace {
constexpr int RECHECK_DELAYED_SECONDS = 1 * 60 * 60;
constexpr int MIN_5GHZ_BAND_FREQUENCY = 5000;
constexpr int MIN_RSSI_VALUE_24G = -77;
constexpr int MIN_RSSI_VALUE_5G = -80;
constexpr int SIGNAL_LEVEL_TWO = 2;
constexpr int POOR_PORTAL_RECHECK_DELAYED_SECONDS = 2 * RECHECK_DELAYED_SECONDS;
constexpr int32_t MIN_SIGNAL_LEVEL_INTERVAL = 2;
constexpr int32_t SIGNAL_LEVEL_THREE = 3;
constexpr int32_t SIGNAL_LEVEL_FOUR = 4;
constexpr int32_t MIN_RSSI_INTERVAL = 8;
constexpr int32_t SCAN_24GHZ_BAND = 1;
constexpr int32_t SCAN_5GHZ_BAND = 2;
}
HiddenWifiFilter::HiddenWifiFilter() : SimpleWifiFilter("notHidden") {}
@ -253,7 +263,6 @@ bool PortalWifiFilter::Filter(NetworkCandidate &networkCandidate)
return networkCandidate.wifiDeviceConfig.isPortal;
}
MaybePortalWifiFilter::MaybePortalWifiFilter() : SimpleWifiFilter("maybePortal") {}
MaybePortalWifiFilter::~MaybePortalWifiFilter()
@ -292,7 +301,6 @@ bool NoInternetWifiFilter::Filter(NetworkCandidate &networkCandidate)
return NetworkStatusHistoryManager::HasInternetEverByHistory(wifiDeviceConfig.networkStatusHistory);
}
WeakAlgorithmWifiFilter::WeakAlgorithmWifiFilter() : SimpleWifiFilter("noWeakAlgorithm") {}
WeakAlgorithmWifiFilter::~WeakAlgorithmWifiFilter()
@ -320,4 +328,221 @@ bool WeakAlgorithmWifiFilter::Filter(NetworkCandidate &networkCandidate)
}
return true;
}
NotCurrentNetworkFilter::NotCurrentNetworkFilter() : SimpleWifiFilter("NotCurrentNetwork") {}
NotCurrentNetworkFilter::~NotCurrentNetworkFilter()
{
if (!filteredNetworkCandidates.empty()) {
WIFI_LOGI("filteredNetworkCandidates in %{public}s: %{public}s",
filterName.c_str(),
NetworkSelectionUtils::GetNetworkCandidatesInfo(filteredNetworkCandidates).c_str());
}
}
bool NotCurrentNetworkFilter::Filter(NetworkCandidate &networkCandidate)
{
WifiLinkedInfo linkedInfo;
WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo);
if (networkCandidate.interScanInfo.bssid == linkedInfo.bssid) {
WIFI_LOGI("NotCurrentNetworkFilter, same bssid:%{public}s",
networkCandidate.ToString().c_str());
return false;
}
if ((networkCandidate.interScanInfo.ssid == linkedInfo.ssid) &&
NetworkSelectionUtils::IsConfigOpenOrEapType(networkCandidate)) {
WIFI_LOGI("NotCurrentNetworkFilter, same ssid and open or eap type:%{public}s",
networkCandidate.ToString().c_str());
return false;
}
return true;
}
SignalLevelFilter::SignalLevelFilter() : SimpleWifiFilter("SignalLevel") {}
SignalLevelFilter::~SignalLevelFilter()
{
if (!filteredNetworkCandidates.empty()) {
WIFI_LOGI("filteredNetworkCandidates in %{public}s: %{public}s",
filterName.c_str(),
NetworkSelectionUtils::GetNetworkCandidatesInfo(filteredNetworkCandidates).c_str());
}
}
bool SignalLevelFilter::Filter(NetworkCandidate &networkCandidate)
{
auto &interScanInfo = networkCandidate.interScanInfo;
int32_t signalLevel = WifiSettings::GetInstance().GetSignalLevel(interScanInfo.rssi, interScanInfo.band);
return signalLevel > SIGNAL_LEVEL_TWO;
}
NotNetworkBlackListFilter::NotNetworkBlackListFilter() : SimpleWifiFilter("NotNetworkBlackList") {}
NotNetworkBlackListFilter::~NotNetworkBlackListFilter()
{
if (!filteredNetworkCandidates.empty()) {
WIFI_LOGI("filteredNetworkCandidates in %{public}s: %{public}s",
filterName.c_str(),
NetworkSelectionUtils::GetNetworkCandidatesInfo(filteredNetworkCandidates).c_str());
}
}
bool NotNetworkBlackListFilter::Filter(NetworkCandidate &networkCandidate)
{
if (NetworkBlockListManager::GetInstance().IsInAbnormalWifiBlocklist(networkCandidate.interScanInfo.bssid)) {
WIFI_LOGI("NotNetworkBlockListFilter, in abnormal wifi blocklist, skip candidate:%{public}s",
networkCandidate.ToString().c_str());
return false;
}
WifiLinkedInfo linkedInfo;
WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo);
int32_t curSignalLevel = WifiSettings::GetInstance().GetSignalLevel(linkedInfo.rssi, linkedInfo.band);
auto scanInfo = networkCandidate.interScanInfo;
int32_t targetSignalLevel = WifiSettings::GetInstance().GetSignalLevel(scanInfo.rssi, scanInfo.band);
if (NetworkBlockListManager::GetInstance().IsInWifiBlocklist(networkCandidate.interScanInfo.bssid) &&
(targetSignalLevel <= SIGNAL_LEVEL_THREE || targetSignalLevel - curSignalLevel < MIN_SIGNAL_LEVEL_INTERVAL)) {
WIFI_LOGI("NotNetworkBlackListFilter, in wifi blocklist and level interval is not enough,"
"skip candidate:%{public}s", networkCandidate.ToString().c_str());
return false;
}
return true;
}
NotP2pFreqAt5gFilter::NotP2pFreqAt5gFilter() : SimpleWifiFilter("NotP2pFreqAt5g") {}
NotP2pFreqAt5gFilter::~NotP2pFreqAt5gFilter()
{
if (!filteredNetworkCandidates.empty()) {
WIFI_LOGI("filteredNetworkCandidates in %{public}s: %{public}s",
filterName.c_str(),
NetworkSelectionUtils::GetNetworkCandidatesInfo(filteredNetworkCandidates).c_str());
}
}
bool NotP2pFreqAt5gFilter::Filter(NetworkCandidate &networkCandidate)
{
if (networkCandidate.interScanInfo.band == SCAN_24GHZ_BAND) {
return true;
}
Hid2dUpperScene softbusScene;
Hid2dUpperScene castScene;
Hid2dUpperScene shareScene;
Hid2dUpperScene mouseCrossScene;
Hid2dUpperScene miracastScene;
WifiP2pLinkedInfo linkedInfo;
WifiConfigCenter::GetInstance().GetHid2dUpperScene(SOFT_BUS_SERVICE_UID, softbusScene);
WifiConfigCenter::GetInstance().GetHid2dUpperScene(CAST_ENGINE_SERVICE_UID, castScene);
WifiConfigCenter::GetInstance().GetHid2dUpperScene(MIRACAST_SERVICE_UID, miracastScene);
WifiConfigCenter::GetInstance().GetHid2dUpperScene(SHARE_SERVICE_UID, shareScene);
WifiConfigCenter::GetInstance().GetHid2dUpperScene(MOUSE_CROSS_SERVICE_UID, mouseCrossScene);
WifiConfigCenter::GetInstance().GetP2pInfo(linkedInfo);
if (linkedInfo.GetConnectState() == P2pConnectedState::P2P_DISCONNECTED
&& WifiConfigCenter::GetInstance().GetP2pEnhanceState() == 0) {
return true;
}
// scene bit 0-2 is valid, 0x01: video, 0x02: audio, 0x04: file,
// scene & 0x07 > 0 means one of them takes effect.
bool isCastScene = false;
if ((softbusScene.scene & 0x07) > 0 || (castScene.scene & 0x07) > 0 || (shareScene.scene & 0x07) > 0 ||
(mouseCrossScene.scene & 0x07) > 0 || (miracastScene.scene & 0x07) > 0) {
isCastScene = true;
}
if (!isCastScene) {
return true;
}
return NetworkSelectionUtils::IsSameFreqAsP2p(networkCandidate);
}
ValidConfigNetworkFilter::ValidConfigNetworkFilter() : SimpleWifiFilter("ValidConfigNetwork") {}
ValidConfigNetworkFilter::~ValidConfigNetworkFilter()
{
if (!filteredNetworkCandidates.empty()) {
WIFI_LOGI("filteredNetworkCandidates in %{public}s: %{public}s",
filterName.c_str(),
NetworkSelectionUtils::GetNetworkCandidatesInfo(filteredNetworkCandidates).c_str());
}
}
bool ValidConfigNetworkFilter::Filter(NetworkCandidate &networkCandidate)
{
// no internet filtering
auto &wifiDeviceConfig = networkCandidate.wifiDeviceConfig;
if (wifiDeviceConfig.noInternetAccess) {
WIFI_LOGI("ValidConfigNetworkFilter, no internet access, skip candidate:%{public}s",
networkCandidate.ToString().c_str());
return false;
}
// portal network filtering
if (networkCandidate.wifiDeviceConfig.isPortal) {
WIFI_LOGI("ValidConfigNetworkFilter, portal network, skip candidate:%{public}s",
networkCandidate.ToString().c_str());
return false;
}
// disable network filtering
auto &networkSelectionStatus = networkCandidate.wifiDeviceConfig.networkSelectionStatus;
if (networkSelectionStatus.networkSelectionDisableReason != DisabledReason::DISABLED_NONE) {
WIFI_LOGI("ValidConfigNetworkFilter, disable network, skip candidate:%{public}s",
networkCandidate.ToString().c_str());
return false;
}
// empty network status history
if (NetworkStatusHistoryManager::IsEmptyNetworkStatusHistory(wifiDeviceConfig.networkStatusHistory)) {
WIFI_LOGI("ValidConfigNetworkFilter, no network status history, skip candidate:%{public}s",
networkCandidate.ToString().c_str());
return false;
}
// maybe portal network filtering
if (NetworkSelectionUtils::IsScanResultForOweNetwork(networkCandidate) &&
NetworkSelectionUtils::IsOpenAndMaybePortal(networkCandidate)) {
WIFI_LOGI("ValidConfigNetworkFilter, maybe portal network, skip candidate:%{public}s",
networkCandidate.ToString().c_str());
return false;
}
return true;
}
WifiSwitchThresholdFilter::WifiSwitchThresholdFilter() : SimpleWifiFilter("WifiSwitchThreshold") {}
WifiSwitchThresholdFilter::~WifiSwitchThresholdFilter()
{
if (!filteredNetworkCandidates.empty()) {
WIFI_LOGI("filteredNetworkCandidates in %{public}s: %{public}s",
filterName.c_str(),
NetworkSelectionUtils::GetNetworkCandidatesInfo(filteredNetworkCandidates).c_str());
}
}
bool WifiSwitchThresholdFilter::Filter(NetworkCandidate &networkCandidate)
{
WifiLinkedInfo linkedInfo;
WifiConfigCenter::GetInstance().GetLinkedInfo(linkedInfo);
int32_t curSignalLevel = WifiSettings::GetInstance().GetSignalLevel(linkedInfo.rssi, linkedInfo.band);
if (linkedInfo.band == static_cast<int>(BandType::BAND_5GHZ) && curSignalLevel == SIGNAL_LEVEL_THREE) {
return false;
}
auto &interScanInfo = networkCandidate.interScanInfo;
if (curSignalLevel == SIGNAL_LEVEL_FOUR || (interScanInfo.rssi - linkedInfo.rssi < MIN_RSSI_INTERVAL)) {
return false;
}
int32_t targetSignalLevel = WifiSettings::GetInstance().GetSignalLevel(interScanInfo.rssi, interScanInfo.band);
if (linkedInfo.band == SCAN_5GHZ_BAND && curSignalLevel == SIGNAL_LEVEL_THREE &&
interScanInfo.band == SCAN_24GHZ_BAND && targetSignalLevel == SIGNAL_LEVEL_FOUR) {
return false;
}
return true;
}
}

View File

@ -26,6 +26,54 @@ protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
class NotCurrentNetworkFilter final : public SimpleWifiFilter {
public:
NotCurrentNetworkFilter();
~NotCurrentNetworkFilter() override;
protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
class SignalLevelFilter final : public SimpleWifiFilter {
public:
SignalLevelFilter();
~SignalLevelFilter() override;
protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
class NotNetworkBlackListFilter final : public SimpleWifiFilter {
public:
NotNetworkBlackListFilter();
~NotNetworkBlackListFilter() override;
protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
class NotP2pFreqAt5gFilter final : public SimpleWifiFilter {
public:
NotP2pFreqAt5gFilter();
~NotP2pFreqAt5gFilter() override;
protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
class ValidConfigNetworkFilter final : public SimpleWifiFilter {
public:
ValidConfigNetworkFilter();
~ValidConfigNetworkFilter() override;
protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
class WifiSwitchThresholdFilter final : public SimpleWifiFilter {
public:
WifiSwitchThresholdFilter();
~WifiSwitchThresholdFilter() override;
protected:
bool Filter(NetworkCandidate &networkCandidate) override;
};
class SignalStrengthWifiFilter final : public SimpleWifiFilter {
public:
SignalStrengthWifiFilter();

View File

@ -22,7 +22,7 @@
namespace OHOS::Wifi::NetworkSelection {
DEFINE_WIFILOG_LABEL("WifiScorerImpl")
namespace {
constexpr int SUFFICIENT_RSSI_5G = -70;
constexpr int SUFFICIENT_RSSI_2G = -73;
constexpr int RSSI_SCORE_OFFSET = 85;
@ -36,6 +36,8 @@ constexpr int WIFI_2G_BAND_SCORE = 20;
constexpr int SECURITY_BONUS_SCORE = 5;
constexpr int RSSI_LEVEL_FOUR_SCORE = 80;
constexpr int RSSI_LEVEL_THREE_SCORE = 60;
constexpr int RSSI_LEVEL_TWO_SCORE = 20;
constexpr int WIFI_DEFAULT_SCORE = -1;
constexpr int RSSI_LEVEL_TWO_SCORE_5G = 40;
constexpr int RSSI_LEVEL_TWO_SCORE_2G = 20;
constexpr int SIGNAL_LEVEL_TWO = 2;
@ -47,6 +49,7 @@ constexpr int EMPTY_NETWORK_STATUS_HISTORY_AWARD = 1;
constexpr int MAX_HISTORY_NETWORK_STATUS_NUM = 10;
constexpr int HISTORY_NETWORK_STATUS_WEIGHTED_SCORE[MAX_HISTORY_NETWORK_STATUS_NUM] = {
0, 40960, 20480, 10240, 5120, 2560, 1280, 640, 320, 160};
}
RssiScorer::RssiScorer() : SimpleWifiScorer("rssiScorer") {}
@ -218,6 +221,31 @@ double RssiLevelBonusScorer::Score(NetworkCandidate &networkCandidate)
return 0;
}
SignalLevelScorer::SignalLevelScorer() : SimpleWifiScorer("SignalLevelScorer") {}
double SignalLevelScorer::Score(NetworkCandidate &networkCandidate)
{
auto &scanInfo = networkCandidate.interScanInfo;
int signalLevel = WifiSettings::GetInstance().GetSignalLevel(scanInfo.rssi, scanInfo.band);
int32_t levelScore = 0;
switch (signalLevel) {
case SIGNAL_LEVEL_FOUR:
levelScore = RSSI_LEVEL_FOUR_SCORE;
break;
case SIGNAL_LEVEL_THREE:
levelScore = RSSI_LEVEL_THREE_SCORE;
break;
case SIGNAL_LEVEL_TWO:
levelScore = RSSI_LEVEL_TWO_SCORE;
break;
default:
levelScore = WIFI_DEFAULT_SCORE;
break;
}
return levelScore;
}
Network5gBonusScorer::Network5gBonusScorer() : SimpleWifiScorer("5gBonusScore") {}
double Network5gBonusScorer::Score(NetworkCandidate &networkCandidate)
@ -254,4 +282,13 @@ double NoInternetNetworkStatusHistoryScorer::Score(NetworkCandidate &networkCand
}
return score;
}
ApQualityScorer::ApQualityScorer(const std::string &scorerName) : CompositeWifiScorer(scorerName)
{
AddScorer(std::make_shared<SignalLevelScorer>());
AddScorer(std::make_shared<Network5gBonusScorer>());
ExternalWifiCommonBuildManager::GetInstance().BuildScore(
TagType::HAS_INTERNET_NETWORK_SELECTOR_SCORE_WIFI_CATEGORY_TAG, *this);
AddScorer(std::make_shared<SecurityBonusScorer>());
}
}

View File

@ -137,6 +137,12 @@ public:
double Score(NetworkCandidate &networkCandidate) override;
};
class SignalLevelScorer : public SimpleWifiScorer {
public:
SignalLevelScorer();
double Score(NetworkCandidate &networkCandidate) override;
};
class Network5gBonusScorer : public SimpleWifiScorer {
public:
Network5gBonusScorer();
@ -153,6 +159,12 @@ public:
NoInternetNetworkStatusHistoryScorer();
double Score(NetworkCandidate &networkCandidate) override;
};
class ApQualityScorer : public CompositeWifiScorer {
public:
explicit ApQualityScorer(const std::string &scorerName);
};
}
#endif

View File

@ -17,7 +17,6 @@
#include "wifi_sta_hal_interface.h"
#include "wifi_config_center.h"
#include "wifi_common_util.h"
#include "wifi_service_manager.h"
#include "block_connect_service.h"
DEFINE_WIFILOG_LABEL("StaAutoConnectService");

View File

@ -81,10 +81,12 @@ namespace Wifi {
#define VALUE_LIMIT_MIN_RSSI (-100)
#define VALUE_LIMIT_MAX_RSSI (-55)
#define NETWORK_SELECTED_BY_UNKNOWN (-1)
#define NETWORK_SELECTED_BY_AUTO 0
#define NETWORK_SELECTED_BY_USER 1
#define NETWORK_SELECTED_BY_RETRY 2
enum SelectedType {
NETWORK_SELECTED_BY_UNKNOWN = -1,
NETWORK_SELECTED_BY_AUTO = 0,
NETWORK_SELECTED_BY_USER = 1,
NETWORK_SELECTED_BY_RETRY = 2
};
#define WIFI_SIM_GSM_AUTH_MIN_PARAM_COUNT 3
#define WIFI_SIM_GSM_AUTH_MAX_PARAM_COUNT 4

View File

@ -76,12 +76,12 @@ ErrCode StaInterface::DisableStaService()
return WIFI_OPT_SUCCESS;
}
ErrCode StaInterface::ConnectToNetwork(int networkId)
ErrCode StaInterface::ConnectToNetwork(int networkId, int type)
{
LOGI("Enter Connect.\n");
std::lock_guard<std::mutex> lock(mutex);
CHECK_NULL_AND_RETURN(pStaService, WIFI_OPT_FAILED);
if (pStaService->ConnectToNetwork(networkId) != WIFI_OPT_SUCCESS) {
if (pStaService->ConnectToNetwork(networkId, type) != WIFI_OPT_SUCCESS) {
LOGE("ConnectTo failed.\n");
return WIFI_OPT_FAILED;
}

View File

@ -50,17 +50,18 @@ public:
/**
* @Description Connect to a new network
*
* @param config - the configuration of network which is going to connect.(in)
* @param networkId - interior saved network index.(in)
* @param type - select network type: SelectedType
* @Output: Return operating results to Interface Service after enable wifi
successfully through callback function instead of returning
result immediately.
* @Return success: WIFI_OPT_SUCCESS fail: WIFI_OPT_FAILED
*/
virtual ErrCode ConnectToNetwork(int networkId) override;
virtual ErrCode ConnectToNetwork(int networkId, int type = NETWORK_SELECTED_BY_USER) override;
/**
* @Description Connecting to a specified network.
*
* @param networkId - interior saved network index.(in)
* @param config - the configuration of network which is going to connect.(in)
* @Output: Return operating results to Interface Service after enable wifi
successfully through callback function instead of returning
result immediately.

View File

@ -560,7 +560,7 @@ ErrCode StaService::ConnectToDevice(const WifiDeviceConfig &config) const
return WIFI_OPT_SUCCESS;
}
ErrCode StaService::ConnectToNetwork(int networkId) const
ErrCode StaService::ConnectToNetwork(int networkId, int type) const
{
LOGI("Enter ConnectToNetwork, networkId is %{public}d.", networkId);
WifiDeviceConfig config;
@ -573,7 +573,7 @@ ErrCode StaService::ConnectToNetwork(int networkId) const
LOGI("ConnectToNetwork, ssid = %{public}s.", SsidAnonymize(config.ssid).c_str());
pStaAutoConnectService->EnableOrDisableBssid(config.bssid, true, 0);
pStaStateMachine->SetPortalBrowserFlag(false);
pStaStateMachine->SendMessage(WIFI_SVR_CMD_STA_CONNECT_SAVED_NETWORK, networkId, NETWORK_SELECTED_BY_USER);
pStaStateMachine->SendMessage(WIFI_SVR_CMD_STA_CONNECT_SAVED_NETWORK, networkId, type);
return WIFI_OPT_SUCCESS;
}

View File

@ -73,12 +73,13 @@ public:
* @Description Connecting to a specified network.
*
* @param networkId - interior saved network index.(in)
* @param type - select network type: SelectedType
* @Output: Return operating results to Interface Service after enable wifi
successfully through callback function instead of returning
result immediately.
* @Return success: WIFI_OPT_SUCCESS fail: WIFI_OPT_FAILED
*/
virtual ErrCode ConnectToNetwork(int networkId) const;
virtual ErrCode ConnectToNetwork(int networkId, int type = NETWORK_SELECTED_BY_USER) const;
/**
* @Description roam to target bssid

View File

@ -25,15 +25,15 @@ namespace OHOS {
namespace Wifi {
struct StaServiceCallback {
std::string callbackModuleName;
std::function<void(OperateResState, int)> OnStaOpenRes;
std::function<void(OperateResState, int)> OnStaCloseRes;
std::function<void(OperateResState, const WifiLinkedInfo &, int)> OnStaConnChanged;
std::function<void(WpsStartState, const int, int)> OnWpsChanged;
std::function<void(StreamDirection, int)> OnStaStreamChanged;
std::function<void(int, int)> OnStaRssiLevelChanged;
std::function<void(OperateResState, int)> OnStaSemiActiveRes;
std::function<void(IpInfo, int)> OnDhcpOfferReport;
std::function<void(int, int)> OnAutoSelectNetworkRes;
std::function<void(OperateResState, int)> OnStaOpenRes { nullptr };
std::function<void(OperateResState, int)> OnStaCloseRes { nullptr };
std::function<void(OperateResState, const WifiLinkedInfo &, int)> OnStaConnChanged { nullptr };
std::function<void(WpsStartState, const int, int)> OnWpsChanged { nullptr };
std::function<void(StreamDirection, int)> OnStaStreamChanged { nullptr };
std::function<void(int, int)> OnStaRssiLevelChanged { nullptr };
std::function<void(OperateResState, int)> OnStaSemiActiveRes { nullptr };
std::function<void(IpInfo, int)> OnDhcpOfferReport { nullptr };
std::function<void(int, int)> OnAutoSelectNetworkRes { nullptr };
};
} // namespace Wifi
} // namespace OHOS

View File

@ -243,6 +243,13 @@ void WifiScanManager::DealScanInfoNotify(std::vector<InterScanInfo> &results, in
if (pService != nullptr) {
pService->ConnectivityManager(results);
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
IWifiProService *pWifiProService = WifiServiceManager::GetInstance().GetWifiProServiceInst(instId);
if (pWifiProService != nullptr) {
pWifiProService->DealScanResult(results);
}
#endif
}
}

View File

@ -27,6 +27,7 @@ group("unittest") {
"wifi_standard/wifi_framework/wifi_manage/wifi_ap:WifiApServiceTest",
"wifi_standard/wifi_framework/wifi_manage/wifi_native:wifi_native_test",
"wifi_standard/wifi_framework/wifi_manage/wifi_p2p/test:wifi_p2p_test",
"wifi_standard/wifi_framework/wifi_manage/wifi_pro:wifi_pro_unittest",
"wifi_standard/wifi_framework/wifi_manage/wifi_scan:wifi_scan_unittest",
"wifi_standard/wifi_framework/wifi_manage/wifi_sta:wifi_selfcure_unittest",
"wifi_standard/wifi_framework/wifi_manage/wifi_sta:wifi_sta_unittest",

View File

@ -45,6 +45,7 @@ ohos_fuzztest("WifiDeviceStubFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",

View File

@ -45,6 +45,7 @@ ohos_fuzztest("WifiHotspotImplFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",

View File

@ -45,6 +45,7 @@ ohos_fuzztest("WifiHotSpotStubFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",

View File

@ -44,6 +44,7 @@ ohos_fuzztest("WifiP2pStubFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",

View File

@ -44,6 +44,7 @@ ohos_fuzztest("WifiScansaFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",

View File

@ -45,6 +45,7 @@ ohos_fuzztest("WifiScanServerFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",

View File

@ -44,6 +44,7 @@ ohos_fuzztest("WifiScanStubFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",

View File

@ -46,6 +46,7 @@ ohos_fuzztest("WifiStaServerFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan_sa",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap_sa",
@ -56,6 +57,7 @@ ohos_fuzztest("WifiStaServerFuzzTest") {
"$WIFI_ROOT_DIR/services/wifi_standard/include",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_country_code",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/network_black_list",
"$WIFI_ROOT_DIR/test/fuzztest/fuzz_common_func",
]

View File

@ -53,6 +53,7 @@ ohos_unittest("wifi_non_mock_unittest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p/hid2d",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/interfaces/inner_api",
"$WIFI_ROOT_DIR/frameworks/native/interfaces",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/app_network_speed_limit",

View File

@ -88,6 +88,7 @@ ohos_unittest("precompiled_macro_unittest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/net_conf",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/hardware/libhardware/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/include",

View File

@ -87,6 +87,7 @@ ohos_unittest("manager_unittest") {
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_ap/Mock/mock_wifi_ap_hal_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_p2p/test/Mock/mock_p2p_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_p2p/test/Mock/mock_wifi_p2p_hal_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_pro/mock/mock_wifi_pro_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_scan/Mock/mock_scan_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_scan/Mock/mock_scan_service.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta/Mock/mock_sta_interface.cpp",
@ -146,6 +147,7 @@ ohos_unittest("manager_unittest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p/hid2d",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/interfaces/inner_api",
"$WIFI_ROOT_DIR/frameworks/native/interfaces",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/app_network_speed_limit",
@ -236,6 +238,10 @@ ohos_unittest("manager_unittest") {
"UT_TEST",
]
if (wifi_feature_wifi_pro_ctrl) {
defines += [ "FEATURE_WIFI_PRO_SUPPORT" ]
}
if (is_asan) {
sources += [ "$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_scan/Mock/mock_scan_service_new.cpp" ]
}

View File

@ -82,6 +82,7 @@ ohos_unittest("wifi_controller_unittest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p/hid2d",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
@ -97,7 +98,7 @@ ohos_unittest("wifi_controller_unittest") {
"--coverage",
]
deps = [
"$WIFI_ROOT_DIR/base:wifi_base_without_crpc",
"$WIFI_ROOT_DIR/base:wifi_base",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common:wifi_common_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native:wifi_native",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit:wifi_toolkit",
@ -141,11 +142,14 @@ ohos_unittest("wifi_controller_unittest") {
]
defines += [
"FEATURE_AP_SUPPORT",
"FEATURE_SELF_CURE_SUPPORT",
"FEATURE_STA_SUPPORT",
"FEATURE_P2P_SUPPORT",
"STA_INSTANCE_MAX_NUM=$wifi_feature_with_sta_num",
]
if (wifi_feature_wifi_pro_ctrl) {
defines += [ "FEATURE_WIFI_PRO_SUPPORT" ]
}
part_name = "wifi"
subsystem_name = "communication"
}

View File

@ -0,0 +1,142 @@
# Copyright (C) 2024-2024 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//build/test.gni")
import("//foundation/communication/wifi/wifi/wifi.gni")
module_output_path = "wifi/wifi_pro_unittest"
defines = []
config("module_private_config") {
visibility = [ ":*" ]
include_dirs = [
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
]
}
ohos_unittest("wifi_pro_unittest") {
module_out_path = module_output_path
sources = [
"$WIFI_ROOT_DIR/frameworks/native/src/network_selection.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_service.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_state_machine.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro/wifi_pro_utils.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/external_wifi_common_builder_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/external_wifi_filter_builder_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selection_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selection_utils.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selector_factory.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selector_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_comparator_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_filter_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_scorer_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_status_history_manager.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_scan/Mock/mock_scan_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta/Mock/mock_sta_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta_sa/mock/mock_wifi_service_manager.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock/mock_wifi_config_center.cpp",
"mock/mock_wifi_pro_interface.cpp",
"wifi_pro_state_machine_test.cpp",
]
include_dirs = [
"//third_party/googletest/googlemock/include",
"//third_party/googletest/googletest/include",
"$WIFI_ROOT_DIR/interfaces/inner_api",
"$WIFI_ROOT_DIR/frameworks/native/include",
"$WIFI_ROOT_DIR/frameworks/native/interfaces",
"$WIFI_ROOT_DIR/services/wifi_standard/interface",
"$WIFI_ROOT_DIR/base/cRPC/include",
"$WIFI_ROOT_DIR/base/utils",
"$WIFI_ROOT_DIR/base/state_machine/include",
"$WIFI_ROOT_DIR/utils/inc",
"$WIFI_ROOT_DIR/services/wifi_standard/include",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/include",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/net_helper",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/log",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/config",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/utils",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_country_code",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_controller",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/network_black_list",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/common",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/wifi_hal_interface",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock",
]
deps = [
"$WIFI_ROOT_DIR/base:wifi_base",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common:wifi_common_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native:wifi_native",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit:wifi_toolkit",
"$WIFI_ROOT_DIR/utils:wifi_utils",
"//third_party/googletest:gmock_main",
"//third_party/googletest:gtest_main",
]
external_deps = [
"ability_base:want",
"ability_base:zuri",
"ability_runtime:ability_manager",
"ability_runtime:app_manager",
"ability_runtime:extension_manager",
"ability_runtime:wantagent_innerkits",
"access_token:libaccesstoken_sdk",
"access_token:libtokenid_sdk",
"bundle_framework:appexecfwk_base",
"bundle_framework:appexecfwk_core",
"c_utils:utils",
"cellular_data:tel_cellular_data_api",
"core_service:tel_core_service_api",
"data_share:datashare_consumer",
"dhcp:dhcp_sdk",
"hilog:libhilog",
"init:libbegetutil",
"ipc:ipc_single",
"jsoncpp:jsoncpp",
"libxml2:libxml2",
"netmanager_base:net_conn_manager_if",
"netmanager_base:net_native_manager_if",
"netmanager_base:net_stats_manager_if",
"netstack:http_client",
"samgr:samgr_proxy",
"time_service:time_client",
]
if (wifi_ffrt_enable) {
external_deps += [ "ffrt:libffrt" ]
defines += [ "WIFI_FFRT_ENABLE" ]
}
defines += [
"AP_INSTANCE_MAX_NUM=$wifi_feature_with_ap_num",
"private=public",
"SUPPORT_RANDOM_MAC_ADDR",
"FEATURE_SELF_CURE_SUPPORT",
]
if (wifi_feature_wifi_pro_ctrl) {
defines += [ "FEATURE_WIFI_PRO_SUPPORT" ]
}
part_name = "wifi"
subsystem_name = "communication"
}

View File

@ -0,0 +1,72 @@
/*
* Copyright (C) 2024-2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "wifi_logger.h"
#include "wifi_pro_interface.h"
namespace OHOS {
namespace Wifi {
DEFINE_WIFILOG_LABEL("WifiPrWifiProInterfaceoService");
WifiProInterface::WifiProInterface(int32_t instId) : instId_(instId)
{
WIFI_LOGI("Enter WifiProInterface");
}
WifiProInterface::~WifiProInterface()
{
WIFI_LOGI("Enter ~WifiProInterface");
}
ErrCode WifiProInterface::InitWifiProService()
{
WIFI_LOGI("Enter WifiProInterface::InitWifiProService");
return WIFI_OPT_SUCCESS;
}
void WifiProInterface::InitCallback()
{
using namespace std::placeholders;
staCallback_.callbackModuleName = "WifiProService";
staCallback_.OnStaConnChanged = [this](OperateResState state, const WifiLinkedInfo &linkedInfo, int32_t instId) {
this->DealStaConnChanged(state, linkedInfo, instId);
};
staCallback_.OnStaRssiLevelChanged = [this](int32_t rssi, int32_t instId) {
this->DealRssiLevelChanged(rssi, instId);
};
}
void WifiProInterface::DealStaConnChanged(OperateResState state, const WifiLinkedInfo &info, int32_t instId)
{
WIFI_LOGI("Enter WifiProInterface::DealStaConnChanged");
}
void WifiProInterface::DealRssiLevelChanged(int32_t rssi, int32_t instId)
{
WIFI_LOGI("Enter WifiProInterface::DealRssiLevelChanged");
}
void WifiProInterface::DealScanResult(const std::vector<InterScanInfo> &results)
{
WIFI_LOGI("Enter WifiProInterface::DealScanResult");
}
StaServiceCallback WifiProInterface::GetStaCallback() const
{
return staCallback_;
}
} // namespace Wifi
} // namespace OHOS

View File

@ -0,0 +1,134 @@
/*
* Copyright (C) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <string>
#include <vector>
#include "define.h"
#include "wifi_log.h"
#include "wifi_errcode.h"
#include "state_machine.h"
#include "wifi_pro_common.h"
#include "iscan_service.h"
#include "wifi_logger.h"
#include "wifi_msg.h"
#include "wifi_pro_state_machine.h"
#include "wifi_service_manager.h"
#include "wifi_pro_utils.h"
#include "net_conn_client.h"
#include "mock_wifi_config_center.h"
using ::testing::_;
using ::testing::AtLeast;
using ::testing::DoAll;
using ::testing::Eq;
using ::testing::Return;
using ::testing::SetArgReferee;
using ::testing::StrEq;
using ::testing::TypedEq;
using ::testing::ext::TestSize;
namespace OHOS {
namespace Wifi {
class WifiProStateMachineTest : public testing::Test {
public:
static void SetUpTestCase() {}
static void TearDownTestCase() {}
virtual void SetUp()
{
pWifiProStateMachine_ = std::make_unique<WifiProStateMachine>();
pWifiProStateMachine_->Initialize();
}
virtual void TearDown()
{
if (pWifiProStateMachine_->pCurrWifiInfo_ != nullptr) {
pWifiProStateMachine_->pCurrWifiInfo_.reset();
}
if (pWifiProStateMachine_->pCurrWifiDeviceConfig_ != nullptr) {
pWifiProStateMachine_->pCurrWifiDeviceConfig_.reset();
}
pWifiProStateMachine_.reset();
}
std::unique_ptr<WifiProStateMachine> pWifiProStateMachine_;
};
HWTEST_F(WifiProStateMachineTest, HandleRssiChangedInLinkMonitorStateTest, TestSize.Level1)
{
InternalMessagePtr msg = std::make_shared<InternalMessage>();
msg->SetMessageName(EVENT_WIFI_RSSI_CHANGED);
msg->SetParam1(-30);
auto pWiFiLinkMonitorState = pWifiProStateMachine_->pWifiLinkMonitorState_;
pWiFiLinkMonitorState->rssiLevel2Or3ScanedCounter_ = 1;
pWiFiLinkMonitorState->HandleRssiChangedInMonitor(msg);
EXPECT_EQ(pWiFiLinkMonitorState->rssiLevel2Or3ScanedCounter_, 1);
}
HWTEST_F(WifiProStateMachineTest, IsReachWifiScanThresholdTest01, TestSize.Level1)
{
// wifi signal 4 bars
int32_t signalLevel = SIG_LEVEL_4;
int32_t ret = pWifiProStateMachine_->IsReachWifiScanThreshold(signalLevel);
EXPECT_EQ(ret, false);
}
HWTEST_F(WifiProStateMachineTest, IsReachWifiScanThresholdTest02, TestSize.Level1)
{
// The wifi signal is lower than 3 bars
int32_t signalLevel = SIG_LEVEL_2;
int32_t ret = pWifiProStateMachine_->IsReachWifiScanThreshold(signalLevel);
EXPECT_EQ(ret, true);
}
HWTEST_F(WifiProStateMachineTest, IsReachWifiScanThresholdTest03, TestSize.Level1)
{
// The wifi signal is equal to 3 bars, and there are switching records within 14 days
int32_t signalLevel = SIG_LEVEL_3;
WifiLinkedInfo wifiLinkedInfo;
wifiLinkedInfo.supplicantState = SupplicantState::INVALID;
EXPECT_CALL(WifiConfigCenter::GetInstance(), GetLinkedInfo(_, _))
.WillRepeatedly(DoAll(SetArgReferee<0>(wifiLinkedInfo), Return(0)));
pWifiProStateMachine_->pCurrWifiInfo_ = std::make_shared<WifiLinkedInfo>(wifiLinkedInfo);
WifiDeviceConfig wifiDeviceConfig;
wifiDeviceConfig.lastTrySwitchWifiTimestamp = WifiProUtils::GetCurrentTimeMs();
pWifiProStateMachine_->pCurrWifiDeviceConfig_ = std::make_shared<WifiDeviceConfig>(wifiDeviceConfig);
bool ret = pWifiProStateMachine_->IsReachWifiScanThreshold(signalLevel);
EXPECT_EQ(ret, true);
}
HWTEST_F(WifiProStateMachineTest, IsReachWifiScanThresholdTest04, TestSize.Level1)
{
// The wifi signal is equal to 3 bars, and there is no connection record within 14 days.
int32_t signalLevel = SIG_LEVEL_3;
WifiLinkedInfo wifiLinkedInfo;
wifiLinkedInfo.supplicantState = SupplicantState::INVALID;
EXPECT_CALL(WifiConfigCenter::GetInstance(), GetLinkedInfo(_, _))
.WillRepeatedly(DoAll(SetArgReferee<0>(wifiLinkedInfo), Return(0)));
pWifiProStateMachine_->pCurrWifiInfo_ = std::make_shared<WifiLinkedInfo>(wifiLinkedInfo);
WifiDeviceConfig wifiDeviceConfig;
wifiDeviceConfig.lastTrySwitchWifiTimestamp = 0;
pWifiProStateMachine_->pCurrWifiDeviceConfig_ = std::make_shared<WifiDeviceConfig>(wifiDeviceConfig);
bool ret = pWifiProStateMachine_->IsReachWifiScanThreshold(signalLevel);
EXPECT_EQ(ret, false);
}
} // namespace Wifi
} // namespace OHOS

View File

@ -72,6 +72,7 @@ ohos_unittest("wifi_scan_unittest") {
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/net_conf",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sub_manage",
"//base/hiviewdfx/hilog/interfaces/native/innerkits/include",

View File

@ -21,7 +21,6 @@ defines += [ "OHOS_WIFI_STA_TEST" ]
config("module_private_config") {
visibility = [ ":*" ]
include_dirs = [
"//commonlibrary/c_utils/base/include",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
]
}
@ -35,6 +34,7 @@ local_base_sources = [
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/app_network_speed_limit/app_network_speed_limit_service.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/app_network_speed_limit/speed_limit_configs_writer.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/block_connect_service.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/network_black_list/network_black_list_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_app_state_aware.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_auth_center.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_channel_helper.cpp",
@ -105,9 +105,11 @@ local_base_include_dirs = [
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/client/idl_client/idl_interface",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_country_code",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/network_black_list",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_controller",
@ -289,6 +291,10 @@ ohos_unittest("wifi_selfcure_unittest") {
"FEATURE_AP_SUPPORT",
"FEATURE_STA_SUPPORT",
]
if (wifi_feature_wifi_pro_ctrl) {
defines += [ "FEATURE_WIFI_PRO_SUPPORT" ]
}
part_name = "wifi"
subsystem_name = "communication"
}

View File

@ -41,7 +41,7 @@ ErrCode StaInterface::DisableStaService()
return WIFI_OPT_SUCCESS;
}
ErrCode StaInterface::ConnectToNetwork(int networkId)
ErrCode StaInterface::ConnectToNetwork(int networkId, int type)
{
LOGI("Enter Connect.\n");
return WIFI_OPT_SUCCESS;

View File

@ -28,7 +28,7 @@ public:
MOCK_METHOD0(EnableStaService, ErrCode());
MOCK_CONST_METHOD0(DisableStaService, ErrCode());
MOCK_CONST_METHOD1(ConnectToDevice, ErrCode(const WifiDeviceConfig &config));
MOCK_CONST_METHOD1(ConnectToNetwork, ErrCode(int networkId));
MOCK_CONST_METHOD2(ConnectToNetwork, ErrCode(int networkId, int type));
MOCK_CONST_METHOD0(ReConnect, ErrCode());
MOCK_CONST_METHOD0(Disconnect, ErrCode());
MOCK_CONST_METHOD0(ReAssociate, ErrCode());

View File

@ -883,10 +883,10 @@ public:
pSelfCureStateMachine->pInternetSelfCureState->currentRssi = MIN_VAL_LEVEL_4;
pSelfCureStateMachine->pInternetSelfCureState->SelfCureForRandMacReassoc(requestCureLevel);
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_)).WillRepeatedly(Return(WIFI_OPT_FAILED));
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_, _)).WillRepeatedly(Return(WIFI_OPT_FAILED));
pSelfCureStateMachine->pInternetSelfCureState->SelfCureForRandMacReassoc(requestCureLevel);
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_)).WillRepeatedly(Return(WIFI_OPT_SUCCESS));
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_, _)).WillRepeatedly(Return(WIFI_OPT_SUCCESS));
pSelfCureStateMachine->pInternetSelfCureState->SelfCureForRandMacReassoc(requestCureLevel);
}
@ -1049,10 +1049,10 @@ public:
pSelfCureStateMachine->useWithRandMacAddress = FAC_MAC_REASSOC;
pSelfCureStateMachine->pInternetSelfCureState->HandleSelfCureFailedForRandMacReassoc();
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_)).WillRepeatedly(Return(WIFI_OPT_FAILED));
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_, _)).WillRepeatedly(Return(WIFI_OPT_FAILED));
pSelfCureStateMachine->pInternetSelfCureState->HandleSelfCureFailedForRandMacReassoc();
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_)).WillRepeatedly(Return(WIFI_OPT_SUCCESS));
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_, _)).WillRepeatedly(Return(WIFI_OPT_SUCCESS));
pSelfCureStateMachine->pInternetSelfCureState->HandleSelfCureFailedForRandMacReassoc();
pSelfCureStateMachine->useWithRandMacAddress = RAND_MAC_REASSOC;
@ -1529,10 +1529,10 @@ public:
Return(MODE_STATE_CLOSE));
pSelfCureStateMachine->pDisconnectedMonitorState->HandleResetConnectNetwork(msg);
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_)).WillRepeatedly(Return(WIFI_OPT_FAILED));
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_, _)).WillRepeatedly(Return(WIFI_OPT_FAILED));
pSelfCureStateMachine->pDisconnectedMonitorState->HandleResetConnectNetwork(msg);
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_)).WillRepeatedly(Return(WIFI_OPT_SUCCESS));
EXPECT_CALL(*pMockStaService, ConnectToNetwork(_, _)).WillRepeatedly(Return(WIFI_OPT_SUCCESS));
pSelfCureStateMachine->pDisconnectedMonitorState->HandleResetConnectNetwork(msg);
}

View File

@ -93,14 +93,14 @@ public:
void ConnectToNetworkIdSuceess()
{
int networkId = 0;
EXPECT_CALL(*pMockStaService, ConnectToNetwork(networkId)).WillRepeatedly(Return(WIFI_OPT_SUCCESS));
EXPECT_CALL(*pMockStaService, ConnectToNetwork(networkId, _)).WillRepeatedly(Return(WIFI_OPT_SUCCESS));
EXPECT_TRUE(pStaInterface->ConnectToNetwork(0) == WIFI_OPT_SUCCESS);
}
void ConnectToNetworkIdFail1()
{
int networkId = 0;
EXPECT_CALL(*pMockStaService, ConnectToNetwork(networkId)).WillRepeatedly(Return(WIFI_OPT_FAILED));
EXPECT_CALL(*pMockStaService, ConnectToNetwork(networkId, _)).WillRepeatedly(Return(WIFI_OPT_FAILED));
EXPECT_TRUE(pStaInterface->ConnectToNetwork(0) == WIFI_OPT_FAILED);
}

View File

@ -1,158 +1,160 @@
# Copyright (C) 2021-2023 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//build/test.gni")
import("//foundation/communication/wifi/wifi/wifi.gni")
################################################################################
module_output_path = "wifi/wifi_sta_new_test"
config("module_private_config") {
visibility = [ ":*" ]
include_dirs = []
}
ohos_unittest("wifi_sta_new_unittest") {
module_out_path = module_output_path
sources = [
"$WIFI_ROOT_DIR/frameworks/native/src/network_selection.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/external_wifi_common_builder_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/external_wifi_filter_builder_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selection_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selection_utils.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selector_factory.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selector_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_comparator_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_filter_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_scorer_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_status_history_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_app_acceleration.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_monitor.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_saved_device_appraisal.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_native/Mock/mock_wifi_sta_hal_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_native/Mock/mock_wifi_supplicant_hal_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta/Mock/mock_if_config.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta/Mock/mock_wifi_settings.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock/mock_wifi_config_center.cpp",
"network_status_history_manager_test.cpp",
"sta_app_acceleration_test.cpp",
"sta_auto_connect_service_test.cpp",
"sta_interface_test.cpp",
"sta_monitor_test.cpp",
"wifi_scorer_impl_test.cpp",
]
include_dirs = [
"$WIFI_ROOT_DIR/interfaces/inner_api",
"$WIFI_ROOT_DIR/frameworks/native/interfaces",
"$WIFI_ROOT_DIR/services/wifi_standard/sdk/include",
"$WIFI_ROOT_DIR/base/cRPC/include",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/include",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/net_helper",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/log",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/config",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/utils",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta/Mock",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/common",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/wifi_hal_interface",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/client/idl_client",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/client/idl_client/idl_interface",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/net_conf",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/hardware/libhardware/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/frameworks/native/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/libutils/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/base/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/libbase/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/libnetutils/include/netutils",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_country_code",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_network_stats",
"//third_party/googletest/googlemock/include",
"//third_party/googletest/googletest/include",
"$WIFI_ROOT_DIR/services/wifi_standard/include",
"$WIFI_ROOT_DIR/utils/inc",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/unittest/Mock",
"$WIFI_ROOT_DIR/base/utils",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/app_network_speed_limit",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_native/Mock",
]
deps = [
"$WIFI_ROOT_DIR/base:wifi_base",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage:wifi_manager_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common:wifi_common_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit:wifi_toolkit",
"$WIFI_ROOT_DIR/utils:wifi_utils",
"//third_party/googletest:gmock_main",
"//third_party/googletest:gtest_main",
]
deps += [
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage:wifi_device_ability",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage:wifi_hotspot_ability",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage:wifi_scan_ability",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native:wifi_native",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta:wifi_sta_service",
]
ldflags = [
"-fPIC",
"--coverage",
"-Wl,-E",
]
external_deps = [
"ability_base:want",
"ability_base:zuri",
"ability_runtime:ability_manager",
"ability_runtime:app_manager",
"ability_runtime:wantagent_innerkits",
"bundle_framework:appexecfwk_base",
"bundle_framework:appexecfwk_core",
"c_utils:utils",
"cellular_data:tel_cellular_data_api",
"core_service:tel_core_service_api",
"dhcp:dhcp_sdk",
"hilog:libhilog",
"init:libbegetutil",
"ipc:ipc_single",
"netmanager_base:net_conn_manager_if",
"time_service:time_client",
]
defines = [
"private = public",
"protected = public",
"SUPPORT_SCAN_CONTROL",
"SUPPORT_LOCAL_RANDOM_MAC",
]
part_name = "wifi"
subsystem_name = "communication"
testonly = true
}
# Copyright (C) 2021-2023 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//build/test.gni")
import("//foundation/communication/wifi/wifi/wifi.gni")
################################################################################
module_output_path = "wifi/wifi_sta_new_test"
config("module_private_config") {
visibility = [ ":*" ]
include_dirs = []
}
ohos_unittest("wifi_sta_new_unittest") {
module_out_path = module_output_path
sources = [
"$WIFI_ROOT_DIR/frameworks/native/src/network_selection.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/external_wifi_common_builder_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/external_wifi_filter_builder_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selection_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selection_utils.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selector_factory.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/network_selector_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_comparator_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_filter_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select/wifi_scorer_impl.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_status_history_manager.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_app_acceleration.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_auto_connect_service.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_interface.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_monitor.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_saved_device_appraisal.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.cpp",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_native/Mock/mock_wifi_sta_hal_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_native/Mock/mock_wifi_supplicant_hal_interface.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta/Mock/mock_if_config.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta/Mock/mock_wifi_settings.cpp",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock/mock_wifi_config_center.cpp",
"network_status_history_manager_test.cpp",
"sta_app_acceleration_test.cpp",
"sta_auto_connect_service_test.cpp",
"sta_interface_test.cpp",
"sta_monitor_test.cpp",
"wifi_scorer_impl_test.cpp",
]
include_dirs = [
"$WIFI_ROOT_DIR/interfaces/inner_api",
"$WIFI_ROOT_DIR/frameworks/native/interfaces",
"$WIFI_ROOT_DIR/services/wifi_standard/sdk/include",
"$WIFI_ROOT_DIR/base/cRPC/include",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/include",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/net_helper",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/log",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/config",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit/utils",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_scan",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_sta/Mock",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_toolkit/unittest/Mock",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/common",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/wifi_hal_interface",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/client/idl_client",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native/client/idl_client/idl_interface",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/net_conf",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_self_cure",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_pro",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_p2p",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/hardware/libhardware/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/frameworks/native/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/libutils/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/base/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/libbase/include",
"$WIFI_ROOT_DIR/services/wifi_standard/depends/include/system/core/libnetutils/include/netutils",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/network_select",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_country_code",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/network_black_list",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/wifi_network_stats",
"//third_party/googletest/googlemock/include",
"//third_party/googletest/googletest/include",
"$WIFI_ROOT_DIR/services/wifi_standard/include",
"$WIFI_ROOT_DIR/utils/inc",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/unittest/Mock",
"$WIFI_ROOT_DIR/base/utils",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common/app_network_speed_limit",
"$WIFI_ROOT_DIR/test/wifi_standard/wifi_framework/wifi_manage/wifi_native/Mock",
]
deps = [
"$WIFI_ROOT_DIR/base:wifi_base",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage:wifi_manager_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_common:wifi_common_service",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_toolkit:wifi_toolkit",
"$WIFI_ROOT_DIR/utils:wifi_utils",
"//third_party/googletest:gmock_main",
"//third_party/googletest:gtest_main",
]
deps += [
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage:wifi_device_ability",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage:wifi_hotspot_ability",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage:wifi_scan_ability",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_native:wifi_native",
"$WIFI_ROOT_DIR/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta:wifi_sta_service",
]
ldflags = [
"-fPIC",
"--coverage",
"-Wl,-E",
]
external_deps = [
"ability_base:want",
"ability_base:zuri",
"ability_runtime:ability_manager",
"ability_runtime:app_manager",
"ability_runtime:wantagent_innerkits",
"bundle_framework:appexecfwk_base",
"bundle_framework:appexecfwk_core",
"c_utils:utils",
"cellular_data:tel_cellular_data_api",
"core_service:tel_core_service_api",
"dhcp:dhcp_sdk",
"hilog:libhilog",
"init:libbegetutil",
"ipc:ipc_single",
"netmanager_base:net_conn_manager_if",
"time_service:time_client",
]
defines = [
"private = public",
"protected = public",
"SUPPORT_SCAN_CONTROL",
"SUPPORT_LOCAL_RANDOM_MAC",
]
part_name = "wifi"
subsystem_name = "communication"
testonly = true
}

View File

@ -25,6 +25,7 @@
#endif
#include "scan_interface.h"
#include "sta_interface.h"
#include "wifi_pro_interface.h"
#ifdef FEATURE_SELF_CURE_SUPPORT
#include "self_cure_interface.h"
#endif
@ -67,6 +68,14 @@ int WifiServiceManager::LoadStaService(const std::string &dlname, int instId, bo
return 0;
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
int32_t WifiServiceManager::LoadWifiProService(bool bCreate, int32_t instId)
{
WIFI_LOGI("WifiServiceManager::LoadWifiProService");
return 0;
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
int WifiServiceManager::LoadSelfCureService(const std::string &dlname, bool bCreate)
{
@ -115,6 +124,14 @@ IStaService *WifiServiceManager::GetStaServiceInst(int instId)
return nullptr;
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
IWifiProService *WifiServiceManager::GetWifiProServiceInst(int32_t instId)
{
WIFI_LOGD("WifiServiceManager::GetWifiProServiceInst, instId: %{public}d", instId);
return nullptr;
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
ISelfCureService *WifiServiceManager::GetSelfCureServiceInst(int instId)
{
@ -154,6 +171,14 @@ IEnhanceService *WifiServiceManager::GetEnhanceServiceInst()
return nullptr;
}
#ifdef FEATURE_WIFI_PRO_SUPPORT
NO_SANITIZE("cfi") int32_t WifiServiceManager::UnloadWifiProService(bool bPreLoad, int32_t instId)
{
WIFI_LOGI("WifiServiceManager::UnloadWifiProService, instId: %{public}d", instId);
return 0;
}
#endif
#ifdef FEATURE_SELF_CURE_SUPPORT
NO_SANITIZE("cfi") int WifiServiceManager::UnloadSelfCureService(bool bPreLoad, int instId)
{

View File

@ -29,35 +29,39 @@ public:
explicit WifiEventHandler(const std::string &threadName, const Callback &timeOutFunc = nullptr);
~WifiEventHandler();
/**
* @submit sync task to Handler
*
* @param Callback - Input task
* @return bool - true: submit success, false: submit failed
*/
/**
* @submit sync task to Handler
*
* @param Callback - Input task
* @return bool - true: submit success, false: submit failed
*/
bool PostSyncTask(const Callback &callback);
/**
* @submit Async task to Handler
*
* @param Callback - Input task
* @param delayTime - Wait delayTime ms excute task
* @return bool - true: submit success, false: submit failed
*/
/**
* @submit Async task to Handler
*
* @param Callback - Input task
* @param delayTime - Wait delayTime ms excute task
* @return bool - true: submit success, false: submit failed
*/
bool PostAsyncTask(const Callback &callback, int64_t delayTime = 0);
/**
* @submit Async task to Handler
*
* @param Callback - Input task
* @param name - Describer of task
* @param delayTime - Wait delayTime ms excute task
* @return bool - true: submit success, false: submit failed
*/
/**
* @submit Async task to Handler
*
* @param Callback - Input task
* @param name - Describer of task
* @param delayTime - Wait delayTime ms excute task
* @return bool - true: submit success, false: submit failed
*/
bool PostAsyncTask(const Callback &callback, const std::string &name, int64_t delayTime = 0);
/**
* @Remove Async task
*
* @param name - Describer of task
*/
/**
* @Remove Async task
*
* @param name - Describer of task
*/
void RemoveAsyncTask(const std::string &name);
/**

View File

@ -31,6 +31,7 @@ declare_args() {
wifi_feature_non_seperate_p2p = false
wifi_feature_non_hdf_driver = false
wifi_feature_with_local_random_mac = true
wifi_feature_wifi_pro_ctrl = true
if (defined(global_parts_info) &&
defined(global_parts_info.resourceschedule_efficiency_manager)) {
wifi_feature_with_app_frozen = true

View File

@ -29,6 +29,7 @@ declare_args() {
wifi_feature_with_hpf_supported = false
wifi_feature_with_hdi_wpa_supported = false
wifi_feature_with_vap_manager = false
wifi_feature_wifi_pro_ctrl = true
}
memory_optimization_cflags = [