1 /*
2 * Copyright (c) 2022-2024 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 "net_manager_center.h"
17 #include "net_manager_constants.h"
18 #include "net_manager_ext_constants.h"
19 #include "netmgr_ext_log_wrapper.h"
20 #include "netsys_controller.h"
21 #include "networkshare_sub_statemachine.h"
22 #include "networkshare_tracker.h"
23 #include "route_utils.h"
24 #include <ifaddrs.h>
25 #include <random>
26 #include <regex>
27 #include <sys/types.h>
28 #ifdef SHARE_TRAFFIC_LIMIT_ENABLE
29 #include "networkshare_trafficlimit.h"
30 #endif
31 #ifdef WIFI_MODOULE
32 #include "wifi_ap_msg.h"
33 #include "wifi_hotspot.h"
34 #endif
35
36 namespace OHOS {
37 namespace NetManagerStandard {
38 namespace {
39 constexpr const char *NEXT_HOT = "0.0.0.0";
40 constexpr const char *IPV6_NEXT_HOT = "";
41 const std::regex REGEX_MAC(std::string(R"(^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$)"));
42
43 /** https://www.rfc-editor.org/rfc/rfc4291
44 * The type of an IPv6 address is identified by the high-order bits of
45 * the address, as follows:
46 *
47 * Address type Binary prefix IPv6 notation Section
48 * ------------ ------------- ------------- -------
49 * Unspecified 00...0 (128 bits) ::/128 2.5.2
50 * Loopback 00...1 (128 bits) ::1/128 2.5.3
51 * Multicast 11111111 FF00::/8 2.7
52 * Link-Local unicast 1111111010 FE80::/10 2.5.6
53 * Global Unicast (everything else)
54 **/
55 constexpr const char *DEFAULT_LINK_STR = "fe80";
56 constexpr const char *DEFAULT_LINK_ROUTE = "fe80::/64";
57 constexpr const char *DEFAULT_PREFIX = "/64";
58 constexpr const char *ERROR_MSG_CONFIG_FORWARD = "Config Forward failed";
59 constexpr const char *ERROR_MSG_ADD_ROUTE_STRATEGY = "Add Route Strategy failed";
60 constexpr const char *ERROR_MSG_ADD_ROUTE_RULE = "Add Route Rule failed";
61 constexpr const char *ERROR_MSG_REMOVE_ROUTE_RULE = "Remove Route Rule failed";
62 constexpr const char *EMPTY_UPSTREAM_IFACENAME = "";
63 constexpr int32_t IP_V4 = 0;
64 constexpr uint8_t BYTE_BIT = 8;
65 constexpr int32_t PREFIX_LEN = 64;
66 constexpr int32_t MAC_BLOCK = 2;
67 constexpr int32_t HEX_BASE = 16;
68 constexpr int32_t HALF_IN6ADDR = 8;
69 constexpr int32_t INTF_ID_LEN = 64;
70 constexpr int32_t MAX_IPV6_PREFIX_LENGTH = 128;
71 constexpr int32_t BYTE_ZERO = 0;
72 constexpr int32_t BYTE_ONE = 1;
73 constexpr int32_t BYTE_TWO = 2;
74 constexpr int32_t BYTE_THREE = 3;
75 constexpr int32_t BYTE_FOUR = 4;
76 constexpr int32_t BYTE_FIVE = 5;
77 constexpr int32_t BYTE_SIX = 6;
78 constexpr int32_t BYTE_SEVEN = 7;
79 constexpr int32_t EUI64_INVERT = 0x02;
80 constexpr int32_t EUI64_FF = 0xFF;
81 constexpr int32_t EUI64_FE = 0xFE;
82 constexpr uint8_t NET_FAMILY_IPV4 = 1;
83 constexpr uint8_t NET_FAMILY_IPV6 = 2;
84 constexpr uint32_t DHCP_IPV6_ENABLE = 1;
85 constexpr int32_t MAC_SSCANF_SPACE = 3;
86 constexpr const char* CELLULAR_IFACE_NAME = "rmnet";
87 } // namespace
88
NetworkShareSubStateMachine(const std::string & ifaceName,const SharingIfaceType & interfaceType,const std::shared_ptr<NetworkShareConfiguration> & configuration)89 NetworkShareSubStateMachine::NetworkShareSubStateMachine(
90 const std::string &ifaceName, const SharingIfaceType &interfaceType,
91 const std::shared_ptr<NetworkShareConfiguration> &configuration)
92 : ifaceName_(ifaceName), netShareType_(interfaceType), configuration_(configuration)
93 {
94 CreateInitStateTable();
95 CreateSharedStateTable();
96 }
97
~NetworkShareSubStateMachine()98 __attribute__((no_sanitize("cfi"))) NetworkShareSubStateMachine::~NetworkShareSubStateMachine() {}
99
CreateInitStateTable()100 void NetworkShareSubStateMachine::CreateInitStateTable()
101 {
102 SubSmStateTable temp;
103 temp.event_ = CMD_NETSHARE_REQUESTED;
104 temp.curState_ = SUBSTATE_INIT;
105 temp.func_ = &NetworkShareSubStateMachine::HandleInitSharingRequest;
106 temp.nextState_ = SUBSTATE_SHARED;
107 stateTable_.push_back(temp);
108
109 temp.event_ = CMD_INTERFACE_DOWN;
110 temp.curState_ = SUBSTATE_INIT;
111 temp.func_ = &NetworkShareSubStateMachine::HandleInitInterfaceDown;
112 temp.nextState_ = SUBSTATE_UNAVAILABLE;
113 stateTable_.push_back(temp);
114
115 temp.event_ = CMD_NETSHARE_UNREQUESTED;
116 temp.curState_ = SUBSTATE_INIT;
117 temp.func_ = &NetworkShareSubStateMachine::HandleSharedUnrequest;
118 temp.nextState_ = SUBSTATE_UNAVAILABLE;
119 stateTable_.push_back(temp);
120 }
121
CreateSharedStateTable()122 void NetworkShareSubStateMachine::CreateSharedStateTable()
123 {
124 SubSmStateTable temp;
125 temp.event_ = CMD_NETSHARE_UNREQUESTED;
126 temp.curState_ = SUBSTATE_SHARED;
127 temp.func_ = &NetworkShareSubStateMachine::HandleSharedUnrequest;
128 temp.nextState_ = SUBSTATE_INIT;
129 stateTable_.push_back(temp);
130
131 temp.event_ = CMD_INTERFACE_DOWN;
132 temp.curState_ = SUBSTATE_SHARED;
133 temp.func_ = &NetworkShareSubStateMachine::HandleSharedInterfaceDown;
134 temp.nextState_ = SUBSTATE_UNAVAILABLE;
135 stateTable_.push_back(temp);
136
137 temp.event_ = CMD_NETSHARE_CONNECTION_CHANGED;
138 temp.curState_ = SUBSTATE_SHARED;
139 temp.func_ = &NetworkShareSubStateMachine::HandleSharedConnectionChange;
140 temp.nextState_ = NO_NEXT_STATE;
141 stateTable_.push_back(temp);
142
143 temp.event_ = CMD_IP_FORWARDING_ENABLE_ERROR;
144 temp.curState_ = SUBSTATE_SHARED;
145 temp.func_ = &NetworkShareSubStateMachine::HandleSharedErrors;
146 temp.nextState_ = SUBSTATE_INIT;
147 stateTable_.push_back(temp);
148
149 temp.event_ = CMD_IP_FORWARDING_DISABLE_ERROR;
150 temp.curState_ = SUBSTATE_SHARED;
151 temp.func_ = &NetworkShareSubStateMachine::HandleSharedErrors;
152 temp.nextState_ = SUBSTATE_INIT;
153 stateTable_.push_back(temp);
154
155 temp.event_ = CMD_START_SHARING_ERROR;
156 temp.curState_ = SUBSTATE_SHARED;
157 temp.func_ = &NetworkShareSubStateMachine::HandleSharedErrors;
158 temp.nextState_ = SUBSTATE_INIT;
159 stateTable_.push_back(temp);
160
161 temp.event_ = CMD_STOP_SHARING_ERROR;
162 temp.curState_ = SUBSTATE_SHARED;
163 temp.func_ = &NetworkShareSubStateMachine::HandleSharedErrors;
164 temp.nextState_ = SUBSTATE_INIT;
165 stateTable_.push_back(temp);
166
167 temp.event_ = CMD_SET_DNS_FORWARDERS_ERROR;
168 temp.curState_ = SUBSTATE_SHARED;
169 temp.func_ = &NetworkShareSubStateMachine::HandleSharedErrors;
170 temp.nextState_ = SUBSTATE_INIT;
171 stateTable_.push_back(temp);
172 }
173
SubSmStateSwitch(int newState)174 void NetworkShareSubStateMachine::SubSmStateSwitch(int newState)
175 {
176 int oldState = curState_;
177 curState_ = newState;
178 NETMGR_EXT_LOG_I("Sub SM from[%{public}d] to[%{public}d].", oldState, newState);
179
180 if (oldState == SUBSTATE_INIT) {
181 InitStateExit();
182 } else if (oldState == SUBSTATE_SHARED) {
183 SharedStateExit();
184 } else if (oldState == SUBSTATE_UNAVAILABLE) {
185 UnavailableStateExit();
186 } else {
187 NETMGR_EXT_LOG_E("oldState is unknow type value.");
188 }
189
190 if (newState == SUBSTATE_INIT) {
191 InitStateEnter();
192 } else if (newState == SUBSTATE_SHARED) {
193 SharedStateEnter();
194 } else if (newState == SUBSTATE_UNAVAILABLE) {
195 UnavailableStateEnter();
196 } else {
197 NETMGR_EXT_LOG_E("newState is unknow type value.");
198 }
199 }
200
getUsefulMutex()201 ffrt::recursive_mutex &NetworkShareSubStateMachine::getUsefulMutex()
202 {
203 auto mainStateMachinePtr = NetworkShareTracker::GetInstance().GetMainStateMachine();
204 if (!mainStateMachinePtr) {
205 NETMGR_EXT_LOG_W("The point of NetworkShareMainStateMachine is nullptr, use mutex in this category.");
206 return mutex_;
207 }
208 return mainStateMachinePtr->GetEventMutex();
209 }
210
SubSmEventHandle(int eventId,const std::any & messageObj)211 void NetworkShareSubStateMachine::SubSmEventHandle(int eventId, const std::any &messageObj)
212 {
213 std::lock_guard<ffrt::recursive_mutex> lock(getUsefulMutex());
214 int nextState = NO_NEXT_STATE;
215 int (NetworkShareSubStateMachine::*eventFunc)(const std::any &messageObj) = nullptr;
216 for (const auto &iterState : stateTable_) {
217 if ((eventId == iterState.event_) && (curState_ == iterState.curState_)) {
218 eventFunc = iterState.func_;
219 nextState = iterState.nextState_;
220 break;
221 }
222 }
223 if (eventFunc == nullptr) {
224 NETMGR_EXT_LOG_W("SubSM currentstate[%{public}d] eventId[%{public}d] is not matched.", curState_, eventId);
225 return;
226 }
227 (this->*eventFunc)(messageObj);
228 if (nextState >= SUBSTATE_INIT && nextState < SUBSTATE_MAX) {
229 SubSmStateSwitch(nextState);
230 }
231
232 NETMGR_EXT_LOG_I("SubSM eventId[%{public}d] handle successfull.", eventId);
233 }
234
GetDownIfaceName(std::string & downIface)235 void NetworkShareSubStateMachine::GetDownIfaceName(std::string &downIface)
236 {
237 downIface = ifaceName_;
238 }
239
GetUpIfaceName(std::string & upIface)240 void NetworkShareSubStateMachine::GetUpIfaceName(std::string &upIface)
241 {
242 upIface = upstreamIfaceName_;
243 }
244
InitStateEnter()245 void NetworkShareSubStateMachine::InitStateEnter()
246 {
247 if (trackerCallback_ == nullptr) {
248 NETMGR_EXT_LOG_E("Enter Sub StateMachine Init State error, trackerCallback_ is null.");
249 return;
250 }
251 NETMGR_EXT_LOG_I("Enter Sub StateMachine[%{public}s] Init State.", ifaceName_.c_str());
252 trackerCallback_->OnUpdateInterfaceState(shared_from_this(), SUB_SM_STATE_AVAILABLE, lastError_);
253 }
254
InitStateExit()255 void NetworkShareSubStateMachine::InitStateExit()
256 {
257 NETMGR_EXT_LOG_I("Exit Sub StateMachine[%{public}s] Init State.", ifaceName_.c_str());
258 }
259
HandleInitSharingRequest(const std::any & messageObj)260 int NetworkShareSubStateMachine::HandleInitSharingRequest(const std::any &messageObj)
261 {
262 (void)messageObj;
263 lastError_ = NETMANAGER_EXT_SUCCESS;
264 return NETMANAGER_EXT_SUCCESS;
265 }
266
HandleInitInterfaceDown(const std::any & messageObj)267 int NetworkShareSubStateMachine::HandleInitInterfaceDown(const std::any &messageObj)
268 {
269 (void)messageObj;
270 return NETMANAGER_EXT_SUCCESS;
271 }
272
GetShareIpv6Prefix(const std::string & iface)273 bool NetworkShareSubStateMachine::GetShareIpv6Prefix(const std::string &iface)
274 {
275 ifaddrs *ifaddr = nullptr;
276 char ipv6Addr[INET6_ADDRSTRLEN] = {};
277 if (getifaddrs(&ifaddr)) {
278 NETMGR_EXT_LOG_E("getifaddrs err!");
279 return false;
280 }
281 for (auto ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
282 if (!ifa->ifa_addr || ifa->ifa_addr->sa_family != AF_INET6 || std::string(ifa->ifa_name) != iface) {
283 continue;
284 }
285 if (getnameinfo(ifa->ifa_addr, sizeof(sockaddr_in6), ipv6Addr, NI_MAXHOST, nullptr, 0, NI_NUMERICHOST) != 0) {
286 NETMGR_EXT_LOG_E("getnameinfo err!");
287 break;
288 }
289 if (strstr(ipv6Addr, DEFAULT_LINK_STR) != nullptr) {
290 continue;
291 }
292 IpPrefix ipPrefix;
293 inet_pton(AF_INET6, ipv6Addr, &ipPrefix.address);
294 inet_pton(AF_INET6, ipv6Addr, &ipPrefix.prefix);
295 if (memset_s(ipPrefix.prefix.s6_addr + HALF_IN6ADDR, HALF_IN6ADDR, 0, HALF_IN6ADDR) != EOK) {
296 NETMGR_EXT_LOG_E("Failed memset_s");
297 break;
298 }
299 ipPrefix.prefixesLength = PREFIX_LEN;
300 lastRaParams_.prefixes_.emplace_back(ipPrefix);
301 }
302 freeifaddrs(ifaddr);
303 return true;
304 }
305
MacToEui64Addr(std::string & mac)306 std::string NetworkShareSubStateMachine::MacToEui64Addr(std::string &mac)
307 {
308 sockaddr macSockaddr = {};
309 for (size_t i = 0; i < mac.length(); i += MAC_SSCANF_SPACE) {
310 std::string byte = mac.substr(i, MAC_BLOCK);
311 macSockaddr.sa_data[i / MAC_SSCANF_SPACE] = static_cast<char>(strtol(byte.c_str(), nullptr, HEX_BASE));
312 }
313 unsigned char eui64Sa[HALF_IN6ADDR] = {0};
314 char eui64Addr[INTF_ID_LEN] = {0};
315 eui64Sa[BYTE_ZERO] =
316 macSockaddr.sa_data[BYTE_ZERO] | ((macSockaddr.sa_data[BYTE_ZERO] & EUI64_INVERT) ^ EUI64_INVERT);
317 eui64Sa[BYTE_ONE] = macSockaddr.sa_data[BYTE_ONE];
318 eui64Sa[BYTE_TWO] = macSockaddr.sa_data[BYTE_TWO];
319 eui64Sa[BYTE_THREE] = EUI64_FF;
320 eui64Sa[BYTE_FOUR] = EUI64_FE;
321 eui64Sa[BYTE_FIVE] = macSockaddr.sa_data[BYTE_THREE];
322 eui64Sa[BYTE_SIX] = macSockaddr.sa_data[BYTE_FOUR];
323 eui64Sa[BYTE_SEVEN] = macSockaddr.sa_data[BYTE_FIVE];
324 if (snprintf_s(eui64Addr, sizeof(eui64Addr), sizeof(eui64Addr) - 1, "%02x%02x:%02x%02x:%02x%02x:%02x%02x",
325 eui64Sa[BYTE_ZERO], eui64Sa[BYTE_ONE], eui64Sa[BYTE_TWO], eui64Sa[BYTE_THREE], eui64Sa[BYTE_FOUR],
326 eui64Sa[BYTE_FIVE], eui64Sa[BYTE_SIX], eui64Sa[BYTE_SEVEN]) < 0) {
327 return std::string{};
328 }
329 return std::string(eui64Addr);
330 }
331
GenerateIpv6(const std::string & iface)332 int32_t NetworkShareSubStateMachine::GenerateIpv6(const std::string &iface)
333 {
334 std::string eui64Addr = std::string("::") + MacToEui64Addr(lastRaParams_.macAddr_);
335 in6_addr eui64 = IN6ADDR_ANY_INIT;
336 inet_pton(AF_INET6, eui64Addr.c_str(), &eui64);
337 for (IpPrefix &prefix : lastRaParams_.prefixes_) {
338 for (int32_t index = HALF_IN6ADDR; index < MAX_IPV6_PREFIX_LENGTH / BYTE_BIT; ++index) {
339 prefix.address.s6_addr[index] = eui64.s6_addr[index];
340 }
341 prefix.address.s6_addr[HALF_IN6ADDR - 1]++;
342 prefix.prefix.s6_addr[HALF_IN6ADDR - 1]++;
343 }
344 return NETMANAGER_EXT_SUCCESS;
345 }
346
StartIpv6()347 void NetworkShareSubStateMachine::StartIpv6()
348 {
349 NETMGR_EXT_LOG_I("Start ipv6 for iface: %{public}s", ifaceName_.c_str());
350 if (lastRaParams_.prefixes_.size() == 0) {
351 NETMGR_EXT_LOG_I("have nothing ipv6 address!");
352 return;
353 }
354 if (raDaemon_ == nullptr) {
355 raDaemon_ = std::make_shared<RouterAdvertisementDaemon>();
356 }
357 if (raDaemon_->Init(ifaceName_) != NETMANAGER_EXT_SUCCESS) {
358 NETMGR_EXT_LOG_E("Init ipv6 share failed");
359 return;
360 }
361 int32_t mtu = NetsysController::GetInstance().GetInterfaceMtu(ifaceName_);
362 lastRaParams_.mtu_ = mtu > IPV6_MIN_MTU ? mtu : IPV6_MIN_MTU;
363 raDaemon_->BuildNewRa(lastRaParams_);
364 if (raDaemon_->StartRa() != NETMANAGER_EXT_SUCCESS) {
365 NETMGR_EXT_LOG_E("StartRa failed");
366 StopIpv6();
367 }
368 }
369
StopIpv6()370 void NetworkShareSubStateMachine::StopIpv6()
371 {
372 NETMGR_EXT_LOG_I("Stop ipv6 for iface: %{public}s", ifaceName_.c_str());
373 if (raDaemon_ != nullptr) {
374 raDaemon_->StopRa();
375 lastRaParams_.Clear();
376 raDaemon_ = nullptr;
377 }
378 }
SharedStateEnter()379 void NetworkShareSubStateMachine::SharedStateEnter()
380 {
381 NETMGR_EXT_LOG_I("Enter Sub StateMachine[%{public}s] Shared State.", ifaceName_.c_str());
382 if (trackerCallback_ == nullptr) {
383 NETMGR_EXT_LOG_E("Enter Sub StateMachine Shared State error, trackerCallback_ is null.");
384 return;
385 }
386 trackerCallback_->OnUpdateInterfaceState(shared_from_this(), SUB_SM_STATE_SHARED, lastError_);
387 }
388
SharedStateExit()389 void NetworkShareSubStateMachine::SharedStateExit()
390 {
391 NETMGR_EXT_LOG_I("Exit Sub StateMachine[%{public}s] Shared State.", ifaceName_.c_str());
392 #ifdef SHARE_TRAFFIC_LIMIT_ENABLE
393 nmd::NetworkSharingTraffic traffic;
394 NetworkShareTrafficLimit::GetInstance().SaveSharingTrafficToCachedData(traffic);
395 if (upstreamIfaceName_.find(CELLULAR_IFACE_NAME) != std::string::npos) {
396 NetworkShareTrafficLimit::GetInstance().SaveSharingTrafficToSettingsDB(traffic);
397 }
398 #endif
399 CleanupUpstreamInterface();
400 ConfigureShareDhcp(false);
401 StopIpv6();
402 }
403
HandleSharedUnrequest(const std::any & messageObj)404 int NetworkShareSubStateMachine::HandleSharedUnrequest(const std::any &messageObj)
405 {
406 (void)messageObj;
407 return NETMANAGER_EXT_SUCCESS;
408 }
409
HandleSharedInterfaceDown(const std::any & messageObj)410 int NetworkShareSubStateMachine::HandleSharedInterfaceDown(const std::any &messageObj)
411 {
412 (void)messageObj;
413 return NETMANAGER_EXT_SUCCESS;
414 }
415
HandleSharedConnectionChange(const std::any & messageObj)416 int NetworkShareSubStateMachine::HandleSharedConnectionChange(const std::any &messageObj)
417 {
418 std::shared_ptr<UpstreamNetworkInfo> upstreamNetInfo =
419 std::any_cast<std::shared_ptr<UpstreamNetworkInfo>>(messageObj);
420 if (upstreamNetInfo == nullptr) {
421 NETMGR_EXT_LOG_I("Sub StateMachine[%{public}s] upstreamNetInfo is null, need clean.", ifaceName_.c_str());
422 #ifdef SHARE_TRAFFIC_LIMIT_ENABLE
423 nmd::NetworkSharingTraffic traffic;
424 NetworkShareTrafficLimit::GetInstance().SaveSharingTrafficToCachedData(traffic);
425 if (upstreamIfaceName_.find(CELLULAR_IFACE_NAME) != std::string::npos) {
426 NetworkShareTrafficLimit::GetInstance().AddSharingTrafficBeforeConnChanged(traffic);
427 }
428 #endif
429 CleanupUpstreamInterface();
430 upstreamIfaceName_ = EMPTY_UPSTREAM_IFACENAME;
431 return NETMANAGER_EXT_SUCCESS;
432 }
433 HandleConnectionChanged(upstreamNetInfo);
434 return NETMANAGER_EXT_SUCCESS;
435 }
436
HandleSharedErrors(const std::any & messageObj)437 int NetworkShareSubStateMachine::HandleSharedErrors(const std::any &messageObj)
438 {
439 (void)messageObj;
440 NETMGR_EXT_LOG_I("Sub StateMachine[%{public}s] SharedState has ERROR.", ifaceName_.c_str());
441 lastError_ = NETWORKSHARE_ERROR_INTERNAL_ERROR;
442 return NETMANAGER_EXT_SUCCESS;
443 }
444
UnavailableStateEnter()445 void NetworkShareSubStateMachine::UnavailableStateEnter()
446 {
447 NETMGR_EXT_LOG_I("Enter Sub StateMachine[%{public}s] Unavailable State.", ifaceName_.c_str());
448 lastError_ = NETMANAGER_EXT_SUCCESS;
449 if (trackerCallback_ == nullptr) {
450 NETMGR_EXT_LOG_E("Enter Sub StateMachine Unavailable State error, trackerCallback_ is null.");
451 return;
452 }
453 trackerCallback_->OnUpdateInterfaceState(shared_from_this(), SUB_SM_STATE_UNAVAILABLE, NETMANAGER_EXT_SUCCESS);
454 }
455
UnavailableStateExit()456 void NetworkShareSubStateMachine::UnavailableStateExit()
457 {
458 NETMGR_EXT_LOG_I("Exit Sub StateMachine[%{public}s] Unavailable State.", ifaceName_.c_str());
459 }
460
HandleConnectionChanged(const std::shared_ptr<UpstreamNetworkInfo> & upstreamNetInfo)461 void NetworkShareSubStateMachine::HandleConnectionChanged(const std::shared_ptr<UpstreamNetworkInfo> &upstreamNetInfo)
462 {
463 if (upstreamNetInfo == nullptr) {
464 return;
465 }
466 if (upstreamNetInfo->netLinkPro_ == nullptr) {
467 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] HandleConnectionChanged netLinkPro_ is null.",
468 ifaceName_.c_str());
469 return;
470 }
471 if (HasChangeUpstreamIfaceSet(upstreamNetInfo->netLinkPro_->ifaceName_)) {
472 NETMGR_EXT_LOG_I("Sub StateMachine[%{public}s] HandleConnectionChanged Upstream Ifacechange.",
473 ifaceName_.c_str());
474 CleanupUpstreamInterface();
475 upstreamIfaceName_ = upstreamNetInfo->netLinkPro_->ifaceName_;
476 #ifdef WIFI_MODOULE
477 Wifi::HotspotMode mode = Wifi::HotspotMode::NONE;
478 auto WifiHostInstance = Wifi::WifiHotspot::GetInstance(WIFI_HOTSPOT_ABILITY_ID);
479 if (WifiHostInstance != nullptr) {
480 WifiHostInstance->GetHotspotMode(mode);
481 }
482 NETMGR_EXT_LOG_I("get hotspot mode, mode=%{public}d", static_cast<int>(mode));
483 if (mode != Wifi::HotspotMode::LOCAL_ONLY_SOFTAP) {
484 HandleConnection();
485 }
486 #else
487 HandleConnection();
488 #endif
489 }
490 ConfigureShareIpv4(upstreamNetInfo->netLinkPro_);
491 ConfigureShareIpv6(upstreamNetInfo->netLinkPro_);
492 }
493
ConfigureShareIpv4(const sptr<NetLinkInfo> & upstreamLinkInfo)494 void NetworkShareSubStateMachine::ConfigureShareIpv4(const sptr<NetLinkInfo> &upstreamLinkInfo)
495 {
496 bool hasIpv4 = false;
497 for (const auto &inetAddr : upstreamLinkInfo->netAddrList_) {
498 auto family = inetAddr.family_;
499 if (family == NET_FAMILY_IPV4) {
500 hasIpv4 = true;
501 NETMGR_EXT_LOG_I("family:%{public}d", family);
502 break;
503 }
504 }
505 if (hasIpv4) {
506 AddRoutesToLocalNetwork();
507 ConfigureShareDhcp(true);
508 }
509 }
510
ConfigureShareIpv6(const sptr<NetLinkInfo> & upstreamLinkInfo)511 void NetworkShareSubStateMachine::ConfigureShareIpv6(const sptr<NetLinkInfo> &upstreamLinkInfo)
512 {
513 lastRaParams_.Clear();
514 for (const auto &inetAddr : upstreamLinkInfo->netAddrList_) {
515 auto family = inetAddr.family_;
516 if (family != NET_FAMILY_IPV6) {
517 continue;
518 }
519 IpPrefix ipPrefix;
520 inet_pton(AF_INET6, inetAddr.address_.c_str(), &ipPrefix.address);
521 inet_pton(AF_INET6, inetAddr.address_.c_str(), &ipPrefix.prefix);
522 if (memset_s(ipPrefix.prefix.s6_addr + HALF_IN6ADDR, HALF_IN6ADDR, 0, HALF_IN6ADDR) != EOK) {
523 NETMGR_EXT_LOG_I("Failed memset_s");
524 continue;
525 }
526 ipPrefix.prefixesLength = PREFIX_LEN;
527 lastRaParams_.prefixes_.emplace_back(ipPrefix);
528 NETMGR_EXT_LOG_I("family:%{public}d", family);
529 }
530 if (lastRaParams_.prefixes_.size() == 0) {
531 NETMGR_EXT_LOG_E("have nothing ipv6 address for iface[%{public}s!", upstreamLinkInfo->ifaceName_.c_str());
532 return;
533 }
534 NetsysController::GetInstance().SetEnableIpv6(ifaceName_, DHCP_IPV6_ENABLE);
535 NETMGR_EXT_LOG_I("ConfigureShareIpv6 SetEnableIpv6 success[%{public}s!", ifaceName_.c_str());
536 if (raDaemon_ == nullptr) {
537 AddIpv6InfoToLocalNetwork();
538 StartIpv6();
539 }
540 }
HandleConnection()541 void NetworkShareSubStateMachine::HandleConnection()
542 {
543 int32_t result = NetsysController::GetInstance().IpfwdAddInterfaceForward(ifaceName_, upstreamIfaceName_);
544 if (result != NETSYS_SUCCESS) {
545 NetworkShareHisysEvent::GetInstance().SendFaultEvent(
546 netShareType_, NetworkShareEventOperator::OPERATION_CONFIG_FORWARD,
547 NetworkShareEventErrorType::ERROR_CONFIG_FORWARD, ERROR_MSG_CONFIG_FORWARD,
548 NetworkShareEventType::SETUP_EVENT);
549 NETMGR_EXT_LOG_E(
550 "Sub StateMachine[%{public}s] IpfwdAddInterfaceForward newIface[%{public}s] error[%{public}d].",
551 ifaceName_.c_str(), upstreamIfaceName_.c_str(), result);
552 lastError_ = NETWORKSHARE_ERROR_ENABLE_FORWARDING_ERROR;
553 SubSmStateSwitch(SUBSTATE_INIT);
554 return;
555 }
556
557 result = NetsysController::GetInstance().NetworkAddInterface(LOCAL_NET_ID, ifaceName_);
558 if (result != NETMANAGER_SUCCESS) {
559 NetworkShareHisysEvent::GetInstance().SendFaultEvent(
560 netShareType_, NetworkShareEventOperator::OPERATION_CONFIG_FORWARD,
561 NetworkShareEventErrorType::ERROR_CONFIG_FORWARD, ERROR_MSG_ADD_ROUTE_STRATEGY,
562 NetworkShareEventType::SETUP_EVENT);
563 NETMGR_EXT_LOG_E(
564 "Sub StateMachine[%{public}s] SharedState NetworkAddInterface newIface[%{public}s] error[%{public}d].",
565 ifaceName_.c_str(), upstreamIfaceName_.c_str(), result);
566 NetsysController::GetInstance().IpfwdRemoveInterfaceForward(ifaceName_, upstreamIfaceName_);
567 lastError_ = NETWORKSHARE_ERROR_ENABLE_FORWARDING_ERROR;
568 SubSmStateSwitch(SUBSTATE_INIT);
569 return;
570 }
571 }
572
RemoveRoutesToLocalNetwork()573 void NetworkShareSubStateMachine::RemoveRoutesToLocalNetwork()
574 {
575 std::string destination;
576 if (!FindDestinationAddr(destination)) {
577 NETMGR_EXT_LOG_E("Get Destination fail");
578 return;
579 }
580 int32_t result =
581 NetsysController::GetInstance().NetworkRemoveRoute(LOCAL_NET_ID, ifaceName_, destination, NEXT_HOT);
582 if (result != NETSYS_SUCCESS) {
583 NetworkShareHisysEvent::GetInstance().SendFaultEvent(
584 netShareType_, NetworkShareEventOperator::OPERATION_CANCEL_FORWARD,
585 NetworkShareEventErrorType::ERROR_CANCEL_FORWARD, ERROR_MSG_REMOVE_ROUTE_RULE,
586 NetworkShareEventType::CANCEL_EVENT);
587 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] Remove Route error[%{public}d].", ifaceName_.c_str(), result);
588 } else {
589 destination_ = "";
590 }
591 }
592
AddRoutesToLocalNetwork()593 void NetworkShareSubStateMachine::AddRoutesToLocalNetwork()
594 {
595 std::string destination;
596 if (!FindDestinationAddr(destination)) {
597 NETMGR_EXT_LOG_E("Get Destination fail");
598 return;
599 }
600 if (destination_ == destination) {
601 NETMGR_EXT_LOG_I("ipv4 route already Set!");
602 return;
603 }
604 int32_t result = NetsysController::GetInstance().NetworkAddRoute(LOCAL_NET_ID, ifaceName_, destination, NEXT_HOT);
605 if (result != NETSYS_SUCCESS) {
606 NetworkShareHisysEvent::GetInstance().SendFaultEvent(
607 netShareType_, NetworkShareEventOperator::OPERATION_CONFIG_FORWARD,
608 NetworkShareEventErrorType::ERROR_CONFIG_FORWARD, ERROR_MSG_ADD_ROUTE_RULE,
609 NetworkShareEventType::SETUP_EVENT);
610 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] Add Route error[%{public}d].", ifaceName_.c_str(), result);
611 } else {
612 destination_ = destination;
613 }
614 }
615
AddIpv6AddrToLocalNetwork()616 void NetworkShareSubStateMachine::AddIpv6AddrToLocalNetwork()
617 {
618 char address[INET6_ADDRSTRLEN] = {0};
619 char addressPrefix[INET6_ADDRSTRLEN] = {0};
620 std::string destination;
621 int32_t result = NETSYS_SUCCESS;
622 for (const auto &prefix : lastRaParams_.prefixes_) {
623 inet_ntop(AF_INET6, &(prefix.address), address, sizeof(address));
624 if (NetsysController::GetInstance().AddInterfaceAddress(ifaceName_, address, PREFIX_LEN) != 0) {
625 NETMGR_EXT_LOG_E("Failed setting ipv6 address");
626 return;
627 }
628 inet_ntop(AF_INET6, &(prefix.prefix), addressPrefix, sizeof(addressPrefix));
629 destination = std::string(addressPrefix) + DEFAULT_PREFIX;
630 result = NetsysController::GetInstance().NetworkAddRoute(LOCAL_NET_ID, ifaceName_, destination, IPV6_NEXT_HOT);
631 if (result != NETSYS_SUCCESS) {
632 NetworkShareHisysEvent::GetInstance().SendFaultEvent(
633 netShareType_, NetworkShareEventOperator::OPERATION_CONFIG_FORWARD,
634 NetworkShareEventErrorType::ERROR_CONFIG_FORWARD, ERROR_MSG_ADD_ROUTE_RULE,
635 NetworkShareEventType::SETUP_EVENT);
636 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] Add Route error[%{public}d].", ifaceName_.c_str(), result);
637 }
638 }
639 destination = std::string(DEFAULT_LINK_ROUTE);
640 result = NetsysController::GetInstance().NetworkAddRoute(LOCAL_NET_ID, ifaceName_, destination, IPV6_NEXT_HOT);
641 if (result != NETSYS_SUCCESS) {
642 NetworkShareHisysEvent::GetInstance().SendFaultEvent(
643 netShareType_, NetworkShareEventOperator::OPERATION_CONFIG_FORWARD,
644 NetworkShareEventErrorType::ERROR_CONFIG_FORWARD, ERROR_MSG_ADD_ROUTE_RULE,
645 NetworkShareEventType::SETUP_EVENT);
646 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] Add Route error[%{public}d].", ifaceName_.c_str(), result);
647 }
648 }
649
AddIpv6InfoToLocalNetwork()650 void NetworkShareSubStateMachine::AddIpv6InfoToLocalNetwork()
651 {
652 if (!GetWifiApDstIpv6Addr()) {
653 NETMGR_EXT_LOG_E("have nothing ipv6 params!");
654 return;
655 }
656 AddIpv6AddrToLocalNetwork();
657 }
658
FindDestinationAddr(std::string & destination)659 bool NetworkShareSubStateMachine::FindDestinationAddr(std::string &destination)
660 {
661 if (netShareType_ == SharingIfaceType::SHARING_BLUETOOTH) {
662 if (!GetBtDestinationAddr(destination)) {
663 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] Add Route Get btpan Destination Addr failed.",
664 ifaceName_.c_str());
665 return false;
666 }
667 return true;
668 }
669 if (netShareType_ == SharingIfaceType::SHARING_WIFI) {
670 if (!GetWifiApDestinationAddr(destination)) {
671 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] Add Route Get wifi Destination Addr failed.",
672 ifaceName_.c_str());
673 return false;
674 }
675 return true;
676 }
677 if (netShareType_ == SharingIfaceType::SHARING_USB) {
678 if (!GetUsbDestinationAddr(destination)) {
679 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] Add Route Get usb Destination Addr failed.",
680 ifaceName_.c_str());
681 return false;
682 }
683 return true;
684 }
685 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] Add Route sharetype is unknown.", ifaceName_.c_str());
686 return false;
687 }
688
GetWifiHotspotDhcpFlag()689 bool NetworkShareSubStateMachine::GetWifiHotspotDhcpFlag()
690 {
691 if (configuration_ == nullptr) {
692 return false;
693 }
694 return configuration_->GetWifiHotspotSetDhcpFlag();
695 }
696
GetBtDestinationAddr(std::string & addrStr)697 bool NetworkShareSubStateMachine::GetBtDestinationAddr(std::string &addrStr)
698 {
699 if (configuration_ == nullptr) {
700 NETMGR_EXT_LOG_E("GetBtDestinationAddr configuration is null.");
701 return false;
702 }
703 std::string btpanIpv4Addr = configuration_->GetBtpanIpv4Addr();
704 if (btpanIpv4Addr.empty()) {
705 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] get btpan ipv4 addr failed.", ifaceName_.c_str());
706 return false;
707 }
708 std::string::size_type dotPos = btpanIpv4Addr.rfind(".");
709 if (dotPos == std::string::npos) {
710 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] btpan ipv4 addr error.", ifaceName_.c_str());
711 return false;
712 }
713 std::string routeSuffix = configuration_->GetRouteSuffix();
714 if (routeSuffix.empty()) {
715 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] get route suffix failed.", ifaceName_.c_str());
716 return false;
717 }
718
719 addrStr = btpanIpv4Addr.substr(0, dotPos) + routeSuffix;
720 return true;
721 }
722
GetWifiApDestinationAddr(std::string & addrStr)723 bool NetworkShareSubStateMachine::GetWifiApDestinationAddr(std::string &addrStr)
724 {
725 if (configuration_ == nullptr) {
726 NETMGR_EXT_LOG_E("GetWifiApDestinationAddr configuration is null.");
727 return false;
728 }
729 std::string wifiIpv4Addr = configuration_->GetWifiHotspotIpv4Addr();
730 if (wifiIpv4Addr.empty()) {
731 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] get wifi ipv4 addr failed.", ifaceName_.c_str());
732 return false;
733 }
734 std::string::size_type dotPos = wifiIpv4Addr.rfind(".");
735 if (dotPos == std::string::npos) {
736 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] wifi ipv4 addr error.", ifaceName_.c_str());
737 return false;
738 }
739 std::string routeSuffix = configuration_->GetRouteSuffix();
740 if (routeSuffix.empty()) {
741 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] get route suffix failed.", ifaceName_.c_str());
742 return false;
743 }
744 addrStr = wifiIpv4Addr.substr(0, dotPos) + routeSuffix;
745 return true;
746 }
747
GetWifiApDstIpv6Addr()748 bool NetworkShareSubStateMachine::GetWifiApDstIpv6Addr()
749 {
750 OHOS::nmd::InterfaceConfigurationParcel config;
751 config.ifName = ifaceName_;
752 if (NetsysController::GetInstance().GetInterfaceConfig(config) != ERR_NONE) {
753 NETMGR_EXT_LOG_E("Get interface mac err!");
754 return false;
755 }
756 if (!std::regex_match(config.hwAddr, REGEX_MAC)) {
757 NETMGR_EXT_LOG_E("Get interface mac format err!");
758 return false;
759 }
760 lastRaParams_.macAddr_ = config.hwAddr;
761 if (lastRaParams_.prefixes_.size() == 0) {
762 NETMGR_EXT_LOG_E("have nothing ipv6 address for iface[%{public}s!", upstreamIfaceName_.c_str());
763 return false;
764 }
765 if (GenerateIpv6(upstreamIfaceName_) != NETMANAGER_EXT_SUCCESS) {
766 NETMGR_EXT_LOG_E("Generate ipv6 adress Fail %{public}s", upstreamIfaceName_.c_str());
767 return false;
768 }
769 return true;
770 }
771
GetUsbDestinationAddr(std::string & addrStr)772 bool NetworkShareSubStateMachine::GetUsbDestinationAddr(std::string &addrStr)
773 {
774 if (configuration_ == nullptr) {
775 NETMGR_EXT_LOG_E("GetUsbDestinationAddr configuration is null.");
776 return false;
777 }
778 std::string usbIpv4Addr = configuration_->GetUsbRndisIpv4Addr();
779 if (usbIpv4Addr.empty()) {
780 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] get usb ipv4 addr failed.", ifaceName_.c_str());
781 return false;
782 }
783 std::string::size_type dotPos = usbIpv4Addr.rfind(".");
784 if (dotPos == std::string::npos) {
785 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] usb ipv4 addr error.", ifaceName_.c_str());
786 return false;
787 }
788 std::string routeSuffix = configuration_->GetRouteSuffix();
789 if (routeSuffix.empty()) {
790 NETMGR_EXT_LOG_E("Sub StateMachine[%{public}s] get route suffix failed.", ifaceName_.c_str());
791 return false;
792 }
793 addrStr = usbIpv4Addr.substr(0, dotPos) + routeSuffix;
794 return true;
795 }
796
StartDhcp(const std::shared_ptr<INetAddr> & netAddr)797 bool NetworkShareSubStateMachine::StartDhcp(const std::shared_ptr<INetAddr> &netAddr)
798 {
799 if (netAddr == nullptr) {
800 NETMGR_EXT_LOG_E("StartDhcp netAddr is null.");
801 return false;
802 }
803 std::string endIp;
804 std::string mask;
805 if (!CheckConfig(endIp, mask)) {
806 NETMGR_EXT_LOG_E("StartDhcp Get necessary config failed.");
807 return false;
808 }
809
810 std::string ipAddr = netAddr->address_;
811 std::string::size_type pos = ipAddr.rfind(".");
812 if (pos == std::string::npos) {
813 NETMGR_EXT_LOG_E("StartDhcp addr is error.");
814 return false;
815 }
816 std::string ipHead = ipAddr.substr(0, pos);
817 std::string ipEnd = ipAddr.substr(pos + 1);
818 std::string startIp = std::to_string(atoi(ipEnd.c_str()) + 1);
819
820 std::string strStartip = ipHead + "." + startIp;
821 std::string strEndip = ipHead + "." + endIp;
822
823 DhcpRange range;
824 range.iptype = IP_V4;
825 if (!SetRange(range, ipHead, strStartip, strEndip, mask)) {
826 return false;
827 }
828
829 if (SetDhcpRange(ifaceName_.c_str(), &range) != DHCP_SUCCESS) {
830 NETMGR_EXT_LOG_E("StartDhcp SetDhcpRange failed.");
831 return false;
832 }
833
834 if (StartDhcpServer(ifaceName_.c_str()) != DHCP_SUCCESS) {
835 NETMGR_EXT_LOG_E("StartDhcp StartDhcpServer failed.");
836 return false;
837 }
838 NETMGR_EXT_LOG_I("StartDhcp StartDhcpServer successful.");
839 return true;
840 }
841
SetRange(DhcpRange & range,const std::string & ipHead,const std::string & strStartip,const std::string & strEndip,const std::string & mask)842 bool NetworkShareSubStateMachine::SetRange(DhcpRange &range, const std::string &ipHead, const std::string &strStartip,
843 const std::string &strEndip, const std::string &mask)
844 {
845 if (strcpy_s(range.strTagName, DHCP_MAX_FILE_BYTES, ifaceName_.c_str()) != 0) {
846 NETMGR_EXT_LOG_E("strcpy_s strTagName failed!");
847 return false;
848 }
849
850 if (strcpy_s(range.strStartip, INET_ADDRSTRLEN, strStartip.c_str()) != 0) {
851 NETMGR_EXT_LOG_E("strcpy_s strStartip failed!");
852 return false;
853 }
854
855 if (strcpy_s(range.strEndip, INET_ADDRSTRLEN, strEndip.c_str()) != 0) {
856 NETMGR_EXT_LOG_E("strcpy_s strEndip failed!");
857 return false;
858 }
859
860 if (strcpy_s(range.strSubnet, INET_ADDRSTRLEN, mask.c_str()) != 0) {
861 NETMGR_EXT_LOG_E("strcpy_s strSubnet failed!");
862 return false;
863 }
864 NETMGR_EXT_LOG_I(
865 "Set dhcp range : ifaceName[%{public}s] TagName[%{public}s] start ip[%{private}s] end ip[%{private}s]",
866 ifaceName_.c_str(), range.strTagName, range.strStartip, range.strEndip);
867
868 return true;
869 }
870
CheckConfig(std::string & endIp,std::string & mask)871 bool NetworkShareSubStateMachine::CheckConfig(std::string &endIp, std::string &mask)
872 {
873 if (configuration_ == nullptr) {
874 NETMGR_EXT_LOG_E("StartDhcp configuration is null.");
875 return false;
876 }
877 endIp = configuration_->GetDhcpEndIP();
878 if (endIp.empty()) {
879 NETMGR_EXT_LOG_E("StartDhcp GetDhcpEndIP is null.");
880 return false;
881 }
882 mask = configuration_->GetDefaultMask();
883 if (mask.empty()) {
884 NETMGR_EXT_LOG_E("StartDhcp GetDefaultMask is null.");
885 return false;
886 }
887 return true;
888 }
889
StopDhcp()890 bool NetworkShareSubStateMachine::StopDhcp()
891 {
892 if (netShareType_ == SharingIfaceType::SHARING_WIFI) {
893 NETMGR_EXT_LOG_W("StopDhcp wifi hotspot not need stop.");
894 return true;
895 }
896
897 int ret = StopDhcpServer(ifaceName_.c_str());
898 if (ret != 0) {
899 NETMGR_EXT_LOG_E("StopDhcpServer failed, error[%{public}d].", ret);
900 return false;
901 }
902 NETMGR_EXT_LOG_I("StopDhcpServer successful.");
903 return true;
904 }
905
ConfigureShareDhcp(bool enabled)906 bool NetworkShareSubStateMachine::ConfigureShareDhcp(bool enabled)
907 {
908 std::shared_ptr<INetAddr> ipv4Address = nullptr;
909 if (enabled) {
910 bool ret = RequestIpv4Address(ipv4Address);
911 if (ipv4Address == nullptr || !ret) {
912 NETMGR_EXT_LOG_E("ConfigureShareDhcp no available ipv4 address.");
913 return false;
914 }
915 if (netShareType_ == SharingIfaceType::SHARING_WIFI && !GetWifiHotspotDhcpFlag()) {
916 NETMGR_EXT_LOG_W("StartDhcp wifi hotspot not need start.");
917 return true;
918 }
919 return StartDhcp(ipv4Address);
920 }
921 return StopDhcp();
922 }
923
RequestIpv4Address(std::shared_ptr<INetAddr> & netAddr)924 bool NetworkShareSubStateMachine::RequestIpv4Address(std::shared_ptr<INetAddr> &netAddr)
925 {
926 if (configuration_ == nullptr) {
927 NETMGR_EXT_LOG_E("RequestIpv4Address get configuration failed.");
928 return false;
929 }
930
931 netAddr = std::make_shared<INetAddr>();
932 netAddr->type_ = INetAddr::IPV4;
933 netAddr->prefixlen_ = PREFIX_LENGTH_24;
934 netAddr->netMask_ = configuration_->GetDefaultMask();
935 if (netAddr->netMask_.empty()) {
936 NETMGR_EXT_LOG_E("RequestIpv4Address get default mask failed.");
937 return false;
938 }
939 switch (netShareType_) {
940 case SharingIfaceType::SHARING_BLUETOOTH: {
941 netAddr->address_ = configuration_->GetBtpanIpv4Addr();
942 netAddr->hostName_ = configuration_->GetBtpanDhcpServerName();
943 break;
944 }
945 case SharingIfaceType::SHARING_WIFI: {
946 netAddr->address_ = configuration_->GetWifiHotspotIpv4Addr();
947 netAddr->hostName_ = configuration_->GetWifiHotspotDhcpServerName();
948 break;
949 }
950 case SharingIfaceType::SHARING_USB: {
951 netAddr->address_ = configuration_->GetUsbRndisIpv4Addr();
952 netAddr->hostName_ = configuration_->GetUsbRndisDhcpServerName();
953 break;
954 }
955 default:
956 NETMGR_EXT_LOG_E("Unknown share type");
957 return false;
958 }
959
960 if (netAddr->address_.empty() || netAddr->hostName_.empty()) {
961 NETMGR_EXT_LOG_E("Failed to get ipv4 Address or dhcp server name.");
962 return false;
963 }
964 return true;
965 }
966
CleanupUpstreamInterface()967 void NetworkShareSubStateMachine::CleanupUpstreamInterface()
968 {
969 NETMGR_EXT_LOG_I("Clearn Forward, downstream Iface[%{public}s], upstream iface[%{public}s].", ifaceName_.c_str(),
970 upstreamIfaceName_.c_str());
971 RemoveRoutesToLocalNetwork();
972 NetsysController::GetInstance().NetworkRemoveInterface(LOCAL_NET_ID, ifaceName_);
973 NetsysController::GetInstance().IpfwdRemoveInterfaceForward(ifaceName_, upstreamIfaceName_);
974 }
975
HasChangeUpstreamIfaceSet(const std::string & newUpstreamIface)976 bool NetworkShareSubStateMachine::HasChangeUpstreamIfaceSet(const std::string &newUpstreamIface)
977 {
978 if ((upstreamIfaceName_.empty()) && (newUpstreamIface.empty())) {
979 return false;
980 }
981 if ((!upstreamIfaceName_.empty()) && (!newUpstreamIface.empty())) {
982 return upstreamIfaceName_ != newUpstreamIface;
983 }
984 return true;
985 }
986
RegisterSubSMCallback(const std::shared_ptr<SubStateMachineCallback> & callback)987 void NetworkShareSubStateMachine::RegisterSubSMCallback(const std::shared_ptr<SubStateMachineCallback> &callback)
988 {
989 trackerCallback_ = callback;
990 }
991
GetNetShareType() const992 SharingIfaceType NetworkShareSubStateMachine::GetNetShareType() const
993 {
994 return netShareType_;
995 }
996
GetInterfaceName() const997 const std::string &NetworkShareSubStateMachine::GetInterfaceName() const
998 {
999 return ifaceName_;
1000 }
1001 } // namespace NetManagerStandard
1002 } // namespace OHOS
1003