• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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/if.h>
17 #include <vector>
18 #include <set>
19 #include <cinttypes>
20 
21 #include "bpf_path.h"
22 #include "bpf_def.h"
23 #include "bpf_stats.h"
24 #include "securec.h"
25 #include "netnative_log_wrapper.h"
26 #include "net_stats_constants.h"
27 
28 namespace OHOS::NetManagerStandard {
29 namespace {
30 constexpr const char *CELLULAR_IFACE = "rmnet0";
31 constexpr const char *CELLULAR_IFACE_1 = "rmnet1";
32 constexpr const char *CELLULAR_IFACE_2 = "rmnet2";
33 constexpr const char *CELLULAR_IFACE_3 = "rmnet3";
34 constexpr const char *VIRNIC_IFACE = "virnic";
35 constexpr const char *WIFI_IFACE = "wlan0";
36 constexpr const char *WIFI_IFACE_1 = "wlan1";
37 std::set<std::string> IFACE_NAME_SET { CELLULAR_IFACE, CELLULAR_IFACE_1, CELLULAR_IFACE_2, CELLULAR_IFACE_3,
38     VIRNIC_IFACE, WIFI_IFACE, WIFI_IFACE_1 };
39 }
GetNumberFromStatsValue(uint64_t & stats,StatsType statsType,const stats_value & value)40 int32_t NetsysBpfStats::GetNumberFromStatsValue(uint64_t &stats, StatsType statsType, const stats_value &value)
41 {
42     switch (statsType) {
43         case StatsType::STATS_TYPE_RX_BYTES:
44             stats = value.rxBytes;
45             break;
46         case StatsType::STATS_TYPE_RX_PACKETS:
47             stats = value.rxPackets;
48             break;
49         case StatsType::STATS_TYPE_TX_BYTES:
50             stats = value.txBytes;
51             break;
52         case StatsType::STATS_TYPE_TX_PACKETS:
53             stats = value.txPackets;
54             break;
55         default:
56             NETNATIVE_LOGE("invalid StatsType type %{public}d", statsType);
57             return STATS_ERR_READ_BPF_FAIL;
58     }
59     return NETSYS_SUCCESS;
60 }
61 
GetTotalStats(uint64_t & stats,StatsType statsType)62 int32_t NetsysBpfStats::GetTotalStats(uint64_t &stats, StatsType statsType)
63 {
64     stats = 0;
65     std::lock_guard<std::mutex> lock(ifaceStatsMapMutext_);
66     BpfMapper<iface_stats_key, iface_stats_value> ifaceStatsMap(IFACE_STATS_MAP_PATH, BPF_F_RDONLY);
67     if (!ifaceStatsMap.IsValid()) {
68         NETNATIVE_LOGE("ifaceStatsMap IsValid");
69         return STATS_ERR_INVALID_IFACE_NAME_MAP;
70     }
71 
72     iface_stats_value totalStats = {0};
73     auto keys = ifaceStatsMap.GetAllKeys();
74     std::set<uint64_t> ifIndexSet;
75     std::set<uint64_t> needFilterIfIndex;
76     for (auto key : keys) {
77         ifIndexSet.insert(key);
78     }
79 
80     for (auto value : ifIndexSet) {
81         char if_name[IFNAME_SIZE] = {0};
82         if (memset_s(if_name, sizeof(if_name), 0, sizeof(if_name)) != EOK) {
83             return STATS_ERR_READ_BPF_FAIL;
84         }
85 
86         char *pName = if_indextoname(value, if_name);
87         if (pName != nullptr && IFACE_NAME_SET.find(pName) == IFACE_NAME_SET.end()) {
88             needFilterIfIndex.insert(value);
89         }
90     }
91     for (const auto &k : keys) {
92         if (needFilterIfIndex.find(k) != needFilterIfIndex.end()) {
93             continue;
94         }
95         iface_stats_value v = {0};
96         if (ifaceStatsMap.Read(k, v) < NETSYS_SUCCESS) {
97             NETNATIVE_LOGE("Read ifaceStatsMap err");
98             return STATS_ERR_READ_BPF_FAIL;
99         }
100         totalStats.rxPackets += v.rxPackets;
101         totalStats.rxBytes += v.rxBytes;
102         totalStats.txPackets += v.txPackets;
103         totalStats.txBytes += v.txBytes;
104     }
105 
106     return GetNumberFromStatsValue(stats, statsType, totalStats);
107 }
108 
GetUidStats(uint64_t & stats,StatsType statsType,uint32_t uid)109 int32_t NetsysBpfStats::GetUidStats(uint64_t &stats, StatsType statsType, uint32_t uid)
110 {
111     stats = 0;
112     BpfMapper<app_uid_stats_key, app_uid_stats_value> appUidStatsMap(APP_UID_STATS_MAP_PATH, BPF_F_RDONLY);
113     if (!appUidStatsMap.IsValid()) {
114         return STATS_ERR_INVALID_IFACE_NAME_MAP;
115     }
116 
117     app_uid_stats_value uidStats = {0};
118     if (appUidStatsMap.Read(uid, uidStats) < 0) {
119         return STATS_ERR_READ_BPF_FAIL;
120     }
121     return GetNumberFromStatsValue(stats, statsType, uidStats);
122 }
123 
GetAllSimStatsInfo(std::vector<OHOS::NetManagerStandard::NetStatsInfo> & stats)124 int32_t NetsysBpfStats::GetAllSimStatsInfo(std::vector<OHOS::NetManagerStandard::NetStatsInfo> &stats)
125 {
126     BpfMapper<stats_key, stats_value> uidSimStatsMap(APP_UID_SIM_STATS_MAP_PATH, BPF_F_RDONLY);
127     if (!uidSimStatsMap.IsValid()) {
128         return STATS_ERR_INVALID_IFACE_NAME_MAP;
129     }
130 
131     stats.clear();
132     char if_name[IFNAME_SIZE] = {0};
133     auto keys = uidSimStatsMap.GetAllKeys();
134     for (const auto &k : keys) {
135         stats_value v = {};
136         if (uidSimStatsMap.Read(k, v) < 0) {
137             NETNATIVE_LOGE("Read uid_sim_map err");
138             return STATS_ERR_READ_BPF_FAIL;
139         }
140 
141         NetStatsInfo tempStats;
142         tempStats.uid_ = k.uId;
143         if (memset_s(if_name, sizeof(if_name), 0, sizeof(if_name)) != EOK) {
144             return STATS_ERR_READ_BPF_FAIL;
145         }
146 
147         char *pName = if_indextoname(k.ifIndex, if_name);
148         if (pName != nullptr) {
149             tempStats.iface_ = pName;
150         }
151         if (IFACE_NAME_SET.find(tempStats.iface_) == IFACE_NAME_SET.end()) {
152             continue;
153         }
154         if (k.ifType == IFACE_TYPE_WIFI) {
155             tempStats.iface_ = WIFI_IFACE;
156         } else if (k.ifType == IFACE_TYPE_CELLULAR) {
157             tempStats.iface_ = CELLULAR_IFACE;
158         }
159         tempStats.rxBytes_ = v.rxBytes;
160         tempStats.txBytes_ = v.txBytes;
161         tempStats.rxPackets_ = v.rxPackets;
162         tempStats.txPackets_ = v.txPackets;
163         auto findRet = std::find_if(stats.begin(), stats.end(),
164                                     [&tempStats](const NetStatsInfo &info) { return info.Equals(tempStats); });
165         if (findRet == stats.end()) {
166             stats.push_back(std::move(tempStats));
167         } else {
168             *findRet += tempStats;
169         }
170     }
171 
172     return NETSYS_SUCCESS;
173 }
174 
GetAllStatsInfo(std::vector<OHOS::NetManagerStandard::NetStatsInfo> & stats)175 int32_t NetsysBpfStats::GetAllStatsInfo(std::vector<OHOS::NetManagerStandard::NetStatsInfo> &stats)
176 {
177     BpfMapper<stats_key, stats_value> uidIfaceStatsMap(APP_UID_IF_STATS_MAP_PATH, BPF_F_RDONLY);
178     if (!uidIfaceStatsMap.IsValid()) {
179         return STATS_ERR_INVALID_IFACE_NAME_MAP;
180     }
181 
182     stats.clear();
183     char if_name[IFNAME_SIZE] = {0};
184     auto keys = uidIfaceStatsMap.GetAllKeys();
185     for (const auto &k : keys) {
186         stats_value v = {};
187         if (uidIfaceStatsMap.Read(k, v) < 0) {
188             NETNATIVE_LOGE("Read ifaceStatsMap err");
189             return STATS_ERR_READ_BPF_FAIL;
190         }
191 
192         NetStatsInfo tempStats;
193         tempStats.uid_ = k.uId;
194         if (memset_s(if_name, sizeof(if_name), 0, sizeof(if_name)) != EOK) {
195             return STATS_ERR_READ_BPF_FAIL;
196         }
197 
198         char *pName = if_indextoname(k.ifIndex, if_name);
199         if (pName != nullptr) {
200             tempStats.iface_ = pName;
201         }
202         if (IFACE_NAME_SET.find(tempStats.iface_) == IFACE_NAME_SET.end()) {
203             continue;
204         }
205         tempStats.rxBytes_ = v.rxBytes;
206         tempStats.txBytes_ = v.txBytes;
207         tempStats.rxPackets_ = v.rxPackets;
208         tempStats.txPackets_ = v.txPackets;
209         stats.emplace_back(std::move(tempStats));
210     }
211 
212     return NETSYS_SUCCESS;
213 }
214 
DeleteStatsInfo(const std::string & path,uint32_t uid)215 int32_t NetsysBpfStats::DeleteStatsInfo(const std::string &path, uint32_t uid)
216 {
217     if (path != APP_UID_IF_STATS_MAP_PATH && path != APP_UID_SIM_STATS_MAP_PATH) {
218         NETNATIVE_LOGI("DeleteStatsInfo invalid path");
219         return NETSYS_SUCCESS;
220     }
221     BpfMapper<stats_key, stats_value> uidStatsMap(path, BPF_ANY);
222     if (!uidStatsMap.IsValid()) {
223         return STATS_ERR_INVALID_IFACE_NAME_MAP;
224     }
225     auto keys = uidStatsMap.GetAllKeys();
226     for (const auto &k : keys) {
227         if (k.uId == uid) {
228             if (uidStatsMap.Delete(k) < 0) {
229                 NETNATIVE_LOGE("Delete uidStatsMap err");
230                 return STATS_ERR_WRITE_BPF_FAIL;
231             }
232         }
233     }
234     return NETSYS_SUCCESS;
235 }
236 
GetIfaceStats(uint64_t & stats,const StatsType statsType,const std::string & interfaceName)237 int32_t NetsysBpfStats::GetIfaceStats(uint64_t &stats, const StatsType statsType, const std::string &interfaceName)
238 {
239     stats = 0;
240     std::lock_guard<std::mutex> lock(ifaceStatsMapMutext_);
241     BpfMapper<iface_stats_key, iface_stats_value> ifaceStatsMap(IFACE_STATS_MAP_PATH, BPF_F_RDONLY);
242     if (!ifaceStatsMap.IsValid()) {
243         return STATS_ERR_INVALID_IFACE_NAME_MAP;
244     }
245 
246     auto ifIndex = if_nametoindex(interfaceName.c_str());
247     if (ifIndex <= 0) {
248         return STATS_ERR_GET_IFACE_NAME_FAILED;
249     }
250 
251     iface_stats_value ifaceStats = {0};
252     if (ifaceStatsMap.Read(ifIndex, ifaceStats) < 0) {
253         return STATS_ERR_READ_BPF_FAIL;
254     }
255     return GetNumberFromStatsValue(stats, statsType, ifaceStats);
256 }
257 
GetCookieStats(uint64_t & stats,StatsType statsType,uint64_t cookie)258 int32_t NetsysBpfStats::GetCookieStats(uint64_t &stats, StatsType statsType, uint64_t cookie)
259 {
260     NETNATIVE_LOGI("GetCookieStats start");
261     stats = 0;
262     BpfMapper<socket_cookie_stats_key, app_cookie_stats_value> appUidCookieStatsMap(APP_COOKIE_STATS_MAP_PATH,
263                                                                                     BPF_F_RDONLY);
264     if (!appUidCookieStatsMap.IsValid()) {
265         NETNATIVE_LOGE("GetCookieStats appUidCookieStatsMap is valid");
266         return NETMANAGER_ERR_INTERNAL;
267     }
268 
269     app_cookie_stats_value cookieStats = {0};
270     if (appUidCookieStatsMap.Read(cookie, cookieStats) < 0) {
271         NETNATIVE_LOGE("GetCookieStats appUidCookieStatsMap read error");
272         return NETMANAGER_ERR_INTERNAL;
273     }
274 
275     int32_t res = GetNumberFromStatsValue(stats, statsType, cookieStats);
276     if (res == STATS_ERR_READ_BPF_FAIL) {
277         NETNATIVE_LOGE("GetCookieStats GetNumberFromStatsValue error");
278         return NETMANAGER_ERR_INTERNAL;
279     }
280     return NETSYS_SUCCESS;
281 }
282 
283 // write taffic available value map.  update by timer/settings modify/network changed
SetNetStateTrafficMap(uint8_t flag,uint64_t availableTraffic)284 int32_t NetsysBpfStats::SetNetStateTrafficMap(uint8_t flag, uint64_t availableTraffic)
285 {
286     NETNATIVE_LOGI("NetsysBpfStats::SetNetStateTrafficMap start. flag:%{public}u, availableTraffic:%{public}" PRIu64,
287         flag, availableTraffic);
288 
289     BpfMapper<traffic_notify_flag, traffic_value> netStatsTrafficMap(LIMITS_STATS_MAP_PATH, BPF_F_WRONLY);
290     if (!netStatsTrafficMap.IsValid()) {
291         NETNATIVE_LOGE("SetNetStateTrafficMap netStatsTrafficMap not exist.");
292         return NETMANAGER_ERROR;
293     }
294 
295     if (netStatsTrafficMap.Write(flag, availableTraffic, 0) != 0) {
296         NETNATIVE_LOGE("SetNetStateTrafficMap Write netStatsTrafficMap err");
297         return NETMANAGER_ERROR;
298     }
299 
300     NETNATIVE_LOGI("NetsysBpfStats::SetNetStateTrafficMap flag:%{public}u, availableTraffic:%{public}" PRIu64,
301         flag, availableTraffic);
302     return NETMANAGER_SUCCESS;
303 }
304 
GetNetStateTrafficMap(uint8_t flag,uint64_t & availableTraffic)305 int32_t NetsysBpfStats::GetNetStateTrafficMap(uint8_t flag, uint64_t &availableTraffic)
306 {
307     BpfMapper<traffic_notify_flag, traffic_value> netStatsTrafficMap(LIMITS_STATS_MAP_PATH, BPF_F_RDONLY);
308     if (!netStatsTrafficMap.IsValid()) {
309         NETNATIVE_LOGE("GetNetStateTrafficMap netStatsTrafficMap not exist. errno: %{public}d", errno);
310         return NETMANAGER_ERROR;
311     }
312     traffic_value value = 0;
313     if (netStatsTrafficMap.Read(flag, value) != 0) {
314         NETNATIVE_LOGE("GetNetStateTrafficMap read netStatsTrafficMap err");
315         return NETMANAGER_ERROR;
316     }
317     availableTraffic = value;
318     NETNATIVE_LOGI("NetsysBpfStats::GetNetStateTrafficMap flag:%{public}u, availableTraffic:%{public}" PRIu64,
319         flag, availableTraffic);
320     return NETMANAGER_SUCCESS;
321 }
322 
GetNetStateIncreTrafficMap(std::vector<uint64_t> & keys)323 int32_t NetsysBpfStats::GetNetStateIncreTrafficMap(std::vector<uint64_t> &keys)
324 {
325     BpfMapper<uint64_t, traffic_value> netStatsIncreTrafficMap(INCREMENT_STATS_MAP_PATH, BPF_F_RDONLY);
326     if (!netStatsIncreTrafficMap.IsValid()) {
327         NETNATIVE_LOGE("GetNetStateIncreTrafficMap netStatsTrafficMap not exist. errno: %{public}d", errno);
328         return NETMANAGER_ERROR;
329     }
330     keys = netStatsIncreTrafficMap.GetAllKeys();
331     NETNATIVE_LOGI("NetsysBpfStats::GetNetStateIncreTrafficMap keys.size: %{public}zu", keys.size());
332     for (auto key : keys) {
333         traffic_value value = { 0 };
334         if (netStatsIncreTrafficMap.Read(key, value) != 0) {
335             NETNATIVE_LOGE("GetNetStateIncreTrafficMap read netStatsTrafficMap err");
336             return NETMANAGER_ERROR;
337         }
338         char ifName[IFNAME_SIZE] = { 0 };
339         auto pName = if_indextoname(key, ifName);
340         NETNATIVE_LOGI("NetsysBpfStats::GetNetStateIncreTrafficMap keys: %{public}" PRIu64 ", \
341 value: %{public}" PRIu64 ", name: %{public}s",
342             key, static_cast<uint64_t>(value), ifName);
343     }
344     return NETMANAGER_SUCCESS;
345 }
346 
ClearIncreaseTrafficMap()347 int32_t NetsysBpfStats::ClearIncreaseTrafficMap()
348 {
349     NETNATIVE_LOGI("NetsysBpfStats::ClearIncreaseTrafficMap start");
350     std::vector<uint64_t> keys;
351     if (GetNetStateIncreTrafficMap(keys) != NETMANAGER_SUCCESS) {
352         return NETMANAGER_ERROR;
353     }
354     BpfMapper<uint64_t, traffic_value> increaseTrafficMap(INCREMENT_STATS_MAP_PATH, BPF_F_WRONLY);
355     if (!increaseTrafficMap.IsValid()) {
356         NETNATIVE_LOGE("ClearIncreaseTrafficMap increamentTrafficMap not exist.");
357         return NETMANAGER_ERROR;
358     }
359 
360     if (increaseTrafficMap.Clear(keys) != 0) {
361         NETNATIVE_LOGE("ClearIncreaseTrafficMap Write increamentTrafficMap err");
362         return NETMANAGER_ERROR;
363     }
364     keys = {};
365     if (GetNetStateIncreTrafficMap(keys) != NETMANAGER_SUCCESS) {
366         return NETMANAGER_ERROR;
367     }
368 
369     NETNATIVE_LOGI("NetsysBpfStats::ClearIncreaseTrafficMap end");
370     return NETMANAGER_SUCCESS;
371 }
372 
DeleteIncreaseTrafficMap(uint64_t ifIndex)373 int32_t NetsysBpfStats::DeleteIncreaseTrafficMap(uint64_t ifIndex)
374 {
375     NETNATIVE_LOGI("NetsysBpfStats::DeleteIncreaseTrafficMap start, ifIndex: %{public}" PRIu64, ifIndex);
376     std::vector<uint64_t> keys;
377     if (GetNetStateIncreTrafficMap(keys) != NETMANAGER_SUCCESS) {
378         return NETMANAGER_ERROR;
379     }
380     BpfMapper<uint64_t, traffic_value> increaseTrafficMap(INCREMENT_STATS_MAP_PATH, BPF_F_WRONLY);
381     if (!increaseTrafficMap.IsValid()) {
382         NETNATIVE_LOGE("DeleteIncreaseTrafficMap increamentTrafficMap not exist.");
383         return NETMANAGER_ERROR;
384     }
385 
386     if (increaseTrafficMap.Delete(static_cast<uint64_t>(ifIndex)) != 0) {
387         NETNATIVE_LOGE("DeleteIncreaseTrafficMap Delete increamentTrafficMap err");
388         return NETMANAGER_ERROR;
389     }
390 
391     keys = {};
392     if (GetNetStateIncreTrafficMap(keys) != NETMANAGER_SUCCESS) {
393         return NETMANAGER_ERROR;
394     }
395 
396     return NETMANAGER_SUCCESS;
397 }
398 
UpdateIfIndexMap(int8_t key,uint64_t index)399 int32_t NetsysBpfStats::UpdateIfIndexMap(int8_t key, uint64_t index)
400 {
401     NETNATIVE_LOGI("UpdateIfIndexMap start. key:%{public}d, index:%{public}" PRIu64, key, index);
402 
403     BpfMapper<uint8_t, uint64_t> netStatsIfIndexMap(IFINDEX_MAP_PATH, BPF_F_WRONLY);
404     if (!netStatsIfIndexMap.IsValid()) {
405         NETNATIVE_LOGE("UpdateIfIndexMap netStatsTrafficMap not exist.");
406         return NETMANAGER_ERROR;
407     }
408 
409     if (netStatsIfIndexMap.Write(key, index, 0) != 0) {
410         NETNATIVE_LOGE("UpdateIfIndexMap Write netStatsTrafficMap err");
411         return NETMANAGER_ERROR;
412     }
413     GetIfIndexMap();
414     return 0;
415 }
416 
GetIfIndexMap()417 int32_t NetsysBpfStats::GetIfIndexMap()
418 {
419     NETNATIVE_LOGI("GetIfIndexMap start");
420     BpfMapper<uint8_t, uint64_t> netStatsIfIndexMap(IFINDEX_MAP_PATH, BPF_F_RDONLY);
421     if (!netStatsIfIndexMap.IsValid()) {
422         NETNATIVE_LOGE("GetIfIndexMap netStatsTrafficMap not exist.");
423         return NETMANAGER_ERROR;
424     }
425 
426     std::vector<uint8_t> keys = netStatsIfIndexMap.GetAllKeys();
427     NETNATIVE_LOGI("GetIfIndexMap keys.size: %{public}zu", keys.size());
428     for (auto key : keys) {
429         uint64_t value = 0;
430         if (netStatsIfIndexMap.Read(key, value) != 0) {
431             NETNATIVE_LOGE("GetIfIndexMap read err");
432             return NETMANAGER_ERROR;
433         }
434         NETNATIVE_LOGI("GetIfIndexMap keys: %{public}u, value: %{public}" PRIu64, key, value);
435     }
436     return NETMANAGER_SUCCESS;
437 }
438 
SetNetStatusMap(uint8_t type,uint8_t value)439 int32_t NetsysBpfStats::SetNetStatusMap(uint8_t type, uint8_t value)
440 {
441     NETNATIVE_LOGI("SetNetStatusMap: %{public}u, %{public}u", type, value);
442     if (type != 0 && type != 1) {
443         return NETMANAGER_ERROR;
444     }
445     {
446         std::lock_guard<std::mutex> lock(netStatusMapMutex_);
447         BpfMapper<uint8_t, uint8_t> netStatusMap(NET_STATUS_MAP_PATH, BPF_F_WRONLY);
448         if (!netStatusMap.IsValid()) {
449             NETNATIVE_LOGE("netStatusMap not exist.");
450             return NETMANAGER_ERROR;
451         }
452         if (netStatusMap.Write(type, value, 0) != 0) {
453             NETNATIVE_LOGE("UpdatenetStatusMap Write netStatusMap err.");
454             return NETMANAGER_ERROR;
455         }
456     }
457 
458     std::string str = WIFI_IFACE_1;
459     uint64_t ifIndex = if_nametoindex(str.c_str());
460     NETNATIVE_LOGI("UpdatenetStatusMap ifIndex:%{public}" PRIu64, ifIndex);
461     if (ifIndex <= 0) {
462         ifIndex = 0;
463     }
464     SetNetWlan1Map(ifIndex);
465     return NETMANAGER_SUCCESS;
466 }
467 
SetNetWlan1Map(uint64_t ifIndex)468 int32_t NetsysBpfStats::SetNetWlan1Map(uint64_t ifIndex)
469 {
470     std::lock_guard<std::mutex> lock(netWlan1MapMutex_);
471     BpfMapper<uint8_t, uint64_t> netWlan1Map(NET_WLAN1_MAP_PATH, BPF_F_WRONLY);
472     if (!netWlan1Map.IsValid()) {
473         NETNATIVE_LOGE("SetNetWlan1Map not exist.");
474         return NETMANAGER_ERROR;
475     }
476     if (netWlan1Map.Write(0, ifIndex, 0) != 0) {
477         NETNATIVE_LOGE("SetNetWlan1Map Write err");
478         return NETMANAGER_ERROR;
479     }
480     return NETMANAGER_SUCCESS;
481 }
482 } // namespace OHOS::NetManagerStandard
483