• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "networkshare_main_statemachine.h"
17 
18 #include "netmgr_ext_log_wrapper.h"
19 #include "netsys_controller.h"
20 #include "networkshare_constants.h"
21 #include "networkshare_sub_statemachine.h"
22 #include "networkshare_tracker.h"
23 
24 namespace OHOS {
25 namespace NetManagerStandard {
26 static constexpr const char *ERROR_MSG_TRUNON = "Turn on Ip Forward failed";
27 static constexpr const char *ERROR_MSG_TRUNOFF = "Turn off Ip Forward failed";
28 static constexpr const char *ERROR_MSG_ENABLE_FORWARD = "Enable Forward failed";
29 static constexpr const char *ERROR_MSG_DISABLE_FORWARD = "Disable Forward failed";
30 static constexpr const char *FAKE_DOWNSTREAM_IFACENAME = "";
31 static constexpr const char *EMPTY_UPSTREAM_IFACENAME = "";
32 
NetworkShareMainStateMachine(std::shared_ptr<NetworkShareUpstreamMonitor> & networkmonitor)33 NetworkShareMainStateMachine::NetworkShareMainStateMachine(std::shared_ptr<NetworkShareUpstreamMonitor> &networkmonitor)
34     : netshareRequester_("netsharing_requester"), networkMonitor_(networkmonitor)
35 {
36     MainSmStateTable temp;
37     temp.event_ = EVENT_IFACE_SM_STATE_ACTIVE;
38     temp.curState_ = MAINSTATE_INIT;
39     temp.func_ = &NetworkShareMainStateMachine::HandleInitInterfaceStateActive;
40     temp.nextState_ = MAINSTATE_ALIVE;
41     stateTable_.push_back(temp);
42 
43     temp.event_ = EVENT_IFACE_SM_STATE_INACTIVE;
44     temp.curState_ = MAINSTATE_INIT;
45     temp.func_ = &NetworkShareMainStateMachine::HandleInitInterfaceStateInactive;
46     temp.nextState_ = NO_NEXT_STATE;
47     stateTable_.push_back(temp);
48 
49     temp.event_ = EVENT_IFACE_SM_STATE_ACTIVE;
50     temp.curState_ = MAINSTATE_ALIVE;
51     temp.func_ = &NetworkShareMainStateMachine::HandleAliveInterfaceStateActive;
52     temp.nextState_ = NO_NEXT_STATE;
53     stateTable_.push_back(temp);
54 
55     temp.event_ = EVENT_IFACE_SM_STATE_INACTIVE;
56     temp.curState_ = MAINSTATE_ALIVE;
57     temp.func_ = &NetworkShareMainStateMachine::HandleAliveInterfaceStateInactive;
58     temp.nextState_ = NO_NEXT_STATE;
59     stateTable_.push_back(temp);
60 
61     temp.event_ = EVENT_UPSTREAM_CALLBACK;
62     temp.curState_ = MAINSTATE_ALIVE;
63     temp.func_ = &NetworkShareMainStateMachine::HandleAliveUpstreamMonitorCallback;
64     temp.nextState_ = NO_NEXT_STATE;
65     stateTable_.push_back(temp);
66 
67     temp.event_ = EVENT_IFACE_SM_STATE_INACTIVE;
68     temp.curState_ = MAINSTATE_ERROR;
69     temp.func_ = &NetworkShareMainStateMachine::HandleErrorInterfaceStateInactive;
70     temp.nextState_ = NO_NEXT_STATE;
71     stateTable_.push_back(temp);
72 
73     temp.event_ = CMD_CLEAR_ERROR;
74     temp.curState_ = MAINSTATE_ERROR;
75     temp.func_ = &NetworkShareMainStateMachine::HandleErrorClear;
76     temp.nextState_ = MAINSTATE_INIT;
77     stateTable_.push_back(temp);
78 }
79 
MainSmStateSwitch(int newState)80 void NetworkShareMainStateMachine::MainSmStateSwitch(int newState)
81 {
82     int oldState = curState_;
83     curState_ = newState;
84     NETMGR_EXT_LOG_I("MainSmStateSwitch from[%{public}d] to[%{public}d].", oldState, newState);
85 
86     if (oldState == MAINSTATE_INIT) {
87         InitStateExit();
88     } else if (oldState == MAINSTATE_ALIVE) {
89         AliveStateExit();
90     } else if (oldState == MAINSTATE_ERROR) {
91         ErrorStateExit();
92     } else {
93         NETMGR_EXT_LOG_E("MainSmStateSwitch oldState is unknow type value.");
94     }
95 
96     if (newState == MAINSTATE_INIT) {
97         InitStateEnter();
98     } else if (newState == MAINSTATE_ALIVE) {
99         AliveStateEnter();
100     } else if (newState == MAINSTATE_ERROR) {
101         ErrorStateEnter();
102     } else {
103         NETMGR_EXT_LOG_E("MainSmStateSwitch newState is unknow type value.");
104     }
105 }
106 
MainSmEventHandle(int eventId,const std::any & messageObj)107 void NetworkShareMainStateMachine::MainSmEventHandle(int eventId, const std::any &messageObj)
108 {
109     std::lock_guard<std::recursive_mutex> lock(mutex_);
110     int nextState = NO_NEXT_STATE;
111     int (NetworkShareMainStateMachine::*eventActionFun)(const std::any &messageObj) = nullptr;
112     for (auto &iter : stateTable_) {
113         if ((eventId == iter.event_) && (curState_ == iter.curState_)) {
114             eventActionFun = iter.func_;
115             nextState = iter.nextState_;
116             break;
117         }
118     }
119     if (eventActionFun == nullptr) {
120         NETMGR_EXT_LOG_W("currentstate[%{public}d]  eventId[%{public}d] is not matched.", curState_, eventId);
121         return;
122     }
123     (this->*eventActionFun)(messageObj);
124     if (nextState >= MAINSTATE_INIT && nextState < MAINSTATE_MAX) {
125         MainSmStateSwitch(nextState);
126     }
127 
128     NETMGR_EXT_LOG_I("MainSm eventId[%{public}d], handle successful.", eventId);
129 }
130 
InitStateEnter()131 void NetworkShareMainStateMachine::InitStateEnter()
132 {
133     NETMGR_EXT_LOG_I("Enter Init state");
134 }
135 
InitStateExit()136 void NetworkShareMainStateMachine::InitStateExit()
137 {
138     NETMGR_EXT_LOG_I("Exit Init state");
139 }
140 
AliveStateEnter()141 void NetworkShareMainStateMachine::AliveStateEnter()
142 {
143     NETMGR_EXT_LOG_I("Enter Alive State");
144     if (!(TurnOnMainShareSettings())) {
145         NETMGR_EXT_LOG_E("Enter Alive State TurnOnMainShareSettings error.");
146         return;
147     }
148     if (NetworkShareTracker::GetInstance().UpstreamWanted()) {
149         ChooseUpstreamNetwork();
150     }
151 }
152 
AliveStateExit()153 void NetworkShareMainStateMachine::AliveStateExit()
154 {
155     NETMGR_EXT_LOG_I("Exit Alive state");
156     NetworkShareTracker::GetInstance().NotifyDownstreamsHasNewUpstreamIface(nullptr);
157 }
158 
ErrorStateEnter()159 void NetworkShareMainStateMachine::ErrorStateEnter()
160 {
161     NETMGR_EXT_LOG_I("Enter Error state, error[%{public}d].", errorType_);
162     for_each(subMachineList_.begin(), subMachineList_.end(),
163              [this](std::shared_ptr<NetworkShareSubStateMachine> subsm) {
164                  if (subsm != nullptr) {
165                      NETMGR_EXT_LOG_I("NOTIFY TO SUB SM [%{public}s] EVENT[%{public}d].",
166                                       subsm->GetInterfaceName().c_str(), errorType_);
167                      subsm->SubSmEventHandle(errorType_, 0);
168                  }
169              });
170 }
171 
ErrorStateExit() const172 void NetworkShareMainStateMachine::ErrorStateExit() const
173 {
174     NETMGR_EXT_LOG_I("Exit Error state, error[%{public}d].", errorType_);
175 }
176 
HandleInitInterfaceStateActive(const std::any & messageObj)177 int NetworkShareMainStateMachine::HandleInitInterfaceStateActive(const std::any &messageObj)
178 {
179     const MessageIfaceActive &temp = std::any_cast<const MessageIfaceActive &>(messageObj);
180     std::vector<std::shared_ptr<NetworkShareSubStateMachine>>::iterator iter =
181         find(subMachineList_.begin(), subMachineList_.end(), temp.subsm_);
182     if (iter == subMachineList_.end()) {
183         NETMGR_EXT_LOG_I("add new subSm.");
184         subMachineList_.push_back(temp.subsm_);
185     }
186 
187     NetworkShareTracker::GetInstance().ModifySharedSubStateMachineList(true, temp.subsm_);
188     return NETMANAGER_EXT_SUCCESS;
189 }
190 
HandleInitInterfaceStateInactive(const std::any & messageObj)191 int NetworkShareMainStateMachine::HandleInitInterfaceStateInactive(const std::any &messageObj)
192 {
193     return EraseSharedSubSM(messageObj);
194 }
195 
HandleAliveInterfaceStateActive(const std::any & messageObj)196 int NetworkShareMainStateMachine::HandleAliveInterfaceStateActive(const std::any &messageObj)
197 {
198     const MessageIfaceActive &temp = std::any_cast<const MessageIfaceActive &>(messageObj);
199     std::vector<std::shared_ptr<NetworkShareSubStateMachine>>::iterator iter =
200         find(subMachineList_.begin(), subMachineList_.end(), temp.subsm_);
201     if (iter == subMachineList_.end()) {
202         NETMGR_EXT_LOG_I("add new subSm.");
203         subMachineList_.push_back(temp.subsm_);
204     }
205 
206     NetworkShareTracker::GetInstance().ModifySharedSubStateMachineList(true, temp.subsm_);
207     if (temp.subsm_ != nullptr) {
208         std::shared_ptr<UpstreamNetworkInfo> upstreamInfo = nullptr;
209         NetworkShareTracker::GetInstance().GetUpstreamInfo(upstreamInfo);
210         NETMGR_EXT_LOG_I("NOTIFY TO SUB SM [%{public}s] CMD_NETSHARE_CONNECTION_CHANGED.",
211                          temp.subsm_->GetInterfaceName().c_str());
212         temp.subsm_->SubSmEventHandle(CMD_NETSHARE_CONNECTION_CHANGED, upstreamInfo);
213     }
214     return NETMANAGER_EXT_SUCCESS;
215 }
216 
HandleAliveInterfaceStateInactive(const std::any & messageObj)217 int NetworkShareMainStateMachine::HandleAliveInterfaceStateInactive(const std::any &messageObj)
218 {
219     int ret = EraseSharedSubSM(messageObj);
220     if (ret != NETMANAGER_EXT_SUCCESS) {
221         return ret;
222     }
223     if (subMachineList_.size() == 0) {
224         DisableForward();
225         TurnOffMainShareSettings();
226     }
227     return NETMANAGER_EXT_SUCCESS;
228 }
229 
EraseSharedSubSM(const std::any & messageObj)230 int NetworkShareMainStateMachine::EraseSharedSubSM(const std::any &messageObj)
231 {
232     const MessageIfaceActive &temp = std::any_cast<const MessageIfaceActive &>(messageObj);
233     if (temp.subsm_ == nullptr) {
234         NETMGR_EXT_LOG_E("subsm[%{public}d] is null.", temp.value_);
235         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
236     }
237     subMachineList_.erase(
238         remove_if(subMachineList_.begin(), subMachineList_.end(),
239                   [temp](std::shared_ptr<NetworkShareSubStateMachine> sm) { return sm == temp.subsm_; }),
240         subMachineList_.end());
241 
242     NetworkShareTracker::GetInstance().ModifySharedSubStateMachineList(false, temp.subsm_);
243     return NETMANAGER_EXT_SUCCESS;
244 }
245 
ChooseUpstreamNetwork()246 void NetworkShareMainStateMachine::ChooseUpstreamNetwork()
247 {
248     sptr<NetHandle> pNetHandle = new (std::nothrow) NetHandle();
249     sptr<NetAllCapabilities> pNetCapabilities = new (std::nothrow) NetAllCapabilities();
250     sptr<NetLinkInfo> pNetLinkInfo = new (std::nothrow) NetLinkInfo();
251     std::shared_ptr<UpstreamNetworkInfo> netInfoPtr =
252         std::make_shared<UpstreamNetworkInfo>(pNetHandle, pNetCapabilities, pNetLinkInfo);
253     if (networkMonitor_ != nullptr && networkMonitor_->GetCurrentGoodUpstream(netInfoPtr)) {
254         upstreamIfaceName_ = netInfoPtr->netLinkPro_->ifaceName_;
255         int32_t result = NetsysController::GetInstance().EnableNat(FAKE_DOWNSTREAM_IFACENAME, upstreamIfaceName_);
256         if (result != NETSYS_SUCCESS) {
257             NetworkShareHisysEvent::GetInstance().SendFaultEvent(
258                 NetworkShareEventOperator::OPERATION_CONFIG_FORWARD, NetworkShareEventErrorType::ERROR_CONFIG_FORWARD,
259                 ERROR_MSG_ENABLE_FORWARD, NetworkShareEventType::SETUP_EVENT);
260             NETMGR_EXT_LOG_E("Main StateMachine enable NAT newIface[%{public}s] error[%{public}d].",
261                              upstreamIfaceName_.c_str(), result);
262         }
263         NetworkShareTracker::GetInstance().SetUpstreamNetHandle(netInfoPtr);
264     }
265 }
266 
HandleAliveUpstreamMonitorCallback(const std::any & messageObj)267 int NetworkShareMainStateMachine::HandleAliveUpstreamMonitorCallback(const std::any &messageObj)
268 {
269     if (!NetworkShareTracker::GetInstance().UpstreamWanted()) {
270         NETMGR_EXT_LOG_W("don't need handle upstream callback.");
271         return NETMANAGER_EXT_SUCCESS;
272     }
273     const MessageUpstreamInfo &temp = std::any_cast<const MessageUpstreamInfo &>(messageObj);
274     switch (temp.cmd_) {
275         case EVENT_UPSTREAM_CALLBACK_ON_LINKPROPERTIES: {
276             ChooseUpstreamNetwork();
277             break;
278         }
279         case EVENT_UPSTREAM_CALLBACK_ON_LOST: {
280             DisableForward();
281             break;
282         }
283         case EVENT_UPSTREAM_CALLBACK_ON_CAPABILITIES: {
284             break;
285         }
286         case EVENT_UPSTREAM_CALLBACK_DEFAULT_SWITCHED: {
287             DisableForward();
288             ChooseUpstreamNetwork();
289             break;
290         }
291         default:
292             break;
293     }
294     return NETMANAGER_EXT_SUCCESS;
295 }
296 
HandleErrorInterfaceStateInactive(const std::any & messageObj)297 int NetworkShareMainStateMachine::HandleErrorInterfaceStateInactive(const std::any &messageObj)
298 {
299     const MessageIfaceActive &temp = std::any_cast<const MessageIfaceActive &>(messageObj);
300     if (temp.subsm_ == nullptr) {
301         NETMGR_EXT_LOG_E("mode[%{public}d] subsm is null.", temp.value_);
302         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
303     }
304     NETMGR_EXT_LOG_I("NOTIFY TO SUB SM [%{public}s] EVENT[%{public}d].", temp.subsm_->GetInterfaceName().c_str(),
305                      errorType_);
306     temp.subsm_->SubSmEventHandle(errorType_, 0);
307     return NETMANAGER_EXT_SUCCESS;
308 }
309 
HandleErrorClear(const std::any & messageObj)310 int NetworkShareMainStateMachine::HandleErrorClear(const std::any &messageObj)
311 {
312     (void)messageObj;
313     errorType_ = NETWORKSHARING_SHARING_NO_ERROR;
314     return NETMANAGER_EXT_SUCCESS;
315 }
316 
SwitcheToErrorState(int32_t errType)317 void NetworkShareMainStateMachine::SwitcheToErrorState(int32_t errType)
318 {
319     NETMGR_EXT_LOG_W("SwitcheToErrorState errType[%{public}d].", errType);
320     errorType_ = errType;
321     MainSmStateSwitch(MAINSTATE_ERROR);
322 }
323 
TurnOnMainShareSettings()324 bool NetworkShareMainStateMachine::TurnOnMainShareSettings()
325 {
326     if (hasSetForward_) {
327         return true;
328     }
329     int32_t result = NetsysController::GetInstance().IpEnableForwarding(netshareRequester_);
330     if (result != NETSYS_SUCCESS) {
331         NetworkShareHisysEvent::GetInstance().SendFaultEvent(NetworkShareEventOperator::OPERATION_TURNON_IP_FORWARD,
332                                                              NetworkShareEventErrorType::ERROR_TURNON_IP_FORWARD,
333                                                              ERROR_MSG_TRUNON, NetworkShareEventType::SETUP_EVENT);
334         NETMGR_EXT_LOG_E("ipfwdEnableForwarding is error, switch error State.");
335         errorType_ = CMD_IP_FORWARDING_ENABLE_ERROR;
336         MainSmStateSwitch(MAINSTATE_ERROR);
337         return false;
338     }
339     hasSetForward_ = true;
340     NETMGR_EXT_LOG_I("turn on main ip forward successful.");
341     return true;
342 }
343 
TurnOffMainShareSettings()344 bool NetworkShareMainStateMachine::TurnOffMainShareSettings()
345 {
346     int32_t result = NetsysController::GetInstance().IpDisableForwarding(netshareRequester_);
347     if (result != NETSYS_SUCCESS) {
348         NetworkShareHisysEvent::GetInstance().SendFaultEvent(NetworkShareEventOperator::OPERATION_TURNOFF_IP_FORWARD,
349                                                              NetworkShareEventErrorType::ERROR_TURNOFF_IP_FORWARD,
350                                                              ERROR_MSG_TRUNOFF, NetworkShareEventType::CANCEL_EVENT);
351         NETMGR_EXT_LOG_E("IpfwdDisableForwarding is error, switch to error State.");
352         errorType_ = CMD_IP_FORWARDING_DISABLE_ERROR;
353         MainSmStateSwitch(MAINSTATE_ERROR);
354         return false;
355     }
356     NETMGR_EXT_LOG_I("turn off main ip forward successful, switch to init state.");
357     MainSmStateSwitch(MAINSTATE_INIT);
358     hasSetForward_ = false;
359     return true;
360 }
361 
DisableForward()362 void NetworkShareMainStateMachine::DisableForward()
363 {
364     NetworkShareTracker::GetInstance().SetUpstreamNetHandle(nullptr);
365     int32_t result = NetsysController::GetInstance().DisableNat(FAKE_DOWNSTREAM_IFACENAME, upstreamIfaceName_);
366     if (result != NETSYS_SUCCESS) {
367         NetworkShareHisysEvent::GetInstance().SendFaultEvent(
368             NetworkShareEventOperator::OPERATION_CONFIG_FORWARD, NetworkShareEventErrorType::ERROR_CONFIG_FORWARD,
369             ERROR_MSG_DISABLE_FORWARD, NetworkShareEventType::SETUP_EVENT);
370         NETMGR_EXT_LOG_E("MainSM disable NAT newIface[%{public}s] in Lost Network error[%{public}d].",
371                          upstreamIfaceName_.c_str(), result);
372     }
373     upstreamIfaceName_ = EMPTY_UPSTREAM_IFACENAME;
374 }
375 } // namespace NetManagerStandard
376 } // namespace OHOS
377