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