1b1b8bc3fSopenharmony_ci/* 2b1b8bc3fSopenharmony_ci * Copyright (c) 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#ifndef NET_STATS_CACHED_H 17b1b8bc3fSopenharmony_ci#define NET_STATS_CACHED_H 18b1b8bc3fSopenharmony_ci 19b1b8bc3fSopenharmony_ci#include <algorithm> 20b1b8bc3fSopenharmony_ci#include <map> 21b1b8bc3fSopenharmony_ci#include <mutex> 22b1b8bc3fSopenharmony_ci#include <vector> 23b1b8bc3fSopenharmony_ci 24b1b8bc3fSopenharmony_ci#include "ffrt.h" 25b1b8bc3fSopenharmony_ci#include "net_push_stats_info.h" 26b1b8bc3fSopenharmony_ci#include "net_stats_callback.h" 27b1b8bc3fSopenharmony_ci#include "net_stats_info.h" 28b1b8bc3fSopenharmony_ci#include "netmanager_base_common_utils.h" 29b1b8bc3fSopenharmony_ci#include "safe_map.h" 30b1b8bc3fSopenharmony_ci 31b1b8bc3fSopenharmony_ci#include "ffrt_timer.h" 32b1b8bc3fSopenharmony_ci 33b1b8bc3fSopenharmony_cinamespace OHOS { 34b1b8bc3fSopenharmony_cinamespace NetManagerStandard { 35b1b8bc3fSopenharmony_ciclass NetStatsCached { 36b1b8bc3fSopenharmony_cipublic: 37b1b8bc3fSopenharmony_ci NetStatsCached() = default; 38b1b8bc3fSopenharmony_ci ~NetStatsCached() = default; 39b1b8bc3fSopenharmony_ci void ForceUpdateStats(); 40b1b8bc3fSopenharmony_ci 41b1b8bc3fSopenharmony_ci void ForceDeleteStats(uint32_t uid); 42b1b8bc3fSopenharmony_ci 43b1b8bc3fSopenharmony_ci void ForceArchiveStats(uint32_t uid); 44b1b8bc3fSopenharmony_ci 45b1b8bc3fSopenharmony_ci int32_t StartCached(); 46b1b8bc3fSopenharmony_ci 47b1b8bc3fSopenharmony_ci void SetCycleThreshold(uint32_t threshold); 48b1b8bc3fSopenharmony_ci 49b1b8bc3fSopenharmony_ci void GetUidStatsCached(std::vector<NetStatsInfo> &uidStatsInfo); 50b1b8bc3fSopenharmony_ci 51b1b8bc3fSopenharmony_ci void GetUidSimStatsCached(std::vector<NetStatsInfo> &uidSimStatsInfo); 52b1b8bc3fSopenharmony_ci 53b1b8bc3fSopenharmony_ci void GetUidPushStatsCached(std::vector<NetStatsInfo> &uidPushStatsInfo); 54b1b8bc3fSopenharmony_ci 55b1b8bc3fSopenharmony_ci void GetAllPushStatsCached(std::vector<NetStatsInfo> &uidPushStatsInfo); 56b1b8bc3fSopenharmony_ci 57b1b8bc3fSopenharmony_ci void GetIfaceStatsCached(std::vector<NetStatsInfo> &ifaceStatsInfo); 58b1b8bc3fSopenharmony_ci 59b1b8bc3fSopenharmony_ci void SetAppStats(const PushStatsInfo &info); 60b1b8bc3fSopenharmony_ci 61b1b8bc3fSopenharmony_ci void GetKernelStats(std::vector<NetStatsInfo> &statsInfo); 62b1b8bc3fSopenharmony_ci 63b1b8bc3fSopenharmony_ci inline void SetTrafficThreshold(uint64_t threshold) 64b1b8bc3fSopenharmony_ci { 65b1b8bc3fSopenharmony_ci trafficThreshold_ = threshold; 66b1b8bc3fSopenharmony_ci } 67b1b8bc3fSopenharmony_ci 68b1b8bc3fSopenharmony_ci inline void SetDateThreshold(uint64_t threshold) 69b1b8bc3fSopenharmony_ci { 70b1b8bc3fSopenharmony_ci cycleThreshold_ = threshold; 71b1b8bc3fSopenharmony_ci } 72b1b8bc3fSopenharmony_ci 73b1b8bc3fSopenharmony_ci inline void SetCallbackManager(const std::shared_ptr<NetStatsCallback> &callbackManager) 74b1b8bc3fSopenharmony_ci { 75b1b8bc3fSopenharmony_ci stats_.SetNotifier(callbackManager); 76b1b8bc3fSopenharmony_ci } 77b1b8bc3fSopenharmony_ci 78b1b8bc3fSopenharmony_ci void Reset(); 79b1b8bc3fSopenharmony_ci 80b1b8bc3fSopenharmony_ciprivate: 81b1b8bc3fSopenharmony_ci class CachedInfo { 82b1b8bc3fSopenharmony_ci public: 83b1b8bc3fSopenharmony_ci void PushUidStats(NetStatsInfo &info) 84b1b8bc3fSopenharmony_ci { 85b1b8bc3fSopenharmony_ci if (info.HasNoData()) { 86b1b8bc3fSopenharmony_ci return; 87b1b8bc3fSopenharmony_ci } 88b1b8bc3fSopenharmony_ci info.date_ = CommonUtils::GetCurrentSecond(); 89b1b8bc3fSopenharmony_ci uidStatsInfo_.push_back(info); 90b1b8bc3fSopenharmony_ci currentUidStats_ += info.GetStats(); 91b1b8bc3fSopenharmony_ci if (netStatsCallbackManager_ != nullptr) { 92b1b8bc3fSopenharmony_ci netStatsCallbackManager_->NotifyNetUidStatsChanged(info.iface_, info.uid_); 93b1b8bc3fSopenharmony_ci } 94b1b8bc3fSopenharmony_ci } 95b1b8bc3fSopenharmony_ci 96b1b8bc3fSopenharmony_ci void PushUidSimStats(NetStatsInfo &info) 97b1b8bc3fSopenharmony_ci { 98b1b8bc3fSopenharmony_ci if (info.HasNoData()) { 99b1b8bc3fSopenharmony_ci return; 100b1b8bc3fSopenharmony_ci } 101b1b8bc3fSopenharmony_ci info.date_ = CommonUtils::GetCurrentSecond(); 102b1b8bc3fSopenharmony_ci uidSimStatsInfo_.push_back(info); 103b1b8bc3fSopenharmony_ci currentUidSimStats_ += info.GetStats(); 104b1b8bc3fSopenharmony_ci if (netStatsCallbackManager_ != nullptr) { 105b1b8bc3fSopenharmony_ci netStatsCallbackManager_->NotifyNetUidStatsChanged(info.iface_, info.uid_); 106b1b8bc3fSopenharmony_ci } 107b1b8bc3fSopenharmony_ci } 108b1b8bc3fSopenharmony_ci 109b1b8bc3fSopenharmony_ci void PushIfaceStats(NetStatsInfo &info) 110b1b8bc3fSopenharmony_ci { 111b1b8bc3fSopenharmony_ci if (info.HasNoData()) { 112b1b8bc3fSopenharmony_ci return; 113b1b8bc3fSopenharmony_ci } 114b1b8bc3fSopenharmony_ci info.date_ = CommonUtils::GetCurrentSecond(); 115b1b8bc3fSopenharmony_ci ifaceStatsInfo_.push_back(info); 116b1b8bc3fSopenharmony_ci currentIfaceStats_ += info.GetStats(); 117b1b8bc3fSopenharmony_ci if (netStatsCallbackManager_ != nullptr) { 118b1b8bc3fSopenharmony_ci netStatsCallbackManager_->NotifyNetIfaceStatsChanged(info.iface_); 119b1b8bc3fSopenharmony_ci } 120b1b8bc3fSopenharmony_ci } 121b1b8bc3fSopenharmony_ci 122b1b8bc3fSopenharmony_ci inline std::vector<NetStatsInfo> &GetUidStatsInfo() 123b1b8bc3fSopenharmony_ci { 124b1b8bc3fSopenharmony_ci return uidStatsInfo_; 125b1b8bc3fSopenharmony_ci } 126b1b8bc3fSopenharmony_ci 127b1b8bc3fSopenharmony_ci inline std::vector<NetStatsInfo> &GetUidSimStatsInfo() 128b1b8bc3fSopenharmony_ci { 129b1b8bc3fSopenharmony_ci return uidSimStatsInfo_; 130b1b8bc3fSopenharmony_ci } 131b1b8bc3fSopenharmony_ci 132b1b8bc3fSopenharmony_ci inline std::vector<NetStatsInfo> &GetIfaceStatsInfo() 133b1b8bc3fSopenharmony_ci { 134b1b8bc3fSopenharmony_ci return ifaceStatsInfo_; 135b1b8bc3fSopenharmony_ci } 136b1b8bc3fSopenharmony_ci 137b1b8bc3fSopenharmony_ci inline uint64_t GetCurrentUidStats() const 138b1b8bc3fSopenharmony_ci { 139b1b8bc3fSopenharmony_ci return currentUidStats_; 140b1b8bc3fSopenharmony_ci } 141b1b8bc3fSopenharmony_ci 142b1b8bc3fSopenharmony_ci inline uint64_t GetCurrentUidSimStats() const 143b1b8bc3fSopenharmony_ci { 144b1b8bc3fSopenharmony_ci return currentUidSimStats_; 145b1b8bc3fSopenharmony_ci } 146b1b8bc3fSopenharmony_ci 147b1b8bc3fSopenharmony_ci inline uint64_t GetCurrentIfaceStats() const 148b1b8bc3fSopenharmony_ci { 149b1b8bc3fSopenharmony_ci return currentIfaceStats_; 150b1b8bc3fSopenharmony_ci } 151b1b8bc3fSopenharmony_ci 152b1b8bc3fSopenharmony_ci void ResetUidStats() 153b1b8bc3fSopenharmony_ci { 154b1b8bc3fSopenharmony_ci uidStatsInfo_.clear(); 155b1b8bc3fSopenharmony_ci currentUidStats_ = 0; 156b1b8bc3fSopenharmony_ci } 157b1b8bc3fSopenharmony_ci 158b1b8bc3fSopenharmony_ci void ResetUidStats(uint32_t uid) 159b1b8bc3fSopenharmony_ci { 160b1b8bc3fSopenharmony_ci for (const auto &item : uidStatsInfo_) { 161b1b8bc3fSopenharmony_ci if (item.uid_ == uid) { 162b1b8bc3fSopenharmony_ci currentUidStats_ -= item.GetStats(); 163b1b8bc3fSopenharmony_ci } 164b1b8bc3fSopenharmony_ci } 165b1b8bc3fSopenharmony_ci uidStatsInfo_.erase(std::remove_if(uidStatsInfo_.begin(), uidStatsInfo_.end(), 166b1b8bc3fSopenharmony_ci [uid](const auto &item) { return item.uid_ == uid; }), 167b1b8bc3fSopenharmony_ci uidStatsInfo_.end()); 168b1b8bc3fSopenharmony_ci } 169b1b8bc3fSopenharmony_ci 170b1b8bc3fSopenharmony_ci void ResetUidSimStats() 171b1b8bc3fSopenharmony_ci { 172b1b8bc3fSopenharmony_ci uidSimStatsInfo_.clear(); 173b1b8bc3fSopenharmony_ci currentUidSimStats_ = 0; 174b1b8bc3fSopenharmony_ci } 175b1b8bc3fSopenharmony_ci 176b1b8bc3fSopenharmony_ci void ResetUidSimStats(uint32_t uid) 177b1b8bc3fSopenharmony_ci { 178b1b8bc3fSopenharmony_ci for (const auto &item : uidSimStatsInfo_) { 179b1b8bc3fSopenharmony_ci if (item.uid_ == uid) { 180b1b8bc3fSopenharmony_ci currentUidSimStats_ -= item.GetStats(); 181b1b8bc3fSopenharmony_ci } 182b1b8bc3fSopenharmony_ci } 183b1b8bc3fSopenharmony_ci uidSimStatsInfo_.erase(std::remove_if(uidSimStatsInfo_.begin(), uidSimStatsInfo_.end(), 184b1b8bc3fSopenharmony_ci [uid](const auto &item) { return item.uid_ == uid; }), 185b1b8bc3fSopenharmony_ci uidSimStatsInfo_.end()); 186b1b8bc3fSopenharmony_ci } 187b1b8bc3fSopenharmony_ci 188b1b8bc3fSopenharmony_ci void ResetIfaceStats() 189b1b8bc3fSopenharmony_ci { 190b1b8bc3fSopenharmony_ci ifaceStatsInfo_.clear(); 191b1b8bc3fSopenharmony_ci currentIfaceStats_ = 0; 192b1b8bc3fSopenharmony_ci } 193b1b8bc3fSopenharmony_ci 194b1b8bc3fSopenharmony_ci inline void SetNotifier(const std::shared_ptr<NetStatsCallback> &callbackManager) 195b1b8bc3fSopenharmony_ci { 196b1b8bc3fSopenharmony_ci netStatsCallbackManager_ = callbackManager; 197b1b8bc3fSopenharmony_ci } 198b1b8bc3fSopenharmony_ci 199b1b8bc3fSopenharmony_ci private: 200b1b8bc3fSopenharmony_ci uint64_t currentUidStats_ = 0; 201b1b8bc3fSopenharmony_ci uint64_t currentUidSimStats_ = 0; 202b1b8bc3fSopenharmony_ci uint64_t currentIfaceStats_ = 0; 203b1b8bc3fSopenharmony_ci std::vector<NetStatsInfo> uidStatsInfo_; 204b1b8bc3fSopenharmony_ci std::vector<NetStatsInfo> uidSimStatsInfo_; 205b1b8bc3fSopenharmony_ci std::vector<NetStatsInfo> ifaceStatsInfo_; 206b1b8bc3fSopenharmony_ci std::shared_ptr<NetStatsCallback> netStatsCallbackManager_ = nullptr; 207b1b8bc3fSopenharmony_ci }; 208b1b8bc3fSopenharmony_ci 209b1b8bc3fSopenharmony_ci static constexpr uint32_t DEFAULT_CACHE_CYCLE_MS = 30 * 60 * 1000; 210b1b8bc3fSopenharmony_ci static constexpr uint64_t DEFAULT_TRAFFIC_STATISTICS_THRESHOLD_BYTES = 2 * 1024 * 1024; 211b1b8bc3fSopenharmony_ci static constexpr uint64_t DEFAULT_DATA_CYCLE_S = 180 * 24 * 60 * 60; 212b1b8bc3fSopenharmony_ci static constexpr uint64_t CACHE_DATE_TIME_S = 1 * 24 * 60 * 60; 213b1b8bc3fSopenharmony_ci static constexpr uint64_t STATS_PACKET_CYCLE_MS = 1 * 60 * 60 * 1000; 214b1b8bc3fSopenharmony_ci 215b1b8bc3fSopenharmony_ci CachedInfo stats_; 216b1b8bc3fSopenharmony_ci ffrt::mutex lock_; 217b1b8bc3fSopenharmony_ci bool isForce_ = false; 218b1b8bc3fSopenharmony_ci std::unique_ptr<FfrtTimer> cacheTimer_ = nullptr; 219b1b8bc3fSopenharmony_ci std::unique_ptr<FfrtTimer> writeTimer_ = nullptr; 220b1b8bc3fSopenharmony_ci uint32_t cycleThreshold_ = DEFAULT_CACHE_CYCLE_MS; 221b1b8bc3fSopenharmony_ci uint64_t trafficThreshold_ = DEFAULT_TRAFFIC_STATISTICS_THRESHOLD_BYTES; 222b1b8bc3fSopenharmony_ci uint64_t dateCycle_ = DEFAULT_DATA_CYCLE_S; 223b1b8bc3fSopenharmony_ci std::vector<NetStatsInfo> uidPushStatsInfo_; 224b1b8bc3fSopenharmony_ci std::vector<NetStatsInfo> allPushStatsInfo_; 225b1b8bc3fSopenharmony_ci std::vector<NetStatsInfo> lastUidStatsInfo_; 226b1b8bc3fSopenharmony_ci std::vector<NetStatsInfo> lastUidSimStatsInfo_; 227b1b8bc3fSopenharmony_ci std::map<std::string, NetStatsInfo> lastIfaceStatsMap_; 228b1b8bc3fSopenharmony_ci std::atomic<int64_t> uninstalledUid_ = -1; 229b1b8bc3fSopenharmony_ci SafeMap<std::string, std::string> ifaceNameIdentMap_; 230b1b8bc3fSopenharmony_ci 231b1b8bc3fSopenharmony_ci void LoadIfaceNameIdentMaps(); 232b1b8bc3fSopenharmony_ci 233b1b8bc3fSopenharmony_ci void CacheStats(); 234b1b8bc3fSopenharmony_ci void CacheUidStats(); 235b1b8bc3fSopenharmony_ci void CacheUidSimStats(); 236b1b8bc3fSopenharmony_ci void CacheIfaceStats(); 237b1b8bc3fSopenharmony_ci void CacheAppStats(); 238b1b8bc3fSopenharmony_ci 239b1b8bc3fSopenharmony_ci void WriteStats(); 240b1b8bc3fSopenharmony_ci void WriteUidStats(); 241b1b8bc3fSopenharmony_ci void WriteUidSimStats(); 242b1b8bc3fSopenharmony_ci void WriteIfaceStats(); 243b1b8bc3fSopenharmony_ci 244b1b8bc3fSopenharmony_ci NetStatsInfo GetIncreasedStats(const NetStatsInfo &info); 245b1b8bc3fSopenharmony_ci 246b1b8bc3fSopenharmony_ci NetStatsInfo GetIncreasedSimStats(const NetStatsInfo &info); 247b1b8bc3fSopenharmony_ci 248b1b8bc3fSopenharmony_ci inline bool CheckUidStor() 249b1b8bc3fSopenharmony_ci { 250b1b8bc3fSopenharmony_ci return stats_.GetCurrentUidStats() >= trafficThreshold_; 251b1b8bc3fSopenharmony_ci } 252b1b8bc3fSopenharmony_ci 253b1b8bc3fSopenharmony_ci inline bool CheckUidSimStor() 254b1b8bc3fSopenharmony_ci { 255b1b8bc3fSopenharmony_ci return stats_.GetCurrentUidSimStats() >= trafficThreshold_; 256b1b8bc3fSopenharmony_ci } 257b1b8bc3fSopenharmony_ci 258b1b8bc3fSopenharmony_ci inline bool CheckIfaceStor() 259b1b8bc3fSopenharmony_ci { 260b1b8bc3fSopenharmony_ci return stats_.GetCurrentIfaceStats() >= trafficThreshold_; 261b1b8bc3fSopenharmony_ci } 262b1b8bc3fSopenharmony_ci}; 263b1b8bc3fSopenharmony_ci} // namespace NetManagerStandard 264b1b8bc3fSopenharmony_ci} // namespace OHOS 265b1b8bc3fSopenharmony_ci 266b1b8bc3fSopenharmony_ci#endif // NET_STATS_CACHED_H 267