7 #include <boost/statechart/custom_reaction.hpp>
8 #include <boost/statechart/state.hpp>
9 #include <boost/statechart/state_machine.hpp>
10 #include <boost/statechart/transition.hpp>
22 #include "bgp/bgp_peer_types.h"
29 using std::ostringstream;
32 namespace mpl = boost::mpl;
33 namespace sc = boost::statechart;
40 getenv(
"CONTRAIL_BGP_IDLE_HOLD_TIME_MSECS") ?
41 strtol(getenv(
"CONTRAIL_BGP_IDLE_HOLD_TIME_MSECS"), NULL, 0) : 5000;
45 #define SM_LOG(level, _Msg) \
49 if (LoggingDisabled()) break; \
50 BGP_LOG_SERVER(peer_, (BgpTable *) 0); \
51 BGP_LOG(BgpPeerStateMachine, level, \
52 BGP_LOG_FLAG_SYSLOG, BGP_PEER_DIR_NA, \
53 peer_ ? peer_->ToUVEKey() : "", \
57 #define SM_LOG_NOTICE(_Msg) \
61 if (LoggingDisabled()) break; \
62 BGP_LOG_SERVER(peer_, (BgpTable *) 0); \
63 BGP_LOG_NOTICE(BgpPeerStateMachine, \
64 BGP_LOG_FLAG_SYSLOG, BGP_PEER_DIR_NA, \
65 peer_ ? peer_->ToUVEKey() : "", \
77 static const char *
Name() {
85 static const char *
Name() {
94 static const char *
Name() {
95 return "EvIdleHoldTimerExpired";
108 return "EvConnectTimerExpired";
129 return "EvOpenTimerExpired";
146 return "EvHoldTimerExpired";
165 return "EvTcpConnected";
178 return "EvTcpConnectFail";
191 return "EvTcpPassiveOpen";
217 return "EvTcpDeleteSession";
228 data = std::string((
const char *)_data, data_size);
231 return "EvBgpHeaderError";
244 "Open " <<
msg->ToString());
256 boost::shared_ptr<const BgpProto::OpenMessage>
msg;
261 const uint8_t *_data = NULL,
size_t data_size = 0)
269 data = std::string((
const char *)_data, data_size);
273 return "EvBgpOpenError";
288 log_level = SandeshLevel::SYS_INFO;
294 return "EvBgpKeepalive";
312 return "EvBgpNotification";
321 boost::shared_ptr<const BgpProto::Notification>
msg;
329 return "EvBgpUpdate";
333 boost::shared_ptr<const BgpProto::Update>
msg;
342 return "EvBgpUpdateError";
358 template <
typename Ev,
int code = 0>
370 template <
typename Ev>
376 template <
typename Ev>
379 &StateMachine::OnIdle<Ev, BgpProto::Notification::FSMErr> >
reaction;
382 template <
typename Ev,
int code>
392 struct Idle : sc::state<Idle, StateMachine> {
395 sc::custom_reaction<EvStart>,
396 sc::custom_reaction<EvIdleHoldTimerExpired>,
397 sc::custom_reaction<EvTcpPassiveOpen>
406 explicit Idle(my_context ctx) : my_base(ctx) {
430 return transit<Active>();
432 return discard_event();
437 return transit<Active>();
445 return discard_event();
454 struct Active : sc::state<Active, StateMachine> {
457 sc::custom_reaction<EvConnectTimerExpired>,
458 sc::custom_reaction<EvOpenTimerExpired>,
459 sc::custom_reaction<EvTcpPassiveOpen>,
460 sc::custom_reaction<EvTcpClose>,
461 sc::custom_reaction<EvBgpOpen>,
476 explicit Active(my_context ctx) : my_base(ctx) {
496 return discard_event();
498 return transit<Connect>();
509 return transit<OpenSent>();
511 return discard_event();
523 return discard_event();
534 return discard_event();
549 return discard_event();
555 return discard_event();
563 return discard_event();
564 return transit<OpenConfirm>();
572 struct Connect : sc::state<Connect, StateMachine> {
575 sc::custom_reaction<EvConnectTimerExpired>,
576 sc::custom_reaction<EvOpenTimerExpired>,
577 sc::custom_reaction<EvTcpConnected>,
578 sc::custom_reaction<EvTcpConnectFail>,
579 sc::custom_reaction<EvTcpPassiveOpen>,
580 sc::custom_reaction<EvTcpClose>,
581 sc::custom_reaction<EvBgpOpen>,
593 explicit Connect(my_context ctx) : my_base(ctx) {
612 return transit<Active>();
624 return transit<OpenSent>();
635 return transit<OpenSent>();
643 return transit<Active>();
653 return discard_event();
664 return discard_event();
670 return transit<Active>();
686 return discard_event();
692 return discard_event();
702 return discard_event();
703 return transit<OpenConfirm>();
714 struct OpenSent : sc::state<OpenSent, StateMachine> {
717 sc::custom_reaction<EvOpenTimerExpired>,
720 sc::custom_reaction<EvTcpPassiveOpen>,
721 sc::custom_reaction<EvTcpClose>,
722 sc::custom_reaction<EvBgpOpen>,
723 sc::custom_reaction<EvBgpNotification>,
757 return discard_event();
772 return transit<Active>();
774 return discard_event();
788 return transit<Active>();
796 return transit<Active>();
799 return discard_event();
812 if (event.
msg->identifier > local_bgp_id) {
817 "Connection collision - closing active session");
834 if (event.
session != session) {
835 return discard_event();
844 "Connection collision - closing passive session");
855 if (event.
session != session) {
856 return discard_event();
869 if (event.
session != session) {
870 return discard_event();
882 if (event.
session != session) {
883 return discard_event();
892 return discard_event();
893 return transit<OpenConfirm>();
902 return discard_event();
912 return discard_event();
920 return transit<Active>();
922 return discard_event();
926 return transit<Idle, StateMachine, EvBgpNotification>(
927 &StateMachine::OnIdle<EvBgpNotification, 0>, event);
941 sc::custom_reaction<EvTcpPassiveOpen>,
944 sc::custom_reaction<EvBgpNotification>,
945 sc::custom_reaction<EvBgpKeepalive>,
982 "Connection rejected - unexpected passive session");
984 return discard_event();
991 return discard_event();
993 return transit<Idle, StateMachine, EvBgpNotification>(
994 &StateMachine::OnIdle<EvBgpNotification, 0>, event);
1002 StateMachine *state_machine = &context<StateMachine>();
1004 return transit<Idle, StateMachine, EvBgpKeepalive>(
1005 &StateMachine::OnIdle<EvBgpKeepalive, 0>, event);
1007 return transit<Established>();
1020 sc::custom_reaction<EvTcpPassiveOpen>,
1024 sc::custom_reaction<EvBgpKeepalive>,
1025 sc::custom_reaction<EvBgpUpdate>,
1034 StateMachine *state_machine = &context<StateMachine>();
1044 StateMachine *state_machine = &context<StateMachine>();
1053 StateMachine *state_machine = &context<StateMachine>();
1060 return discard_event();
1065 StateMachine *state_machine = &context<StateMachine>();
1067 return discard_event();
1072 StateMachine *state_machine = &context<StateMachine>();
1075 return discard_event();
1082 : work_queue_(
TaskScheduler::GetInstance()->GetTaskId(
"bgp::StateMachine"),
1083 peer->GetTaskInstance(),
1086 active_session_(NULL),
1087 passive_session_(NULL),
1088 connect_timer_(
TimerManager::CreateTimer(*peer->server()->ioservice(),
1090 TaskScheduler::GetInstance()->GetTaskId(
"bgp::StateMachine"),
1091 peer->GetTaskInstance())),
1092 open_timer_(
TimerManager::CreateTimer(*peer->server()->ioservice(),
1094 TaskScheduler::GetInstance()->GetTaskId(
"bgp::StateMachine"),
1095 peer->GetTaskInstance())),
1096 hold_timer_(
TimerManager::CreateTimer(*peer->server()->ioservice(),
1098 TaskScheduler::GetInstance()->GetTaskId(
"bgp::StateMachine"),
1099 peer->GetTaskInstance())),
1100 idle_hold_timer_(
TimerManager::CreateTimer(*peer->server()->ioservice(),
1102 TaskScheduler::GetInstance()->GetTaskId(
"bgp::StateMachine"),
1103 peer->GetTaskInstance())),
1104 hold_time_(GetConfiguredHoldTime()),
1179 template <
typename Ev,
int code>
1185 template <
typename Ev>
1196 template <
typename Ev,
int code>
1219 int ms = seconds ? seconds * 1000 : 50;
1220 ms = (ms * (100 -
kJitter)) / 100;
1370 const std::string &data) {
1376 if (session && code != 0)
1417 boost::system::error_code error;
1420 if (
peer() &&
peer()->session() &&
peer()->session()->socket() &&
1421 peer()->session()->socket()->available(error) > 0) {
1493 switch (msg->
type) {
1563 std::string((
const char *)context->
data, context->
data_size)));
1601 template <
typename Ev>
1603 template <
typename T,
bool (T::*)(StateMachine *) const>
struct SFINAE {};
1605 template <
typename T>
static int Test(...);
1606 static const bool Has =
sizeof(Test<Ev>(0)) ==
sizeof(
char);
1609 template <
typename Ev,
bool has_val
idate>
1616 template <
typename Ev>
1619 return boost::bind(&Ev::validate, event, _1);
1623 template <
typename Ev>
1627 ec.
event =
event.intrusive_from_this();
1629 static_cast<const Ev *
>(ec.
event.get()));
1639 (event_name ==
"fsm::EvBgpKeepalive" ||
1640 event_name ==
"fsm::EvBgpUpdate")) {
1643 SM_LOG(log_level, msg <<
" " << event_name <<
" in state " <<
StateName());
1649 if (deferred_delete != NULL) {
1659 process_event(*ec.
event);
1692 static std::atomic<bool> env_checked = std::atomic<bool>();
1693 static std::atomic<int> env_hold_time = std::atomic<int>();
1697 char *keepalive_time_str = getenv(
"BGP_KEEPALIVE_SECONDS");
1698 if (keepalive_time_str) {
1699 env_hold_time = strtoul(keepalive_time_str, NULL, 0) * 3;
1701 return env_hold_time;
1705 }
else if (env_hold_time) {
1706 return env_hold_time;
1722 assert(!peer_info.get_name().empty());
1732 (event ==
"fsm::EvBgpKeepalive" || event ==
"fsm::EvBgpUpdate")) {
1736 BgpPeerInfoData peer_info;
1737 peer_info.set_name(
peer()->ToUVEKey());
1738 PeerEventInfo event_info;
1741 peer_info.set_event_info(event_info);
1746 const string &reason) {
1751 BgpPeerInfoData peer_info;
1752 peer_info.set_name(
peer()->ToUVEKey());
1760 const string &reason) {
1765 BgpPeerInfoData peer_info;
1766 peer_info.set_name(
peer()->ToUVEKey());
1779 BgpPeerInfoData peer_info;
1780 peer_info.set_name(
peer()->ToUVEKey());
1781 PeerStateInfo state_info;
1785 peer_info.set_state_info(state_info);
1792 BgpPeerInfoData peer_info;
1793 peer_info.set_name(
peer()->ToUVEKey());
1801 BgpPeerInfoData peer_info;
1802 peer_info.set_name(
peer()->ToUVEKey());
1819 BgpPeerInfoData peer_info;
1820 peer_info.set_name(
peer()->ToUVEKey());
1821 PeerStateInfo state_info;
1825 peer_info.set_state_info(state_info);
1827 PeerEventInfo event_info;
1830 peer_info.set_event_info(event_info);
#define BGP_LOG_FLAG_SYSLOG
#define BGP_LOG_PEER(type, peer, level, flags, dir, arg)
#define BGP_UVE_SEND(type, object)
const BgpPeerKey & peer_key() const
StateMachine * state_machine()
virtual const std::string & ToUVEKey() const
uint16_t hold_time() const
bool IsRouterTypeBGPaaS() const
void Close(bool graceful)
bool IsCloseInProgress() const
void increment_flap_count()
virtual BgpServer * server()
virtual void SetDataCollectionKey(BgpPeerInfo *peer_info) const
void inc_connect_timer_expired()
void SendKeepalive(bool from_timer)
virtual uint32_t bgp_identifier() const
void SendNotification(BgpSession *, int code, int subcode=0, const std::string &data=std::string())
void set_session(BgpSession *session)
void SendOpen(TcpSession *session)
void inc_hold_timer_expired()
bool SetCapabilities(const BgpProto::OpenMessage *msg)
void StartKeepaliveTimer()
void inc_rx_notification()
BgpSession * CreateSession()
void ProcessUpdate(const BgpProto::Update *msg, size_t msgsize=0)
virtual IPeerDebugStats * peer_stats()
bool IsCloseGraceful() const
void NotifyEstablished(bool established)
bool AttemptGRHelperMode(int code, int subcode) const
uint32_t bgp_identifier() const
BgpSessionManager * session_manager()
uint32_t hold_time() const
void LogNotification(int code, int subcode, const std::string &direction, const std::string &peer_key, const BgpProto::Notification &msg) const
static SandeshLevel::type LoggingUtLevel()
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)
uint64_t last_state_change_at_
virtual void DeleteSession(BgpSession *session)
bool ProcessNotificationEvent(BgpSession *session)
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
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)
void set_last_event(const std::string &event)
uint64_t last_notification_out_at_
bool ConnectTimerRunning()
virtual void StartOpenTimer(int seconds)
void Shutdown(int subcode)
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)
std::pair< int, int > last_notification_out_
static const int kMaxIdleHoldTime
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
virtual void Connect(TcpSession *session, Endpoint remote)
virtual void DeleteSession(TcpSession *session)
virtual std::string ToString() const
void set_observer(EventObserver observer)
bool IsEstablished() const
virtual void AsyncReadStart()
static bool DeleteTimer(Timer *Timer)
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
bool Enqueue(QueueEntryT entry)
void Shutdown(bool delete_entries=true)
void SetExitCallback(TaskExitCallback on_exit)
bool IsQueueEmpty() const
#define SM_LOG(level, _Msg)
ostream & operator<<(ostream &out, const StateMachine::State &state)
#define SM_LOG_NOTICE(_Msg)
static const std::string state_names[]
boost::function< bool(StateMachine *)> EvValidate
static const std::string integerToString(const NumberType &num)
boost::asio::ip::tcp::endpoint endpoint
static const std::string toString(Code code, int subcode)
int Validate(BgpPeer *peer) const
int Validate(const BgpPeer *, std::string *data)
static char Test(SFINAE< T, &T::validate > *)
boost::intrusive_ptr< const sc::event_base > event
EvValidate operator()(const Ev *event)
EvValidate operator()(const Ev *event)
sc::result react(const EvOpenTimerExpired &event)
sc::result react(const EvTcpPassiveOpen &event)
sc::result react(const EvConnectTimerExpired &event)
mpl::list< IdleCease< EvStop >::reaction, sc::custom_reaction< EvConnectTimerExpired >, sc::custom_reaction< EvOpenTimerExpired >, sc::custom_reaction< EvTcpPassiveOpen >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvBgpOpen >, TransitToIdle< EvBgpNotification >::reaction, IdleFsmError< EvBgpKeepalive >::reaction, IdleFsmError< EvBgpUpdate >::reaction, IdleError< EvBgpHeaderError, BgpProto::Notification::MsgHdrErr >::reaction, IdleError< EvBgpOpenError, BgpProto::Notification::OpenMsgErr >::reaction, IdleError< EvBgpUpdateError, BgpProto::Notification::UpdateMsgErr >::reaction > reactions
sc::result react(const EvTcpClose &event)
sc::result react(const EvBgpOpen &event)
mpl::list< IdleCease< EvStop >::reaction, sc::custom_reaction< EvConnectTimerExpired >, sc::custom_reaction< EvOpenTimerExpired >, sc::custom_reaction< EvTcpConnected >, sc::custom_reaction< EvTcpConnectFail >, sc::custom_reaction< EvTcpPassiveOpen >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvBgpOpen >, TransitToIdle< EvBgpNotification >::reaction, IdleFsmError< EvBgpKeepalive >::reaction, IdleFsmError< EvBgpUpdate >::reaction, IdleError< EvBgpHeaderError, BgpProto::Notification::MsgHdrErr >::reaction, IdleError< EvBgpOpenError, BgpProto::Notification::OpenMsgErr >::reaction, IdleError< EvBgpUpdateError, BgpProto::Notification::UpdateMsgErr >::reaction > reactions
sc::result react(const EvTcpConnected &event)
sc::result react(const EvBgpOpen &event)
sc::result react(const EvTcpPassiveOpen &event)
sc::result react(const EvConnectTimerExpired &event)
sc::result react(const EvTcpConnectFail &event)
sc::result react(const EvOpenTimerExpired &event)
sc::result react(const EvTcpClose &event)
sc::result react(const EvTcpPassiveOpen &event)
sc::result react(const EvBgpKeepalive &event)
sc::result react(const EvBgpUpdate &event)
mpl::list< IdleCease< EvStop >::reaction, IdleFsmError< EvOpenTimerExpired >::reaction, TransitToIdle< EvHoldTimerExpired, BgpProto::Notification::HoldTimerExp >::reaction, sc::custom_reaction< EvTcpPassiveOpen >, TransitToIdle< EvTcpClose >::reaction, IdleFsmError< EvBgpOpen >::reaction, TransitToIdle< EvBgpNotification >::reaction, sc::custom_reaction< EvBgpKeepalive >, sc::custom_reaction< EvBgpUpdate >, IdleError< EvBgpHeaderError, BgpProto::Notification::MsgHdrErr >::reaction, IdleFsmError< EvBgpOpenError >::reaction, IdleError< EvBgpUpdateError, BgpProto::Notification::UpdateMsgErr >::reaction > reactions
Established(my_context ctx)
static const char * Name()
bool validate(StateMachine *state_machine) const
EvBgpKeepalive(BgpSession *session)
boost::shared_ptr< const BgpProto::Notification > msg
EvBgpNotification(BgpSession *session, const BgpProto::Notification *msg)
bool validate(StateMachine *state_machine) const
static const char * Name()
static const char * Name()
EvBgpOpenError(BgpSession *session, int subcode, const uint8_t *_data=NULL, size_t data_size=0)
bool validate(StateMachine *state_machine) const
static const char * Name()
boost::shared_ptr< const BgpProto::OpenMessage > msg
EvBgpOpen(BgpSession *session, const BgpProto::OpenMessage *msg)
EvBgpUpdateError(BgpSession *session, int subcode, std::string data)
static const char * Name()
EvBgpUpdate(BgpSession *session, const BgpProto::Update *msg, size_t msgsize)
static const char * Name()
boost::shared_ptr< const BgpProto::Update > msg
bool validate(StateMachine *state_machine) const
static const char * Name()
EvConnectTimerExpired(Timer *timer)
bool validate(StateMachine *state_machine) const
static const char * Name()
EvHoldTimerExpired(Timer *timer)
bool validate(StateMachine *state_machine) const
static const char * Name()
EvIdleHoldTimerExpired(Timer *timer)
EvOpenTimerExpired(Timer *timer)
bool validate(StateMachine *state_machine) const
static const char * Name()
static const char * Name()
static const char * Name()
bool validate(StateMachine *state_machine) const
static const char * Name()
EvTcpClose(BgpSession *session)
EvTcpConnectFail(BgpSession *session)
static const char * Name()
bool validate(StateMachine *state_machine) const
bool validate(StateMachine *state_machine) const
EvTcpConnected(BgpSession *session)
static const char * Name()
static const char * Name()
EvTcpDeleteSession(BgpSession *session)
EvTcpPassiveOpen(BgpSession *session)
static const char * Name()
sc::transition< Ev, Idle, StateMachine, &StateMachine::OnIdleCease< Ev > > reaction
sc::transition< Ev, Idle, StateMachine, &StateMachine::OnIdleError< Ev, code > > reaction
sc::transition< Ev, Idle, StateMachine, &StateMachine::OnIdle< Ev, BgpProto::Notification::FSMErr > > reaction
sc::result react(const EvIdleHoldTimerExpired &event)
mpl::list< IdleCease< EvStop >::reaction, sc::custom_reaction< EvStart >, sc::custom_reaction< EvIdleHoldTimerExpired >, sc::custom_reaction< EvTcpPassiveOpen > > reactions
sc::result react(const EvTcpPassiveOpen &event)
sc::result react(const EvStart &event)
mpl::list< IdleCease< EvStop >::reaction, IdleFsmError< EvOpenTimerExpired >::reaction, TransitToIdle< EvHoldTimerExpired, BgpProto::Notification::HoldTimerExp >::reaction, sc::custom_reaction< EvTcpPassiveOpen >, TransitToIdle< EvTcpClose >::reaction, IdleFsmError< EvBgpOpen >::reaction, sc::custom_reaction< EvBgpNotification >, sc::custom_reaction< EvBgpKeepalive >, IdleFsmError< EvBgpUpdate >::reaction, IdleError< EvBgpHeaderError, BgpProto::Notification::MsgHdrErr >::reaction, IdleError< EvBgpOpenError, BgpProto::Notification::OpenMsgErr >::reaction, IdleError< EvBgpUpdateError, BgpProto::Notification::UpdateMsgErr >::reaction > reactions
OpenConfirm(my_context ctx)
sc::result react(const EvBgpKeepalive &event)
sc::result react(const EvTcpPassiveOpen &event)
sc::result react(const EvBgpNotification &event)
sc::result react(const EvBgpNotification &event)
sc::result react(const EvTcpPassiveOpen &event)
mpl::list< IdleCease< EvStop >::reaction, sc::custom_reaction< EvOpenTimerExpired >, TransitToIdle< EvHoldTimerExpired, BgpProto::Notification::HoldTimerExp >::reaction, sc::custom_reaction< EvTcpPassiveOpen >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvBgpOpen >, sc::custom_reaction< EvBgpNotification >, IdleFsmError< EvBgpKeepalive >::reaction, IdleFsmError< EvBgpUpdate >::reaction, IdleError< EvBgpHeaderError, BgpProto::Notification::MsgHdrErr >::reaction, IdleError< EvBgpOpenError, BgpProto::Notification::OpenMsgErr >::reaction, IdleError< EvBgpUpdateError, BgpProto::Notification::UpdateMsgErr >::reaction > reactions
sc::result react(const EvBgpOpen &event)
sc::result react(const EvTcpClose &event)
sc::result react(const EvOpenTimerExpired &event)
sc::transition< EvBgpNotification, Idle, StateMachine, &StateMachine::OnIdleNotification > reaction
sc::transition< Ev, Idle, StateMachine, &StateMachine::OnIdle< Ev, code > > reaction
#define CHECK_CONCURRENCY(...)
static boost::posix_time::ptime UTCUsecToPTime(uint64_t tusec)
static uint64_t UTCTimestampUsec()