• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "net_stats_service.h"
17 
18 #include <net/if.h>
19 #include <sys/time.h>
20 #include <unistd.h>
21 
22 #include <cinttypes>
23 #include <initializer_list>
24 
25 #include "bpf_stats.h"
26 #include "broadcast_manager.h"
27 #include "common_event_manager.h"
28 #include "common_event_support.h"
29 #include "net_manager_center.h"
30 #include "net_manager_constants.h"
31 #include "net_mgr_log_wrapper.h"
32 #include "net_stats_constants.h"
33 #include "net_stats_database_defines.h"
34 #include "net_stats_service_common.h"
35 #include "netmanager_base_permission.h"
36 #include "netmanager_hitrace.h"
37 #include "netsys_controller.h"
38 #include "system_ability_definition.h"
39 
40 namespace OHOS {
41 namespace NetManagerStandard {
42 using namespace NetStatsDatabaseDefines;
43 namespace {
44 constexpr std::initializer_list<NetBearType> BEAR_TYPE_LIST = {
45     NetBearType::BEARER_CELLULAR, NetBearType::BEARER_WIFI, NetBearType::BEARER_BLUETOOTH,
46     NetBearType::BEARER_ETHERNET, NetBearType::BEARER_VPN,  NetBearType::BEARER_WIFI_AWARE,
47 };
48 
GetIfaceNamesFromManager(std::list<std::string> & ifaceNames)49 bool GetIfaceNamesFromManager(std::list<std::string> &ifaceNames)
50 {
51     int32_t ret = NetManagerCenter::GetInstance().GetIfaceNames(BEARER_CELLULAR, ifaceNames);
52     if (ret != NETMANAGER_SUCCESS || ifaceNames.empty()) {
53         NETMGR_LOG_E("Iface list is empty, ret = %{public}d", ret);
54         return false;
55     }
56     return true;
57 }
58 } // namespace
59 const bool REGISTER_LOCAL_RESULT =
60     SystemAbility::MakeAndRegisterAbility(DelayedSingleton<NetStatsService>::GetInstance().get());
61 
NetStatsService()62 NetStatsService::NetStatsService()
63     : SystemAbility(COMM_NET_STATS_MANAGER_SYS_ABILITY_ID, true), registerToService_(false), state_(STATE_STOPPED)
64 {
65     netStatsCallback_ = std::make_shared<NetStatsCallback>();
66     netStatsCached_ = std::make_unique<NetStatsCached>();
67 }
68 
69 NetStatsService::~NetStatsService() = default;
70 
OnStart()71 void NetStatsService::OnStart()
72 {
73     if (state_ == STATE_RUNNING) {
74         NETMGR_LOG_D("the state is already running");
75         return;
76     }
77     if (!Init()) {
78         NETMGR_LOG_E("init failed");
79         return;
80     }
81     AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
82     state_ = STATE_RUNNING;
83     sptr<NetStatsBaseService> baseService = new (std::nothrow) NetStatsServiceCommon();
84     if (baseService == nullptr) {
85         NETMGR_LOG_E("Net stats base service instance create failed");
86         return;
87     }
88     NetManagerCenter::GetInstance().RegisterStatsService(baseService);
89 }
90 
OnStop()91 void NetStatsService::OnStop()
92 {
93     state_ = STATE_STOPPED;
94     registerToService_ = true;
95 }
96 
Dump(int32_t fd,const std::vector<std::u16string> & args)97 int32_t NetStatsService::Dump(int32_t fd, const std::vector<std::u16string> &args)
98 {
99     NETMGR_LOG_D("Start Dump, fd: %{public}d", fd);
100     std::string result;
101     GetDumpMessage(result);
102     int32_t ret = dprintf(fd, "%s\n", result.c_str());
103     return ret < 0 ? STATS_DUMP_MESSAGE_FAIL : NETMANAGER_SUCCESS;
104 }
105 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)106 void NetStatsService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
107 {
108     EventFwk::MatchingSkills matchingSkills;
109     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
110     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SHUTDOWN);
111     EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
112     subscribeInfo.SetPriority(1);
113     subscriber_ = std::make_shared<NetStatsListener>(subscribeInfo);
114     subscriber_->RegisterStatsCallback(EventFwk::CommonEventSupport::COMMON_EVENT_SHUTDOWN,
115                                        [this](const EventFwk::Want &want) { return UpdateStatsData(); });
116     EventFwk::CommonEventManager::SubscribeCommonEvent(subscriber_);
117 }
118 
GetDumpMessage(std::string & message)119 void NetStatsService::GetDumpMessage(std::string &message)
120 {
121     message.append("Net Stats Info:\n");
122     uint64_t rxBytes = 0;
123     uint64_t txBytes = 0;
124     uint64_t rxPackets = 0;
125     uint64_t txPackets = 0;
126     NetsysController::GetInstance().GetTotalStats(rxBytes, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES));
127     NetsysController::GetInstance().GetTotalStats(txBytes, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES));
128     NetsysController::GetInstance().GetTotalStats(rxPackets, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_PACKETS));
129     NetsysController::GetInstance().GetTotalStats(txPackets, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_PACKETS));
130 
131     message.append("\tRxBytes: " + std::to_string(rxBytes) + "\n");
132     message.append("\tTxBytes: " + std::to_string(txBytes) + "\n");
133     message.append("\tRxPackets: " + std::to_string(rxPackets) + "\n");
134     message.append("\tTxPackets: " + std::to_string(txPackets) + "\n");
135     std::for_each(BEAR_TYPE_LIST.begin(), BEAR_TYPE_LIST.end(), [&message, this](const auto &bearType) {
136         std::list<std::string> ifaceNames;
137         if (NetManagerCenter::GetInstance().GetIfaceNames(bearType, ifaceNames)) {
138             return;
139         }
140         uint64_t rx = 0;
141         uint64_t tx = 0;
142         for (const auto &name : ifaceNames) {
143             GetIfaceRxBytes(rx, name);
144             GetIfaceTxBytes(tx, name);
145             message.append("\t" + name + "-TxBytes: " + std::to_string(tx));
146             message.append("\t" + name + "-RxBytes: " + std::to_string(rx));
147         }
148     });
149 }
150 
Init()151 bool NetStatsService::Init()
152 {
153     if (!REGISTER_LOCAL_RESULT) {
154         NETMGR_LOG_E("Register to local sa manager failed");
155         registerToService_ = false;
156         return false;
157     }
158     if (!registerToService_) {
159         if (!Publish(DelayedSingleton<NetStatsService>::GetInstance().get())) {
160             NETMGR_LOG_E("Register to sa manager failed");
161             return false;
162         }
163         registerToService_ = true;
164     }
165     if (nullptr == netStatsCached_) {
166         return false;
167     }
168     netStatsCached_->SetCallbackManager(netStatsCallback_);
169     auto ret = netStatsCached_->StartCached();
170     if (ret != NETMANAGER_SUCCESS) {
171         NETMGR_LOG_E("Start cached failed");
172         return false;
173     }
174 
175     return true;
176 }
177 
RegisterNetStatsCallback(const sptr<INetStatsCallback> & callback)178 int32_t NetStatsService::RegisterNetStatsCallback(const sptr<INetStatsCallback> &callback)
179 {
180     if (callback == nullptr) {
181         NETMGR_LOG_E("RegisterNetStatsCallback parameter callback is null");
182         return NETMANAGER_ERR_PARAMETER_ERROR;
183     }
184     netStatsCallback_->RegisterNetStatsCallback(callback);
185     return NETMANAGER_SUCCESS;
186 }
187 
UnregisterNetStatsCallback(const sptr<INetStatsCallback> & callback)188 int32_t NetStatsService::UnregisterNetStatsCallback(const sptr<INetStatsCallback> &callback)
189 {
190     if (callback == nullptr) {
191         NETMGR_LOG_E("UnregisterNetStatsCallback parameter callback is null");
192         return NETMANAGER_ERR_PARAMETER_ERROR;
193     }
194     netStatsCallback_->UnregisterNetStatsCallback(callback);
195     return NETMANAGER_SUCCESS;
196 }
197 
GetIfaceRxBytes(uint64_t & stats,const std::string & interfaceName)198 int32_t NetStatsService::GetIfaceRxBytes(uint64_t &stats, const std::string &interfaceName)
199 {
200     return NetsysController::GetInstance().GetIfaceStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES),
201                                                          interfaceName);
202 }
203 
GetIfaceTxBytes(uint64_t & stats,const std::string & interfaceName)204 int32_t NetStatsService::GetIfaceTxBytes(uint64_t &stats, const std::string &interfaceName)
205 {
206     return NetsysController::GetInstance().GetIfaceStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES),
207                                                          interfaceName);
208 }
209 
GetCellularRxBytes(uint64_t & stats)210 int32_t NetStatsService::GetCellularRxBytes(uint64_t &stats)
211 {
212     std::list<std::string> ifaceNames;
213     if (!GetIfaceNamesFromManager(ifaceNames)) {
214         return STATS_ERR_GET_IFACE_NAME_FAILED;
215     }
216 
217     for (const auto &name : ifaceNames) {
218         uint64_t totalCellular = 0;
219         auto ret = NetsysController::GetInstance().GetIfaceStats(
220             totalCellular, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES), name);
221         if (ret != NETMANAGER_SUCCESS) {
222             NETMGR_LOG_E("Get iface stats failed result: %{public}d", ret);
223             return ret;
224         }
225         stats += totalCellular;
226     }
227     return NETMANAGER_SUCCESS;
228 }
229 
GetCellularTxBytes(uint64_t & stats)230 int32_t NetStatsService::GetCellularTxBytes(uint64_t &stats)
231 {
232     std::list<std::string> ifaceNames;
233     if (!GetIfaceNamesFromManager(ifaceNames)) {
234         return STATS_ERR_GET_IFACE_NAME_FAILED;
235     }
236 
237     uint64_t totalCellular = 0;
238     for (const auto &name : ifaceNames) {
239         auto ret = NetsysController::GetInstance().GetIfaceStats(
240             totalCellular, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES), name);
241         if (ret != NETMANAGER_SUCCESS) {
242             NETMGR_LOG_E("Get iface stats failed result: %{public}d", ret);
243             return ret;
244         }
245         stats += totalCellular;
246     }
247     return NETMANAGER_SUCCESS;
248 }
249 
GetAllRxBytes(uint64_t & stats)250 int32_t NetStatsService::GetAllRxBytes(uint64_t &stats)
251 {
252     return NetsysController::GetInstance().GetTotalStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES));
253 }
254 
GetAllTxBytes(uint64_t & stats)255 int32_t NetStatsService::GetAllTxBytes(uint64_t &stats)
256 {
257     return NetsysController::GetInstance().GetTotalStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES));
258 }
259 
GetUidRxBytes(uint64_t & stats,uint32_t uid)260 int32_t NetStatsService::GetUidRxBytes(uint64_t &stats, uint32_t uid)
261 {
262     return NetsysController::GetInstance().GetUidStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES),
263                                                        uid);
264 }
265 
GetUidTxBytes(uint64_t & stats,uint32_t uid)266 int32_t NetStatsService::GetUidTxBytes(uint64_t &stats, uint32_t uid)
267 {
268     return NetsysController::GetInstance().GetUidStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES),
269                                                        uid);
270 }
271 
GetIfaceStatsDetail(const std::string & iface,uint64_t start,uint64_t end,NetStatsInfo & statsInfo)272 int32_t NetStatsService::GetIfaceStatsDetail(const std::string &iface, uint64_t start, uint64_t end,
273                                              NetStatsInfo &statsInfo)
274 {
275     // Start of get traffic data by interface name.
276     NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetIfaceStatsDetail start");
277     if (start > end) {
278         return NETMANAGER_ERR_INVALID_PARAMETER;
279     }
280     std::vector<NetStatsInfo> allInfo;
281     auto history = std::make_unique<NetStatsHistory>();
282     int32_t ret = history->GetHistory(allInfo, iface, start, end);
283 
284     if (nullptr == netStatsCached_) {
285         return NETMANAGER_ERR_LOCAL_PTR_NULL;
286     }
287     netStatsCached_->GetIfaceStatsCached(allInfo);
288     if (ret != NETMANAGER_SUCCESS) {
289         NETMGR_LOG_E("Get traffic stats data failed");
290         return ret;
291     }
292     std::for_each(allInfo.begin(), allInfo.end(), [&statsInfo, &iface, &start, &end](const auto &info) {
293         if (info.iface_ == iface && info.date_ >= start && info.date_ <= end) {
294             statsInfo += info;
295         }
296     });
297     statsInfo.iface_ = iface;
298     statsInfo.date_ = end;
299     // End of get traffic data by interface name.
300     NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetIfaceStatsDetail end");
301     return NETMANAGER_SUCCESS;
302 }
303 
GetUidStatsDetail(const std::string & iface,uint32_t uid,uint64_t start,uint64_t end,NetStatsInfo & statsInfo)304 int32_t NetStatsService::GetUidStatsDetail(const std::string &iface, uint32_t uid, uint64_t start, uint64_t end,
305                                            NetStatsInfo &statsInfo)
306 {
307     // Start of get traffic data by usr id.
308     NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetUidStatsDetail start");
309     if (start > end) {
310         return NETMANAGER_ERR_INVALID_PARAMETER;
311     }
312     std::vector<NetStatsInfo> allInfo;
313     auto history = std::make_unique<NetStatsHistory>();
314     int32_t ret = history->GetHistory(allInfo, iface, uid, start, end);
315     if (nullptr == netStatsCached_) {
316         return NETMANAGER_ERR_OPERATION_FAILED;
317     }
318     netStatsCached_->GetUidStatsCached(allInfo);
319     if (ret != NETMANAGER_SUCCESS) {
320         NETMGR_LOG_E("Get traffic stats data failed");
321         return ret;
322     }
323     std::for_each(allInfo.begin(), allInfo.end(), [&statsInfo, &iface, &uid, &start, &end](const auto &info) {
324         if (info.iface_ == iface && info.uid_ == uid && info.date_ >= start && info.date_ <= end) {
325             statsInfo += info;
326         }
327     });
328     statsInfo.uid_ = uid;
329     statsInfo.iface_ = iface;
330     statsInfo.date_ = end;
331     // End of get traffic data by usr id.
332     NetmanagerHiTrace::NetmanagerFinishSyncTrace("NetStatsService GetUidStatsDetail end");
333     return NETMANAGER_SUCCESS;
334 }
335 
UpdateIfacesStats(const std::string & iface,uint64_t start,uint64_t end,const NetStatsInfo & stats)336 int32_t NetStatsService::UpdateIfacesStats(const std::string &iface, uint64_t start, uint64_t end,
337                                            const NetStatsInfo &stats)
338 {
339     // Start of update traffic data by date.
340     NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService UpdateIfacesStats start");
341     if (start > end) {
342         return NETMANAGER_ERR_INVALID_PARAMETER;
343     }
344     std::vector<NetStatsInfo> infos;
345     infos.push_back(stats);
346     auto handler = std::make_unique<NetStatsDataHandler>();
347     auto ret = handler->DeleteByDate(IFACE_TABLE, start, end);
348     if (ret != NETMANAGER_SUCCESS) {
349         NETMGR_LOG_E("Update ifaces stats failed");
350     }
351     ret = handler->WriteStatsData(infos, IFACE_TABLE);
352     if (ret != NETMANAGER_SUCCESS) {
353         NETMGR_LOG_E("Update ifaces stats failed");
354         return STATS_ERR_WRITE_DATA_FAIL;
355     }
356     // End of update traffic data by date.
357     NetmanagerHiTrace::NetmanagerFinishSyncTrace("NetStatsService UpdateIfacesStats end");
358     return ret;
359 }
360 
UpdateStatsData()361 int32_t NetStatsService::UpdateStatsData()
362 {
363     if (netStatsCached_ == nullptr) {
364         NETMGR_LOG_E("Cached is nullptr");
365         return NETMANAGER_ERR_LOCAL_PTR_NULL;
366     }
367     netStatsCached_->ForceUpdateStats();
368     return NETMANAGER_SUCCESS;
369 }
370 
ResetFactory()371 int32_t NetStatsService::ResetFactory()
372 {
373     auto handler = std::make_unique<NetStatsDataHandler>();
374     return handler->ClearData();
375 }
376 
GetAllStatsInfo(std::vector<NetStatsInfo> & infos)377 int32_t NetStatsService::GetAllStatsInfo(std::vector<NetStatsInfo> &infos)
378 {
379     return NetsysController::GetInstance().GetAllStatsInfo(infos);
380 }
381 
382 } // namespace NetManagerStandard
383 } // namespace OHOS
384