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