• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "local_network.h"
19 #include "net_manager_constants.h"
20 #include "netnative_log_wrapper.h"
21 #include "physical_network.h"
22 
23 namespace OHOS {
24 namespace nmd {
25 using namespace NetManagerStandard;
26 namespace {
27 constexpr int32_t INTERFACE_UNSET = -1;
28 constexpr int32_t LOCAL_NET_ID = 99;
29 } // namespace
30 
ConnManager()31 ConnManager::ConnManager()
32 {
33     networks_[LOCAL_NET_ID] = std::make_shared<LocalNetwork>(LOCAL_NET_ID);
34     defaultNetId_ = 0;
35     needReinitRouteFlag_ = false;
36 }
37 
~ConnManager()38 ConnManager::~ConnManager()
39 {
40     networks_.clear();
41 }
42 
CreatePhysicalNetwork(uint16_t netId,NetworkPermission permission)43 int32_t ConnManager::CreatePhysicalNetwork(uint16_t netId, NetworkPermission permission)
44 {
45     if (needReinitRouteFlag_) {
46         std::set<int32_t> netIds;
47         for (const auto &iter : networks_) {
48             if (iter.first == LOCAL_NET_ID || iter.second == nullptr) {
49                 continue;
50             }
51             netIds.insert(iter.second->GetNetId());
52         }
53         for (auto netId : netIds) {
54             std::string interfaceName;
55             {
56                 std::lock_guard<std::mutex> lock(interfaceNameMutex_);
57                 interfaceName = physicalInterfaceName_[netId];
58             }
59             RemoveInterfaceFromNetwork(netId, interfaceName);
60             DestroyNetwork(netId);
61         }
62         needReinitRouteFlag_ = false;
63     }
64     std::shared_ptr<NetsysNetwork> network = std::make_shared<PhysicalNetwork>(netId, permission);
65     networks_[netId] = network;
66     return NETMANAGER_SUCCESS;
67 }
68 
DestroyNetwork(int32_t netId)69 int32_t ConnManager::DestroyNetwork(int32_t netId)
70 {
71     if (netId == LOCAL_NET_ID) {
72         NETNATIVE_LOGE("Cannot destroy local network");
73         return NETMANAGER_ERROR;
74     }
75     const auto &net = FindNetworkById(netId);
76     if (std::get<0>(net)) {
77         std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
78         if (defaultNetId_ == netId) {
79             if (nw->IsPhysical()) {
80                 static_cast<PhysicalNetwork *>(nw.get())->RemoveDefault();
81             }
82             defaultNetId_ = 0;
83         }
84         nw->ClearInterfaces();
85     }
86     networks_.erase(netId);
87     return NETMANAGER_SUCCESS;
88 }
89 
SetDefaultNetwork(int32_t netId)90 int32_t ConnManager::SetDefaultNetwork(int32_t netId)
91 {
92     if (defaultNetId_ == netId) {
93         return NETMANAGER_SUCCESS;
94     }
95 
96     // check if this network exists
97     const auto &net = FindNetworkById(netId);
98     if (std::get<0>(net)) {
99         std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
100         if (!nw->IsPhysical()) {
101             NETNATIVE_LOGE("SetDefaultNetwork fail, network :%{public}d is not physical ", netId);
102             return NETMANAGER_ERROR;
103         }
104         static_cast<PhysicalNetwork *>(nw.get())->AddDefault();
105     }
106 
107     if (defaultNetId_ != 0) {
108         const auto &defaultNet = FindNetworkById(defaultNetId_);
109         if (std::get<0>(defaultNet)) {
110             std::shared_ptr<NetsysNetwork> nw = std::get<1>(defaultNet);
111             if (!nw->IsPhysical()) {
112                 NETNATIVE_LOGE("SetDefaultNetwork fail, defaultNetId_ :%{public}d is not physical", defaultNetId_);
113                 return NETMANAGER_ERROR;
114             }
115             static_cast<PhysicalNetwork *>(nw.get())->RemoveDefault();
116         }
117     }
118     defaultNetId_ = netId;
119     return NETMANAGER_SUCCESS;
120 }
121 
ClearDefaultNetwork()122 int32_t ConnManager::ClearDefaultNetwork()
123 {
124     if (defaultNetId_ != 0) {
125         const auto &net = FindNetworkById(defaultNetId_);
126         if (std::get<0>(net)) {
127             std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
128             if (!nw->IsPhysical()) {
129                 NETNATIVE_LOGE("ClearDefaultNetwork fail, defaultNetId_ :%{public}d is not physical", defaultNetId_);
130                 return NETMANAGER_ERROR;
131             }
132             static_cast<PhysicalNetwork *>(nw.get())->RemoveDefault();
133         }
134     }
135     defaultNetId_ = 0;
136     return NETMANAGER_SUCCESS;
137 }
138 
FindNetworkById(int32_t netId)139 std::tuple<bool, std::shared_ptr<NetsysNetwork>> ConnManager::FindNetworkById(int32_t netId)
140 {
141     NETNATIVE_LOG_D("Entry ConnManager::FindNetworkById netId:%{public}d", netId);
142     std::map<int32_t, std::shared_ptr<NetsysNetwork>>::iterator it;
143     for (it = networks_.begin(); it != networks_.end(); ++it) {
144         if (netId == it->first) {
145             return std::make_tuple(true, it->second);
146         }
147     }
148     return std::make_tuple<bool, std::shared_ptr<NetsysNetwork>>(false, nullptr);
149 }
150 
GetDefaultNetwork() const151 int32_t ConnManager::GetDefaultNetwork() const
152 {
153     return defaultNetId_;
154 }
155 
GetNetworkForInterface(std::string & interfaceName)156 int32_t ConnManager::GetNetworkForInterface(std::string &interfaceName)
157 {
158     NETNATIVE_LOG_D("Entry ConnManager::GetNetworkForInterface interfaceName:%{public}s", interfaceName.c_str());
159     std::map<int32_t, std::shared_ptr<NetsysNetwork>>::iterator it;
160     for (it = networks_.begin(); it != networks_.end(); ++it) {
161         if (it->second->ExistInterface(interfaceName)) {
162             return it->first;
163         }
164     }
165     return INTERFACE_UNSET;
166 }
167 
AddInterfaceToNetwork(int32_t netId,std::string & interfaceName)168 int32_t ConnManager::AddInterfaceToNetwork(int32_t netId, std::string &interfaceName)
169 {
170     NETNATIVE_LOG_D("Entry ConnManager::AddInterfaceToNetwork netId:%{public}d, interfaceName:%{public}s", netId,
171                     interfaceName.c_str());
172     int32_t alreadySetNetId = GetNetworkForInterface(interfaceName);
173     if ((alreadySetNetId != netId) && (alreadySetNetId != INTERFACE_UNSET)) {
174         NETNATIVE_LOGE("AddInterfaceToNetwork failed alreadySetNetId:%{public}d", alreadySetNetId);
175         return NETMANAGER_ERROR;
176     }
177 
178     const auto &net = FindNetworkById(netId);
179     if (std::get<0>(net)) {
180         std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
181         {
182             std::lock_guard<std::mutex> lock(interfaceNameMutex_);
183             physicalInterfaceName_[netId] = interfaceName;
184         }
185         return nw->AddInterface(interfaceName);
186     }
187     return NETMANAGER_ERROR;
188 }
189 
RemoveInterfaceFromNetwork(int32_t netId,std::string & interfaceName)190 int32_t ConnManager::RemoveInterfaceFromNetwork(int32_t netId, std::string &interfaceName)
191 {
192     int32_t alreadySetNetId = GetNetworkForInterface(interfaceName);
193     if ((alreadySetNetId != netId) || (alreadySetNetId == INTERFACE_UNSET)) {
194         return NETMANAGER_SUCCESS;
195     } else if (alreadySetNetId == netId) {
196         const auto &net = FindNetworkById(netId);
197         if (std::get<0>(net)) {
198             std::shared_ptr<NetsysNetwork> nw = std::get<1>(net);
199             int32_t ret = nw->RemoveInterface(interfaceName);
200             {
201                 std::lock_guard<std::mutex> lock(interfaceNameMutex_);
202                 physicalInterfaceName_.erase(netId);
203             }
204             return ret;
205         }
206     }
207     return NETMANAGER_SUCCESS;
208 }
209 
ReinitRoute()210 int32_t ConnManager::ReinitRoute()
211 {
212     NETNATIVE_LOG_D("ConnManager::ReInitRoute");
213     needReinitRouteFlag_ = true;
214     return NETMANAGER_SUCCESS;
215 }
216 
AddRoute(int32_t netId,std::string interfaceName,std::string destination,std::string nextHop)217 int32_t ConnManager::AddRoute(int32_t netId, std::string interfaceName, std::string destination, std::string nextHop)
218 {
219     return RouteManager::AddRoute(GetTableType(netId), interfaceName, destination, nextHop);
220 }
221 
RemoveRoute(int32_t netId,std::string interfaceName,std::string destination,std::string nextHop)222 int32_t ConnManager::RemoveRoute(int32_t netId, std::string interfaceName, std::string destination, std::string nextHop)
223 {
224     return RouteManager::RemoveRoute(GetTableType(netId), interfaceName, destination, nextHop);
225 }
226 
UpdateRoute(int32_t netId,std::string interfaceName,std::string destination,std::string nextHop)227 int32_t ConnManager::UpdateRoute(int32_t netId, std::string interfaceName, std::string destination, std::string nextHop)
228 {
229     return RouteManager::UpdateRoute(GetTableType(netId), interfaceName, destination, nextHop);
230 }
231 
GetTableType(int32_t netId)232 RouteManager::TableType ConnManager::GetTableType(int32_t netId)
233 {
234     RouteManager::TableType tableType;
235     if (netId == LOCAL_NET_ID) {
236         tableType = RouteManager::LOCAL_NETWORK;
237     } else {
238         tableType = RouteManager::INTERFACE;
239     }
240     return tableType;
241 }
242 
GetFwmarkForNetwork(int32_t netId)243 int32_t ConnManager::GetFwmarkForNetwork(int32_t netId)
244 {
245     return NETMANAGER_ERROR;
246 }
247 
SetPermissionForNetwork(int32_t netId,NetworkPermission permission)248 int32_t ConnManager::SetPermissionForNetwork(int32_t netId, NetworkPermission permission)
249 {
250     return NETMANAGER_ERROR;
251 }
252 
GetDumpInfos(std::string & infos)253 void ConnManager::GetDumpInfos(std::string &infos)
254 {
255     static const std::string TAB = "  ";
256     infos.append("Netsys connect manager :\n");
257     infos.append(TAB + "default NetId: " + std::to_string(defaultNetId_) + "\n");
258     std::for_each(networks_.begin(), networks_.end(), [&infos](const auto &network) {
259         infos.append(TAB + "NetId:" + std::to_string(network.first));
260         std::string interfaces = TAB + "interfaces: {";
261         for (const auto &interface : network.second->GetAllInterface()) {
262             interfaces.append(interface + ", ");
263         }
264         infos.append(interfaces + "}\n");
265     });
266 }
267 } // namespace nmd
268 } // namespace OHOS
269