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