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