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