• 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 "conn_manager.h"
17 
18 #include <linux/if_ether.h>
19 #include <net/if.h>
20 #include <ifaddrs.h>
21 #include <string>
22 
23 #include "bpf_mapper.h"
24 #include "bpf_path.h"
25 #include "local_network.h"
26 #include "netlink_socket_diag.h"
27 #include "net_manager_constants.h"
28 #include "netlink_socket_diag.h"
29 #include "netmanager_base_common_utils.h"
30 #include "netnative_log_wrapper.h"
31 #include "physical_network.h"
32 #include "virtual_network.h"
33 #include "securec.h"
34 #include "bpf_ring_buffer.h"
35 
36 namespace OHOS {
37 namespace nmd {
38 using namespace NetManagerStandard;
39 namespace {
40 constexpr int32_t INTERFACE_UNSET = -1;
41 constexpr int32_t LOCAL_NET_ID = 99;
42 } // namespace
43 
ConnManager()44 ConnManager::ConnManager()
45 {
46     networks_.EnsureInsert(LOCAL_NET_ID, std::make_shared<LocalNetwork>(LOCAL_NET_ID));
47     defaultNetId_ = 0;
48     needReinitRouteFlag_ = false;
49 }
50 
~ConnManager()51 ConnManager::~ConnManager()
52 {
53     networks_.Clear();
54 }
55 
SetInternetPermission(uint32_t uid,uint8_t allow,uint8_t isBroker)56 int32_t ConnManager::SetInternetPermission(uint32_t uid, uint8_t allow, uint8_t isBroker)
57 {
58     // 0 means root
59     if (uid == 0) {
60         return NETMANAGER_ERROR;
61     }
62     if (isBroker) {
63         BpfMapper<sock_permission_key, sock_permission_value> permissionMap(BROKER_SOCKET_PERMISSION_MAP_PATH,
64                                                                             BPF_F_WRONLY);
65         if (!permissionMap.IsValid()) {
66             return NETMANAGER_ERROR;
67         }
68         // 0 means no permission
69         if (permissionMap.Write(uid, allow, 0) != 0) {
70             return NETMANAGER_ERROR;
71         }
72 
73         return NETMANAGER_SUCCESS;
74     }
75     BpfMapper<sock_permission_key, sock_permission_value> permissionMap(OH_SOCKET_PERMISSION_MAP_PATH, BPF_F_WRONLY);
76     if (!permissionMap.IsValid()) {
77         return NETMANAGER_ERROR;
78     }
79     // 0 means no permission
80     if (permissionMap.Write(uid, allow, 0) != 0) {
81         return NETMANAGER_ERROR;
82     }
83 
84     return NETMANAGER_SUCCESS;
85 }
86 
CreatePhysicalNetwork(uint16_t netId,NetworkPermission permission)87 int32_t ConnManager::CreatePhysicalNetwork(uint16_t netId, NetworkPermission permission)
88 {
89     if (needReinitRouteFlag_) {
90         std::set<int32_t> netIds;
91         networks_.Iterate([&netIds](int32_t id, std::shared_ptr<NetsysNetwork> &NetsysNetworkPtr) {
92             if (id == LOCAL_NET_ID || NetsysNetworkPtr == nullptr) {
93                 return;
94             }
95             netIds.insert(NetsysNetworkPtr->GetNetId());
96         });
97 
98         for (auto netId : netIds) {
99             std::string interfaceName;
100             {
101                 std::lock_guard<std::mutex> lock(interfaceNameMutex_);
102                 interfaceName = physicalInterfaceName_[netId];
103             }
104             RemoveInterfaceFromNetwork(netId, interfaceName);
105             DestroyNetwork(netId);
106         }
107         needReinitRouteFlag_ = false;
108     }
109     std::shared_ptr<NetsysNetwork> network = std::make_shared<PhysicalNetwork>(netId, permission);
110     networks_.EnsureInsert(netId, network);
111     return NETMANAGER_SUCCESS;
112 }
113 
CreateVirtualNetwork(uint16_t netId,bool hasDns)114 int32_t ConnManager::CreateVirtualNetwork(uint16_t netId, bool hasDns)
115 {
116     networks_.EnsureInsert(netId, std::make_shared<VirtualNetwork>(netId, hasDns));
117     return NETMANAGER_SUCCESS;
118 }
119 
DestroyNetwork(int32_t netId)120 int32_t ConnManager::DestroyNetwork(int32_t netId)
121 {
122     if (netId == LOCAL_NET_ID) {
123         NETNATIVE_LOGE("Cannot destroy local network");
124         return NETMANAGER_ERROR;
125     }
126     const auto &net = FindNetworkById(netId);
127     if (std::get<0>(net)) {
128         std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
129         if (defaultNetId_ == netId) {
130             if (nw->IsPhysical()) {
131                 static_cast<PhysicalNetwork *>(nw.get())->RemoveDefault();
132             }
133             defaultNetId_ = 0;
134         }
135         nw->ClearInterfaces();
136     }
137     networks_.Erase(netId);
138     return NETMANAGER_SUCCESS;
139 }
140 
SetDefaultNetwork(int32_t netId)141 int32_t ConnManager::SetDefaultNetwork(int32_t netId)
142 {
143     if (defaultNetId_ == netId) {
144         return NETMANAGER_SUCCESS;
145     }
146 
147     // check if this network exists
148     const auto &net = FindNetworkById(netId);
149     if (std::get<0>(net)) {
150         std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
151         if (!nw->IsPhysical()) {
152             NETNATIVE_LOGE("SetDefaultNetwork fail, network :%{public}d is not physical ", netId);
153             return NETMANAGER_ERROR;
154         }
155         static_cast<PhysicalNetwork *>(nw.get())->AddDefault();
156     }
157 
158     if (defaultNetId_ != 0) {
159         const auto &defaultNet = FindNetworkById(defaultNetId_);
160         if (std::get<0>(defaultNet)) {
161             std::shared_ptr<NetsysNetwork> nw = std::get<1>(defaultNet);
162             if (!nw->IsPhysical()) {
163                 NETNATIVE_LOGE("SetDefaultNetwork fail, defaultNetId_ :%{public}d is not physical", defaultNetId_);
164                 return NETMANAGER_ERROR;
165             }
166             static_cast<PhysicalNetwork *>(nw.get())->RemoveDefault();
167         }
168     }
169     defaultNetId_ = netId;
170     return NETMANAGER_SUCCESS;
171 }
172 
ClearDefaultNetwork()173 int32_t ConnManager::ClearDefaultNetwork()
174 {
175     if (defaultNetId_ != 0) {
176         const auto &net = FindNetworkById(defaultNetId_);
177         if (std::get<0>(net)) {
178             std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
179             if (!nw->IsPhysical()) {
180                 NETNATIVE_LOGE("ClearDefaultNetwork fail, defaultNetId_ :%{public}d is not physical", defaultNetId_);
181                 return NETMANAGER_ERROR;
182             }
183             static_cast<PhysicalNetwork *>(nw.get())->RemoveDefault();
184         }
185     }
186     defaultNetId_ = 0;
187     return NETMANAGER_SUCCESS;
188 }
189 
FindNetworkById(int32_t netId)190 std::tuple<bool, std::shared_ptr<NetsysNetwork>> ConnManager::FindNetworkById(int32_t netId)
191 {
192     NETNATIVE_LOG_D("Entry ConnManager::FindNetworkById netId:%{public}d", netId);
193     std::shared_ptr<NetsysNetwork> netsysNetworkPtr;
194     bool ret = networks_.Find(netId, netsysNetworkPtr);
195     if (ret) {
196         return std::make_tuple(true, netsysNetworkPtr);
197     }
198     return std::make_tuple<bool, std::shared_ptr<NetsysNetwork>>(false, nullptr);
199 }
200 
GetDefaultNetwork() const201 int32_t ConnManager::GetDefaultNetwork() const
202 {
203     return defaultNetId_;
204 }
205 
GetNetworkForInterface(int32_t netId,std::string & interfaceName)206 int32_t ConnManager::GetNetworkForInterface(int32_t netId, std::string &interfaceName)
207 {
208     NETNATIVE_LOG_D("Entry ConnManager::GetNetworkForInterface interfaceName:%{public}s", interfaceName.c_str());
209     std::map<int32_t, std::shared_ptr<NetsysNetwork>>::iterator it;
210     int32_t InterfaceId = INTERFACE_UNSET;
211     bool isInternalNetId = IsInternalNetId(netId);
212     networks_.Iterate([&InterfaceId, &interfaceName, isInternalNetId]
213         (int32_t id, std::shared_ptr<NetsysNetwork> &NetsysNetworkPtr) {
214         if (IsInternalNetId(id) != isInternalNetId) {
215             return;
216         }
217         if (InterfaceId != INTERFACE_UNSET) {
218             return;
219         }
220         if (NetsysNetworkPtr != nullptr) {
221             if (NetsysNetworkPtr->ExistInterface(interfaceName)) {
222                 InterfaceId = id;
223             }
224         }
225     });
226     return InterfaceId;
227 }
228 
GetInterfaceNameId(NetManagerStandard::NetBearType netBearerType)229 net_interface_name_id ConnManager::GetInterfaceNameId(NetManagerStandard::NetBearType netBearerType)
230 {
231     net_interface_name_id v = {0};
232     if (netBearerType == BEARER_WIFI) {
233         v = NETWORK_BEARER_TYPE_WIFI;
234     } else if (netBearerType == BEARER_CELLULAR) {
235         v = NETWORK_BEARER_TYPE_CELLULAR;
236     } else {
237         v = NETWORK_BEARER_TYPE_INITIAL;
238     }
239     return v;
240 }
241 
AddNetIdAndIfaceToMap(int32_t netId,net_interface_name_id nameId)242 void ConnManager::AddNetIdAndIfaceToMap(int32_t netId, net_interface_name_id nameId)
243 {
244     // Create Map Table to establish the relationship betweet netId and the id about interfaceName.
245     BpfMapper<net_index, net_interface_name_id> netIdAndIfaceMap(NET_INDEX_AND_IFACE_MAP_PATH, BPF_ANY);
246     if (netIdAndIfaceMap.IsValid()) {
247         if (netIdAndIfaceMap.Write(netId, nameId, 0) != 0) {
248             NETNATIVE_LOGE("netIdAndIfaceMap add error: netId:%{public}d, nameId:%{public}d", netId, nameId);
249         }
250     }
251 }
252 
AddIfindexAndNetTypeToMap(const std::string & interfaceName,net_interface_name_id nameId)253 void ConnManager::AddIfindexAndNetTypeToMap(const std::string &interfaceName, net_interface_name_id nameId)
254 {
255     BpfMapper<if_index, net_interface_name_id> ifIndexAndNetTypeMap(IFINDEX_AND_NET_TYPE_MAP_PATH, BPF_ANY);
256     if (ifIndexAndNetTypeMap.IsValid()) {
257         uint32_t ifIndex = if_nametoindex(interfaceName.c_str());
258         if (ifIndexAndNetTypeMap.Write(ifIndex, nameId, 0) != 0) {
259             NETNATIVE_LOGE("ifIndexAndNetTypeMap add error: interfaceName:%{public}s, ifIndex:%{public}d",
260                 interfaceName.c_str(), ifIndex);
261         }
262     }
263 }
264 
AddInterfaceToNetwork(int32_t netId,std::string & interfaceName,NetManagerStandard::NetBearType netBearerType)265 int32_t ConnManager::AddInterfaceToNetwork(int32_t netId, std::string &interfaceName,
266                                            NetManagerStandard::NetBearType netBearerType)
267 {
268     NETNATIVE_LOG_D(
269         "Entry ConnManager::AddInterfaceToNetwork netId:%{public}d, interfaceName:%{public}s, netBearerType: "
270         "%{public}u",
271         netId, interfaceName.c_str(), netBearerType);
272     int32_t alreadySetNetId = GetNetworkForInterface(netId, interfaceName);
273     if ((alreadySetNetId != netId) && (alreadySetNetId != INTERFACE_UNSET)) {
274         NETNATIVE_LOGE("AddInterfaceToNetwork failed alreadySetNetId:%{public}d", alreadySetNetId);
275         return NETMANAGER_ERROR;
276     }
277 
278     const auto &net = FindNetworkById(netId);
279     if (std::get<0>(net)) {
280         net_interface_name_id nameId = GetInterfaceNameId(netBearerType);
281         AddNetIdAndIfaceToMap(netId, nameId);
282         AddIfindexAndNetTypeToMap(interfaceName, nameId);
283         std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
284         if (nw->IsPhysical()) {
285             std::lock_guard<std::mutex> lock(interfaceNameMutex_);
286             physicalInterfaceName_[netId] = interfaceName;
287         }
288         return nw->AddInterface(interfaceName);
289     }
290     return NETMANAGER_ERROR;
291 }
292 
RemoveInterfaceFromNetwork(int32_t netId,std::string & interfaceName)293 int32_t ConnManager::RemoveInterfaceFromNetwork(int32_t netId, std::string &interfaceName)
294 {
295     int32_t alreadySetNetId = GetNetworkForInterface(netId, interfaceName);
296     if ((alreadySetNetId != netId) || (alreadySetNetId == INTERFACE_UNSET)) {
297         return NETMANAGER_SUCCESS;
298     } else if (alreadySetNetId == netId) {
299         const auto &net = FindNetworkById(netId);
300         if (std::get<0>(net)) {
301             std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
302             int32_t ret = nw->RemoveInterface(interfaceName);
303             if (nw->IsPhysical()) {
304                 std::lock_guard<std::mutex> lock(interfaceNameMutex_);
305                 physicalInterfaceName_.erase(netId);
306             }
307 
308             BpfMapper<net_index, net_interface_name_id> netIdAndIfaceMap(NET_INDEX_AND_IFACE_MAP_PATH, BPF_ANY);
309             if (netIdAndIfaceMap.IsValid() && netIdAndIfaceMap.Delete(netId) != 0) {
310                 NETNATIVE_LOGE("netIdAndIfaceMap remove error: netId:%{public}d, interfaceName:%{public}s", netId,
311                                interfaceName.c_str());
312             }
313             BpfMapper<if_index, net_interface_name_id> ifIndexAndNetTypeMap(IFINDEX_AND_NET_TYPE_MAP_PATH, BPF_ANY);
314             uint32_t ifIndex = if_nametoindex(interfaceName.c_str());
315             if (ifIndexAndNetTypeMap.IsValid() && ifIndexAndNetTypeMap.Delete(ifIndex) != 0) {
316                 NETNATIVE_LOGE("ifIndexAndNetTypeMap remove error: ifIndex:%{public}d, interfaceName:%{public}s",
317                     ifIndex, interfaceName.c_str());
318             }
319             return ret;
320         }
321     }
322     return NETMANAGER_SUCCESS;
323 }
324 
ReinitRoute()325 int32_t ConnManager::ReinitRoute()
326 {
327     NETNATIVE_LOG_D("ConnManager::ReInitRoute");
328     needReinitRouteFlag_ = true;
329     return NETMANAGER_SUCCESS;
330 }
331 
AddRoute(int32_t netId,NetworkRouteInfo networkRouteInfo,bool & routeRepeat)332 int32_t ConnManager::AddRoute(int32_t netId, NetworkRouteInfo networkRouteInfo, bool& routeRepeat)
333 {
334     return RouteManager::AddRoute(GetTableType(netId), networkRouteInfo, routeRepeat);
335 }
336 
RemoveRoute(int32_t netId,std::string interfaceName,std::string destination,std::string nextHop)337 int32_t ConnManager::RemoveRoute(int32_t netId, std::string interfaceName, std::string destination, std::string nextHop)
338 {
339     return RouteManager::RemoveRoute(GetTableType(netId), interfaceName, destination, nextHop);
340 }
341 
UpdateRoute(int32_t netId,std::string interfaceName,std::string destination,std::string nextHop)342 int32_t ConnManager::UpdateRoute(int32_t netId, std::string interfaceName, std::string destination, std::string nextHop)
343 {
344     return RouteManager::UpdateRoute(GetTableType(netId), interfaceName, destination, nextHop);
345 }
346 
GetTableType(int32_t netId)347 RouteManager::TableType ConnManager::GetTableType(int32_t netId)
348 {
349     if (netId == LOCAL_NET_ID) {
350         return RouteManager::LOCAL_NETWORK;
351     } else if (FindVirtualNetwork(netId) != nullptr) {
352         return RouteManager::VPN_NETWORK;
353     } else if (NetManagerStandard::IsInternalNetId(netId)) {
354         return RouteManager::INTERNAL_DEFAULT;
355     } else {
356         return RouteManager::INTERFACE;
357     }
358 }
359 
GetFwmarkForNetwork(int32_t netId)360 int32_t ConnManager::GetFwmarkForNetwork(int32_t netId)
361 {
362     return NETMANAGER_ERROR;
363 }
364 
SetPermissionForNetwork(int32_t netId,NetworkPermission permission)365 int32_t ConnManager::SetPermissionForNetwork(int32_t netId, NetworkPermission permission)
366 {
367     return NETMANAGER_ERROR;
368 }
369 
FindVirtualNetwork(int32_t netId)370 std::shared_ptr<NetsysNetwork> ConnManager::FindVirtualNetwork(int32_t netId)
371 {
372     if (netId == LOCAL_NET_ID) {
373         return nullptr;
374     }
375     std::shared_ptr<NetsysNetwork> netsysNetworkPtr = nullptr;
376     auto ret = networks_.Find(netId, netsysNetworkPtr);
377     if (!ret || netsysNetworkPtr == nullptr) {
378         NETNATIVE_LOGE("invalid netId:%{public}d or nw is null.", netId);
379         return nullptr;
380     }
381     if (netsysNetworkPtr->IsPhysical()) {
382         return nullptr;
383     }
384     return netsysNetworkPtr;
385 }
386 
AddUidsToNetwork(int32_t netId,const std::vector<NetManagerStandard::UidRange> & uidRanges)387 int32_t ConnManager::AddUidsToNetwork(int32_t netId, const std::vector<NetManagerStandard::UidRange> &uidRanges)
388 {
389     auto netsysNetwork = FindVirtualNetwork(netId);
390     if (netsysNetwork == nullptr) {
391         NETNATIVE_LOGE("cannot add uids to non-virtual network with netId:%{public}d", netId);
392         return NETMANAGER_ERROR;
393     }
394     return static_cast<VirtualNetwork *>(netsysNetwork.get())->AddUids(uidRanges);
395 }
396 
RemoveUidsFromNetwork(int32_t netId,const std::vector<NetManagerStandard::UidRange> & uidRanges)397 int32_t ConnManager::RemoveUidsFromNetwork(int32_t netId, const std::vector<NetManagerStandard::UidRange> &uidRanges)
398 {
399     auto netsysNetwork = FindVirtualNetwork(netId);
400     if (netsysNetwork == nullptr) {
401         NETNATIVE_LOGE("cannot remove uids from non-virtual network with netId:%{public}d", netId);
402         return NETMANAGER_ERROR;
403     }
404     return static_cast<VirtualNetwork *>(netsysNetwork.get())->RemoveUids(uidRanges);
405 }
406 
GetDumpInfos(std::string & infos)407 void ConnManager::GetDumpInfos(std::string &infos)
408 {
409     static const std::string TAB = "  ";
410     infos.append("Netsys connect manager :\n");
411     infos.append(TAB + "default NetId: " + std::to_string(defaultNetId_) + "\n");
412     networks_.Iterate([&infos](int32_t id, std::shared_ptr<NetsysNetwork> &NetsysNetworkPtr) {
413         infos.append(TAB + "NetId:" + std::to_string(id));
414         std::string interfaces = TAB + "interfaces: {";
415         for (const auto &interface : NetsysNetworkPtr->GetAllInterface()) {
416             interfaces.append(interface + ", ");
417         }
418         infos.append(interfaces + "}\n");
419     });
420 }
421 
SetNetworkAccessPolicy(uint32_t uid,NetManagerStandard::NetworkAccessPolicy policy,bool reconfirmFlag)422 int32_t ConnManager::SetNetworkAccessPolicy(uint32_t uid, NetManagerStandard::NetworkAccessPolicy policy,
423                                             bool reconfirmFlag)
424 {
425     NETNATIVE_LOGI("SetNetworkAccessPolicy Enter");
426 
427     BpfMapper<app_uid_key, uid_access_policy_value> uidAccessPolicyMap(APP_UID_PERMISSION_MAP_PATH, BPF_ANY);
428     if (!uidAccessPolicyMap.IsValid()) {
429         NETNATIVE_LOGE("SetNetworkAccessPolicy uidAccessPolicyMap not exist.");
430         return NETMANAGER_ERROR;
431     }
432 
433     uid_access_policy_value v = {0};
434     uid_access_policy_value v2 = {0};
435     (void)uidAccessPolicyMap.Read(uid, v);
436 
437     v.configSetFromFlag = reconfirmFlag;
438     v.diagAckFlag = 0;
439     v.wifiPolicy = policy.wifiAllow;
440     v.cellularPolicy = policy.cellularAllow;
441 
442     if (uidAccessPolicyMap.Write(uid, v, 0) != 0) {
443         NETNATIVE_LOGE("SetNetworkAccessPolicy Write uidAccessPolicyMap err");
444         return NETMANAGER_ERROR;
445     }
446 
447     (void)uidAccessPolicyMap.Read(uid, v2);
448     NETNATIVE_LOG_D(
449         "SetNetworkAccessPolicy Read uid:%{public}u, wifi:%{public}u, cellular:%{public}u, reconfirmFlag:%{public}u",
450         uid, v2.wifiPolicy, v2.cellularPolicy, v2.configSetFromFlag);
451     return NETMANAGER_SUCCESS;
452 }
453 
DeleteNetworkAccessPolicy(uint32_t uid)454 int32_t ConnManager::DeleteNetworkAccessPolicy(uint32_t uid)
455 {
456     BpfMapper<app_uid_key, uid_access_policy_value> uidAccessPolicyMap(APP_UID_PERMISSION_MAP_PATH, BPF_ANY);
457     if (!uidAccessPolicyMap.IsValid()) {
458         NETNATIVE_LOGE("uidAccessPolicyMap not exist");
459         return NETMANAGER_ERROR;
460     }
461 
462     if (uidAccessPolicyMap.Delete(uid) != 0) {
463         NETNATIVE_LOGE("DeleteNetworkAccessPolicy err");
464         return NETMANAGER_ERROR;
465     }
466 
467     return NETMANAGER_SUCCESS;
468 }
469 
NotifyNetBearerTypeChange(std::set<NetManagerStandard::NetBearType> bearerTypes)470 int32_t ConnManager::NotifyNetBearerTypeChange(std::set<NetManagerStandard::NetBearType> bearerTypes)
471 {
472     NETNATIVE_LOG_D("NotifyNetBearerTypeChange");
473     BpfMapper<net_bear_id_key, net_bear_type_map_value> NetBearerTypeMap(NET_BEAR_TYPE_MAP_PATH, BPF_ANY);
474     if (!NetBearerTypeMap.IsValid()) {
475         NETNATIVE_LOGE("NetBearerTypeMap not exist");
476         return NETMANAGER_ERROR;
477     }
478 
479     // -1 means invalid
480     int32_t netbearerType = -1;
481     for (const auto& bearerType : bearerTypes) {
482         if (bearerType == BEARER_CELLULAR) {
483             netbearerType = NETWORK_BEARER_TYPE_CELLULAR;
484         }
485         if (bearerType == BEARER_WIFI) {
486             netbearerType = NETWORK_BEARER_TYPE_WIFI;
487         }
488     }
489     NETNATIVE_LOGI("NotifyNetBearerTypeChange Type: %{public}d", static_cast<int32_t>(netbearerType));
490 
491     net_bear_type_map_value v = 0;
492     int32_t ret = NetBearerTypeMap.Read(0, v);
493 
494     net_bear_id_key key = DEFAULT_NETWORK_BEARER_MAP_KEY;
495     // -1 means current bearer independent network access.
496     if (netbearerType != -1 &&
497         (((ret == NETSYS_SUCCESS) && (static_cast<int32_t>(v) != netbearerType)) || (ret != NETSYS_SUCCESS))) {
498         v = netbearerType;
499         if (NetBearerTypeMap.Write(key, v, 0) != 0) {
500             NETNATIVE_LOGE("Could not update NetBearerTypeMap");
501             return NETMANAGER_ERROR;
502         }
503     }
504 
505     return NETMANAGER_SUCCESS;
506 }
507 
CloseSocketsUid(const std::string & ipAddr,uint32_t uid)508 int ConnManager::CloseSocketsUid(const std::string &ipAddr, uint32_t uid)
509 {
510     NetLinkSocketDiag socketDiag;
511     socketDiag.DestroyLiveSocketsWithUid(ipAddr, uid);
512     return NETMANAGER_SUCCESS;
513 }
514 
515 #ifdef SUPPORT_SYSVPN
UpdateVpnRules(uint16_t netId,const std::vector<std::string> & extMessages,bool add)516 int32_t ConnManager::UpdateVpnRules(uint16_t netId, const std::vector<std::string> &extMessages, bool add)
517 {
518     auto netsysNetwork = FindVirtualNetwork(netId);
519     if (netsysNetwork == nullptr) {
520         NETNATIVE_LOGE("cannot add uids to non-virtual network with netId:%{public}d", netId);
521         return NETMANAGER_ERROR;
522     }
523     return static_cast<VirtualNetwork *>(netsysNetwork.get())->UpdateVpnRules(extMessages, add);
524 }
525 #endif  // SUPPORT_SYSVPN
526 
527 } // namespace nmd
528 } // namespace OHOS
529