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;
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);
void CancelIdleHoldTimer()
BgpSession * active_session()
void connect_attempts_inc()
void connect_attempts_clear()
const std::string last_notification_in_error() const
BgpSession * active_session_
void OnIdleError(const Ev &event)
bool IdleHoldTimerExpired()
static const int kOpenSentHoldTime
virtual bool IsCloseGraceful() const
void OnMessage(BgpSession *session, BgpProto::BgpMessage *msg, size_t msgsize=0)
uint64_t last_notification_in_at_
void set_last_notification_out(int code, int subcode, const std::string &reason)
std::pair< int, int > last_notification_in_
virtual const int GetIdleHoldTimeMSecs() const
bool DequeueEvent(EventContainer ec)
virtual void OnNotificationMessage(BgpSession *session, BgpProto::BgpMessage *msg)
void set_state(State state)
const std::string & last_event() const
uint64_t last_state_change_at_
virtual void DeleteSession(BgpSession *session)
bool ProcessNotificationEvent(BgpSession *session)
friend class StateMachineTest
const std::string last_state_change_at() const
std::string last_notification_out_error_
void OnMessageError(BgpSession *session, const ParseErrorContext *context)
static const int kConnectInterval
void SendNotification(BgpSession *session, int code, int subcode=0, const std::string &data=std::string())
bool ConnectTimerExpired()
BgpSession * passive_session_
int GetConfiguredHoldTime() const
DISALLOW_COPY_AND_ASSIGN(StateMachine)
std::string last_notification_in_error_
StateMachine(BgpPeer *peer)
virtual void OnSessionEvent(TcpSession *session, TcpSession::Event event)
void CancelConnectTimer()
WorkQueue< EventContainer > work_queue_
void OnIdleCease(const Ev &event)
BgpSession * passive_session()
static const int kIdleHoldTime
static const int kHoldTime
void SetAdminState(bool down, int subcode)
void SetDataCollectionKey(BgpPeerInfo *peer_info) const
void set_hold_time(int hold_time)
bool IsQueueEmpty() const
void set_idle_hold_time(int idle_hold_time)
const std::string last_notification_out_error() const
void AssignSession(bool active)
bool Enqueue(const Ev &event)
void set_passive_session(BgpSession *session)
const uint64_t last_state_change_usecs_at() const
const std::string & StateName() const
void PeerClose(int code, int subcode)
friend class StateMachineUnitTest
void set_last_event(const std::string &event)
uint64_t last_notification_out_at_
bool ConnectTimerRunning()
boost::function< void(void)> EventCB
virtual void StartOpenTimer(int seconds)
void Shutdown(int subcode)
int connect_attempts() const
bool IdleHoldTimerRunning()
void LogEvent(std::string event_name, std::string msg, SandeshLevel::type log_level=SandeshLevel::SYS_DEBUG)
void DequeueEventDone(bool done)
int GetConnectTime() const
virtual bool IsPeerCloseInProgress() const
virtual bool IsRouterTypeBGPaaS() const
void BGPPeerInfoSend(const BgpPeerInfoData &peer_info)
virtual void StartIdleHoldTimer()
void set_active_session(BgpSession *session)
bool PassiveOpen(BgpSession *session)
void OnIdle(const Ev &event)
static const int kOpenTime
void OnIdleNotification(const fsm::EvBgpNotification &event)
int idle_hold_time() const
const std::string & LastStateName() const
void reset_idle_hold_time()
void TimerErrorHanlder(std::string name, std::string error)
virtual void StartConnectTimer(int seconds)
virtual void StartHoldTimer()
void set_last_notification_in(int code, int subcode, const std::string &reason)
virtual int keepalive_time_msecs() const
std::pair< int, int > last_notification_out_
static const int kMaxIdleHoldTime
std::ostream & operator<<(std::ostream &out, const StateMachine::State &state)
boost::function< bool(StateMachine *)> EvValidate
boost::intrusive_ptr< const sc::event_base > event