1b1b8bc3fSopenharmony_ci/* 2b1b8bc3fSopenharmony_ci * Copyright (c) 2021-2022 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 <functional> 18b1b8bc3fSopenharmony_ci 19b1b8bc3fSopenharmony_ci#include "net_activate.h" 20b1b8bc3fSopenharmony_ci#include "net_caps.h" 21b1b8bc3fSopenharmony_ci#include "net_mgr_log_wrapper.h" 22b1b8bc3fSopenharmony_ci 23b1b8bc3fSopenharmony_cinamespace OHOS { 24b1b8bc3fSopenharmony_cinamespace NetManagerStandard { 25b1b8bc3fSopenharmony_cistatic std::atomic<uint32_t> g_nextRequestId = MIN_REQUEST_ID; 26b1b8bc3fSopenharmony_cistatic std::string IDENT_WIFI = "wifi"; 27b1b8bc3fSopenharmony_ciusing TimeOutCallback = std::function<void()>; 28b1b8bc3fSopenharmony_ci 29b1b8bc3fSopenharmony_ciNetActivate::NetActivate(const sptr<NetSpecifier> &specifier, const sptr<INetConnCallback> &callback, 30b1b8bc3fSopenharmony_ci std::weak_ptr<INetActivateCallback> timeoutCallback, const uint32_t &timeoutMS, 31b1b8bc3fSopenharmony_ci const std::shared_ptr<AppExecFwk::EventHandler> &netActEventHandler, 32b1b8bc3fSopenharmony_ci uint32_t uid, const int32_t registerType) 33b1b8bc3fSopenharmony_ci : netSpecifier_(specifier), 34b1b8bc3fSopenharmony_ci netConnCallback_(callback), 35b1b8bc3fSopenharmony_ci timeoutMS_(timeoutMS), 36b1b8bc3fSopenharmony_ci timeoutCallback_(timeoutCallback), 37b1b8bc3fSopenharmony_ci netActEventHandler_(netActEventHandler), 38b1b8bc3fSopenharmony_ci uid_(uid), 39b1b8bc3fSopenharmony_ci registerType_(registerType) 40b1b8bc3fSopenharmony_ci{ 41b1b8bc3fSopenharmony_ci requestId_ = g_nextRequestId++; 42b1b8bc3fSopenharmony_ci if (g_nextRequestId > MAX_REQUEST_ID) { 43b1b8bc3fSopenharmony_ci g_nextRequestId = MIN_REQUEST_ID; 44b1b8bc3fSopenharmony_ci } 45b1b8bc3fSopenharmony_ci} 46b1b8bc3fSopenharmony_ci 47b1b8bc3fSopenharmony_civoid NetActivate::StartTimeOutNetAvailable() 48b1b8bc3fSopenharmony_ci{ 49b1b8bc3fSopenharmony_ci activateName_ = "NetActivate" + std::to_string(requestId_); 50b1b8bc3fSopenharmony_ci auto self = shared_from_this(); 51b1b8bc3fSopenharmony_ci if (netActEventHandler_ != nullptr && timeoutMS_ > 0) { 52b1b8bc3fSopenharmony_ci netActEventHandler_->PostTask([self]() { self->TimeOutNetAvailable(); }, activateName_, timeoutMS_); 53b1b8bc3fSopenharmony_ci } 54b1b8bc3fSopenharmony_ci} 55b1b8bc3fSopenharmony_ci 56b1b8bc3fSopenharmony_ciNetActivate::~NetActivate() 57b1b8bc3fSopenharmony_ci{ 58b1b8bc3fSopenharmony_ci if (netActEventHandler_ != nullptr) { 59b1b8bc3fSopenharmony_ci netActEventHandler_->RemoveTask(activateName_); 60b1b8bc3fSopenharmony_ci } 61b1b8bc3fSopenharmony_ci} 62b1b8bc3fSopenharmony_ci 63b1b8bc3fSopenharmony_civoid NetActivate::TimeOutNetAvailable() 64b1b8bc3fSopenharmony_ci{ 65b1b8bc3fSopenharmony_ci if (netServiceSupplied_) { 66b1b8bc3fSopenharmony_ci return; 67b1b8bc3fSopenharmony_ci } 68b1b8bc3fSopenharmony_ci if (netConnCallback_) { 69b1b8bc3fSopenharmony_ci netConnCallback_->NetUnavailable(); 70b1b8bc3fSopenharmony_ci } 71b1b8bc3fSopenharmony_ci 72b1b8bc3fSopenharmony_ci auto timeoutCb = timeoutCallback_.lock(); 73b1b8bc3fSopenharmony_ci if (timeoutCb) { 74b1b8bc3fSopenharmony_ci timeoutCb->OnNetActivateTimeOut(requestId_); 75b1b8bc3fSopenharmony_ci } 76b1b8bc3fSopenharmony_ci} 77b1b8bc3fSopenharmony_ci 78b1b8bc3fSopenharmony_cibool NetActivate::MatchRequestAndNetwork(sptr<NetSupplier> supplier, bool skipCheckIdent) 79b1b8bc3fSopenharmony_ci{ 80b1b8bc3fSopenharmony_ci NETMGR_LOG_D("supplier[%{public}d, %{public}s], request[%{public}d]", 81b1b8bc3fSopenharmony_ci (supplier ? supplier->GetSupplierId() : 0), 82b1b8bc3fSopenharmony_ci (supplier ? supplier->GetNetSupplierIdent().c_str() : "nullptr"), requestId_); 83b1b8bc3fSopenharmony_ci if (supplier == nullptr) { 84b1b8bc3fSopenharmony_ci NETMGR_LOG_E("Supplier is null"); 85b1b8bc3fSopenharmony_ci return false; 86b1b8bc3fSopenharmony_ci } 87b1b8bc3fSopenharmony_ci if (!CompareByNetworkCapabilities(supplier->GetNetCaps())) { 88b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Supplier[%{public}d], request[%{public}d], capability is not matched", supplier->GetSupplierId(), 89b1b8bc3fSopenharmony_ci requestId_); 90b1b8bc3fSopenharmony_ci return false; 91b1b8bc3fSopenharmony_ci } 92b1b8bc3fSopenharmony_ci if (!CompareByNetworkNetType((supplier->GetNetSupplierType()))) { 93b1b8bc3fSopenharmony_ci NETMGR_LOG_W("Supplier[%{public}d], request[%{public}d], Supplier net type not matched", 94b1b8bc3fSopenharmony_ci supplier->GetSupplierId(), requestId_); 95b1b8bc3fSopenharmony_ci return false; 96b1b8bc3fSopenharmony_ci } 97b1b8bc3fSopenharmony_ci if (!CompareByNetworkIdent(supplier->GetNetSupplierIdent(), supplier->GetNetSupplierType(), 98b1b8bc3fSopenharmony_ci skipCheckIdent)) { 99b1b8bc3fSopenharmony_ci NETMGR_LOG_W("Supplier[%{public}d], request[%{public}d], Supplier ident is not matched", 100b1b8bc3fSopenharmony_ci supplier->GetSupplierId(), requestId_); 101b1b8bc3fSopenharmony_ci return false; 102b1b8bc3fSopenharmony_ci } 103b1b8bc3fSopenharmony_ci NetAllCapabilities netAllCaps = supplier->GetNetCapabilities(); 104b1b8bc3fSopenharmony_ci if (!CompareByNetworkBand(netAllCaps.linkUpBandwidthKbps_, netAllCaps.linkDownBandwidthKbps_)) { 105b1b8bc3fSopenharmony_ci NETMGR_LOG_W("Supplier[%{public}d], request[%{public}d], supplier net band not matched", 106b1b8bc3fSopenharmony_ci supplier->GetSupplierId(), requestId_); 107b1b8bc3fSopenharmony_ci return false; 108b1b8bc3fSopenharmony_ci } 109b1b8bc3fSopenharmony_ci 110b1b8bc3fSopenharmony_ci return true; 111b1b8bc3fSopenharmony_ci} 112b1b8bc3fSopenharmony_ci 113b1b8bc3fSopenharmony_cibool NetActivate::CompareByNetworkIdent(const std::string &ident, NetBearType bearerType, bool skipCheckIdent) 114b1b8bc3fSopenharmony_ci{ 115b1b8bc3fSopenharmony_ci if (ident.empty() || netSpecifier_->ident_.empty()) { 116b1b8bc3fSopenharmony_ci return true; 117b1b8bc3fSopenharmony_ci } 118b1b8bc3fSopenharmony_ci if (IDENT_WIFI == netSpecifier_->ident_) { 119b1b8bc3fSopenharmony_ci return true; 120b1b8bc3fSopenharmony_ci } 121b1b8bc3fSopenharmony_ci if (ident == netSpecifier_->ident_) { 122b1b8bc3fSopenharmony_ci return true; 123b1b8bc3fSopenharmony_ci } 124b1b8bc3fSopenharmony_ci if (skipCheckIdent && BEARER_WIFI == bearerType) { 125b1b8bc3fSopenharmony_ci return true; 126b1b8bc3fSopenharmony_ci } 127b1b8bc3fSopenharmony_ci return false; 128b1b8bc3fSopenharmony_ci} 129b1b8bc3fSopenharmony_ci 130b1b8bc3fSopenharmony_cibool NetActivate::CompareByNetworkCapabilities(const NetCaps &netCaps) 131b1b8bc3fSopenharmony_ci{ 132b1b8bc3fSopenharmony_ci if (netSpecifier_ == nullptr) { 133b1b8bc3fSopenharmony_ci return false; 134b1b8bc3fSopenharmony_ci } 135b1b8bc3fSopenharmony_ci std::set<NetCap> &reqCaps = netSpecifier_->netCapabilities_.netCaps_; 136b1b8bc3fSopenharmony_ci if (reqCaps.empty()) { 137b1b8bc3fSopenharmony_ci NETMGR_LOG_D("Use default Supplier for empty cap"); 138b1b8bc3fSopenharmony_ci return netCaps.HasNetCap(NET_CAPABILITY_INTERNET); 139b1b8bc3fSopenharmony_ci } 140b1b8bc3fSopenharmony_ci return netCaps.HasNetCaps(reqCaps); 141b1b8bc3fSopenharmony_ci} 142b1b8bc3fSopenharmony_ci 143b1b8bc3fSopenharmony_cibool NetActivate::CompareByNetworkNetType(NetBearType bearerType) 144b1b8bc3fSopenharmony_ci{ 145b1b8bc3fSopenharmony_ci if (netSpecifier_ == nullptr) { 146b1b8bc3fSopenharmony_ci return false; 147b1b8bc3fSopenharmony_ci } 148b1b8bc3fSopenharmony_ci std::set<NetBearType> &reqTypes = netSpecifier_->netCapabilities_.bearerTypes_; 149b1b8bc3fSopenharmony_ci if (reqTypes.empty()) { 150b1b8bc3fSopenharmony_ci return true; 151b1b8bc3fSopenharmony_ci } 152b1b8bc3fSopenharmony_ci if (reqTypes.find(bearerType) == reqTypes.end()) { 153b1b8bc3fSopenharmony_ci return false; 154b1b8bc3fSopenharmony_ci } 155b1b8bc3fSopenharmony_ci return true; 156b1b8bc3fSopenharmony_ci} 157b1b8bc3fSopenharmony_ci 158b1b8bc3fSopenharmony_cibool NetActivate::CompareByNetworkBand(uint32_t netLinkUpBand, uint32_t netLinkDownBand) 159b1b8bc3fSopenharmony_ci{ 160b1b8bc3fSopenharmony_ci uint32_t reqLinkUpBand = netSpecifier_->netCapabilities_.linkUpBandwidthKbps_; 161b1b8bc3fSopenharmony_ci uint32_t reqLinkDownBand = netSpecifier_->netCapabilities_.linkDownBandwidthKbps_; 162b1b8bc3fSopenharmony_ci if ((netLinkUpBand >= reqLinkUpBand) && (netLinkDownBand >= reqLinkDownBand)) { 163b1b8bc3fSopenharmony_ci return true; 164b1b8bc3fSopenharmony_ci } 165b1b8bc3fSopenharmony_ci return false; 166b1b8bc3fSopenharmony_ci} 167b1b8bc3fSopenharmony_ci 168b1b8bc3fSopenharmony_cisptr<NetSpecifier> NetActivate::GetNetSpecifier() 169b1b8bc3fSopenharmony_ci{ 170b1b8bc3fSopenharmony_ci return netSpecifier_; 171b1b8bc3fSopenharmony_ci} 172b1b8bc3fSopenharmony_ci 173b1b8bc3fSopenharmony_ciuint32_t NetActivate::GetRequestId() const 174b1b8bc3fSopenharmony_ci{ 175b1b8bc3fSopenharmony_ci return requestId_; 176b1b8bc3fSopenharmony_ci} 177b1b8bc3fSopenharmony_ci 178b1b8bc3fSopenharmony_cistd::set<NetBearType> NetActivate::GetBearType() const 179b1b8bc3fSopenharmony_ci{ 180b1b8bc3fSopenharmony_ci return netSpecifier_->netCapabilities_.bearerTypes_; 181b1b8bc3fSopenharmony_ci} 182b1b8bc3fSopenharmony_ci 183b1b8bc3fSopenharmony_ciint32_t NetActivate::GetRegisterType() const 184b1b8bc3fSopenharmony_ci{ 185b1b8bc3fSopenharmony_ci return registerType_; 186b1b8bc3fSopenharmony_ci} 187b1b8bc3fSopenharmony_ci 188b1b8bc3fSopenharmony_civoid NetActivate::SetRequestId(uint32_t reqId) 189b1b8bc3fSopenharmony_ci{ 190b1b8bc3fSopenharmony_ci requestId_ = reqId; 191b1b8bc3fSopenharmony_ci} 192b1b8bc3fSopenharmony_ci 193b1b8bc3fSopenharmony_cisptr<NetSupplier> NetActivate::GetServiceSupply() const 194b1b8bc3fSopenharmony_ci{ 195b1b8bc3fSopenharmony_ci return netServiceSupplied_; 196b1b8bc3fSopenharmony_ci} 197b1b8bc3fSopenharmony_ci 198b1b8bc3fSopenharmony_civoid NetActivate::SetServiceSupply(sptr<NetSupplier> netServiceSupplied) 199b1b8bc3fSopenharmony_ci{ 200b1b8bc3fSopenharmony_ci netServiceSupplied_ = netServiceSupplied; 201b1b8bc3fSopenharmony_ci} 202b1b8bc3fSopenharmony_ci 203b1b8bc3fSopenharmony_cisptr<INetConnCallback> NetActivate::GetNetCallback() 204b1b8bc3fSopenharmony_ci{ 205b1b8bc3fSopenharmony_ci return netConnCallback_; 206b1b8bc3fSopenharmony_ci} 207b1b8bc3fSopenharmony_ci 208b1b8bc3fSopenharmony_cibool NetActivate::HaveCapability(NetCap netCap) const 209b1b8bc3fSopenharmony_ci{ 210b1b8bc3fSopenharmony_ci if (netSpecifier_ == nullptr) { 211b1b8bc3fSopenharmony_ci return false; 212b1b8bc3fSopenharmony_ci } 213b1b8bc3fSopenharmony_ci auto &capsRef = netSpecifier_->netCapabilities_.netCaps_; 214b1b8bc3fSopenharmony_ci if (capsRef.find(netCap) == capsRef.end()) { 215b1b8bc3fSopenharmony_ci return false; 216b1b8bc3fSopenharmony_ci } 217b1b8bc3fSopenharmony_ci return true; 218b1b8bc3fSopenharmony_ci} 219b1b8bc3fSopenharmony_ci 220b1b8bc3fSopenharmony_cibool NetActivate::HaveTypes(const std::set<NetBearType> &bearerTypes) const 221b1b8bc3fSopenharmony_ci{ 222b1b8bc3fSopenharmony_ci if (netSpecifier_ == nullptr) { 223b1b8bc3fSopenharmony_ci return false; 224b1b8bc3fSopenharmony_ci } 225b1b8bc3fSopenharmony_ci auto &typesRef = netSpecifier_->netCapabilities_.bearerTypes_; 226b1b8bc3fSopenharmony_ci bool result = bearerTypes.size() > 0; 227b1b8bc3fSopenharmony_ci for (auto type : bearerTypes) { 228b1b8bc3fSopenharmony_ci if (typesRef.find(type) == typesRef.end()) { 229b1b8bc3fSopenharmony_ci result = false; 230b1b8bc3fSopenharmony_ci break; 231b1b8bc3fSopenharmony_ci } 232b1b8bc3fSopenharmony_ci } 233b1b8bc3fSopenharmony_ci return result; 234b1b8bc3fSopenharmony_ci} 235b1b8bc3fSopenharmony_ci 236b1b8bc3fSopenharmony_ciuint32_t NetActivate::GetUid() const 237b1b8bc3fSopenharmony_ci{ 238b1b8bc3fSopenharmony_ci return uid_; 239b1b8bc3fSopenharmony_ci} 240b1b8bc3fSopenharmony_ci} // namespace NetManagerStandard 241b1b8bc3fSopenharmony_ci} // namespace OHOS 242