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 } // namespace
49 const bool REGISTER_LOCAL_RESULT =
50 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<NetStatsService>::GetInstance().get());
51
NetStatsService()52 NetStatsService::NetStatsService()
53 : SystemAbility(COMM_NET_STATS_MANAGER_SYS_ABILITY_ID, true), registerToService_(false), state_(STATE_STOPPED)
54 {
55 netStatsCallback_ = std::make_shared<NetStatsCallback>();
56 netStatsCached_ = std::make_unique<NetStatsCached>();
57 }
58
59 NetStatsService::~NetStatsService() = default;
60
OnStart()61 void NetStatsService::OnStart()
62 {
63 if (state_ == STATE_RUNNING) {
64 NETMGR_LOG_D("the state is already running");
65 return;
66 }
67 if (!Init()) {
68 NETMGR_LOG_E("init failed");
69 return;
70 }
71 AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
72 state_ = STATE_RUNNING;
73 sptr<NetStatsBaseService> baseService = new (std::nothrow) NetStatsServiceCommon();
74 if (baseService == nullptr) {
75 NETMGR_LOG_E("Net stats base service instance create failed");
76 return;
77 }
78 NetManagerCenter::GetInstance().RegisterStatsService(baseService);
79 }
80
OnStop()81 void NetStatsService::OnStop()
82 {
83 state_ = STATE_STOPPED;
84 registerToService_ = true;
85 }
86
Dump(int32_t fd,const std::vector<std::u16string> & args)87 int32_t NetStatsService::Dump(int32_t fd, const std::vector<std::u16string> &args)
88 {
89 NETMGR_LOG_D("Start Dump, fd: %{public}d", fd);
90 std::string result;
91 GetDumpMessage(result);
92 int32_t ret = dprintf(fd, "%s\n", result.c_str());
93 return ret < 0 ? STATS_DUMP_MESSAGE_FAIL : NETMANAGER_SUCCESS;
94 }
95
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)96 void NetStatsService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
97 {
98 EventFwk::MatchingSkills matchingSkills;
99 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
100 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SHUTDOWN);
101 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
102 subscribeInfo.SetPriority(1);
103 subscriber_ = std::make_shared<NetStatsListener>(subscribeInfo);
104 subscriber_->RegisterStatsCallback(EventFwk::CommonEventSupport::COMMON_EVENT_SHUTDOWN,
105 [this](const EventFwk::Want &want) { return UpdateStatsData(); });
106 EventFwk::CommonEventManager::SubscribeCommonEvent(subscriber_);
107 }
108
GetDumpMessage(std::string & message)109 void NetStatsService::GetDumpMessage(std::string &message)
110 {
111 message.append("Net Stats Info:\n");
112 uint64_t rxBytes = 0;
113 uint64_t txBytes = 0;
114 uint64_t rxPackets = 0;
115 uint64_t txPackets = 0;
116 NetsysController::GetInstance().GetTotalStats(rxBytes, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES));
117 NetsysController::GetInstance().GetTotalStats(txBytes, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES));
118 NetsysController::GetInstance().GetTotalStats(rxPackets, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_PACKETS));
119 NetsysController::GetInstance().GetTotalStats(txPackets, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_PACKETS));
120
121 message.append("\tRxBytes: " + std::to_string(rxBytes) + "\n");
122 message.append("\tTxBytes: " + std::to_string(txBytes) + "\n");
123 message.append("\tRxPackets: " + std::to_string(rxPackets) + "\n");
124 message.append("\tTxPackets: " + std::to_string(txPackets) + "\n");
125 std::for_each(BEAR_TYPE_LIST.begin(), BEAR_TYPE_LIST.end(), [&message, this](const auto &bearType) {
126 std::list<std::string> ifaceNames;
127 if (NetManagerCenter::GetInstance().GetIfaceNames(bearType, ifaceNames)) {
128 return;
129 }
130 uint64_t rx = 0;
131 uint64_t tx = 0;
132 for (const auto &name : ifaceNames) {
133 GetIfaceRxBytes(rx, name);
134 GetIfaceTxBytes(tx, name);
135 message.append("\t" + name + "-TxBytes: " + std::to_string(tx));
136 message.append("\t" + name + "-RxBytes: " + std::to_string(rx));
137 }
138 });
139 }
140
Init()141 bool NetStatsService::Init()
142 {
143 if (!REGISTER_LOCAL_RESULT) {
144 NETMGR_LOG_E("Register to local sa manager failed");
145 registerToService_ = false;
146 return false;
147 }
148 if (!registerToService_) {
149 if (!Publish(DelayedSingleton<NetStatsService>::GetInstance().get())) {
150 NETMGR_LOG_E("Register to sa manager failed");
151 return false;
152 }
153 registerToService_ = true;
154 }
155 if (nullptr == netStatsCached_) {
156 return false;
157 }
158 netStatsCached_->SetCallbackManager(netStatsCallback_);
159 auto ret = netStatsCached_->StartCached();
160 if (ret != NETMANAGER_SUCCESS) {
161 NETMGR_LOG_E("Start cached failed");
162 return false;
163 }
164
165 return true;
166 }
167
RegisterNetStatsCallback(const sptr<INetStatsCallback> & callback)168 int32_t NetStatsService::RegisterNetStatsCallback(const sptr<INetStatsCallback> &callback)
169 {
170 NETMGR_LOG_I("Enter RegisterNetStatsCallback");
171 if (callback == nullptr) {
172 NETMGR_LOG_E("RegisterNetStatsCallback parameter callback is null");
173 return NETMANAGER_ERR_PARAMETER_ERROR;
174 }
175 netStatsCallback_->RegisterNetStatsCallback(callback);
176 return NETMANAGER_SUCCESS;
177 }
178
UnregisterNetStatsCallback(const sptr<INetStatsCallback> & callback)179 int32_t NetStatsService::UnregisterNetStatsCallback(const sptr<INetStatsCallback> &callback)
180 {
181 NETMGR_LOG_I("Enter UnregisterNetStatsCallback");
182 if (callback == nullptr) {
183 NETMGR_LOG_E("UnregisterNetStatsCallback parameter callback is null");
184 return NETMANAGER_ERR_PARAMETER_ERROR;
185 }
186 netStatsCallback_->UnregisterNetStatsCallback(callback);
187 return NETMANAGER_SUCCESS;
188 }
189
GetIfaceRxBytes(uint64_t & stats,const std::string & interfaceName)190 int32_t NetStatsService::GetIfaceRxBytes(uint64_t &stats, const std::string &interfaceName)
191 {
192 return NetsysController::GetInstance().GetIfaceStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES),
193 interfaceName);
194 }
195
GetIfaceTxBytes(uint64_t & stats,const std::string & interfaceName)196 int32_t NetStatsService::GetIfaceTxBytes(uint64_t &stats, const std::string &interfaceName)
197 {
198 return NetsysController::GetInstance().GetIfaceStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES),
199 interfaceName);
200 }
201
GetCellularRxBytes(uint64_t & stats)202 int32_t NetStatsService::GetCellularRxBytes(uint64_t &stats)
203 {
204 std::list<std::string> ifaceNames;
205 if (!GetIfaceNamesFromManager(ifaceNames)) {
206 return STATS_ERR_GET_IFACE_NAME_FAILED;
207 }
208
209 for (const auto &name : ifaceNames) {
210 uint64_t totalCellular = 0;
211 auto ret = NetsysController::GetInstance().GetIfaceStats(
212 totalCellular, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES), name);
213 if (ret != NETMANAGER_SUCCESS) {
214 NETMGR_LOG_E("Get iface stats failed result: %{public}d", ret);
215 return ret;
216 }
217 stats += totalCellular;
218 }
219 return NETMANAGER_SUCCESS;
220 }
221
GetCellularTxBytes(uint64_t & stats)222 int32_t NetStatsService::GetCellularTxBytes(uint64_t &stats)
223 {
224 std::list<std::string> ifaceNames;
225 if (!GetIfaceNamesFromManager(ifaceNames)) {
226 return STATS_ERR_GET_IFACE_NAME_FAILED;
227 }
228
229 uint64_t totalCellular = 0;
230 for (const auto &name : ifaceNames) {
231 auto ret = NetsysController::GetInstance().GetIfaceStats(
232 totalCellular, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES), name);
233 if (ret != NETMANAGER_SUCCESS) {
234 NETMGR_LOG_E("Get iface stats failed result: %{public}d", ret);
235 return ret;
236 }
237 stats += totalCellular;
238 }
239 return NETMANAGER_SUCCESS;
240 }
241
GetAllRxBytes(uint64_t & stats)242 int32_t NetStatsService::GetAllRxBytes(uint64_t &stats)
243 {
244 NETMGR_LOG_D("Enter GetAllRxBytes");
245 return NetsysController::GetInstance().GetTotalStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES));
246 }
247
GetAllTxBytes(uint64_t & stats)248 int32_t NetStatsService::GetAllTxBytes(uint64_t &stats)
249 {
250 NETMGR_LOG_D("Enter GetAllTxBytes");
251 return NetsysController::GetInstance().GetTotalStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES));
252 }
253
GetUidRxBytes(uint64_t & stats,uint32_t uid)254 int32_t NetStatsService::GetUidRxBytes(uint64_t &stats, uint32_t uid)
255 {
256 NETMGR_LOG_D("Enter GetUidRxBytes, uid is %{public}d", uid);
257 return NetsysController::GetInstance().GetUidStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES),
258 uid);
259 }
260
GetUidTxBytes(uint64_t & stats,uint32_t uid)261 int32_t NetStatsService::GetUidTxBytes(uint64_t &stats, uint32_t uid)
262 {
263 NETMGR_LOG_D("Enter GetUidTxBytes,uid is %{public}d", uid);
264 return NetsysController::GetInstance().GetUidStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES),
265 uid);
266 }
267
GetIfaceStatsDetail(const std::string & iface,uint64_t start,uint64_t end,NetStatsInfo & statsInfo)268 int32_t NetStatsService::GetIfaceStatsDetail(const std::string &iface, uint64_t start, uint64_t end,
269 NetStatsInfo &statsInfo)
270 {
271 // Start of get traffic data by interface name.
272 NETMGR_LOG_D("Enter GetIfaceStatsDetail, iface= %{public}s", iface.c_str());
273 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetIfaceStatsDetail start");
274 if (start > end) {
275 NETMGR_LOG_E("start is after end.");
276 return NETMANAGER_ERR_INVALID_PARAMETER;
277 }
278 std::vector<NetStatsInfo> allInfo;
279 auto history = std::make_unique<NetStatsHistory>();
280 int32_t ret = history->GetHistory(allInfo, iface, start, end);
281
282 if (netStatsCached_ == nullptr) {
283 NETMGR_LOG_E("netStatsCached_ is fail");
284 return NETMANAGER_ERR_LOCAL_PTR_NULL;
285 }
286 netStatsCached_->GetIfaceStatsCached(allInfo);
287 if (ret != NETMANAGER_SUCCESS) {
288 NETMGR_LOG_E("Get traffic stats data failed");
289 return ret;
290 }
291 std::for_each(allInfo.begin(), allInfo.end(), [&statsInfo, &iface, &start, &end](const auto &info) {
292 if (info.iface_ == iface && info.date_ >= start && info.date_ <= end) {
293 statsInfo += info;
294 }
295 });
296 statsInfo.iface_ = iface;
297 statsInfo.date_ = end;
298 // End of get traffic data by interface name.
299 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetIfaceStatsDetail end");
300 return NETMANAGER_SUCCESS;
301 }
302
GetUidStatsDetail(const std::string & iface,uint32_t uid,uint64_t start,uint64_t end,NetStatsInfo & statsInfo)303 int32_t NetStatsService::GetUidStatsDetail(const std::string &iface, uint32_t uid, uint64_t start, uint64_t end,
304 NetStatsInfo &statsInfo)
305 {
306 // Start of get traffic data by usr id.
307 NETMGR_LOG_D("Enter GetIfaceStatsDetail, iface= %{public}s uid= %{public}d", iface.c_str(), uid);
308 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService GetUidStatsDetail start");
309 if (start > end) {
310 NETMGR_LOG_E("start is after end.");
311 return NETMANAGER_ERR_INVALID_PARAMETER;
312 }
313 std::vector<NetStatsInfo> allInfo;
314 auto history = std::make_unique<NetStatsHistory>();
315 int32_t ret = history->GetHistory(allInfo, iface, uid, start, end);
316 if (netStatsCached_ == nullptr) {
317 NETMGR_LOG_E("netStatsCached_ is fail");
318 return NETMANAGER_ERR_LOCAL_PTR_NULL;
319 }
320 netStatsCached_->GetUidStatsCached(allInfo);
321 if (ret != NETMANAGER_SUCCESS) {
322 NETMGR_LOG_E("Get traffic stats data failed");
323 return ret;
324 }
325 std::for_each(allInfo.begin(), allInfo.end(), [&statsInfo, &iface, &uid, &start, &end](const auto &info) {
326 if (info.iface_ == iface && info.uid_ == uid && info.date_ >= start && info.date_ <= end) {
327 statsInfo += info;
328 }
329 });
330 statsInfo.uid_ = uid;
331 statsInfo.iface_ = iface;
332 statsInfo.date_ = end;
333 // End of get traffic data by usr id.
334 NetmanagerHiTrace::NetmanagerFinishSyncTrace("NetStatsService GetUidStatsDetail end");
335 return NETMANAGER_SUCCESS;
336 }
337
UpdateIfacesStats(const std::string & iface,uint64_t start,uint64_t end,const NetStatsInfo & stats)338 int32_t NetStatsService::UpdateIfacesStats(const std::string &iface, uint64_t start, uint64_t end,
339 const NetStatsInfo &stats)
340 {
341 // Start of update traffic data by date.
342 NETMGR_LOG_I("UpdateIfacesStats ifaces is %{public}s", iface.c_str());
343 NetmanagerHiTrace::NetmanagerStartSyncTrace("NetStatsService UpdateIfacesStats start");
344 if (start > end) {
345 NETMGR_LOG_E("start is after end.");
346 return NETMANAGER_ERR_INVALID_PARAMETER;
347 }
348 std::vector<NetStatsInfo> infos;
349 infos.push_back(stats);
350 auto handler = std::make_unique<NetStatsDataHandler>();
351 auto ret = handler->DeleteByDate(IFACE_TABLE, start, end);
352 if (ret != NETMANAGER_SUCCESS) {
353 NETMGR_LOG_E("Update ifaces stats failed");
354 }
355 ret = handler->WriteStatsData(infos, IFACE_TABLE);
356 if (ret != NETMANAGER_SUCCESS) {
357 NETMGR_LOG_E("Update ifaces stats failed");
358 return STATS_ERR_WRITE_DATA_FAIL;
359 }
360 // End of update traffic data by date.
361 NetmanagerHiTrace::NetmanagerFinishSyncTrace("NetStatsService UpdateIfacesStats end");
362 return ret;
363 }
364
UpdateStatsData()365 int32_t NetStatsService::UpdateStatsData()
366 {
367 NETMGR_LOG_D("Enter UpdateStatsData.");
368 if (netStatsCached_ == nullptr) {
369 NETMGR_LOG_E("Cached is nullptr");
370 return NETMANAGER_ERR_LOCAL_PTR_NULL;
371 }
372 netStatsCached_->ForceUpdateStats();
373 NETMGR_LOG_D("End UpdateStatsData.");
374 return NETMANAGER_SUCCESS;
375 }
376
ResetFactory()377 int32_t NetStatsService::ResetFactory()
378 {
379 auto handler = std::make_unique<NetStatsDataHandler>();
380 return handler->ClearData();
381 }
382
GetAllStatsInfo(std::vector<NetStatsInfo> & infos)383 int32_t NetStatsService::GetAllStatsInfo(std::vector<NetStatsInfo> &infos)
384 {
385 NETMGR_LOG_D("Enter GetAllStatsInfo.");
386 return NetsysController::GetInstance().GetAllStatsInfo(infos);
387 }
388
GetCookieRxBytes(uint64_t & stats,uint64_t cookie)389 int32_t NetStatsService::GetCookieRxBytes(uint64_t &stats, uint64_t cookie)
390 {
391 return NetsysController::GetInstance().GetCookieStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_RX_BYTES),
392 cookie);
393 }
394
GetCookieTxBytes(uint64_t & stats,uint64_t cookie)395 int32_t NetStatsService::GetCookieTxBytes(uint64_t &stats, uint64_t cookie)
396 {
397 return NetsysController::GetInstance().GetCookieStats(stats, static_cast<uint32_t>(StatsType::STATS_TYPE_TX_BYTES),
398 cookie);
399 }
400
GetIfaceNamesFromManager(std::list<std::string> & ifaceNames)401 bool NetStatsService::GetIfaceNamesFromManager(std::list<std::string> &ifaceNames)
402 {
403 int32_t ret = NetManagerCenter::GetInstance().GetIfaceNames(BEARER_CELLULAR, ifaceNames);
404 if (ret != NETMANAGER_SUCCESS || ifaceNames.empty()) {
405 NETMGR_LOG_E("Iface list is empty, ret = %{public}d", ret);
406 return false;
407 }
408 return true;
409 }
410 } // namespace NetManagerStandard
411 } // namespace OHOS
412