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>();
318 assert(state_machine->
session() ==
event.session);
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>();
409 connection->StopKeepAliveTimer();
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>();
619 connection->SendKeepAlive();
620 connection->StartKeepAliveTimer();
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>();
755 if (!connection->SendStartTls(session)) {
756 connection->SendClose(session);
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();
986 static_cast<const XmppStanza::XmppChatMessage *>(event.
msg.get()));
987 return discard_event();
993 return discard_event();
997 static_cast<const XmppStanza::XmppMessage *>(event.
msg.get()));
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),
1120 last_state_(xmsm::
IDLE),
1163 if (session != NULL) {
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(),
1308 this->
ChannelType(),
"Event: Tcp Connection Closed ",
1322 string state =
"PassiveOpen in state: " +
StateName();
1337 tbb::mutex::scoped_lock lock(connection_manager->
mutex());
1352 string reason =
"Subcluster mismatch: Agent subcluster " +
1353 msg->
xmlns +
", Control subcluster " +
1357 "Drop new xmpp connection " + session->
ToString() +
1376 boost::asio::ip::address addr =
1381 "Drop new xmpp connection " + session->
ToString() +
1382 " as another connection with same name " + msg->
from +
1383 " but with different IP address " + addr.to_string() +
1398 "Drop new xmpp connection " + session->
ToString() +
1399 " as another connection is alreready present");
1415 " as a new connection as been initiated (GR Helper is active)");
1428 "Drop new xmpp connection " + session->
ToString() +
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(
1736 static_cast<XmppServerConnection *>(new_connection), created);
1748 "Resurrect xmpp connection " + new_session->
ToString());
1752 assert(old_xmpp_connection);
1754 XmppStateMachine *old_state_machine = old_xmpp_connection->state_machine();
1755 assert(old_state_machine);
1763 if (old_xmpp_session)
1769 old_xmpp_connection->set_session(new_session);
void SetTo(const std::string &)
bool IsValidType(XmppMessageType type) const
int GetConnectTime() const
XmppSession * CreateSession()
sc::result react(const EvTlsHandShakeFailure &event)
static const char * Name()
static const char * Name()
int get_connect_attempts() const
#define XMPP_UTDEBUG(obj,...)
virtual void StartOpenTimer(int seconds)
#define XMPP_INFO(obj,...)
EvXmppOpenReceive(XmppSession *session)
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
virtual xmps::PeerState GetPeerState() const
virtual void DeleteSession(TcpSession *session)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
EvXmppKeepalive(XmppSession *session, const XmppStanza::XmppMessage *msg)
static const char * Name()
EvStreamFeatureRequest(XmppSession *session, const XmppStanza::XmppMessage *msg)
void Shutdown(bool delete_entries=true)
XmppStreamTlsType strmtlstype
sc::result react(const EvXmppKeepalive &event)
void CloseSession(XmppStateMachine *state_machine)
EvTcpDeleteSession(TcpSession *session)
sc::result react(const EvHoldTimerExpired &event)
virtual void Connect(TcpSession *session, Endpoint remote)
std::string StateName() const
EvTlsProceed(XmppSession *session, const XmppStanza::XmppMessage *msg)
sc::result react(const EvStop &event)
sc::result react(const EvOpenTimerExpired &event)
XmppConnection * connection()
static const char * Name()
sc::result react(const EvXmppOpen &event)
virtual boost::asio::ip::tcp::endpoint endpoint() const
virtual bool IsPeerCloseGraceful() const
virtual std::string ToString() const
void SwapXmppConnection(XmppStateMachine *other)
virtual void StartHoldTimer()
static const char * Name()
int32_t remote_port() const
sc::result react(const EvXmppOpen &event)
sc::result react(const EvXmppMessageStanza &event)
sc::result react(const EvAdminDown &event)
tbb::mutex & mutex() const
sc::result react(const EvTcpClose &event)
static const int kHoldTime
void SetAdminState(bool down)
sc::result react(const EvHoldTimerExpired &event)
EvTcpPassiveOpen(XmppSession *session)
sc::result react(const EvAdminDown &event)
boost::shared_ptr< const XmppStanza::XmppStreamMessage > msg
sc::result react(const EvStop &event)
const XmppStanza::XmppMessage * msg
std::string LastStateChangeAt() const
void StartKeepAliveTimer()
virtual void increment_flap_count()=0
sc::result react(const EvConnectTimerExpired &event)
int get_keepalive_count() const
SslHandShakeCallbackHandler handshake_cb_
static const int kConnectInterval
static const char * Name()
sc::result react(const EvStop &event)
XmppStreamMsgType strmtype
sc::result react(const EvXmppOpen &event)
void SendClose(XmppSession *session)
sc::result react(const EvTcpClose &event)
std::string LastStateName() const
static const int kMaxAttempts
EvXmppOpen(XmppSession *session, const XmppStanza::XmppMessage *msg)
int32_t local_port() const
static const char * Name()
XmppStateMachine(XmppConnection *connection, bool active, bool auth_enabled=false, int config_hold_time=kHoldTime)
static const char * Name()
EvTlsHandShakeSuccess(XmppSession *session)
xmsm::XmOpenConfirmState openconfirm_state_
sc::result react(const EvStreamFeatureRequest &event)
boost::shared_ptr< const XmppStanza::XmppMessage > msg
void set_observer(EventObserver observer)
static const char * Name()
xmsm::XmState get_state()
void set_state(xmsm::XmState state)
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
virtual bool SendProceedTls(XmppSession *session)
void OnMessage(XmppSession *session, const XmppStanza::XmppMessage *msg)
XmppConnection * connection()
EvTlsHandShakeFailure(XmppSession *session)
static const char * Name()
bool Enqueue(const sc::event_base &ev)
sc::result react(const EvAdminDown &event)
static const char * Name()
boost::shared_ptr< const XmppStanza::XmppMessage > msg
sc::result react(const EvAdminDown &event)
void HandleStateEvent(xmsm::XmState state)
static const std::string integerToString(const NumberType &num)
sc::result react(const EvTcpConnected &event)
static const char * Name()
xmsm::XmOpenConfirmState OpenConfirmStateType() const
EvTcpConnectFail(XmppSession *session)
void DeleteSession(XmppSession *session)
void StartSession(XmppStateMachine *state_machine)
#define XMPP_NOTICE(obj,...)
static const char * Name()
XmppConnection * Connection()
sc::result react(const EvTcpClose &event)
sc::result react(const EvTlsProceed &event)
static const char * Name()
void connect_attempts_clear()
boost::shared_ptr< const XmppStanza::XmppMessage > msg
void set_openconfirm_state(xmsm::XmOpenConfirmState state)
boost::shared_ptr< const XmppStanza::XmppMessage > msg
virtual bool SendOpenConfirm(XmppSession *session)
EvXmppMessage(XmppSession *session, const XmppStanza::XmppMessage *msg)
static boost::posix_time::ptime UTCUsecToPTime(uint64_t tusec)
int GetConfiguredHoldTime() const
mpl::list< sc::custom_reaction< EvAdminDown >, sc::custom_reaction< EvTcpClose >, sc::custom_reaction< EvXmppOpen >, sc::custom_reaction< EvHoldTimerExpired >, sc::custom_reaction< EvStop > > reactions
void StopKeepAliveTimer()
virtual bool SendStreamFeatureRequest(XmppSession *session)
static const char * Name()
static const char * Name()
void SendConnectionInfo(const std::string &event, const std::string &nextstate="")
sc::result react(const EvTcpPassiveOpen &event)
static const char * state_names[]
void TriggerSslHandShake(SslHandShakeCallbackHandler)
sc::result react(const EvXmppIqStanza &event)
#define XMPP_CONNECTION_LOG_MSG(info)
OpenConfirm(my_context ctx)
sc::result react(const EvStop &event)
virtual void set_close_reason(const std::string &reason)=0
xmsm::XmState StateType() const
bool DequeueEvent(boost::intrusive_ptr< const sc::event_base > event)
bool IsActiveChannel() const
int ProcessXmppChatMessage(const XmppStanza::XmppChatMessage *)
bool OpenTimerCancelled()
void CloseSession(XmppStateMachine *state_machine)
XmppConnection * connection_
XmppChannelMux * ChannelMux()
sc::result react(const EvTcpClose &event)
SslHandShakeCallbackHandler HandShakeCbHandler()
sc::result react(const EvConnectTimerExpired &event)
virtual void StartConnectTimer(int seconds)
WorkQueue< boost::intrusive_ptr< const sc::event_base > > work_queue_
xmsm::XmState last_state_
void keepalive_count_clear()
boost::shared_ptr< const XmppStanza::XmppMessage > msg
const std::string & ToString() const
void connect_attempts_inc()
void ProcessMessage(XmppSession *session, const XmppStanza::XmppMessage *msg)
static const char * Name()
void set_session(XmppSession *session)
void keepalive_count_inc()
static const char * Name()
bool HoldTimerCancelled()
void ProcessSslHandShakeResponse(SslSessionPtr session, const boost::system::error_code &error)
void OnEvent(SslSession *session, xmsm::SslHandShakeResponse)
static const int kOpenTime
const std::string & ToUVEKey() const
void CancelConnectTimer()
EvStartTls(XmppSession *session, const XmppStanza::XmppMessage *msg)
void set_session(TcpSession *session)
void SetConnection(XmppConnection *connection)
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
int ProcessXmppIqMessage(const XmppStanza::XmppMessage *)
sc::result react(const EvHoldTimerExpired &event)
static uint64_t UTCTimestampUsec()
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
static const char * Name()
bool ConnectTimerExpired()
sc::result react(const EvTlsHandShakeSuccess &event)
void SwapXmppStateMachine(XmppConnection *other)
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
EvTcpConnected(XmppSession *session)
void OnStart(const xmsm::EvStart &event)
EvXmppMessageStanza(XmppSession *session, const XmppStanza::XmppMessage *msg)
bool ConnectTimerCancelled()
virtual void ManagedDelete()=0
static const char * Name()
#define LOG(_Level, _Msg)
#define SM_LOG(_sm, _msg)
static const char * Name()
void CloseSession(XmppStateMachine *state_machine)
bool PassiveOpen(XmppSession *session)
void ProcessStreamHeaderMessage(XmppSession *session, const XmppStanza::XmppMessage *msg)
void AssertOnHoldTimeout()
sc::result react(const EvTcpClose &event)
virtual bool SendOpen(XmppSession *session)
sc::result react(const EvTcpConnectFail &event)
size_t ReceiverCount() const
XmppConnectionEndpoint * FindConnectionEndpoint(const std::string &endpoint_name)
const char * ChannelType()
boost::shared_ptr< const XmppStanza::XmppMessage > msg
virtual void OnSessionEvent(TcpSession *session, TcpSession::Event event)
void ProcessEvent(const sc::event_base &event)
static const char * Name()
XmppStateMachine * state_machine()
sc::result react(const EvAdminDown &event)
void ResurrectOldConnection(XmppConnection *connection, XmppSession *session)
virtual void AsyncReadStart()
XmppStreamEstablished(my_context ctx)
void SwapContents(XmppConnection *other)
EvTcpClose(XmppSession *session)
void set_last_event(const std::string &event)
virtual boost::asio::ip::tcp::endpoint local_endpoint() const
bool Enqueue(QueueEntryT entry)
sc::result react(const EvStop &event)
const std::string & ToUVEKey() const
const std::string subcluster_name() const
void TimerErrorHandler(std::string name, std::string error)
virtual Socket * socket() const
sc::result react(const EvStartTls &event)
sc::transition< EvStart, Active, XmppStateMachine,&XmppStateMachine::OnStart > reactions
#define XMPP_WARNING(obj,...)
void unconsumed_event(const sc::event_base &event)
void update_last_event(const std::string &event)
static bool DeleteTimer(Timer *Timer)
EvXmppIqStanza(XmppSession *session, const XmppStanza::XmppMessage *msg)