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