1b1b8bc3fSopenharmony_ci/*
2b1b8bc3fSopenharmony_ci * Copyright (c) 2022-2023 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 "net_stats_cached.h"
17b1b8bc3fSopenharmony_ci
18b1b8bc3fSopenharmony_ci#include <initializer_list>
19b1b8bc3fSopenharmony_ci#include <list>
20b1b8bc3fSopenharmony_ci#include <pthread.h>
21b1b8bc3fSopenharmony_ci
22b1b8bc3fSopenharmony_ci#include "net_conn_client.h"
23b1b8bc3fSopenharmony_ci#include "net_mgr_log_wrapper.h"
24b1b8bc3fSopenharmony_ci#include "net_stats_constants.h"
25b1b8bc3fSopenharmony_ci#include "net_stats_data_handler.h"
26b1b8bc3fSopenharmony_ci#include "net_stats_database_defines.h"
27b1b8bc3fSopenharmony_ci#include "net_stats_database_helper.h"
28b1b8bc3fSopenharmony_ci#include "netsys_controller.h"
29b1b8bc3fSopenharmony_ci#include "bpf_stats.h"
30b1b8bc3fSopenharmony_ci#include "ffrt_inner.h"
31b1b8bc3fSopenharmony_ci
32b1b8bc3fSopenharmony_cinamespace OHOS {
33b1b8bc3fSopenharmony_cinamespace NetManagerStandard {
34b1b8bc3fSopenharmony_ciusing namespace NetStatsDatabaseDefines;
35b1b8bc3fSopenharmony_cinamespace {
36b1b8bc3fSopenharmony_ciconstexpr const char *IFACE_LO = "lo";
37b1b8bc3fSopenharmony_ci} // namespace
38b1b8bc3fSopenharmony_ci
39b1b8bc3fSopenharmony_ciint32_t NetStatsCached::StartCached()
40b1b8bc3fSopenharmony_ci{
41b1b8bc3fSopenharmony_ci    auto helper = std::make_unique<NetStatsDatabaseHelper>(NET_STATS_DATABASE_PATH);
42b1b8bc3fSopenharmony_ci    auto ret = helper->CreateTable(VERSION_TABLE, VERSION_TABLE_CREATE_PARAM);
43b1b8bc3fSopenharmony_ci    if (ret != NETMANAGER_SUCCESS) {
44b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("Create version table failed");
45b1b8bc3fSopenharmony_ci        return STATS_ERR_CREATE_TABLE_FAIL;
46b1b8bc3fSopenharmony_ci    }
47b1b8bc3fSopenharmony_ci    ret = helper->CreateTable(UID_TABLE, UID_TABLE_CREATE_PARAM);
48b1b8bc3fSopenharmony_ci    if (ret != NETMANAGER_SUCCESS) {
49b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("Create uid table failed");
50b1b8bc3fSopenharmony_ci        return STATS_ERR_CREATE_TABLE_FAIL;
51b1b8bc3fSopenharmony_ci    }
52b1b8bc3fSopenharmony_ci    ret = helper->CreateTable(IFACE_TABLE, IFACE_TABLE_CREATE_PARAM);
53b1b8bc3fSopenharmony_ci    if (ret != 0) {
54b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("Create iface table failed");
55b1b8bc3fSopenharmony_ci        return STATS_ERR_CREATE_TABLE_FAIL;
56b1b8bc3fSopenharmony_ci    }
57b1b8bc3fSopenharmony_ci    ret = helper->CreateTable(UID_SIM_TABLE, UID_SIM_TABLE_CREATE_PARAM);
58b1b8bc3fSopenharmony_ci    if (ret != 0) {
59b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("Create uid_sim table failed");
60b1b8bc3fSopenharmony_ci        return STATS_ERR_CREATE_TABLE_FAIL;
61b1b8bc3fSopenharmony_ci    }
62b1b8bc3fSopenharmony_ci    helper->Upgrade();
63b1b8bc3fSopenharmony_ci#ifndef UNITTEST_FORBID_FFRT
64b1b8bc3fSopenharmony_ci    cacheTimer_ = std::make_unique<FfrtTimer>();
65b1b8bc3fSopenharmony_ci    writeTimer_ = std::make_unique<FfrtTimer>();
66b1b8bc3fSopenharmony_ci    cacheTimer_->Start(cycleThreshold_, [this]() { CacheStats(); });
67b1b8bc3fSopenharmony_ci    writeTimer_->Start(STATS_PACKET_CYCLE_MS, [this]() { WriteStats(); });
68b1b8bc3fSopenharmony_ci#endif
69b1b8bc3fSopenharmony_ci    return ret;
70b1b8bc3fSopenharmony_ci}
71b1b8bc3fSopenharmony_ci
72b1b8bc3fSopenharmony_civoid NetStatsCached::GetUidStatsCached(std::vector<NetStatsInfo> &uidStatsInfo)
73b1b8bc3fSopenharmony_ci{
74b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
75b1b8bc3fSopenharmony_ci    uidStatsInfo.insert(uidStatsInfo.end(), stats_.GetUidStatsInfo().begin(), stats_.GetUidStatsInfo().end());
76b1b8bc3fSopenharmony_ci}
77b1b8bc3fSopenharmony_ci
78b1b8bc3fSopenharmony_civoid NetStatsCached::GetUidSimStatsCached(std::vector<NetStatsInfo> &uidSimStatsInfo)
79b1b8bc3fSopenharmony_ci{
80b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
81b1b8bc3fSopenharmony_ci    std::transform(stats_.GetUidSimStatsInfo().begin(), stats_.GetUidSimStatsInfo().end(),
82b1b8bc3fSopenharmony_ci                   std::back_inserter(uidSimStatsInfo), [](NetStatsInfo &info) {
83b1b8bc3fSopenharmony_ci                       NetStatsInfo tmpInfo = info;
84b1b8bc3fSopenharmony_ci                       tmpInfo.uid_ = Sim_UID;
85b1b8bc3fSopenharmony_ci                       return tmpInfo;
86b1b8bc3fSopenharmony_ci                   });
87b1b8bc3fSopenharmony_ci}
88b1b8bc3fSopenharmony_ci
89b1b8bc3fSopenharmony_civoid NetStatsCached::GetUidPushStatsCached(std::vector<NetStatsInfo> &uidPushStatsInfo)
90b1b8bc3fSopenharmony_ci{
91b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
92b1b8bc3fSopenharmony_ci    uidPushStatsInfo.insert(uidPushStatsInfo.end(), uidPushStatsInfo_.begin(), uidPushStatsInfo_.end());
93b1b8bc3fSopenharmony_ci}
94b1b8bc3fSopenharmony_ci
95b1b8bc3fSopenharmony_civoid NetStatsCached::GetAllPushStatsCached(std::vector<NetStatsInfo> &uidPushStatsInfo)
96b1b8bc3fSopenharmony_ci{
97b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
98b1b8bc3fSopenharmony_ci    uidPushStatsInfo.insert(uidPushStatsInfo.end(), allPushStatsInfo_.begin(), allPushStatsInfo_.end());
99b1b8bc3fSopenharmony_ci}
100b1b8bc3fSopenharmony_ci
101b1b8bc3fSopenharmony_civoid NetStatsCached::GetIfaceStatsCached(std::vector<NetStatsInfo> &ifaceStatsInfo)
102b1b8bc3fSopenharmony_ci{
103b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
104b1b8bc3fSopenharmony_ci    ifaceStatsInfo.insert(ifaceStatsInfo.end(), stats_.GetIfaceStatsInfo().begin(), stats_.GetIfaceStatsInfo().end());
105b1b8bc3fSopenharmony_ci}
106b1b8bc3fSopenharmony_ci
107b1b8bc3fSopenharmony_civoid NetStatsCached::SetAppStats(const PushStatsInfo &info)
108b1b8bc3fSopenharmony_ci{
109b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
110b1b8bc3fSopenharmony_ci    NetStatsInfo stats;
111b1b8bc3fSopenharmony_ci    stats.uid_ = info.uid_;
112b1b8bc3fSopenharmony_ci    stats.iface_ = info.iface_;
113b1b8bc3fSopenharmony_ci    stats.date_ = info.endTime_;
114b1b8bc3fSopenharmony_ci    stats.rxBytes_ = info.rxBytes_;
115b1b8bc3fSopenharmony_ci    stats.txBytes_ = info.txBytes_;
116b1b8bc3fSopenharmony_ci    stats.rxPackets_ = info.rxBytes_ > 0 ? 1 : 0;
117b1b8bc3fSopenharmony_ci    stats.txPackets_ = info.txBytes_ > 0 ? 1 : 0;
118b1b8bc3fSopenharmony_ci    if (info.netBearType_ == BEARER_CELLULAR) {
119b1b8bc3fSopenharmony_ci        stats.ident_ = std::to_string(info.simId_);
120b1b8bc3fSopenharmony_ci    }
121b1b8bc3fSopenharmony_ci    NETMGR_LOG_D("SetAppStats info=%{public}s", stats.UidData().c_str());
122b1b8bc3fSopenharmony_ci    uidPushStatsInfo_.push_back(std::move(stats));
123b1b8bc3fSopenharmony_ci}
124b1b8bc3fSopenharmony_ci
125b1b8bc3fSopenharmony_civoid NetStatsCached::GetKernelStats(std::vector<NetStatsInfo> &statsInfo)
126b1b8bc3fSopenharmony_ci{
127b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
128b1b8bc3fSopenharmony_ci    std::vector<NetStatsInfo> allInfos;
129b1b8bc3fSopenharmony_ci    NetsysController::GetInstance().GetAllStatsInfo(allInfos);
130b1b8bc3fSopenharmony_ci    ifaceNameIdentMap_.Iterate([&allInfos](const std::string &k, const std::string &v) {
131b1b8bc3fSopenharmony_ci        std::for_each(allInfos.begin(), allInfos.end(), [&k, &v](NetStatsInfo &item) {
132b1b8bc3fSopenharmony_ci            if (item.iface_ == k) {
133b1b8bc3fSopenharmony_ci                item.ident_ = v;
134b1b8bc3fSopenharmony_ci            }
135b1b8bc3fSopenharmony_ci        });
136b1b8bc3fSopenharmony_ci    });
137b1b8bc3fSopenharmony_ci    std::for_each(allInfos.begin(), allInfos.end(), [this, &statsInfo](NetStatsInfo &info) {
138b1b8bc3fSopenharmony_ci        if (info.iface_ == IFACE_LO) {
139b1b8bc3fSopenharmony_ci            return;
140b1b8bc3fSopenharmony_ci        }
141b1b8bc3fSopenharmony_ci        NetStatsInfo tmp = GetIncreasedStats(info);
142b1b8bc3fSopenharmony_ci        if (tmp.HasNoData()) {
143b1b8bc3fSopenharmony_ci            return;
144b1b8bc3fSopenharmony_ci        }
145b1b8bc3fSopenharmony_ci        tmp.date_ = CommonUtils::GetCurrentSecond();
146b1b8bc3fSopenharmony_ci        statsInfo.push_back(std::move(tmp));
147b1b8bc3fSopenharmony_ci    });
148b1b8bc3fSopenharmony_ci    std::vector<NetStatsInfo> SimInfos;
149b1b8bc3fSopenharmony_ci    NetsysController::GetInstance().GetAllSimStatsInfo(SimInfos);
150b1b8bc3fSopenharmony_ci    ifaceNameIdentMap_.Iterate([&SimInfos](const std::string &k, const std::string &v) {
151b1b8bc3fSopenharmony_ci        std::for_each(SimInfos.begin(), SimInfos.end(), [&k, &v](NetStatsInfo &item) {
152b1b8bc3fSopenharmony_ci            if (item.iface_ == k) {
153b1b8bc3fSopenharmony_ci                item.ident_ = v;
154b1b8bc3fSopenharmony_ci            }
155b1b8bc3fSopenharmony_ci        });
156b1b8bc3fSopenharmony_ci    });
157b1b8bc3fSopenharmony_ci    std::for_each(SimInfos.begin(), SimInfos.end(), [this, &statsInfo](NetStatsInfo &info) {
158b1b8bc3fSopenharmony_ci        if (info.iface_ == IFACE_LO) {
159b1b8bc3fSopenharmony_ci            return;
160b1b8bc3fSopenharmony_ci        }
161b1b8bc3fSopenharmony_ci        NetStatsInfo tmp = GetIncreasedSimStats(info);
162b1b8bc3fSopenharmony_ci        if (tmp.HasNoData()) {
163b1b8bc3fSopenharmony_ci            return;
164b1b8bc3fSopenharmony_ci        }
165b1b8bc3fSopenharmony_ci        tmp.date_ = CommonUtils::GetCurrentSecond();
166b1b8bc3fSopenharmony_ci        tmp.uid_ = Sim_UID;
167b1b8bc3fSopenharmony_ci        statsInfo.push_back(std::move(tmp));
168b1b8bc3fSopenharmony_ci    });
169b1b8bc3fSopenharmony_ci}
170b1b8bc3fSopenharmony_ci
171b1b8bc3fSopenharmony_ciNetStatsInfo NetStatsCached::GetIncreasedStats(const NetStatsInfo &info)
172b1b8bc3fSopenharmony_ci{
173b1b8bc3fSopenharmony_ci    auto findRet = std::find_if(lastUidStatsInfo_.begin(), lastUidStatsInfo_.end(),
174b1b8bc3fSopenharmony_ci                                [&info](const NetStatsInfo &lastInfo) { return info.Equals(lastInfo); });
175b1b8bc3fSopenharmony_ci    if (findRet == lastUidStatsInfo_.end()) {
176b1b8bc3fSopenharmony_ci        return info;
177b1b8bc3fSopenharmony_ci    }
178b1b8bc3fSopenharmony_ci    return info - *findRet;
179b1b8bc3fSopenharmony_ci}
180b1b8bc3fSopenharmony_ci
181b1b8bc3fSopenharmony_ciNetStatsInfo NetStatsCached::GetIncreasedSimStats(const NetStatsInfo &info)
182b1b8bc3fSopenharmony_ci{
183b1b8bc3fSopenharmony_ci    auto findRet = std::find_if(lastUidSimStatsInfo_.begin(), lastUidSimStatsInfo_.end(),
184b1b8bc3fSopenharmony_ci                                [&info](const NetStatsInfo &lastInfo) { return info.Equals(lastInfo); });
185b1b8bc3fSopenharmony_ci    if (findRet == lastUidSimStatsInfo_.end()) {
186b1b8bc3fSopenharmony_ci        return info;
187b1b8bc3fSopenharmony_ci    }
188b1b8bc3fSopenharmony_ci    return info - *findRet;
189b1b8bc3fSopenharmony_ci}
190b1b8bc3fSopenharmony_ci
191b1b8bc3fSopenharmony_civoid NetStatsCached::CacheUidStats()
192b1b8bc3fSopenharmony_ci{
193b1b8bc3fSopenharmony_ci    std::vector<NetStatsInfo> statsInfos;
194b1b8bc3fSopenharmony_ci    NetsysController::GetInstance().GetAllStatsInfo(statsInfos);
195b1b8bc3fSopenharmony_ci    if (statsInfos.empty()) {
196b1b8bc3fSopenharmony_ci        NETMGR_LOG_W("No stats need to save");
197b1b8bc3fSopenharmony_ci        return;
198b1b8bc3fSopenharmony_ci    }
199b1b8bc3fSopenharmony_ci
200b1b8bc3fSopenharmony_ci    ifaceNameIdentMap_.Iterate([&statsInfos](const std::string &k, const std::string &v) {
201b1b8bc3fSopenharmony_ci        std::for_each(statsInfos.begin(), statsInfos.end(), [&k, &v](NetStatsInfo &item) {
202b1b8bc3fSopenharmony_ci            if (item.iface_ == k) {
203b1b8bc3fSopenharmony_ci                item.ident_ = v;
204b1b8bc3fSopenharmony_ci            }
205b1b8bc3fSopenharmony_ci        });
206b1b8bc3fSopenharmony_ci    });
207b1b8bc3fSopenharmony_ci
208b1b8bc3fSopenharmony_ci    std::for_each(statsInfos.begin(), statsInfos.end(), [this](NetStatsInfo &info) {
209b1b8bc3fSopenharmony_ci        if (info.iface_ == IFACE_LO) {
210b1b8bc3fSopenharmony_ci            return;
211b1b8bc3fSopenharmony_ci        }
212b1b8bc3fSopenharmony_ci        auto findRet = std::find_if(lastUidStatsInfo_.begin(), lastUidStatsInfo_.end(),
213b1b8bc3fSopenharmony_ci                                    [this, &info](const NetStatsInfo &lastInfo) { return info.Equals(lastInfo); });
214b1b8bc3fSopenharmony_ci        if (findRet == lastUidStatsInfo_.end()) {
215b1b8bc3fSopenharmony_ci            stats_.PushUidStats(info);
216b1b8bc3fSopenharmony_ci            return;
217b1b8bc3fSopenharmony_ci        }
218b1b8bc3fSopenharmony_ci        auto currentStats = info - *findRet;
219b1b8bc3fSopenharmony_ci        stats_.PushUidStats(currentStats);
220b1b8bc3fSopenharmony_ci    });
221b1b8bc3fSopenharmony_ci    lastUidStatsInfo_.swap(statsInfos);
222b1b8bc3fSopenharmony_ci}
223b1b8bc3fSopenharmony_ci
224b1b8bc3fSopenharmony_civoid NetStatsCached::CacheAppStats()
225b1b8bc3fSopenharmony_ci{
226b1b8bc3fSopenharmony_ci    std::vector<NetStatsInfo> pushInfos;
227b1b8bc3fSopenharmony_ci    std::for_each(uidPushStatsInfo_.begin(), uidPushStatsInfo_.end(), [&pushInfos](NetStatsInfo &info) {
228b1b8bc3fSopenharmony_ci        auto findRet = std::find_if(pushInfos.begin(), pushInfos.end(),
229b1b8bc3fSopenharmony_ci                                    [&info](const NetStatsInfo &item) { return info.Equals(item); });
230b1b8bc3fSopenharmony_ci        if (findRet == pushInfos.end()) {
231b1b8bc3fSopenharmony_ci            pushInfos.push_back(info);
232b1b8bc3fSopenharmony_ci            return;
233b1b8bc3fSopenharmony_ci        }
234b1b8bc3fSopenharmony_ci        *findRet += info;
235b1b8bc3fSopenharmony_ci    });
236b1b8bc3fSopenharmony_ci    std::for_each(pushInfos.begin(), pushInfos.end(), [this](auto &item) {
237b1b8bc3fSopenharmony_ci        stats_.PushUidStats(item);
238b1b8bc3fSopenharmony_ci        auto findRet = std::find_if(allPushStatsInfo_.begin(), allPushStatsInfo_.end(),
239b1b8bc3fSopenharmony_ci                                    [&item](const NetStatsInfo &info) {
240b1b8bc3fSopenharmony_ci                                        return info.Equals(item) && info.ident_ == item.ident_;
241b1b8bc3fSopenharmony_ci                                    });
242b1b8bc3fSopenharmony_ci        if (findRet == allPushStatsInfo_.end()) {
243b1b8bc3fSopenharmony_ci            allPushStatsInfo_.push_back(item);
244b1b8bc3fSopenharmony_ci            return;
245b1b8bc3fSopenharmony_ci        }
246b1b8bc3fSopenharmony_ci        *findRet += item;
247b1b8bc3fSopenharmony_ci    });
248b1b8bc3fSopenharmony_ci    uidPushStatsInfo_.clear();
249b1b8bc3fSopenharmony_ci}
250b1b8bc3fSopenharmony_ci
251b1b8bc3fSopenharmony_civoid NetStatsCached::CacheUidSimStats()
252b1b8bc3fSopenharmony_ci{
253b1b8bc3fSopenharmony_ci    std::vector<NetStatsInfo> statsInfos;
254b1b8bc3fSopenharmony_ci    NetsysController::GetInstance().GetAllSimStatsInfo(statsInfos);
255b1b8bc3fSopenharmony_ci    if (statsInfos.empty()) {
256b1b8bc3fSopenharmony_ci        NETMGR_LOG_W("No stats need to save");
257b1b8bc3fSopenharmony_ci        return;
258b1b8bc3fSopenharmony_ci    }
259b1b8bc3fSopenharmony_ci
260b1b8bc3fSopenharmony_ci    ifaceNameIdentMap_.Iterate([&statsInfos](const std::string &k, const std::string &v) {
261b1b8bc3fSopenharmony_ci        std::for_each(statsInfos.begin(), statsInfos.end(), [&k, &v](NetStatsInfo &item) {
262b1b8bc3fSopenharmony_ci            if (item.iface_ == k) {
263b1b8bc3fSopenharmony_ci                item.ident_ = v;
264b1b8bc3fSopenharmony_ci            }
265b1b8bc3fSopenharmony_ci        });
266b1b8bc3fSopenharmony_ci    });
267b1b8bc3fSopenharmony_ci
268b1b8bc3fSopenharmony_ci    std::for_each(statsInfos.begin(), statsInfos.end(), [this](NetStatsInfo &info) {
269b1b8bc3fSopenharmony_ci        if (info.iface_ == IFACE_LO) {
270b1b8bc3fSopenharmony_ci            return;
271b1b8bc3fSopenharmony_ci        }
272b1b8bc3fSopenharmony_ci        auto findRet = std::find_if(lastUidSimStatsInfo_.begin(), lastUidSimStatsInfo_.end(),
273b1b8bc3fSopenharmony_ci                                    [this, &info](const NetStatsInfo &lastInfo) { return info.Equals(lastInfo); });
274b1b8bc3fSopenharmony_ci        if (findRet == lastUidSimStatsInfo_.end()) {
275b1b8bc3fSopenharmony_ci            stats_.PushUidSimStats(info);
276b1b8bc3fSopenharmony_ci            return;
277b1b8bc3fSopenharmony_ci        }
278b1b8bc3fSopenharmony_ci        auto currentStats = info - *findRet;
279b1b8bc3fSopenharmony_ci        stats_.PushUidSimStats(currentStats);
280b1b8bc3fSopenharmony_ci    });
281b1b8bc3fSopenharmony_ci    lastUidSimStatsInfo_.swap(statsInfos);
282b1b8bc3fSopenharmony_ci}
283b1b8bc3fSopenharmony_ci
284b1b8bc3fSopenharmony_civoid NetStatsCached::CacheIfaceStats()
285b1b8bc3fSopenharmony_ci{
286b1b8bc3fSopenharmony_ci    std::vector<std::string> ifNameList = NetsysController::GetInstance().InterfaceGetList();
287b1b8bc3fSopenharmony_ci    std::for_each(ifNameList.begin(), ifNameList.end(), [this](const auto &ifName) {
288b1b8bc3fSopenharmony_ci        if (ifName == IFACE_LO) {
289b1b8bc3fSopenharmony_ci            return;
290b1b8bc3fSopenharmony_ci        }
291b1b8bc3fSopenharmony_ci        NetStatsInfo statsInfo;
292b1b8bc3fSopenharmony_ci        statsInfo.iface_ = ifName;
293b1b8bc3fSopenharmony_ci        NetsysController::GetInstance().GetIfaceStats(statsInfo.rxBytes_,
294b1b8bc3fSopenharmony_ci                                                      static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES), ifName);
295b1b8bc3fSopenharmony_ci        NetsysController::GetInstance().GetIfaceStats(statsInfo.rxPackets_,
296b1b8bc3fSopenharmony_ci                                                      static_cast<uint32_t>(StatsType::STATS_TYPE_RX_PACKETS), ifName);
297b1b8bc3fSopenharmony_ci        NetsysController::GetInstance().GetIfaceStats(statsInfo.txBytes_,
298b1b8bc3fSopenharmony_ci                                                      static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES), ifName);
299b1b8bc3fSopenharmony_ci        NetsysController::GetInstance().GetIfaceStats(statsInfo.txPackets_,
300b1b8bc3fSopenharmony_ci                                                      static_cast<uint32_t>(StatsType::STATS_TYPE_TX_PACKETS), ifName);
301b1b8bc3fSopenharmony_ci        auto findRet = lastIfaceStatsMap_.find(ifName);
302b1b8bc3fSopenharmony_ci        if (findRet == lastIfaceStatsMap_.end()) {
303b1b8bc3fSopenharmony_ci            stats_.PushIfaceStats(statsInfo);
304b1b8bc3fSopenharmony_ci            lastIfaceStatsMap_[ifName] = statsInfo;
305b1b8bc3fSopenharmony_ci            return;
306b1b8bc3fSopenharmony_ci        }
307b1b8bc3fSopenharmony_ci        auto currentStats = statsInfo - findRet->second;
308b1b8bc3fSopenharmony_ci        stats_.PushIfaceStats(currentStats);
309b1b8bc3fSopenharmony_ci        lastIfaceStatsMap_[ifName] = statsInfo;
310b1b8bc3fSopenharmony_ci    });
311b1b8bc3fSopenharmony_ci}
312b1b8bc3fSopenharmony_ci
313b1b8bc3fSopenharmony_civoid NetStatsCached::CacheStats()
314b1b8bc3fSopenharmony_ci{
315b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
316b1b8bc3fSopenharmony_ci    CacheUidStats();
317b1b8bc3fSopenharmony_ci    CacheAppStats();
318b1b8bc3fSopenharmony_ci    CacheUidSimStats();
319b1b8bc3fSopenharmony_ci    CacheIfaceStats();
320b1b8bc3fSopenharmony_ci}
321b1b8bc3fSopenharmony_ci
322b1b8bc3fSopenharmony_civoid NetStatsCached::WriteStats()
323b1b8bc3fSopenharmony_ci{
324b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
325b1b8bc3fSopenharmony_ci    WriteUidStats();
326b1b8bc3fSopenharmony_ci    WriteUidSimStats();
327b1b8bc3fSopenharmony_ci    WriteIfaceStats();
328b1b8bc3fSopenharmony_ci}
329b1b8bc3fSopenharmony_civoid NetStatsCached::WriteIfaceStats()
330b1b8bc3fSopenharmony_ci{
331b1b8bc3fSopenharmony_ci    if (!(CheckIfaceStor() || isForce_)) {
332b1b8bc3fSopenharmony_ci        return;
333b1b8bc3fSopenharmony_ci    }
334b1b8bc3fSopenharmony_ci    auto handler = std::make_unique<NetStatsDataHandler>();
335b1b8bc3fSopenharmony_ci    handler->WriteStatsData(stats_.GetIfaceStatsInfo(), NetStatsDatabaseDefines::IFACE_TABLE);
336b1b8bc3fSopenharmony_ci    handler->DeleteByDate(NetStatsDatabaseDefines::IFACE_TABLE, 0, CommonUtils::GetCurrentSecond() - dateCycle_);
337b1b8bc3fSopenharmony_ci    stats_.ResetIfaceStats();
338b1b8bc3fSopenharmony_ci}
339b1b8bc3fSopenharmony_ci
340b1b8bc3fSopenharmony_civoid NetStatsCached::WriteUidStats()
341b1b8bc3fSopenharmony_ci{
342b1b8bc3fSopenharmony_ci    if (!(CheckUidStor() || isForce_)) {
343b1b8bc3fSopenharmony_ci        return;
344b1b8bc3fSopenharmony_ci    }
345b1b8bc3fSopenharmony_ci    std::for_each(stats_.GetUidStatsInfo().begin(), stats_.GetUidStatsInfo().end(), [this](NetStatsInfo &info) {
346b1b8bc3fSopenharmony_ci        if (info.uid_ == uninstalledUid_) {
347b1b8bc3fSopenharmony_ci            info.flag_ = STATS_DATA_FLAG_UNINSTALLED;
348b1b8bc3fSopenharmony_ci        }
349b1b8bc3fSopenharmony_ci    });
350b1b8bc3fSopenharmony_ci    auto handler = std::make_unique<NetStatsDataHandler>();
351b1b8bc3fSopenharmony_ci    handler->WriteStatsData(stats_.GetUidStatsInfo(), NetStatsDatabaseDefines::UID_TABLE);
352b1b8bc3fSopenharmony_ci    handler->DeleteByDate(NetStatsDatabaseDefines::UID_TABLE, 0, CommonUtils::GetCurrentSecond() - dateCycle_);
353b1b8bc3fSopenharmony_ci    stats_.ResetUidStats();
354b1b8bc3fSopenharmony_ci}
355b1b8bc3fSopenharmony_ci
356b1b8bc3fSopenharmony_civoid NetStatsCached::WriteUidSimStats()
357b1b8bc3fSopenharmony_ci{
358b1b8bc3fSopenharmony_ci    if (!(CheckUidSimStor() || isForce_)) {
359b1b8bc3fSopenharmony_ci        return;
360b1b8bc3fSopenharmony_ci    }
361b1b8bc3fSopenharmony_ci    std::for_each(stats_.GetUidSimStatsInfo().begin(), stats_.GetUidSimStatsInfo().end(), [this](NetStatsInfo &info) {
362b1b8bc3fSopenharmony_ci        if (info.uid_ == uninstalledUid_) {
363b1b8bc3fSopenharmony_ci            info.flag_ = STATS_DATA_FLAG_UNINSTALLED;
364b1b8bc3fSopenharmony_ci        }
365b1b8bc3fSopenharmony_ci    });
366b1b8bc3fSopenharmony_ci    auto handler = std::make_unique<NetStatsDataHandler>();
367b1b8bc3fSopenharmony_ci    handler->WriteStatsData(stats_.GetUidSimStatsInfo(), NetStatsDatabaseDefines::UID_SIM_TABLE);
368b1b8bc3fSopenharmony_ci    handler->DeleteByDate(NetStatsDatabaseDefines::UID_SIM_TABLE, 0, CommonUtils::GetCurrentSecond() - dateCycle_);
369b1b8bc3fSopenharmony_ci    stats_.ResetUidSimStats();
370b1b8bc3fSopenharmony_ci}
371b1b8bc3fSopenharmony_ci
372b1b8bc3fSopenharmony_civoid NetStatsCached::LoadIfaceNameIdentMaps()
373b1b8bc3fSopenharmony_ci{
374b1b8bc3fSopenharmony_ci    int32_t ret = NetConnClient::GetInstance().GetIfaceNameIdentMaps(NetBearType::BEARER_CELLULAR, ifaceNameIdentMap_);
375b1b8bc3fSopenharmony_ci    if (ret != NETMANAGER_SUCCESS) {
376b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("GetIfaceNameIdentMaps error. ret=%{public}d", ret);
377b1b8bc3fSopenharmony_ci    }
378b1b8bc3fSopenharmony_ci}
379b1b8bc3fSopenharmony_ci
380b1b8bc3fSopenharmony_civoid NetStatsCached::SetCycleThreshold(uint32_t threshold)
381b1b8bc3fSopenharmony_ci{
382b1b8bc3fSopenharmony_ci    NETMGR_LOG_D("Current cycle threshold has changed current is : %{public}d", threshold);
383b1b8bc3fSopenharmony_ci    cycleThreshold_ = threshold;
384b1b8bc3fSopenharmony_ci#ifndef UNITTEST_FORBID_FFRT
385b1b8bc3fSopenharmony_ci    cacheTimer_ = std::make_unique<FfrtTimer>();
386b1b8bc3fSopenharmony_ci    cacheTimer_->Start(cycleThreshold_, [this]() { CacheStats(); });
387b1b8bc3fSopenharmony_ci#endif
388b1b8bc3fSopenharmony_ci}
389b1b8bc3fSopenharmony_ci
390b1b8bc3fSopenharmony_civoid NetStatsCached::ForceUpdateStats()
391b1b8bc3fSopenharmony_ci{
392b1b8bc3fSopenharmony_ci    isForce_ = true;
393b1b8bc3fSopenharmony_ci    std::function<void()> netCachedStats = [this] () {
394b1b8bc3fSopenharmony_ci        CacheStats();
395b1b8bc3fSopenharmony_ci        WriteStats();
396b1b8bc3fSopenharmony_ci        isForce_ = false;
397b1b8bc3fSopenharmony_ci        LoadIfaceNameIdentMaps();
398b1b8bc3fSopenharmony_ci    };
399b1b8bc3fSopenharmony_ci    ffrt::submit(std::move(netCachedStats), {}, {}, ffrt::task_attr().name("NetCachedStats"));
400b1b8bc3fSopenharmony_ci}
401b1b8bc3fSopenharmony_ci
402b1b8bc3fSopenharmony_civoid NetStatsCached::ForceDeleteStats(uint32_t uid)
403b1b8bc3fSopenharmony_ci{
404b1b8bc3fSopenharmony_ci    NETMGR_LOG_I("ForceDeleteStats Enter uid[%{public}u]", uid);
405b1b8bc3fSopenharmony_ci    auto ret = NetsysController::GetInstance().DeleteStatsInfo(uid);
406b1b8bc3fSopenharmony_ci    if (ret != NETMANAGER_SUCCESS) {
407b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("ForceDeleteStats DeleteStatsInfo failed. ret is %{public}d", ret);
408b1b8bc3fSopenharmony_ci    }
409b1b8bc3fSopenharmony_ci    ret = NetsysController::GetInstance().DeleteSimStatsInfo(uid);
410b1b8bc3fSopenharmony_ci    if (ret != NETMANAGER_SUCCESS) {
411b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("ForceDeleteStats DeleteSimStatsInfo failed. ret is %{public}d", ret);
412b1b8bc3fSopenharmony_ci    }
413b1b8bc3fSopenharmony_ci
414b1b8bc3fSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(lock_);
415b1b8bc3fSopenharmony_ci    stats_.ResetUidStats(uid);
416b1b8bc3fSopenharmony_ci    stats_.ResetUidSimStats(uid);
417b1b8bc3fSopenharmony_ci    lastUidStatsInfo_.erase(std::remove_if(lastUidStatsInfo_.begin(), lastUidStatsInfo_.end(),
418b1b8bc3fSopenharmony_ci                                           [uid](const auto &item) { return item.uid_ == uid; }),
419b1b8bc3fSopenharmony_ci                            lastUidStatsInfo_.end());
420b1b8bc3fSopenharmony_ci    lastUidSimStatsInfo_.erase(std::remove_if(lastUidSimStatsInfo_.begin(), lastUidSimStatsInfo_.end(),
421b1b8bc3fSopenharmony_ci                                              [uid](const auto &item) { return item.uid_ == uid; }),
422b1b8bc3fSopenharmony_ci                               lastUidSimStatsInfo_.end());
423b1b8bc3fSopenharmony_ci    uidPushStatsInfo_.erase(std::remove_if(uidPushStatsInfo_.begin(), uidPushStatsInfo_.end(),
424b1b8bc3fSopenharmony_ci                                           [uid](const auto &item) { return item.uid_ == uid; }),
425b1b8bc3fSopenharmony_ci                            uidPushStatsInfo_.end());
426b1b8bc3fSopenharmony_ci}
427b1b8bc3fSopenharmony_ci
428b1b8bc3fSopenharmony_civoid NetStatsCached::ForceArchiveStats(uint32_t uid)
429b1b8bc3fSopenharmony_ci{
430b1b8bc3fSopenharmony_ci    std::function<void()> netCachedStats = [this, uid]() {
431b1b8bc3fSopenharmony_ci        CacheStats();
432b1b8bc3fSopenharmony_ci        {
433b1b8bc3fSopenharmony_ci            std::lock_guard<ffrt::mutex> lock(lock_);
434b1b8bc3fSopenharmony_ci            isForce_ = true;
435b1b8bc3fSopenharmony_ci            uninstalledUid_ = uid;
436b1b8bc3fSopenharmony_ci            WriteUidStats();
437b1b8bc3fSopenharmony_ci            WriteUidSimStats();
438b1b8bc3fSopenharmony_ci            uninstalledUid_ = -1;
439b1b8bc3fSopenharmony_ci            isForce_ = false;
440b1b8bc3fSopenharmony_ci        }
441b1b8bc3fSopenharmony_ci        ForceDeleteStats(uid);
442b1b8bc3fSopenharmony_ci    };
443b1b8bc3fSopenharmony_ci    ffrt::submit(std::move(netCachedStats), {}, {}, ffrt::task_attr().name("NetForceArchiveStats"));
444b1b8bc3fSopenharmony_ci}
445b1b8bc3fSopenharmony_ci
446b1b8bc3fSopenharmony_civoid NetStatsCached::Reset() {}
447b1b8bc3fSopenharmony_ci
448b1b8bc3fSopenharmony_ci} // namespace NetManagerStandard
449b1b8bc3fSopenharmony_ci} // namespace OHOS
450