• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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