5 #ifndef SRC_BGP_STATE_MACHINE_H_
6 #define SRC_BGP_STATE_MACHINE_H_
8 #include <boost/statechart/state_machine.hpp>
17 #include "sandesh/sandesh.h"
19 namespace sc = boost::statechart;
24 class BgpPeerInfoData;
30 struct EvBgpNotification;
33 typedef boost::function<bool(StateMachine *)>
EvValidate;
75 class StateMachine :
public sc::state_machine<StateMachine, fsm::Idle> {
77 typedef boost::function<void(void)>
EventCB;
104 template <
typename Ev,
int code>
void OnIdle(
const Ev &event);
105 template <
typename Ev>
void OnIdleCease(
const Ev &event);
106 template <
typename Ev,
int code>
void OnIdleError(
const Ev &event);
139 const std::string &data = std::string());
175 const std::string &reason);
177 const std::string &reason);
181 void LogEvent(std::string event_name, std::string msg,
198 boost::intrusive_ptr<const sc::event_base>
event;
214 template <
typename Ev>
bool Enqueue(
const Ev &event);
250 #endif // SRC_BGP_STATE_MACHINE_H_
void OnIdleNotification(const fsm::EvBgpNotification &event)
const std::string & LastStateName() const
void set_last_notification_out(int code, int subcode, const std::string &reason)
const std::string last_notification_in_error() const
virtual void StartConnectTimer(int seconds)
const std::string & StateName() const
virtual void StartOpenTimer(int seconds)
bool IdleHoldTimerExpired()
uint64_t last_state_change_at_
static const int kIdleHoldTime
const uint64_t last_state_change_usecs_at() const
void set_passive_session(BgpSession *session)
std::ostream & operator<<(std::ostream &out, BFDState state)
void reset_idle_hold_time()
BgpSession * passive_session_
void Shutdown(int subcode)
void PeerClose(int code, int subcode)
int connect_attempts() const
bool ConnectTimerExpired()
bool ProcessNotificationEvent(BgpSession *session)
void OnMessageError(BgpSession *session, const ParseErrorContext *context)
bool ConnectTimerRunning()
std::string last_notification_in_error_
void CancelIdleHoldTimer()
boost::intrusive_ptr< const sc::event_base > event
static const int kHoldTime
void TimerErrorHanlder(std::string name, std::string error)
void SetDataCollectionKey(BgpPeerInfo *peer_info) const
void set_active_session(BgpSession *session)
void OnMessage(BgpSession *session, BgpProto::BgpMessage *msg, size_t msgsize=0)
DISALLOW_COPY_AND_ASSIGN(StateMachine)
void set_last_notification_in(int code, int subcode, const std::string &reason)
int GetConfiguredHoldTime() const
const std::string & last_event() const
boost::function< bool(StateMachine *)> EvValidate
void OnIdleCease(const Ev &event)
StateMachine(BgpPeer *peer)
bool IdleHoldTimerRunning()
const std::string last_state_change_at() const
void connect_attempts_clear()
virtual void StartIdleHoldTimer()
bool IsQueueEmpty() const
virtual void StartHoldTimer()
void BGPPeerInfoSend(const BgpPeerInfoData &peer_info)
bool PassiveOpen(BgpSession *session)
void set_hold_time(int hold_time)
static const int kMaxIdleHoldTime
std::pair< int, int > last_notification_in_
bool Enqueue(const Ev &event)
friend class StateMachineUnitTest
uint64_t last_notification_out_at_
BgpSession * active_session()
void SendNotification(BgpSession *session, int code, int subcode=0, const std::string &data=std::string())
uint64_t last_notification_in_at_
void SetAdminState(bool down, int subcode)
friend class StateMachineTest
void DequeueEventDone(bool done)
virtual bool IsPeerCloseInProgress() const
virtual void OnSessionEvent(TcpSession *session, TcpSession::Event event)
virtual const int GetIdleHoldTimeMSecs() const
int GetConnectTime() const
static const int kOpenTime
std::string last_notification_out_error_
virtual void OnNotificationMessage(BgpSession *session, BgpProto::BgpMessage *msg)
BgpSession * passive_session()
void OnIdleError(const Ev &event)
const std::string last_notification_out_error() const
std::pair< int, int > last_notification_out_
virtual bool IsCloseGraceful() const
void set_state(State state)
void set_last_event(const std::string &event)
static const int kOpenSentHoldTime
void AssignSession(bool active)
void CancelConnectTimer()
boost::function< void(void)> EventCB
static const int kConnectInterval
BgpSession * active_session_
void OnIdle(const Ev &event)
void connect_attempts_inc()
virtual int keepalive_time_msecs() const
void LogEvent(std::string event_name, std::string msg, SandeshLevel::type log_level=SandeshLevel::SYS_DEBUG)
virtual bool IsRouterTypeBGPaaS() const
virtual void DeleteSession(BgpSession *session)
void set_idle_hold_time(int idle_hold_time)
bool DequeueEvent(EventContainer ec)
WorkQueue< EventContainer > work_queue_
int idle_hold_time() const