1b1b8bc3fSopenharmony_ci/* 2b1b8bc3fSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 3b1b8bc3fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4b1b8bc3fSopenharmony_ci * you may not use this file except in compliance with the License. 5b1b8bc3fSopenharmony_ci * You may obtain a copy of the License at 6b1b8bc3fSopenharmony_ci * 7b1b8bc3fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8b1b8bc3fSopenharmony_ci * 9b1b8bc3fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10b1b8bc3fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11b1b8bc3fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b1b8bc3fSopenharmony_ci * See the License for the specific language governing permissions and 13b1b8bc3fSopenharmony_ci * limitations under the License. 14b1b8bc3fSopenharmony_ci */ 15b1b8bc3fSopenharmony_ci 16b1b8bc3fSopenharmony_ci#include <atomic> 17b1b8bc3fSopenharmony_ci#include <cinttypes> 18b1b8bc3fSopenharmony_ci 19b1b8bc3fSopenharmony_ci#include "broadcast_manager.h" 20b1b8bc3fSopenharmony_ci#include "net_manager_constants.h" 21b1b8bc3fSopenharmony_ci#include "net_mgr_log_wrapper.h" 22b1b8bc3fSopenharmony_ci#include "net_supplier.h" 23b1b8bc3fSopenharmony_ci 24b1b8bc3fSopenharmony_cinamespace OHOS { 25b1b8bc3fSopenharmony_cinamespace NetManagerStandard { 26b1b8bc3fSopenharmony_cinamespace { 27b1b8bc3fSopenharmony_ciconstexpr int32_t REG_OK = 0; 28b1b8bc3fSopenharmony_ciconstexpr const char *SIMID_IDENT_PREFIX = "simId"; 29b1b8bc3fSopenharmony_ci} 30b1b8bc3fSopenharmony_cistatic std::atomic<uint32_t> g_nextNetSupplierId = 0x03EB; 31b1b8bc3fSopenharmony_ci 32b1b8bc3fSopenharmony_ciNetSupplier::NetSupplier(NetBearType bearerType, const std::string &netSupplierIdent, const std::set<NetCap> &netCaps) 33b1b8bc3fSopenharmony_ci : netSupplierType_(bearerType), 34b1b8bc3fSopenharmony_ci netSupplierIdent_(netSupplierIdent), 35b1b8bc3fSopenharmony_ci netCaps_(netCaps), 36b1b8bc3fSopenharmony_ci supplierId_(g_nextNetSupplierId++) 37b1b8bc3fSopenharmony_ci{ 38b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_ = netCaps; 39b1b8bc3fSopenharmony_ci netAllCapabilities_.bearerTypes_.insert(bearerType); 40b1b8bc3fSopenharmony_ci ResetNetSupplier(); 41b1b8bc3fSopenharmony_ci InitNetScore(); 42b1b8bc3fSopenharmony_ci} 43b1b8bc3fSopenharmony_ci 44b1b8bc3fSopenharmony_cisptr<INetSupplierCallback> NetSupplier::GetSupplierCallback() 45b1b8bc3fSopenharmony_ci{ 46b1b8bc3fSopenharmony_ci return netController_; 47b1b8bc3fSopenharmony_ci} 48b1b8bc3fSopenharmony_ci 49b1b8bc3fSopenharmony_civoid NetSupplier::RegisterSupplierCallback(const sptr<INetSupplierCallback> &callback) 50b1b8bc3fSopenharmony_ci{ 51b1b8bc3fSopenharmony_ci netController_ = callback; 52b1b8bc3fSopenharmony_ci} 53b1b8bc3fSopenharmony_ci 54b1b8bc3fSopenharmony_civoid NetSupplier::InitNetScore() 55b1b8bc3fSopenharmony_ci{ 56b1b8bc3fSopenharmony_ci int32_t netScore = 0; 57b1b8bc3fSopenharmony_ci auto iter = netTypeScore_.find(netSupplierType_); 58b1b8bc3fSopenharmony_ci if (iter == netTypeScore_.end()) { 59b1b8bc3fSopenharmony_ci NETMGR_LOG_E("Can not find net bearer type[%{public}d] for this net service", netSupplierType_); 60b1b8bc3fSopenharmony_ci return; 61b1b8bc3fSopenharmony_ci } 62b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Net type[%{public}d],default score[%{public}d]", 63b1b8bc3fSopenharmony_ci static_cast<int32_t>(iter->first), static_cast<int32_t>(iter->second)); 64b1b8bc3fSopenharmony_ci netScore = static_cast<int32_t>(iter->second); 65b1b8bc3fSopenharmony_ci netScore_ = netScore; 66b1b8bc3fSopenharmony_ci NETMGR_LOG_D("netScore_ = %{public}d", netScore_); 67b1b8bc3fSopenharmony_ci} 68b1b8bc3fSopenharmony_ci 69b1b8bc3fSopenharmony_ci/** 70b1b8bc3fSopenharmony_ci * Reset all attributes that may change in the supplier, such as detection progress and network quality. 71b1b8bc3fSopenharmony_ci */ 72b1b8bc3fSopenharmony_civoid NetSupplier::ResetNetSupplier() 73b1b8bc3fSopenharmony_ci{ 74b1b8bc3fSopenharmony_ci // Reset network quality. 75b1b8bc3fSopenharmony_ci netQuality_ = QUALITY_NORMAL_STATE; 76b1b8bc3fSopenharmony_ci // Reset network detection progress. 77b1b8bc3fSopenharmony_ci isFirstTimeDetectionDone = false; 78b1b8bc3fSopenharmony_ci //Reset User Selection 79b1b8bc3fSopenharmony_ci isAcceptUnvaliad = false; 80b1b8bc3fSopenharmony_ci // Reset network capabilities for checking connectivity finished flag. 81b1b8bc3fSopenharmony_ci netCaps_.InsertNetCap(NET_CAPABILITY_CHECKING_CONNECTIVITY); 82b1b8bc3fSopenharmony_ci // Reset network verification status to validated. 83b1b8bc3fSopenharmony_ci SetNetValid(VERIFICATION_STATE); 84b1b8bc3fSopenharmony_ci // Reset checking connectivity flag. 85b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_.insert(NET_CAPABILITY_CHECKING_CONNECTIVITY); 86b1b8bc3fSopenharmony_ci NETMGR_LOG_I("Reset net supplier %{public}u", supplierId_); 87b1b8bc3fSopenharmony_ci} 88b1b8bc3fSopenharmony_ci 89b1b8bc3fSopenharmony_cibool NetSupplier::operator==(const NetSupplier &netSupplier) const 90b1b8bc3fSopenharmony_ci{ 91b1b8bc3fSopenharmony_ci return supplierId_ == netSupplier.supplierId_ && netSupplierType_ == netSupplier.netSupplierType_ && 92b1b8bc3fSopenharmony_ci netSupplierIdent_ == netSupplier.netSupplierIdent_ && netCaps_ == netSupplier.netCaps_; 93b1b8bc3fSopenharmony_ci} 94b1b8bc3fSopenharmony_ci 95b1b8bc3fSopenharmony_civoid NetSupplier::UpdateNetSupplierInfo(const NetSupplierInfo &netSupplierInfo) 96b1b8bc3fSopenharmony_ci{ 97b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Update net supplier[%{public}d, %{public}s], netSupplierInfo[%{public}s]", supplierId_, 98b1b8bc3fSopenharmony_ci netSupplierIdent_.c_str(), netSupplierInfo_.ToString("").c_str()); 99b1b8bc3fSopenharmony_ci bool oldAvailable = netSupplierInfo_.isAvailable_; 100b1b8bc3fSopenharmony_ci netSupplierInfo_ = netSupplierInfo; 101b1b8bc3fSopenharmony_ci netAllCapabilities_.linkUpBandwidthKbps_ = netSupplierInfo_.linkUpBandwidthKbps_; 102b1b8bc3fSopenharmony_ci netAllCapabilities_.linkDownBandwidthKbps_ = netSupplierInfo_.linkDownBandwidthKbps_; 103b1b8bc3fSopenharmony_ci if (!netSupplierInfo_.ident_.empty()) { 104b1b8bc3fSopenharmony_ci netSupplierIdent_ = netSupplierInfo_.ident_; 105b1b8bc3fSopenharmony_ci } 106b1b8bc3fSopenharmony_ci if (netSupplierInfo_.score_ != 0) { 107b1b8bc3fSopenharmony_ci netScore_ = netSupplierInfo_.score_; 108b1b8bc3fSopenharmony_ci } 109b1b8bc3fSopenharmony_ci if (oldAvailable == netSupplierInfo_.isAvailable_) { 110b1b8bc3fSopenharmony_ci NETMGR_LOG_W("Same supplier available status:[%{public}d]", oldAvailable); 111b1b8bc3fSopenharmony_ci return; 112b1b8bc3fSopenharmony_ci } 113b1b8bc3fSopenharmony_ci if (network_ == nullptr) { 114b1b8bc3fSopenharmony_ci NETMGR_LOG_E("network_ is nullptr!"); 115b1b8bc3fSopenharmony_ci return; 116b1b8bc3fSopenharmony_ci } 117b1b8bc3fSopenharmony_ci network_->UpdateBasicNetwork(netSupplierInfo_.isAvailable_); 118b1b8bc3fSopenharmony_ci if (!netSupplierInfo_.isAvailable_) { 119b1b8bc3fSopenharmony_ci UpdateNetConnState(NET_CONN_STATE_DISCONNECTED); 120b1b8bc3fSopenharmony_ci } 121b1b8bc3fSopenharmony_ci} 122b1b8bc3fSopenharmony_ci 123b1b8bc3fSopenharmony_ciint32_t NetSupplier::UpdateNetLinkInfo(NetLinkInfo &netLinkInfo) 124b1b8bc3fSopenharmony_ci{ 125b1b8bc3fSopenharmony_ci if (network_ == nullptr) { 126b1b8bc3fSopenharmony_ci NETMGR_LOG_E("network_ is nullptr!"); 127b1b8bc3fSopenharmony_ci return NET_CONN_ERR_INVALID_NETWORK; 128b1b8bc3fSopenharmony_ci } 129b1b8bc3fSopenharmony_ci 130b1b8bc3fSopenharmony_ci if (GetNetSupplierIdent().substr(0, strlen(SIMID_IDENT_PREFIX)) == SIMID_IDENT_PREFIX) { 131b1b8bc3fSopenharmony_ci netLinkInfo.ident_ = GetNetSupplierIdent().substr(strlen(SIMID_IDENT_PREFIX)); 132b1b8bc3fSopenharmony_ci } 133b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Update netlink info: netLinkInfo[%{public}s]", netLinkInfo.ToString(" ").c_str()); 134b1b8bc3fSopenharmony_ci if (!network_->UpdateNetLinkInfo(netLinkInfo)) { 135b1b8bc3fSopenharmony_ci return NET_CONN_ERR_SERVICE_UPDATE_NET_LINK_INFO_FAIL; 136b1b8bc3fSopenharmony_ci } 137b1b8bc3fSopenharmony_ci UpdateNetConnState(NET_CONN_STATE_CONNECTED); 138b1b8bc3fSopenharmony_ci return NETMANAGER_SUCCESS; 139b1b8bc3fSopenharmony_ci} 140b1b8bc3fSopenharmony_ci 141b1b8bc3fSopenharmony_ciNetBearType NetSupplier::GetNetSupplierType() const 142b1b8bc3fSopenharmony_ci{ 143b1b8bc3fSopenharmony_ci return netSupplierType_; 144b1b8bc3fSopenharmony_ci} 145b1b8bc3fSopenharmony_ci 146b1b8bc3fSopenharmony_cistd::string NetSupplier::GetNetSupplierIdent() const 147b1b8bc3fSopenharmony_ci{ 148b1b8bc3fSopenharmony_ci return netSupplierIdent_; 149b1b8bc3fSopenharmony_ci} 150b1b8bc3fSopenharmony_ci 151b1b8bc3fSopenharmony_cibool NetSupplier::CompareNetCaps(const std::set<NetCap> caps) const 152b1b8bc3fSopenharmony_ci{ 153b1b8bc3fSopenharmony_ci if (caps.empty()) { 154b1b8bc3fSopenharmony_ci return true; 155b1b8bc3fSopenharmony_ci } 156b1b8bc3fSopenharmony_ci return netCaps_.HasNetCaps(caps); 157b1b8bc3fSopenharmony_ci} 158b1b8bc3fSopenharmony_ci 159b1b8bc3fSopenharmony_cibool NetSupplier::HasNetCap(NetCap cap) const 160b1b8bc3fSopenharmony_ci{ 161b1b8bc3fSopenharmony_ci return netCaps_.HasNetCap(cap); 162b1b8bc3fSopenharmony_ci} 163b1b8bc3fSopenharmony_ci 164b1b8bc3fSopenharmony_cibool NetSupplier::HasNetCaps(const std::set<NetCap> &caps) const 165b1b8bc3fSopenharmony_ci{ 166b1b8bc3fSopenharmony_ci return netCaps_.HasNetCaps(caps); 167b1b8bc3fSopenharmony_ci} 168b1b8bc3fSopenharmony_ci 169b1b8bc3fSopenharmony_ciconst NetCaps &NetSupplier::GetNetCaps() const 170b1b8bc3fSopenharmony_ci{ 171b1b8bc3fSopenharmony_ci return netCaps_; 172b1b8bc3fSopenharmony_ci} 173b1b8bc3fSopenharmony_ci 174b1b8bc3fSopenharmony_ciNetAllCapabilities NetSupplier::GetNetCapabilities() const 175b1b8bc3fSopenharmony_ci{ 176b1b8bc3fSopenharmony_ci return netAllCapabilities_; 177b1b8bc3fSopenharmony_ci} 178b1b8bc3fSopenharmony_ci 179b1b8bc3fSopenharmony_civoid NetSupplier::SetNetwork(const std::shared_ptr<Network> &network) 180b1b8bc3fSopenharmony_ci{ 181b1b8bc3fSopenharmony_ci network_ = network; 182b1b8bc3fSopenharmony_ci if (network_ != nullptr) { 183b1b8bc3fSopenharmony_ci netHandle_ = std::make_unique<NetHandle>(network_->GetNetId()).release(); 184b1b8bc3fSopenharmony_ci } 185b1b8bc3fSopenharmony_ci} 186b1b8bc3fSopenharmony_ci 187b1b8bc3fSopenharmony_cistd::shared_ptr<Network> NetSupplier::GetNetwork() const 188b1b8bc3fSopenharmony_ci{ 189b1b8bc3fSopenharmony_ci return network_; 190b1b8bc3fSopenharmony_ci} 191b1b8bc3fSopenharmony_ci 192b1b8bc3fSopenharmony_ciint32_t NetSupplier::GetNetId() const 193b1b8bc3fSopenharmony_ci{ 194b1b8bc3fSopenharmony_ci if (network_ == nullptr) { 195b1b8bc3fSopenharmony_ci return INVALID_NET_ID; 196b1b8bc3fSopenharmony_ci } 197b1b8bc3fSopenharmony_ci return network_->GetNetId(); 198b1b8bc3fSopenharmony_ci} 199b1b8bc3fSopenharmony_ci 200b1b8bc3fSopenharmony_cisptr<NetHandle> NetSupplier::GetNetHandle() const 201b1b8bc3fSopenharmony_ci{ 202b1b8bc3fSopenharmony_ci return netHandle_; 203b1b8bc3fSopenharmony_ci} 204b1b8bc3fSopenharmony_ci 205b1b8bc3fSopenharmony_civoid NetSupplier::GetHttpProxy(HttpProxy &httpProxy) 206b1b8bc3fSopenharmony_ci{ 207b1b8bc3fSopenharmony_ci if (network_ == nullptr) { 208b1b8bc3fSopenharmony_ci NETMGR_LOG_E("network_ is nullptr."); 209b1b8bc3fSopenharmony_ci return; 210b1b8bc3fSopenharmony_ci } 211b1b8bc3fSopenharmony_ci httpProxy = network_->GetNetLinkInfo().httpProxy_; 212b1b8bc3fSopenharmony_ci} 213b1b8bc3fSopenharmony_ci 214b1b8bc3fSopenharmony_ciuint32_t NetSupplier::GetSupplierId() const 215b1b8bc3fSopenharmony_ci{ 216b1b8bc3fSopenharmony_ci return supplierId_; 217b1b8bc3fSopenharmony_ci} 218b1b8bc3fSopenharmony_ci 219b1b8bc3fSopenharmony_cibool NetSupplier::GetRoaming() const 220b1b8bc3fSopenharmony_ci{ 221b1b8bc3fSopenharmony_ci return netSupplierInfo_.isRoaming_; 222b1b8bc3fSopenharmony_ci} 223b1b8bc3fSopenharmony_ci 224b1b8bc3fSopenharmony_ciint8_t NetSupplier::GetStrength() const 225b1b8bc3fSopenharmony_ci{ 226b1b8bc3fSopenharmony_ci return netSupplierInfo_.strength_; 227b1b8bc3fSopenharmony_ci} 228b1b8bc3fSopenharmony_ci 229b1b8bc3fSopenharmony_ciuint16_t NetSupplier::GetFrequency() const 230b1b8bc3fSopenharmony_ci{ 231b1b8bc3fSopenharmony_ci return netSupplierInfo_.frequency_; 232b1b8bc3fSopenharmony_ci} 233b1b8bc3fSopenharmony_ci 234b1b8bc3fSopenharmony_ciint32_t NetSupplier::GetSupplierUid() const 235b1b8bc3fSopenharmony_ci{ 236b1b8bc3fSopenharmony_ci return netSupplierInfo_.uid_; 237b1b8bc3fSopenharmony_ci} 238b1b8bc3fSopenharmony_ci 239b1b8bc3fSopenharmony_ciint32_t NetSupplier::GetUid() const 240b1b8bc3fSopenharmony_ci{ 241b1b8bc3fSopenharmony_ci return uid_; 242b1b8bc3fSopenharmony_ci} 243b1b8bc3fSopenharmony_ci 244b1b8bc3fSopenharmony_civoid NetSupplier::SetUid(int32_t uid) 245b1b8bc3fSopenharmony_ci{ 246b1b8bc3fSopenharmony_ci uid_ = uid; 247b1b8bc3fSopenharmony_ci} 248b1b8bc3fSopenharmony_ci 249b1b8bc3fSopenharmony_cibool NetSupplier::IsAvailable() const 250b1b8bc3fSopenharmony_ci{ 251b1b8bc3fSopenharmony_ci return netSupplierInfo_.isAvailable_; 252b1b8bc3fSopenharmony_ci} 253b1b8bc3fSopenharmony_ci 254b1b8bc3fSopenharmony_cibool NetSupplier::SupplierConnection(const std::set<NetCap> &netCaps, const NetRequest &netRequest) 255b1b8bc3fSopenharmony_ci{ 256b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Supplier[%{public}d, %{public}s] request connect, available=%{public}d", supplierId_, 257b1b8bc3fSopenharmony_ci netSupplierIdent_.c_str(), netSupplierInfo_.isAvailable_); 258b1b8bc3fSopenharmony_ci if (netSupplierInfo_.isAvailable_ && netRequest.ident.empty()) { 259b1b8bc3fSopenharmony_ci NETMGR_LOG_D("The supplier is currently available, there is no need to repeat the request for connection."); 260b1b8bc3fSopenharmony_ci return true; 261b1b8bc3fSopenharmony_ci } 262b1b8bc3fSopenharmony_ci UpdateNetConnState(NET_CONN_STATE_IDLE); 263b1b8bc3fSopenharmony_ci 264b1b8bc3fSopenharmony_ci if (netController_ == nullptr) { 265b1b8bc3fSopenharmony_ci NETMGR_LOG_E("netController_ is nullptr"); 266b1b8bc3fSopenharmony_ci return false; 267b1b8bc3fSopenharmony_ci } 268b1b8bc3fSopenharmony_ci NETMGR_LOG_D("execute RequestNetwork"); 269b1b8bc3fSopenharmony_ci int32_t errCode = netController_->RequestNetwork(netSupplierIdent_, netCaps, netRequest); 270b1b8bc3fSopenharmony_ci NETMGR_LOG_D("RequestNetwork errCode[%{public}d]", errCode); 271b1b8bc3fSopenharmony_ci if (errCode != REG_OK) { 272b1b8bc3fSopenharmony_ci NETMGR_LOG_E("RequestNetwork fail"); 273b1b8bc3fSopenharmony_ci return false; 274b1b8bc3fSopenharmony_ci } 275b1b8bc3fSopenharmony_ci return true; 276b1b8bc3fSopenharmony_ci} 277b1b8bc3fSopenharmony_ci 278b1b8bc3fSopenharmony_civoid NetSupplier::SetRestrictBackground(bool restrictBackground) 279b1b8bc3fSopenharmony_ci{ 280b1b8bc3fSopenharmony_ci restrictBackground_ = restrictBackground; 281b1b8bc3fSopenharmony_ci} 282b1b8bc3fSopenharmony_cibool NetSupplier::GetRestrictBackground() const 283b1b8bc3fSopenharmony_ci{ 284b1b8bc3fSopenharmony_ci return restrictBackground_; 285b1b8bc3fSopenharmony_ci} 286b1b8bc3fSopenharmony_ci 287b1b8bc3fSopenharmony_cibool NetSupplier::SupplierDisconnection(const std::set<NetCap> &netCaps) 288b1b8bc3fSopenharmony_ci{ 289b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Supplier[%{public}d, %{public}s] request disconnect, available=%{public}d", supplierId_, 290b1b8bc3fSopenharmony_ci netSupplierIdent_.c_str(), netSupplierInfo_.isAvailable_); 291b1b8bc3fSopenharmony_ci if (!netSupplierInfo_.isAvailable_) { 292b1b8bc3fSopenharmony_ci NETMGR_LOG_D("The supplier is currently unavailable, there is no need to repeat the request to disconnect."); 293b1b8bc3fSopenharmony_ci return true; 294b1b8bc3fSopenharmony_ci } 295b1b8bc3fSopenharmony_ci if (netController_ == nullptr) { 296b1b8bc3fSopenharmony_ci NETMGR_LOG_E("netController_ is nullptr"); 297b1b8bc3fSopenharmony_ci return false; 298b1b8bc3fSopenharmony_ci } 299b1b8bc3fSopenharmony_ci NETMGR_LOG_D("execute ReleaseNetwork, supplierId[%{public}d]", supplierId_); 300b1b8bc3fSopenharmony_ci int32_t errCode = netController_->ReleaseNetwork(netSupplierIdent_, netCaps); 301b1b8bc3fSopenharmony_ci NETMGR_LOG_D("ReleaseNetwork retCode[%{public}d]", errCode); 302b1b8bc3fSopenharmony_ci if (errCode != REG_OK) { 303b1b8bc3fSopenharmony_ci NETMGR_LOG_E("ReleaseNetwork fail"); 304b1b8bc3fSopenharmony_ci return false; 305b1b8bc3fSopenharmony_ci } 306b1b8bc3fSopenharmony_ci return true; 307b1b8bc3fSopenharmony_ci} 308b1b8bc3fSopenharmony_ci 309b1b8bc3fSopenharmony_civoid NetSupplier::UpdateNetConnState(NetConnState netConnState) 310b1b8bc3fSopenharmony_ci{ 311b1b8bc3fSopenharmony_ci if (network_) { 312b1b8bc3fSopenharmony_ci network_->UpdateNetConnState(netConnState); 313b1b8bc3fSopenharmony_ci } 314b1b8bc3fSopenharmony_ci} 315b1b8bc3fSopenharmony_ci 316b1b8bc3fSopenharmony_cibool NetSupplier::IsConnecting() const 317b1b8bc3fSopenharmony_ci{ 318b1b8bc3fSopenharmony_ci if (network_) { 319b1b8bc3fSopenharmony_ci return network_->IsConnecting(); 320b1b8bc3fSopenharmony_ci } 321b1b8bc3fSopenharmony_ci return false; 322b1b8bc3fSopenharmony_ci} 323b1b8bc3fSopenharmony_ci 324b1b8bc3fSopenharmony_cibool NetSupplier::IsConnected() const 325b1b8bc3fSopenharmony_ci{ 326b1b8bc3fSopenharmony_ci if (network_) { 327b1b8bc3fSopenharmony_ci return network_->IsConnected(); 328b1b8bc3fSopenharmony_ci } 329b1b8bc3fSopenharmony_ci return false; 330b1b8bc3fSopenharmony_ci} 331b1b8bc3fSopenharmony_ci 332b1b8bc3fSopenharmony_cibool NetSupplier::RequestToConnect(const NetRequest &netrequest) 333b1b8bc3fSopenharmony_ci{ 334b1b8bc3fSopenharmony_ci if (requestList_.find(netrequest.requestId) == requestList_.end()) { 335b1b8bc3fSopenharmony_ci requestList_.insert(netrequest.requestId); 336b1b8bc3fSopenharmony_ci } 337b1b8bc3fSopenharmony_ci AddRequest(netrequest); 338b1b8bc3fSopenharmony_ci return SupplierConnection(netCaps_.ToSet(), netrequest); 339b1b8bc3fSopenharmony_ci} 340b1b8bc3fSopenharmony_ci 341b1b8bc3fSopenharmony_ciint32_t NetSupplier::SelectAsBestNetwork(const NetRequest &netrequest) 342b1b8bc3fSopenharmony_ci{ 343b1b8bc3fSopenharmony_ci NETMGR_LOG_I("Request[%{public}d] select [%{public}d, %{public}s] as best network", netrequest.requestId, 344b1b8bc3fSopenharmony_ci supplierId_, netSupplierIdent_.c_str()); 345b1b8bc3fSopenharmony_ci if (requestList_.find(netrequest.requestId) == requestList_.end()) { 346b1b8bc3fSopenharmony_ci requestList_.insert(netrequest.requestId); 347b1b8bc3fSopenharmony_ci } 348b1b8bc3fSopenharmony_ci if (bestReqList_.find(netrequest.requestId) == bestReqList_.end()) { 349b1b8bc3fSopenharmony_ci bestReqList_.insert(netrequest.requestId); 350b1b8bc3fSopenharmony_ci } 351b1b8bc3fSopenharmony_ci AddRequest(netrequest); 352b1b8bc3fSopenharmony_ci return NETMANAGER_SUCCESS; 353b1b8bc3fSopenharmony_ci} 354b1b8bc3fSopenharmony_ci 355b1b8bc3fSopenharmony_civoid NetSupplier::ReceiveBestScore(int32_t bestScore, uint32_t supplierId, const NetRequest &netrequest) 356b1b8bc3fSopenharmony_ci{ 357b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Supplier[%{public}d, %{public}s] receive best score, bestSupplierId[%{public}d]", supplierId_, 358b1b8bc3fSopenharmony_ci netSupplierIdent_.c_str(), supplierId); 359b1b8bc3fSopenharmony_ci if (supplierId == supplierId_) { 360b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Same net supplier, no need to disconnect."); 361b1b8bc3fSopenharmony_ci return; 362b1b8bc3fSopenharmony_ci } 363b1b8bc3fSopenharmony_ci if (requestList_.empty()) { 364b1b8bc3fSopenharmony_ci SupplierDisconnection(netCaps_.ToSet()); 365b1b8bc3fSopenharmony_ci return; 366b1b8bc3fSopenharmony_ci } 367b1b8bc3fSopenharmony_ci if (requestList_.find(netrequest.requestId) == requestList_.end()) { 368b1b8bc3fSopenharmony_ci NETMGR_LOG_W("Can not find request[%{public}d]", netrequest.requestId); 369b1b8bc3fSopenharmony_ci return; 370b1b8bc3fSopenharmony_ci } 371b1b8bc3fSopenharmony_ci if (netScore_ >= bestScore) { 372b1b8bc3fSopenharmony_ci NETMGR_LOG_D("High priority network, no need to disconnect"); 373b1b8bc3fSopenharmony_ci return; 374b1b8bc3fSopenharmony_ci } 375b1b8bc3fSopenharmony_ci requestList_.erase(netrequest.requestId); 376b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Supplier[%{public}d, %{public}s] remaining request list size[%{public}zd]", supplierId_, 377b1b8bc3fSopenharmony_ci netSupplierIdent_.c_str(), requestList_.size()); 378b1b8bc3fSopenharmony_ci if (requestList_.empty()) { 379b1b8bc3fSopenharmony_ci SupplierDisconnection(netCaps_.ToSet()); 380b1b8bc3fSopenharmony_ci } 381b1b8bc3fSopenharmony_ci RemoveRequest(netrequest); 382b1b8bc3fSopenharmony_ci} 383b1b8bc3fSopenharmony_ci 384b1b8bc3fSopenharmony_ciint32_t NetSupplier::CancelRequest(const NetRequest &netrequest) 385b1b8bc3fSopenharmony_ci{ 386b1b8bc3fSopenharmony_ci auto iter = requestList_.find(netrequest.requestId); 387b1b8bc3fSopenharmony_ci if (iter == requestList_.end()) { 388b1b8bc3fSopenharmony_ci return NET_CONN_ERR_SERVICE_NO_REQUEST; 389b1b8bc3fSopenharmony_ci } 390b1b8bc3fSopenharmony_ci NETMGR_LOG_I("CancelRequest requestId:%{public}u", netrequest.requestId); 391b1b8bc3fSopenharmony_ci requestList_.erase(netrequest.requestId); 392b1b8bc3fSopenharmony_ci if (requestList_.empty()) { 393b1b8bc3fSopenharmony_ci SupplierDisconnection(netCaps_.ToSet()); 394b1b8bc3fSopenharmony_ci } 395b1b8bc3fSopenharmony_ci bestReqList_.erase(netrequest.requestId); 396b1b8bc3fSopenharmony_ci RemoveRequest(netrequest); 397b1b8bc3fSopenharmony_ci return NETMANAGER_SUCCESS; 398b1b8bc3fSopenharmony_ci} 399b1b8bc3fSopenharmony_ci 400b1b8bc3fSopenharmony_civoid NetSupplier::AddRequest(const NetRequest &netRequest) 401b1b8bc3fSopenharmony_ci{ 402b1b8bc3fSopenharmony_ci if (netController_ == nullptr) { 403b1b8bc3fSopenharmony_ci NETMGR_LOG_E("netController_ is nullptr"); 404b1b8bc3fSopenharmony_ci return; 405b1b8bc3fSopenharmony_ci } 406b1b8bc3fSopenharmony_ci NetRequest request; 407b1b8bc3fSopenharmony_ci request.uid = netRequest.uid; 408b1b8bc3fSopenharmony_ci request.ident = netSupplierIdent_; 409b1b8bc3fSopenharmony_ci request.netCaps = netCaps_.ToSet(); 410b1b8bc3fSopenharmony_ci NETMGR_LOG_D("execute AddRequest"); 411b1b8bc3fSopenharmony_ci int32_t errCode = netController_->AddRequest(request); 412b1b8bc3fSopenharmony_ci NETMGR_LOG_D("AddRequest errCode[%{public}d]", errCode); 413b1b8bc3fSopenharmony_ci if (errCode != REG_OK) { 414b1b8bc3fSopenharmony_ci NETMGR_LOG_E("AddRequest fail"); 415b1b8bc3fSopenharmony_ci return; 416b1b8bc3fSopenharmony_ci } 417b1b8bc3fSopenharmony_ci return; 418b1b8bc3fSopenharmony_ci} 419b1b8bc3fSopenharmony_ci 420b1b8bc3fSopenharmony_civoid NetSupplier::RemoveRequest(const NetRequest &netrequest) 421b1b8bc3fSopenharmony_ci{ 422b1b8bc3fSopenharmony_ci if (netController_ == nullptr) { 423b1b8bc3fSopenharmony_ci NETMGR_LOG_E("netController_ is nullptr"); 424b1b8bc3fSopenharmony_ci return; 425b1b8bc3fSopenharmony_ci } 426b1b8bc3fSopenharmony_ci NetRequest request; 427b1b8bc3fSopenharmony_ci request.uid = netrequest.uid; 428b1b8bc3fSopenharmony_ci request.ident = netSupplierIdent_; 429b1b8bc3fSopenharmony_ci request.netCaps = netCaps_.ToSet(); 430b1b8bc3fSopenharmony_ci NETMGR_LOG_D("execute RemoveRequest"); 431b1b8bc3fSopenharmony_ci int32_t errCode = netController_->RemoveRequest(request); 432b1b8bc3fSopenharmony_ci NETMGR_LOG_D("RemoveRequest errCode[%{public}d]", errCode); 433b1b8bc3fSopenharmony_ci if (errCode != REG_OK) { 434b1b8bc3fSopenharmony_ci NETMGR_LOG_E("RemoveRequest fail"); 435b1b8bc3fSopenharmony_ci return; 436b1b8bc3fSopenharmony_ci } 437b1b8bc3fSopenharmony_ci return; 438b1b8bc3fSopenharmony_ci} 439b1b8bc3fSopenharmony_ci 440b1b8bc3fSopenharmony_civoid NetSupplier::RemoveBestRequest(uint32_t reqId) 441b1b8bc3fSopenharmony_ci{ 442b1b8bc3fSopenharmony_ci auto iter = bestReqList_.find(reqId); 443b1b8bc3fSopenharmony_ci if (iter == bestReqList_.end()) { 444b1b8bc3fSopenharmony_ci return; 445b1b8bc3fSopenharmony_ci } 446b1b8bc3fSopenharmony_ci bestReqList_.erase(reqId); 447b1b8bc3fSopenharmony_ci NETMGR_LOG_I("RemoveBestRequest supplierId=[%{public}d], reqId=[%{public}u]", supplierId_, reqId); 448b1b8bc3fSopenharmony_ci} 449b1b8bc3fSopenharmony_ci 450b1b8bc3fSopenharmony_cistd::set<uint32_t> &NetSupplier::GetBestRequestList() 451b1b8bc3fSopenharmony_ci{ 452b1b8bc3fSopenharmony_ci return bestReqList_; 453b1b8bc3fSopenharmony_ci} 454b1b8bc3fSopenharmony_ci 455b1b8bc3fSopenharmony_civoid NetSupplier::SetNetValid(NetDetectionStatus netState) 456b1b8bc3fSopenharmony_ci{ 457b1b8bc3fSopenharmony_ci NETMGR_LOG_I("Enter SetNetValid. supplier[%{public}d, %{public}s], ifValid[%{public}d]", supplierId_, 458b1b8bc3fSopenharmony_ci netSupplierIdent_.c_str(), netState); 459b1b8bc3fSopenharmony_ci if (netState == VERIFICATION_STATE) { 460b1b8bc3fSopenharmony_ci if (!HasNetCap(NET_CAPABILITY_VALIDATED)) { 461b1b8bc3fSopenharmony_ci netCaps_.InsertNetCap(NET_CAPABILITY_VALIDATED); 462b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_.insert(NET_CAPABILITY_VALIDATED); 463b1b8bc3fSopenharmony_ci NETMGR_LOG_I("NetSupplier inserted cap:NET_CAPABILITY_VALIDATED"); 464b1b8bc3fSopenharmony_ci } 465b1b8bc3fSopenharmony_ci if (HasNetCap(NET_CAPABILITY_PORTAL)) { 466b1b8bc3fSopenharmony_ci netCaps_.RemoveNetCap(NET_CAPABILITY_PORTAL); 467b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_.erase(NET_CAPABILITY_PORTAL); 468b1b8bc3fSopenharmony_ci NETMGR_LOG_I("NetSupplier remove cap:NET_CAPABILITY_PORTAL"); 469b1b8bc3fSopenharmony_ci } 470b1b8bc3fSopenharmony_ci } else if (netState == CAPTIVE_PORTAL_STATE) { 471b1b8bc3fSopenharmony_ci if (!HasNetCap(NET_CAPABILITY_PORTAL)) { 472b1b8bc3fSopenharmony_ci netCaps_.InsertNetCap(NET_CAPABILITY_PORTAL); 473b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_.insert(NET_CAPABILITY_PORTAL); 474b1b8bc3fSopenharmony_ci NETMGR_LOG_I("NetSupplier inserted cap:NET_CAPABILITY_PORTAL"); 475b1b8bc3fSopenharmony_ci } 476b1b8bc3fSopenharmony_ci if (HasNetCap(NET_CAPABILITY_VALIDATED)) { 477b1b8bc3fSopenharmony_ci netCaps_.RemoveNetCap(NET_CAPABILITY_VALIDATED); 478b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_.erase(NET_CAPABILITY_VALIDATED); 479b1b8bc3fSopenharmony_ci NETMGR_LOG_I("NetSupplier remove cap:NET_CAPABILITY_VALIDATED"); 480b1b8bc3fSopenharmony_ci } 481b1b8bc3fSopenharmony_ci } else if (netState == QUALITY_POOR_STATE) { 482b1b8bc3fSopenharmony_ci netQuality_ = QUALITY_POOR_STATE; 483b1b8bc3fSopenharmony_ci } else if (netState == QUALITY_GOOD_STATE) { 484b1b8bc3fSopenharmony_ci netQuality_ = QUALITY_GOOD_STATE; 485b1b8bc3fSopenharmony_ci } else if (netState == ACCEPT_UNVALIDATED) { 486b1b8bc3fSopenharmony_ci netQuality_ = ACCEPT_UNVALIDATED; 487b1b8bc3fSopenharmony_ci isAcceptUnvaliad = true; 488b1b8bc3fSopenharmony_ci } else { 489b1b8bc3fSopenharmony_ci if (HasNetCap(NET_CAPABILITY_VALIDATED)) { 490b1b8bc3fSopenharmony_ci netCaps_.RemoveNetCap(NET_CAPABILITY_VALIDATED); 491b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_.erase(NET_CAPABILITY_VALIDATED); 492b1b8bc3fSopenharmony_ci NETMGR_LOG_I("NetSupplier remove cap:NET_CAPABILITY_VALIDATED"); 493b1b8bc3fSopenharmony_ci } 494b1b8bc3fSopenharmony_ci if (HasNetCap(NET_CAPABILITY_PORTAL)) { 495b1b8bc3fSopenharmony_ci netCaps_.RemoveNetCap(NET_CAPABILITY_PORTAL); 496b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_.erase(NET_CAPABILITY_PORTAL); 497b1b8bc3fSopenharmony_ci NETMGR_LOG_I("NetSupplier remove cap:NET_CAPABILITY_PORTAL"); 498b1b8bc3fSopenharmony_ci } 499b1b8bc3fSopenharmony_ci } 500b1b8bc3fSopenharmony_ci} 501b1b8bc3fSopenharmony_ci 502b1b8bc3fSopenharmony_cibool NetSupplier::IsNetValidated() const 503b1b8bc3fSopenharmony_ci{ 504b1b8bc3fSopenharmony_ci return HasNetCap(NET_CAPABILITY_VALIDATED); 505b1b8bc3fSopenharmony_ci} 506b1b8bc3fSopenharmony_ci 507b1b8bc3fSopenharmony_ci/** 508b1b8bc3fSopenharmony_ci * This method returns the score of the current network supplier. 509b1b8bc3fSopenharmony_ci * 510b1b8bc3fSopenharmony_ci * It is used to prioritize network suppliers so that higher priority producers can activate when lower 511b1b8bc3fSopenharmony_ci * priority networks are available. 512b1b8bc3fSopenharmony_ci * 513b1b8bc3fSopenharmony_ci * @return the score of the current network supplier. 514b1b8bc3fSopenharmony_ci */ 515b1b8bc3fSopenharmony_ciint32_t NetSupplier::GetNetScore() const 516b1b8bc3fSopenharmony_ci{ 517b1b8bc3fSopenharmony_ci return netScore_; 518b1b8bc3fSopenharmony_ci} 519b1b8bc3fSopenharmony_ci 520b1b8bc3fSopenharmony_ci/** 521b1b8bc3fSopenharmony_ci * This method returns the real score of current network supplier. 522b1b8bc3fSopenharmony_ci * 523b1b8bc3fSopenharmony_ci * This method subtracts the score depending on different conditions, or returns netScore_ if the conditions are not 524b1b8bc3fSopenharmony_ci * met. 525b1b8bc3fSopenharmony_ci * It is used to compare the priorities of different networks. 526b1b8bc3fSopenharmony_ci * 527b1b8bc3fSopenharmony_ci * @return the real score of current network supplier. 528b1b8bc3fSopenharmony_ci */ 529b1b8bc3fSopenharmony_ciint32_t NetSupplier::GetRealScore() 530b1b8bc3fSopenharmony_ci{ 531b1b8bc3fSopenharmony_ci // Notice: the order is important here: 532b1b8bc3fSopenharmony_ci // 1.If the user chooses to use this network, return MAX_SCORE 533b1b8bc3fSopenharmony_ci if (isAcceptUnvaliad) { 534b1b8bc3fSopenharmony_ci return static_cast<int32_t>(NetManagerStandard::NetTypeScoreValue::MAX_SCORE); 535b1b8bc3fSopenharmony_ci } 536b1b8bc3fSopenharmony_ci 537b1b8bc3fSopenharmony_ci // 2. If network detection is not complete in the first time, subtract NET_VALID_SCORE. 538b1b8bc3fSopenharmony_ci if (IsInFirstTimeDetecting()) { 539b1b8bc3fSopenharmony_ci return netScore_ - NET_VALID_SCORE; 540b1b8bc3fSopenharmony_ci } 541b1b8bc3fSopenharmony_ci 542b1b8bc3fSopenharmony_ci // 3. If network is not validated, subtract NET_VALID_SCORE. 543b1b8bc3fSopenharmony_ci if (!IsNetValidated()) { 544b1b8bc3fSopenharmony_ci return netScore_ - NET_VALID_SCORE; 545b1b8bc3fSopenharmony_ci } 546b1b8bc3fSopenharmony_ci 547b1b8bc3fSopenharmony_ci // 4. Deduct DIFF_SCORE_BETWEEN_GOOD_POOR for poor network quality (reported by the supplier). 548b1b8bc3fSopenharmony_ci if (IsNetQualityPoor()) { 549b1b8bc3fSopenharmony_ci return netScore_ - DIFF_SCORE_BETWEEN_GOOD_POOR; 550b1b8bc3fSopenharmony_ci } 551b1b8bc3fSopenharmony_ci return netScore_; 552b1b8bc3fSopenharmony_ci} 553b1b8bc3fSopenharmony_ci 554b1b8bc3fSopenharmony_civoid NetSupplier::SetDefault() 555b1b8bc3fSopenharmony_ci{ 556b1b8bc3fSopenharmony_ci NETMGR_LOG_I("set default supplier[%{public}d].", supplierId_); 557b1b8bc3fSopenharmony_ci if (network_) { 558b1b8bc3fSopenharmony_ci network_->SetDefaultNetWork(); 559b1b8bc3fSopenharmony_ci } 560b1b8bc3fSopenharmony_ci} 561b1b8bc3fSopenharmony_ci 562b1b8bc3fSopenharmony_civoid NetSupplier::ClearDefault() 563b1b8bc3fSopenharmony_ci{ 564b1b8bc3fSopenharmony_ci NETMGR_LOG_I("clear default supplier[%{public}d].", supplierId_); 565b1b8bc3fSopenharmony_ci if (network_) { 566b1b8bc3fSopenharmony_ci network_->ClearDefaultNetWorkNetId(); 567b1b8bc3fSopenharmony_ci } 568b1b8bc3fSopenharmony_ci} 569b1b8bc3fSopenharmony_ci 570b1b8bc3fSopenharmony_civoid NetSupplier::UpdateGlobalHttpProxy(const HttpProxy &httpProxy) 571b1b8bc3fSopenharmony_ci{ 572b1b8bc3fSopenharmony_ci NETMGR_LOG_I("supplierId[%{public}d] update global httpProxy.", supplierId_); 573b1b8bc3fSopenharmony_ci if (network_) { 574b1b8bc3fSopenharmony_ci network_->UpdateGlobalHttpProxy(httpProxy); 575b1b8bc3fSopenharmony_ci } 576b1b8bc3fSopenharmony_ci} 577b1b8bc3fSopenharmony_ci 578b1b8bc3fSopenharmony_cistd::string NetSupplier::TechToType(NetSlotTech techType) 579b1b8bc3fSopenharmony_ci{ 580b1b8bc3fSopenharmony_ci switch (techType) { 581b1b8bc3fSopenharmony_ci case NetSlotTech::SLOT_TYPE_GSM: 582b1b8bc3fSopenharmony_ci return "2G"; 583b1b8bc3fSopenharmony_ci case NetSlotTech::SLOT_TYPE_LTE: 584b1b8bc3fSopenharmony_ci case NetSlotTech::SLOT_TYPE_LTE_CA: 585b1b8bc3fSopenharmony_ci return "4G"; 586b1b8bc3fSopenharmony_ci default: 587b1b8bc3fSopenharmony_ci return "3G"; 588b1b8bc3fSopenharmony_ci } 589b1b8bc3fSopenharmony_ci} 590b1b8bc3fSopenharmony_ci 591b1b8bc3fSopenharmony_civoid NetSupplier::SetSupplierType(int32_t type) 592b1b8bc3fSopenharmony_ci{ 593b1b8bc3fSopenharmony_ci NETMGR_LOG_I("supplierId[%{public}d] update type[%{public}d].", supplierId_, type); 594b1b8bc3fSopenharmony_ci type_ = TechToType(static_cast<NetSlotTech>(type)); 595b1b8bc3fSopenharmony_ci} 596b1b8bc3fSopenharmony_ci 597b1b8bc3fSopenharmony_cistd::string NetSupplier::GetSupplierType() 598b1b8bc3fSopenharmony_ci{ 599b1b8bc3fSopenharmony_ci return type_; 600b1b8bc3fSopenharmony_ci} 601b1b8bc3fSopenharmony_ci 602b1b8bc3fSopenharmony_cibool NetSupplier::ResumeNetworkInfo() 603b1b8bc3fSopenharmony_ci{ 604b1b8bc3fSopenharmony_ci if (network_ == nullptr) { 605b1b8bc3fSopenharmony_ci NETMGR_LOG_E("network_ is nullptr!"); 606b1b8bc3fSopenharmony_ci return false; 607b1b8bc3fSopenharmony_ci } 608b1b8bc3fSopenharmony_ci 609b1b8bc3fSopenharmony_ci return network_->ResumeNetworkInfo(); 610b1b8bc3fSopenharmony_ci} 611b1b8bc3fSopenharmony_ci 612b1b8bc3fSopenharmony_cibool NetSupplier::IsNetQualityPoor() 613b1b8bc3fSopenharmony_ci{ 614b1b8bc3fSopenharmony_ci return netQuality_ == QUALITY_POOR_STATE; 615b1b8bc3fSopenharmony_ci} 616b1b8bc3fSopenharmony_ci 617b1b8bc3fSopenharmony_civoid NetSupplier::SetDetectionDone() 618b1b8bc3fSopenharmony_ci{ 619b1b8bc3fSopenharmony_ci if (!isFirstTimeDetectionDone) { 620b1b8bc3fSopenharmony_ci isFirstTimeDetectionDone = true; 621b1b8bc3fSopenharmony_ci } 622b1b8bc3fSopenharmony_ci if (HasNetCap(NET_CAPABILITY_CHECKING_CONNECTIVITY)) { 623b1b8bc3fSopenharmony_ci netCaps_.RemoveNetCap(NET_CAPABILITY_CHECKING_CONNECTIVITY); 624b1b8bc3fSopenharmony_ci netAllCapabilities_.netCaps_.erase(NET_CAPABILITY_CHECKING_CONNECTIVITY); 625b1b8bc3fSopenharmony_ci NETMGR_LOG_I("supplier %{public}u detection done, remove NET_CAPABILITY_CHECKING_CONNECTIVITY", supplierId_); 626b1b8bc3fSopenharmony_ci } 627b1b8bc3fSopenharmony_ci} 628b1b8bc3fSopenharmony_ci 629b1b8bc3fSopenharmony_cibool NetSupplier::IsInFirstTimeDetecting() const 630b1b8bc3fSopenharmony_ci{ 631b1b8bc3fSopenharmony_ci return !isFirstTimeDetectionDone; 632b1b8bc3fSopenharmony_ci} 633b1b8bc3fSopenharmony_ci} // namespace NetManagerStandard 634b1b8bc3fSopenharmony_ci} // namespace OHOS 635