• 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 } // 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