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