9 #include <boost/bind.hpp>
10 #include <boost/date_time/posix_time/posix_time.hpp>
11 #include <boost/statechart/custom_reaction.hpp>
12 #include <boost/statechart/event.hpp>
13 #include <boost/statechart/simple_state.hpp>
14 #include <boost/statechart/state.hpp>
15 #include <boost/statechart/state_machine.hpp>
16 #include <boost/statechart/transition.hpp>
22 #include "sandesh/sandesh_trace.h"
23 #include "sandesh/common/vns_types.h"
24 #include "sandesh/common/vns_constants.h"
25 #include "sandesh/xmpp_client_server_sandesh_types.h"
26 #include "sandesh/xmpp_peer_info_types.h"
27 #include "sandesh/xmpp_state_machine_sandesh_types.h"
28 #include "sandesh/xmpp_trace_sandesh_types.h"
37 namespace mpl = boost::mpl;
38 namespace sc = boost::statechart;
40 #define SM_LOG(_sm, _msg) do { \
41 XMPP_UTDEBUG(XmppStateMachineDebug, \
42 (_sm)->connection() ? (_sm)->connection()->ToUVEKey() : "", \
43 XMPP_PEER_DIR_NA, (_sm)->ChannelType(), _msg); \
50 static const char *
Name() {
56 static const char *
Name() {
62 static const char *
Name() {
68 static const char *
Name() {
69 return "EvConnectTimerExpired";
74 static const char *
Name() {
75 return "EvOpenTimerExpired";
80 static const char *
Name() {
81 return "EvHoldTimerExpired";
87 static const char *
Name() {
88 return "EvTcpConnected";
95 static const char *
Name() {
96 return "EvTcpConnectFail";
104 return "EvTcpPassiveOpen";
120 return "EvTcpDeleteSession";
129 return "EvXmppMessage";
138 msg(static_cast<const
XmppStanza::XmppStreamMessage *>(msg)) {
144 boost::shared_ptr<const XmppStanza::XmppStreamMessage>
msg;
151 msg(static_cast<const
XmppStanza::XmppStreamMessage *>(msg)) {
154 return "EvStreamFeatureRequest";
157 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
164 msg(static_cast<const
XmppStanza::XmppStreamMessage *>(msg)) {
170 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
177 msg(static_cast<const
XmppStanza::XmppStreamMessage *>(msg)) {
180 return "EvTlsProceed";
183 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
190 return "EvTlsHandShakeSuccess";
199 return "EvTlsHandShakeFailure";
207 session(session), msg(msg) {
210 return "EvXmppKeepalive";
213 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
219 session(session), msg(msg) {
222 return "EvXmppMessageStanza";
225 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
231 : session(session), msg(msg) {
234 return "EvXmppIqStanza";
237 boost::shared_ptr<const XmppStanza::XmppMessage>
msg;
244 return "EvXmppOpenReceive";
249 struct Idle :
public sc::state<Idle, XmppStateMachine> {
252 Idle(my_context ctx) : my_base(ctx) {
263 struct Active :
public sc::state<Active, XmppStateMachine> {
265 sc::custom_reaction<EvAdminDown>,
266 sc::custom_reaction<EvConnectTimerExpired>,
267 sc::custom_reaction<EvOpenTimerExpired>,
268 sc::custom_reaction<EvTcpPassiveOpen>,
269 sc::custom_reaction<EvTcpClose>,
270 sc::custom_reaction<EvXmppOpen>,
271 sc::custom_reaction<EvStop>
288 "Connect failed after retries");
306 SM_LOG(state_machine,
"Discard EvConnectTimerExpired in (Active) State");
307 return discard_event();
310 SM_LOG(state_machine,
"EvConnectTimerExpired in (Active) State");
311 return transit<Connect>();
318 event.session->AsyncReadStart();
320 event.session->set_observer(
322 state_machine, _1, _2));
324 XmppConnectionInfo info;
328 return discard_event();
335 return discard_event();
340 return transit<Idle>();
348 "Discard EvOpenTimerExpired in (Active) State");
349 return discard_event();
359 return transit<Idle>();
366 return discard_event();
373 return discard_event();
388 return transit<Idle>();
390 XmppConnectionInfo info;
391 info.set_identifier(event.
msg->from);
395 return transit<OpenConfirm>();
400 return transit<XmppStreamEstablished>();
415 return transit<Active>();
419 return transit<Idle>();
425 XmppConnectionInfo info;
426 info.set_close_reason(
"Administratively down");
429 return transit<Idle>();
435 struct Connect :
public sc::state<Connect, XmppStateMachine> {
437 sc::custom_reaction<EvAdminDown>,
438 sc::custom_reaction<EvConnectTimerExpired>,
439 sc::custom_reaction<EvTcpConnected>,
440 sc::custom_reaction<EvTcpConnectFail>,
441 sc::custom_reaction<EvTcpClose>,
442 sc::custom_reaction<EvStop>
445 static const int kConnectTimeout = 60;
449 StartSession(state_machine);
454 if (session != NULL) {
455 XmppConnectionInfo info;
470 "Discard EvConnectTimerExpired in (Connect) State");
471 return discard_event();
473 CloseSession(state_machine);
474 XmppConnectionInfo info;
475 info.set_close_reason(
"Connect timer expired");
478 return transit<Active>();
484 return discard_event();
489 XmppConnectionInfo info;
492 if (connection->
SendOpen(session)) {
495 return transit<OpenSent>();
497 SM_LOG(state_machine,
"SendOpen failed in (Connect) State");
498 CloseSession(state_machine);
499 info.set_close_reason(
"SendOpen failed");
503 return transit<Active>();
511 return discard_event();
516 return transit<Active>();
522 return discard_event();
525 CloseSession(state_machine);
528 return transit<Active>();
533 CloseSession(state_machine);
535 XmppConnectionInfo info;
536 info.set_close_reason(
"EvStop received");
539 return transit<Active>();
544 CloseSession(state_machine);
545 XmppConnectionInfo info;
546 info.set_close_reason(
"Administratively down");
549 return transit<Idle>();
558 state_machine, _1, _2));
559 boost::system::error_code err;
562 LOG(WARN,
"Bind failure for local address " <<
576 struct OpenSent :
public sc::state<OpenSent, XmppStateMachine> {
578 sc::custom_reaction<EvAdminDown>,
579 sc::custom_reaction<EvTcpClose>,
580 sc::custom_reaction<EvXmppOpen>,
581 sc::custom_reaction<EvHoldTimerExpired>,
582 sc::custom_reaction<EvStop>
597 return discard_event();
603 return transit<Active>();
605 return discard_event();
613 XmppConnectionInfo info;
614 info.set_identifier(event.
msg->from);
618 return transit<OpenConfirm>();
625 return transit<XmppStreamEstablished>();
628 return discard_event();
635 "Discard EvHoldTimerExpired in (OpenSent) State");
636 return discard_event();
638 CloseSession(state_machine);
639 XmppConnectionInfo info;
640 info.set_close_reason(
"Hold timer expired");
643 return transit<Active>();
649 CloseSession(state_machine);
650 XmppConnectionInfo info;
651 info.set_close_reason(
"EvStop received");
654 return transit<Active>();
659 CloseSession(state_machine);
660 XmppConnectionInfo info;
661 info.set_close_reason(
"Administratively down");
664 return transit<Idle>();
672 struct OpenConfirm :
public sc::state<OpenConfirm, XmppStateMachine> {
674 sc::custom_reaction<EvAdminDown>,
675 sc::custom_reaction<EvTcpClose>,
676 sc::custom_reaction<EvHoldTimerExpired>,
677 sc::custom_reaction<EvStreamFeatureRequest>,
678 sc::custom_reaction<EvStartTls>,
679 sc::custom_reaction<EvTlsProceed>,
680 sc::custom_reaction<EvTlsHandShakeSuccess>,
681 sc::custom_reaction<EvTlsHandShakeFailure>,
682 sc::custom_reaction<EvXmppOpen>,
683 sc::custom_reaction<EvStop>
689 XmppConnectionInfo info;
697 "Xmpp Send Stream Feature Request Failed, IDLE");
699 info.set_close_reason(
"Send Stream Feature Request Failed");
701 "Send Stream Feature Request Failed");
703 "Send Stream Feature Request failed",
"Idle");
717 CloseSession(state_machine);
719 return transit<Active>();
723 return transit<Idle>();
731 "Discard EvHoldTimerExpired in (OpenConfirm) State");
732 return discard_event();
734 XmppConnectionInfo info;
735 info.set_close_reason(
"Hold timer expired");
738 CloseSession(state_machine);
740 return transit<Active>();
744 return transit<Idle>();
759 XmppConnectionInfo info;
760 info.set_close_reason(
"Send Start Tls Failed");
762 return transit<Active>();
766 "Sent Start Tls, OpenConfirm Feature Negotiation");
769 return discard_event();
779 XmppConnectionInfo info;
780 info.set_identifier(connection->
GetTo());
784 "Trigger Client Ssl Handshake");
785 return discard_event();
792 return discard_event();
796 XmppConnectionInfo info;
797 info.set_identifier(connection->
GetTo());
801 info.set_close_reason(
"Send Proceed Tls Failed");
803 return transit<Idle>();
809 "Trigger Server Ssl Handshake");
810 return discard_event();
818 CloseSession(state_machine);
820 return transit<Active>();
824 return transit<Idle>();
831 return discard_event();
838 if (!connection->
SendOpen(session)) {
841 XmppConnectionInfo info;
842 info.set_close_reason(
"Open send failed in OpenConfirm State");
844 return transit<Active>();
850 "OpenConfirm Feature Negotiation Success");
851 return discard_event();
857 return discard_event();
863 return transit<Active>();
866 return transit<Idle>();
874 return discard_event();
876 XmppConnectionInfo info;
877 info.set_identifier(event.
msg->from);
886 return transit<XmppStreamEstablished>();
891 "Xmpp Send Open Confirm Failed, IDLE");
893 info.set_close_reason(
"Send Open Confirm Failed");
895 "Send Open Confirm Failed");
897 return transit<Idle>();
906 return transit<XmppStreamEstablished>();
913 CloseSession(state_machine);
914 XmppConnectionInfo info;
915 info.set_close_reason(
"Administratively down");
918 return transit<Idle>();
929 public sc::state<XmppStreamEstablished, XmppStateMachine> {
931 sc::custom_reaction<EvAdminDown>,
932 sc::custom_reaction<EvTcpClose>,
933 sc::custom_reaction<EvXmppKeepalive>,
934 sc::custom_reaction<EvXmppMessageStanza>,
935 sc::custom_reaction<EvXmppIqStanza>,
936 sc::custom_reaction<EvHoldTimerExpired>,
937 sc::custom_reaction<EvStop>
955 return discard_event();
960 return transit<Active>();
963 return transit<Idle>();
970 return discard_event();
977 return discard_event();
983 return discard_event();
988 return discard_event();
994 return discard_event();
999 return discard_event();
1006 "Discard EvHoldTimerExpired in (Established) State");
1007 return discard_event();
1013 "EvHoldTimerExpired in (Established) State. Transit to IDLE");
1018 return transit<Active>();
1020 return transit<Idle>();
1029 return transit<Active>();
1031 return transit<Idle>();
1038 XmppConnectionInfo info;
1039 info.set_close_reason(
"Administratively down");
1042 return transit<Idle>();
1049 static bool init_ =
false;
1050 static bool assert_ =
false;
1053 char *str = getenv(
"XMPP_ASSERT_ON_HOLD_TIMEOUT");
1054 if (str && strtoul(str, NULL, 0) != 0) assert_ =
true;
1058 if (!assert_)
return;
1061 connection()->LogMsg(
"HOLD TIMER EXPIRED: ");
1063 LOG4CPLUS_DEBUG(log4cplus::Logger::getRoot(),
"HOLD TIMER EXPIRED: ");
1080 if (IsActiveChannel())
1090 bool auth_enabled,
int config_hold_time)
1091 : work_queue_(
TaskScheduler::GetInstance()->GetTaskId(
"xmpp::StateMachine"),
1092 connection->GetTaskInstance(),
1094 connection_(connection),
1096 server_(connection->server()),
1098 TimerManager::CreateTimer(*server_->event_manager()->io_service(),
1100 TaskScheduler::GetInstance()->GetTaskId(
"xmpp::StateMachine"),
1101 connection->GetTaskInstance())),
1103 TimerManager::CreateTimer(*server_->event_manager()->io_service(),
1105 TaskScheduler::GetInstance()->GetTaskId(
"xmpp::StateMachine"),
1106 connection->GetTaskInstance())),
1108 TimerManager::CreateTimer(*server_->event_manager()->io_service(),
1110 TaskScheduler::GetInstance()->GetTaskId(
"xmpp::StateMachine"),
1111 connection->GetTaskInstance())),
1112 config_hold_time_(config_hold_time),
1113 hold_time_(GetConfiguredHoldTime()),
1115 keepalive_count_(0),
1119 auth_enabled_(auth_enabled),
1187 int ms = ((seconds)? seconds * 1000 : 50);
1188 ms = (ms * (100 -
kJitter)) / 100;
1189 ms += (ms * (rand() % (
kJitter * 2))) / 100;
1211 static std::atomic<bool> env_checked = std::atomic<bool>();
1212 static std::atomic<int> env_hold_time = std::atomic<int>();
1216 char *keepalive_time_str = getenv(
"XMPP_KEEPALIVE_SECONDS");
1217 if (keepalive_time_str) {
1218 env_hold_time = strtoul(keepalive_time_str, NULL, 0) * 3;
1220 return env_hold_time;
1224 }
else if (env_hold_time) {
1225 return env_hold_time;
1263 "Event: OpenTimer Expired ",
1264 connection()->endpoint().address().to_string(),
1272 boost::system::error_code error;
1276 session()->socket()->available(error) > 0) {
1281 connection()->endpoint().address().to_string(),
1294 this->ChannelType(),
"Event: Tcp Connected ",
1295 connection()->endpoint().address().to_string(),
1301 this->ChannelType(),
"Event: Tcp Connect Fail ",
1302 connection()->endpoint().address().to_string(),
1309 this->ChannelType(),
"Event: Tcp Connection Closed ",
1310 connection()->endpoint().address().to_string(),
1317 this->ChannelType(), event);
1323 string state =
"PassiveOpen in state: " +
StateName();
1325 this->ChannelType(), state,
1338 std::scoped_lock lock(connection_manager->
mutex());
1353 string reason =
"Subcluster mismatch: Agent subcluster " +
1354 msg->
xmlns +
", Control subcluster " +
1377 boost::asio::ip::address addr =
1383 " as another connection with same name " + msg->
from +
1384 " but with different IP address " + addr.to_string() +
1400 " as another connection is alreready present");
1416 " as a new connection as been initiated (GR Helper is active)");
1430 " as current connection is still under deletion");
1461 switch (msg->
type) {
1543 XmppPeerInfoData peer_info;
1544 peer_info.set_name(
connection()->ToUVEKey());
1545 PeerStateInfo state_info;
1549 peer_info.set_state_info(state_info);
1550 assert(!peer_info.get_name().empty());
1551 XMPPPeerInfo::Send(peer_info);
1611 boost::intrusive_ptr<const sc::event_base> event) {
1615 if (ev_xmpp_message) {
1631 connection()->endpoint().address().to_string() :
"",
1633 if (deferred_delete) {
1644 process_event(event);
1659 if (event ==
"xmsm::EvXmppIqStanza" ||
1660 event ==
"xmsm::EvXmppMessageStanza") {
1669 XmppPeerInfoData peer_info;
1670 peer_info.set_name(
connection()->ToUVEKey());
1671 PeerEventInfo event_info;
1674 peer_info.set_event_info(event_info);
1676 assert(!peer_info.get_name().empty());
1677 XMPPPeerInfo::Send(peer_info);
1695 const string &nextstate) {
1696 XmppConnectionInfo info;
1702 const string &event,
const string &nextstate) {
1704 info->set_ip_address(this->
connection()->endpoint().address().to_string());
1706 info->set_event(event);
1707 if (!nextstate.empty()) {
1708 info->set_next_state(nextstate);
1736 new_connection->
server())->LocateConnectionEndpoint(
1749 "Resurrect xmpp connection " + new_session->
ToString());
1753 assert(old_xmpp_connection);
1756 assert(old_state_machine);
1764 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()
std::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[]