10 #include <boost/optional.hpp>
11 #include <boost/bind/bind.hpp>
12 #include <boost/statechart/event.hpp>
13 #include <boost/statechart/transition.hpp>
14 #include <boost/statechart/state_machine.hpp>
15 #include <boost/statechart/simple_state.hpp>
16 #include <boost/statechart/custom_reaction.hpp>
17 #include <boost/mpl/list.hpp>
21 using namespace boost::placeholders;
22 namespace mpl = boost::mpl;
23 namespace sc = boost::statechart;
43 public sc::state_machine<StateMachineImpl, DownState> {
46 evm_(
evm), session_(session) {
51 LOG(DEBUG,
"StateMachine state: " << state);
52 if (cb_.is_initialized() && session_) {
53 (cb_.get())(session_->key(), GetState());
55 LOG(ERROR,
"StateMachine cb initialized: "
56 << cb_.is_initialized() <<
" session: " << session_);
76 if (old_state != GetState()) {
84 if (old_state != GetState())
89 return state_cast<const BFDStateAware &>().getState();
97 boost::optional<ChangeCb>
cb_;
102 struct InitState : sc::simple_state<InitState, StateMachineImpl>,
105 sc::transition<EvRecvInit, UpState>,
106 sc::transition<EvRecvDown, InitState>,
107 sc::transition<EvRecvUp, UpState>,
108 sc::transition<EvRecvAdminDown, DownState>,
109 sc::transition<EvTimeout, DownState>
117 sc::transition<EvRecvInit, UpState>,
118 sc::transition<EvRecvDown, DownState>,
119 sc::transition<EvRecvUp, UpState>,
120 sc::transition<EvRecvAdminDown, DownState>,
121 sc::transition<EvTimeout, DownState>
127 struct DownState : sc::simple_state<DownState, StateMachineImpl>,
130 sc::transition<EvRecvInit, UpState>,
131 sc::transition<EvRecvDown, InitState>,
132 sc::transition<EvRecvUp, DownState>,
133 sc::transition<EvRecvAdminDown, DownState>,
134 sc::transition<EvTimeout, DownState>
void SetCallback(boost::optional< ChangeCb > cb)
void ProcessRemoteState(BFDState state)
boost::optional< ChangeCb > cb_
void Notify(BFDState state)
StateMachineImpl(EventManager *evm, Session *session)
#define LOG(_Level, _Msg)
StateMachine * CreateStateMachine(EventManager *evm, Session *session)
virtual BFDState getState() const =0
mpl::list< sc::transition< EvRecvInit, UpState >, sc::transition< EvRecvDown, InitState >, sc::transition< EvRecvUp, DownState >, sc::transition< EvRecvAdminDown, DownState >, sc::transition< EvTimeout, DownState > > reactions
virtual BFDState getState() const
mpl::list< sc::transition< EvRecvInit, UpState >, sc::transition< EvRecvDown, InitState >, sc::transition< EvRecvUp, UpState >, sc::transition< EvRecvAdminDown, DownState >, sc::transition< EvTimeout, DownState > > reactions
virtual BFDState getState() const
mpl::list< sc::transition< EvRecvInit, UpState >, sc::transition< EvRecvDown, DownState >, sc::transition< EvRecvUp, UpState >, sc::transition< EvRecvAdminDown, DownState >, sc::transition< EvTimeout, DownState > > reactions
virtual BFDState getState() const