8 #include <boost/bind.hpp>
9 #include <boost/date_time/posix_time/posix_time.hpp>
10 #include <boost/statechart/custom_reaction.hpp>
11 #include <boost/statechart/event.hpp>
12 #include <boost/statechart/simple_state.hpp>
13 #include <boost/statechart/state.hpp>
14 #include <boost/statechart/state_machine.hpp>
15 #include <boost/statechart/transition.hpp>
21 #include "sandesh/sandesh_trace.h"
22 #include "sandesh/common/vns_types.h"
23 #include "sandesh/common/vns_constants.h"
24 #include "sandesh/xmpp_client_server_sandesh_types.h"
25 #include "sandesh/xmpp_peer_info_types.h"
26 #include "sandesh/xmpp_state_machine_sandesh_types.h"
27 #include "sandesh/xmpp_trace_sandesh_types.h"
36 namespace mpl = boost::mpl;
37 namespace sc = boost::statechart;
39 #define SM_LOG(_sm, _msg) do { \
40 XMPP_UTDEBUG(XmppStateMachineDebug, \
41 (_sm)->connection() ? (_sm)->connection()->ToUVEKey() : "", \
42 XMPP_PEER_DIR_NA, (_sm)->ChannelType(), _msg); \
49 static const char *
Name() {
55 static const char *
Name() {
61 static const char *
Name() {
67 static const char *
Name() {
68 return "EvConnectTimerExpired";
73 static const char *
Name() {
74 return "EvOpenTimerExpired";
79 static const char *
Name() {
80 return "EvHoldTimerExpired";
86 static const char *
Name() {
87 return "EvTcpConnected";
94 static const char *
Name() {
95 return "EvTcpConnectFail";
103 return "EvTcpPassiveOpen";
119 return "EvTcpDeleteSession";
128 return "EvXmppMessage";
137 msg(static_cast<const
XmppStanza::XmppStreamMessage *>(msg)) {
143 boost::shared_ptr<const XmppStanza::XmppStreamMessage>
msg;
150 msg(static_cast<const
XmppStanza::XmppStreamMessage *>(msg)) {
153 return "EvStreamFeatureRequest";
156 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
163 msg(static_cast<const
XmppStanza::XmppStreamMessage *>(msg)) {
169 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
176 msg(static_cast<const
XmppStanza::XmppStreamMessage *>(msg)) {
179 return "EvTlsProceed";
182 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
189 return "EvTlsHandShakeSuccess";
198 return "EvTlsHandShakeFailure";
206 session(session), msg(msg) {
209 return "EvXmppKeepalive";
212 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
218 session(session), msg(msg) {
221 return "EvXmppMessageStanza";
224 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
230 : session(session), msg(msg) {
233 return "EvXmppIqStanza";
236 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
243 return "EvXmppOpenReceive";
248 struct Idle :
public sc::state<Idle, XmppStateMachine> {
251 Idle(my_context ctx) : my_base(ctx) {
262 struct Active :
public sc::state<Active, XmppStateMachine> {
264 sc::custom_reaction<EvAdminDown>,
265 sc::custom_reaction<EvConnectTimerExpired>,
266 sc::custom_reaction<EvOpenTimerExpired>,
267 sc::custom_reaction<EvTcpPassiveOpen>,
268 sc::custom_reaction<EvTcpClose>,
269 sc::custom_reaction<EvXmppOpen>,
270 sc::custom_reaction<EvStop>
287 "Connect failed after retries");
305 SM_LOG(state_machine,
"Discard EvConnectTimerExpired in (Active) State");
306 return discard_event();
309 SM_LOG(state_machine,
"EvConnectTimerExpired in (Active) State");
310 return transit<Connect>();
317 event.session->AsyncReadStart();
319 event.session->set_observer(
321 state_machine, _1, _2));
323 XmppConnectionInfo info;
327 return discard_event();
334 return discard_event();
339 return transit<Idle>();
347 "Discard EvOpenTimerExpired in (Active) State");
348 return discard_event();
358 return transit<Idle>();
365 return discard_event();
372 return discard_event();
387 return transit<Idle>();
389 XmppConnectionInfo info;
390 info.set_identifier(event.
msg->from);
394 return transit<OpenConfirm>();
399 return transit<XmppStreamEstablished>();
414 return transit<Active>();
418 return transit<Idle>();
424 XmppConnectionInfo info;
425 info.set_close_reason(
"Administratively down");
428 return transit<Idle>();
434 struct Connect :
public sc::state<Connect, XmppStateMachine> {
436 sc::custom_reaction<EvAdminDown>,
437 sc::custom_reaction<EvConnectTimerExpired>,
438 sc::custom_reaction<EvTcpConnected>,
439 sc::custom_reaction<EvTcpConnectFail>,
440 sc::custom_reaction<EvTcpClose>,
441 sc::custom_reaction<EvStop>
444 static const int kConnectTimeout = 60;
448 StartSession(state_machine);
453 if (session != NULL) {
454 XmppConnectionInfo info;
469 "Discard EvConnectTimerExpired in (Connect) State");
470 return discard_event();
472 CloseSession(state_machine);
473 XmppConnectionInfo info;
474 info.set_close_reason(
"Connect timer expired");
477 return transit<Active>();
483 return discard_event();
488 XmppConnectionInfo info;
491 if (connection->
SendOpen(session)) {
494 return transit<OpenSent>();
496 SM_LOG(state_machine,
"SendOpen failed in (Connect) State");
497 CloseSession(state_machine);
498 info.set_close_reason(
"SendOpen failed");
502 return transit<Active>();
510 return discard_event();
515 return transit<Active>();
521 return discard_event();
524 CloseSession(state_machine);
527 return transit<Active>();
532 CloseSession(state_machine);
534 XmppConnectionInfo info;
535 info.set_close_reason(
"EvStop received");
538 return transit<Active>();
543 CloseSession(state_machine);
544 XmppConnectionInfo info;
545 info.set_close_reason(
"Administratively down");
548 return transit<Idle>();
557 state_machine, _1, _2));
558 boost::system::error_code err;
561 LOG(WARN,
"Bind failure for local address " <<
575 struct OpenSent :
public sc::state<OpenSent, XmppStateMachine> {
577 sc::custom_reaction<EvAdminDown>,
578 sc::custom_reaction<EvTcpClose>,
579 sc::custom_reaction<EvXmppOpen>,
580 sc::custom_reaction<EvHoldTimerExpired>,
581 sc::custom_reaction<EvStop>
596 return discard_event();
602 return transit<Active>();
604 return discard_event();
612 XmppConnectionInfo info;
613 info.set_identifier(event.
msg->from);
617 return transit<OpenConfirm>();
624 return transit<XmppStreamEstablished>();
627 return discard_event();
634 "Discard EvHoldTimerExpired in (OpenSent) State");
635 return discard_event();
637 CloseSession(state_machine);
638 XmppConnectionInfo info;
639 info.set_close_reason(
"Hold timer expired");
642 return transit<Active>();
648 CloseSession(state_machine);
649 XmppConnectionInfo info;
650 info.set_close_reason(
"EvStop received");
653 return transit<Active>();
658 CloseSession(state_machine);
659 XmppConnectionInfo info;
660 info.set_close_reason(
"Administratively down");
663 return transit<Idle>();
671 struct OpenConfirm :
public sc::state<OpenConfirm, XmppStateMachine> {
673 sc::custom_reaction<EvAdminDown>,
674 sc::custom_reaction<EvTcpClose>,
675 sc::custom_reaction<EvHoldTimerExpired>,
676 sc::custom_reaction<EvStreamFeatureRequest>,
677 sc::custom_reaction<EvStartTls>,
678 sc::custom_reaction<EvTlsProceed>,
679 sc::custom_reaction<EvTlsHandShakeSuccess>,
680 sc::custom_reaction<EvTlsHandShakeFailure>,
681 sc::custom_reaction<EvXmppOpen>,
682 sc::custom_reaction<EvStop>
688 XmppConnectionInfo info;
696 "Xmpp Send Stream Feature Request Failed, IDLE");
698 info.set_close_reason(
"Send Stream Feature Request Failed");
700 "Send Stream Feature Request Failed");
702 "Send Stream Feature Request failed",
"Idle");
716 CloseSession(state_machine);
718 return transit<Active>();
722 return transit<Idle>();
730 "Discard EvHoldTimerExpired in (OpenConfirm) State");
731 return discard_event();
733 XmppConnectionInfo info;
734 info.set_close_reason(
"Hold timer expired");
737 CloseSession(state_machine);
739 return transit<Active>();
743 return transit<Idle>();
758 XmppConnectionInfo info;
759 info.set_close_reason(
"Send Start Tls Failed");
761 return transit<Active>();
765 "Sent Start Tls, OpenConfirm Feature Negotiation");
768 return discard_event();
778 XmppConnectionInfo info;
779 info.set_identifier(connection->
GetTo());
783 "Trigger Client Ssl Handshake");
784 return discard_event();
791 return discard_event();
795 XmppConnectionInfo info;
796 info.set_identifier(connection->
GetTo());
800 info.set_close_reason(
"Send Proceed Tls Failed");
802 return transit<Idle>();
808 "Trigger Server Ssl Handshake");
809 return discard_event();
817 CloseSession(state_machine);
819 return transit<Active>();
823 return transit<Idle>();
830 return discard_event();
837 if (!connection->
SendOpen(session)) {
840 XmppConnectionInfo info;
841 info.set_close_reason(
"Open send failed in OpenConfirm State");
843 return transit<Active>();
849 "OpenConfirm Feature Negotiation Success");
850 return discard_event();
856 return discard_event();
862 return transit<Active>();
865 return transit<Idle>();
873 return discard_event();
875 XmppConnectionInfo info;
876 info.set_identifier(event.
msg->from);
885 return transit<XmppStreamEstablished>();
890 "Xmpp Send Open Confirm Failed, IDLE");
892 info.set_close_reason(
"Send Open Confirm Failed");
894 "Send Open Confirm Failed");
896 return transit<Idle>();
905 return transit<XmppStreamEstablished>();
912 CloseSession(state_machine);
913 XmppConnectionInfo info;
914 info.set_close_reason(
"Administratively down");
917 return transit<Idle>();
928 public sc::state<XmppStreamEstablished, XmppStateMachine> {
930 sc::custom_reaction<EvAdminDown>,
931 sc::custom_reaction<EvTcpClose>,
932 sc::custom_reaction<EvXmppKeepalive>,
933 sc::custom_reaction<EvXmppMessageStanza>,
934 sc::custom_reaction<EvXmppIqStanza>,
935 sc::custom_reaction<EvHoldTimerExpired>,
936 sc::custom_reaction<EvStop>
954 return discard_event();
959 return transit<Active>();
962 return transit<Idle>();
969 return discard_event();
976 return discard_event();
982 return discard_event();
987 return discard_event();
993 return discard_event();
998 return discard_event();
1005 "Discard EvHoldTimerExpired in (Established) State");
1006 return discard_event();
1012 "EvHoldTimerExpired in (Established) State. Transit to IDLE");
1017 return transit<Active>();
1019 return transit<Idle>();
1028 return transit<Active>();
1030 return transit<Idle>();
1037 XmppConnectionInfo info;
1038 info.set_close_reason(
"Administratively down");
1041 return transit<Idle>();
1048 static bool init_ =
false;
1049 static bool assert_ =
false;
1052 char *str = getenv(
"XMPP_ASSERT_ON_HOLD_TIMEOUT");
1053 if (str && strtoul(str, NULL, 0) != 0) assert_ =
true;
1057 if (!assert_)
return;
1060 connection()->LogMsg(
"HOLD TIMER EXPIRED: ");
1062 LOG4CPLUS_DEBUG(log4cplus::Logger::getRoot(),
"HOLD TIMER EXPIRED: ");
1079 if (IsActiveChannel())
1089 bool auth_enabled,
int config_hold_time)
1090 : work_queue_(
TaskScheduler::GetInstance()->GetTaskId(
"xmpp::StateMachine"),
1091 connection->GetTaskInstance(),
1093 connection_(connection),
1095 server_(connection->server()),
1097 TimerManager::CreateTimer(*server_->event_manager()->io_service(),
1099 TaskScheduler::GetInstance()->GetTaskId(
"xmpp::StateMachine"),
1100 connection->GetTaskInstance())),
1102 TimerManager::CreateTimer(*server_->event_manager()->io_service(),
1104 TaskScheduler::GetInstance()->GetTaskId(
"xmpp::StateMachine"),
1105 connection->GetTaskInstance())),
1107 TimerManager::CreateTimer(*server_->event_manager()->io_service(),
1109 TaskScheduler::GetInstance()->GetTaskId(
"xmpp::StateMachine"),
1110 connection->GetTaskInstance())),
1111 config_hold_time_(config_hold_time),
1112 hold_time_(GetConfiguredHoldTime()),
1114 keepalive_count_(0),
1118 auth_enabled_(auth_enabled),
1186 int ms = ((seconds)? seconds * 1000 : 50);
1187 ms = (ms * (100 -
kJitter)) / 100;
1188 ms += (ms * (rand() % (
kJitter * 2))) / 100;
1210 static tbb::atomic<bool> env_checked = tbb::atomic<bool>();
1211 static tbb::atomic<int> env_hold_time = tbb::atomic<int>();
1215 char *keepalive_time_str = getenv(
"XMPP_KEEPALIVE_SECONDS");
1216 if (keepalive_time_str) {
1217 env_hold_time = strtoul(keepalive_time_str, NULL, 0) * 3;
1219 return env_hold_time;
1223 }
else if (env_hold_time) {
1224 return env_hold_time;
1262 "Event: OpenTimer Expired ",
1263 connection()->endpoint().address().to_string(),
1271 boost::system::error_code error;
1275 session()->socket()->available(error) > 0) {
1280 connection()->endpoint().address().to_string(),
1293 this->ChannelType(),
"Event: Tcp Connected ",
1294 connection()->endpoint().address().to_string(),
1300 this->ChannelType(),
"Event: Tcp Connect Fail ",
1301 connection()->endpoint().address().to_string(),
1308 this->ChannelType(),
"Event: Tcp Connection Closed ",
1309 connection()->endpoint().address().to_string(),
1316 this->ChannelType(), event);
1322 string state =
"PassiveOpen in state: " +
StateName();
1324 this->ChannelType(), state,
1337 tbb::mutex::scoped_lock lock(connection_manager->
mutex());
1352 string reason =
"Subcluster mismatch: Agent subcluster " +
1353 msg->
xmlns +
", Control subcluster " +
1376 boost::asio::ip::address addr =
1382 " as another connection with same name " + msg->
from +
1383 " but with different IP address " + addr.to_string() +
1399 " as another connection is alreready present");
1415 " as a new connection as been initiated (GR Helper is active)");
1429 " as current connection is still under deletion");
1460 switch (msg->
type) {
1542 XmppPeerInfoData peer_info;
1543 peer_info.set_name(
connection()->ToUVEKey());
1544 PeerStateInfo state_info;
1548 peer_info.set_state_info(state_info);
1549 assert(!peer_info.get_name().empty());
1550 XMPPPeerInfo::Send(peer_info);
1610 boost::intrusive_ptr<const sc::event_base> event) {
1614 if (ev_xmpp_message) {
1630 connection()->endpoint().address().to_string() :
"",
1632 if (deferred_delete) {
1643 process_event(event);
1658 if (event ==
"xmsm::EvXmppIqStanza" ||
1659 event ==
"xmsm::EvXmppMessageStanza") {
1668 XmppPeerInfoData peer_info;
1669 peer_info.set_name(
connection()->ToUVEKey());
1670 PeerEventInfo event_info;
1673 peer_info.set_event_info(event_info);
1675 assert(!peer_info.get_name().empty());
1676 XMPPPeerInfo::Send(peer_info);
1694 const string &nextstate) {
1695 XmppConnectionInfo info;
1701 const string &event,
const string &nextstate) {
1703 info->set_ip_address(this->
connection()->endpoint().address().to_string());
1705 info->set_event(event);
1706 if (!nextstate.empty()) {
1707 info->set_next_state(nextstate);
1735 new_connection->
server())->LocateConnectionEndpoint(
1748 "Resurrect xmpp connection " + new_session->
ToString());
1752 assert(old_xmpp_connection);
1755 assert(old_state_machine);
1763 if (old_xmpp_session)
virtual Socket * socket() const
void TriggerSslHandShake(SslHandShakeCallbackHandler)
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)
const std::string & ToUVEKey() const
int32_t remote_port() const
virtual std::string ToString() const
void set_observer(EventObserver observer)
virtual void AsyncReadStart()
int32_t local_port() const
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 HandleStateEvent(xmsm::XmState state)
virtual xmps::PeerState GetPeerState() const
size_t ReceiverCount() const
XmppConnection * connection()
tbb::mutex & mutex() const
virtual void increment_flap_count()=0
void StopKeepAliveTimer()
bool IsActiveChannel() const
XmppChannelMux * ChannelMux()
virtual bool SendStreamFeatureRequest(XmppSession *session)
int ProcessXmppIqMessage(const XmppStanza::XmppMessage *)
XmppSession * CreateSession()
void SwapContents(XmppConnection *other)
virtual boost::asio::ip::tcp::endpoint local_endpoint() const
virtual bool SendOpen(XmppSession *session)
virtual void ManagedDelete()=0
virtual bool SendStartTls(XmppSession *session)
virtual boost::asio::ip::tcp::endpoint endpoint() const
virtual bool SendProceedTls(XmppSession *session)
int ProcessXmppChatMessage(const XmppStanza::XmppChatMessage *)
void SetTo(const std::string &)
void SwapXmppStateMachine(XmppConnection *other)
void StartKeepAliveTimer()
void SendClose(XmppSession *session)
XmppStateMachine * state_machine()
virtual bool SendOpenConfirm(XmppSession *session)
void ProcessSslHandShakeResponse(SslSessionPtr session, const boost::system::error_code &error)
const std::string & ToString() const
void set_session(XmppSession *session)
const std::string & ToUVEKey() const
virtual void set_close_reason(const std::string &reason)=0
virtual bool IsPeerCloseGraceful() const
XmppConnectionEndpoint * FindConnectionEndpoint(const std::string &endpoint_name)
const std::string subcluster_name() const
XmppConnection * Connection()
void SetConnection(XmppConnection *connection)
bool IsValidType(XmppMessageType type) const
@ WHITESPACE_MESSAGE_STANZA
void update_last_event(const std::string &event)
xmsm::XmOpenConfirmState OpenConfirmStateType() const
void set_state(xmsm::XmState state)
void ProcessEvent(const sc::event_base &event)
bool ConnectTimerExpired()
xmsm::XmState get_state()
virtual void StartHoldTimer()
void SetAdminState(bool down)
XmppStateMachine(XmppConnection *connection, bool active, bool auth_enabled=false, int config_hold_time=kHoldTime)
void DeleteSession(XmppSession *session)
std::string StateName() const
virtual void StartOpenTimer(int seconds)
bool HoldTimerCancelled()
static const int kConnectInterval
bool DequeueEvent(boost::intrusive_ptr< const sc::event_base > event)
void OnStart(const xmsm::EvStart &event)
SslHandShakeCallbackHandler HandShakeCbHandler()
void ProcessStreamHeaderMessage(XmppSession *session, const XmppStanza::XmppMessage *msg)
xmsm::XmState StateType() const
XmppConnection * connection()
const char * ChannelType()
WorkQueue< boost::intrusive_ptr< const sc::event_base > > work_queue_
void connect_attempts_inc()
void AssertOnHoldTimeout()
void set_last_event(const std::string &event)
void TimerErrorHandler(std::string name, std::string error)
std::string LastStateName() const
bool PassiveOpen(XmppSession *session)
void CancelConnectTimer()
virtual void StartConnectTimer(int seconds)
void SwapXmppConnection(XmppStateMachine *other)
XmppConnection * connection_
std::string LastStateChangeAt() const
void ProcessMessage(XmppSession *session, const XmppStanza::XmppMessage *msg)
xmsm::XmOpenConfirmState openconfirm_state_
void OnEvent(SslSession *session, xmsm::SslHandShakeResponse)
bool Enqueue(const sc::event_base &ev)
void OnMessage(XmppSession *session, const XmppStanza::XmppMessage *msg)
void set_session(TcpSession *session)
int get_keepalive_count() const
bool OpenTimerCancelled()
void set_openconfirm_state(xmsm::XmOpenConfirmState state)
int GetConfiguredHoldTime() const
void SendConnectionInfo(const std::string &event, const std::string &nextstate="")
int get_connect_attempts() const
void keepalive_count_inc()
void connect_attempts_clear()
xmsm::XmState last_state_
static const int kMaxAttempts
void ResurrectOldConnection(XmppConnection *connection, XmppSession *session)
static const int kHoldTime
static const int kOpenTime
void keepalive_count_clear()
int GetConnectTime() const
virtual void OnSessionEvent(TcpSession *session, TcpSession::Event event)
void unconsumed_event(const sc::event_base &event)
bool ConnectTimerCancelled()
SslHandShakeCallbackHandler handshake_cb_
#define LOG(_Level, _Msg)
@ OPENCONFIRM_FEATURE_NEGOTIATION
@ OPENCONFIRM_FEATURE_SUCCESS
static const std::string integerToString(const NumberType &num)
@ INIT_STREAM_HEADER_RESP
XmppStreamTlsType strmtlstype
XmppStreamMsgType strmtype
sc::result react(const EvXmppOpen &event)
mpl::list< sc::custom_reaction< EvAdminDown >, sc::custom_reaction< EvConnectTimerExpired >, sc::custom_reaction< EvOpenTimerExpired >, sc::custom_reaction< EvTcpPassiveOpen >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvXmppOpen >, sc::custom_reaction< EvStop > > reactions
sc::result react(const EvConnectTimerExpired &event)
sc::result react(const EvAdminDown &event)
sc::result react(const EvStop &event)
sc::result react(const EvTcpPassiveOpen &event)
sc::result react(const EvOpenTimerExpired &event)
sc::result react(const EvTcpClose &event)
void StartSession(XmppStateMachine *state_machine)
void CloseSession(XmppStateMachine *state_machine)
sc::result react(const EvAdminDown &event)
sc::result react(const EvTcpConnectFail &event)
mpl::list< sc::custom_reaction< EvAdminDown >, sc::custom_reaction< EvConnectTimerExpired >, sc::custom_reaction< EvTcpConnected >, sc::custom_reaction< EvTcpConnectFail >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvStop > > reactions
sc::result react(const EvTcpClose &event)
sc::result react(const EvStop &event)
sc::result react(const EvTcpConnected &event)
sc::result react(const EvConnectTimerExpired &event)
static const char * Name()
static const char * Name()
static const char * Name()
static const char * Name()
static const char * Name()
boost::shared_ptr< const XmppStanza::XmppMessage > msg
EvStartTls(XmppSession *session, const XmppStanza::XmppMessage *msg)
static const char * Name()
static const char * Name()
static const char * Name()
boost::shared_ptr< const XmppStanza::XmppMessage > msg
EvStreamFeatureRequest(XmppSession *session, const XmppStanza::XmppMessage *msg)
static const char * Name()
EvTcpClose(XmppSession *session)
EvTcpConnectFail(XmppSession *session)
static const char * Name()
static const char * Name()
EvTcpConnected(XmppSession *session)
EvTcpDeleteSession(TcpSession *session)
static const char * Name()
EvTcpPassiveOpen(XmppSession *session)
static const char * Name()
EvTlsHandShakeFailure(XmppSession *session)
static const char * Name()
EvTlsHandShakeSuccess(XmppSession *session)
static const char * Name()
EvTlsProceed(XmppSession *session, const XmppStanza::XmppMessage *msg)
boost::shared_ptr< const XmppStanza::XmppMessage > msg
static const char * Name()
EvXmppIqStanza(XmppSession *session, const XmppStanza::XmppMessage *msg)
static const char * Name()
boost::shared_ptr< const XmppStanza::XmppMessage > msg
static const char * Name()
EvXmppKeepalive(XmppSession *session, const XmppStanza::XmppMessage *msg)
boost::shared_ptr< const XmppStanza::XmppMessage > msg
boost::shared_ptr< const XmppStanza::XmppMessage > msg
static const char * Name()
EvXmppMessageStanza(XmppSession *session, const XmppStanza::XmppMessage *msg)
static const char * Name()
EvXmppMessage(XmppSession *session, const XmppStanza::XmppMessage *msg)
const XmppStanza::XmppMessage * msg
static const char * Name()
EvXmppOpenReceive(XmppSession *session)
boost::shared_ptr< const XmppStanza::XmppStreamMessage > msg
EvXmppOpen(XmppSession *session, const XmppStanza::XmppMessage *msg)
static const char * Name()
sc::transition< EvStart, Active, XmppStateMachine, &XmppStateMachine::OnStart > reactions
sc::result react(const EvStartTls &event)
sc::result react(const EvStop &event)
sc::result react(const EvHoldTimerExpired &event)
mpl::list< sc::custom_reaction< EvAdminDown >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvHoldTimerExpired >, sc::custom_reaction< EvStreamFeatureRequest >, sc::custom_reaction< EvStartTls >, sc::custom_reaction< EvTlsProceed >, sc::custom_reaction< EvTlsHandShakeSuccess >, sc::custom_reaction< EvTlsHandShakeFailure >, sc::custom_reaction< EvXmppOpen >, sc::custom_reaction< EvStop > > reactions
sc::result react(const EvTlsHandShakeSuccess &event)
OpenConfirm(my_context ctx)
void CloseSession(XmppStateMachine *state_machine)
sc::result react(const EvTcpClose &event)
sc::result react(const EvTlsHandShakeFailure &event)
sc::result react(const EvTlsProceed &event)
sc::result react(const EvAdminDown &event)
sc::result react(const EvXmppOpen &event)
sc::result react(const EvStreamFeatureRequest &event)
sc::result react(const EvAdminDown &event)
sc::result react(const EvStop &event)
mpl::list< sc::custom_reaction< EvAdminDown >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvXmppOpen >, sc::custom_reaction< EvHoldTimerExpired >, sc::custom_reaction< EvStop > > reactions
sc::result react(const EvTcpClose &event)
sc::result react(const EvXmppOpen &event)
void CloseSession(XmppStateMachine *state_machine)
sc::result react(const EvHoldTimerExpired &event)
sc::result react(const EvXmppMessageStanza &event)
sc::result react(const EvTcpClose &event)
sc::result react(const EvXmppIqStanza &event)
sc::result react(const EvStop &event)
sc::result react(const EvHoldTimerExpired &event)
sc::result react(const EvAdminDown &event)
sc::result react(const EvXmppKeepalive &event)
XmppStreamEstablished(my_context ctx)
mpl::list< sc::custom_reaction< EvAdminDown >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvXmppKeepalive >, sc::custom_reaction< EvXmppMessageStanza >, sc::custom_reaction< EvXmppIqStanza >, sc::custom_reaction< EvHoldTimerExpired >, sc::custom_reaction< EvStop > > reactions
static boost::posix_time::ptime UTCUsecToPTime(uint64_t tusec)
static uint64_t UTCTimestampUsec()
#define XMPP_UTDEBUG(obj,...)
#define XMPP_WARNING(obj,...)
#define XMPP_INFO(obj,...)
#define XMPP_CONNECTION_LOG_MSG(info)
#define XMPP_NOTICE(obj,...)
#define SM_LOG(_sm, _msg)
static const char * state_names[]