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