OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
xmpp_connection.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __XMPP_CHANNEL_H__
6 #define __XMPP_CHANNEL_H__
7 
8 #include <boost/asio/ip/tcp.hpp>
9 #include <boost/scoped_ptr.hpp>
10 #include <tbb/atomic.h>
11 #include <tbb/spin_mutex.h>
12 
13 #include "base/timer.h"
14 #include "base/lifetime.h"
15 #include "base/address.h"
16 #include "xmpp/xmpp_channel_mux.h"
18 #include "xmpp/xmpp_session.h"
19 
20 class LifetimeActor;
21 class ShowXmppConnection;
22 class TcpServer;
23 class TcpSession;
24 class XmppChannelConfig;
25 class XmppClient;
27 class XmppServer;
28 class XmppSession;
29 
31 public:
32  struct ProtoStats {
34  open = 0;
35  close = 0;
36  keepalive = 0;
37  update = 0;
38  }
39  tbb::atomic<uint32_t> open;
40  tbb::atomic<uint32_t> close;
41  tbb::atomic<uint32_t> keepalive;
42  tbb::atomic<uint32_t> update;
43  };
44 
45  struct ErrorStats {
47  connect_error = 0;
48  session_close = 0;
49  open_fail = 0;
51  handshake_fail = 0;
52  }
53  tbb::atomic<uint32_t> connect_error;
54  tbb::atomic<uint32_t> session_close;
55  tbb::atomic<uint32_t> open_fail;
56  tbb::atomic<uint32_t> stream_feature_fail;
57  tbb::atomic<uint32_t> handshake_fail;
58  };
59 
61  virtual ~XmppConnection();
62 
63  void SetConfig(const XmppChannelConfig *);
64 
65  // Invoked from XmppServer when a session is accepted.
66  virtual bool AcceptSession(XmppSession *session);
67  virtual void ReceiveMsg(XmppSession *session, const std::string &);
68 
69  virtual boost::asio::ip::tcp::endpoint endpoint() const;
70  virtual boost::asio::ip::tcp::endpoint local_endpoint() const;
71  std::string endpoint_string() const;
72  std::string local_endpoint_string() const;
73  TcpServer *server() { return server_; }
75  int GetTaskInstance() const { return GetTaskInstance(is_client_); }
76 
77  const std::string &ToUVEKey() const;
78  const std::string &ToString() const;
79  const std::string &FromString() const;
80  void SetAdminDown(bool toggle);
81  bool Send(const uint8_t *data, size_t size,
82  const std::string *msg_str = NULL);
83 
84  // Xmpp connection messages
85  virtual bool SendOpen(XmppSession *session);
86  virtual bool SendOpenConfirm(XmppSession *session);
88  virtual bool SendStartTls(XmppSession *session);
89  virtual bool SendProceedTls(XmppSession *session);
90 
91  void SendKeepAlive();
93 
94  // Ssl Handshake callback response
96  const boost::system::error_code& error);
97 
98  // PubSub Messages
100 
101  // chat messages
103 
104  void StartKeepAliveTimer();
105  void StopKeepAliveTimer();
106  void UpdateKeepAliveTimer(uint8_t time_out);
107 
109  void clear_session();
110  void SetTo(const std::string &);
111 
112  const XmppSession *session() const;
113  XmppSession *session();
114 
115  bool logUVE() const { return !is_client_ && log_uve_; }
116  bool IsClient() const { return is_client_; }
117  virtual void ManagedDelete() = 0;
118  virtual void RetryDelete() = 0;
119  virtual LifetimeActor *deleter() = 0;
120  virtual const LifetimeActor *deleter() const = 0;
121  virtual LifetimeManager *lifetime_manager() = 0;
124 
125  bool IsActiveChannel() const {
126  return state_machine_->IsActiveChannel();
127  }
128  XmppChannelMux *ChannelMux() {return mux_.get(); }
129  void SetChannelMux(XmppChannelMux *channel_mux) { mux_.reset(channel_mux); }
130 
131  void Initialize() { state_machine_->Initialize(); }
132  void Clear() { state_machine_->Clear(); }
133  void SetAdminState(bool down) { state_machine_->SetAdminState(down); }
134 
135  void Shutdown();
136  bool MayDelete() const;
137  bool IsDeleted() const;
138 
139  std::string &GetComputeHostName() { return to_; }
140  std::string &GetControllerHostName() { return from_; }
141 
142  std::string &GetFrom() { return from_; }
143  std::string &GetTo() { return to_; }
144 
145  virtual void set_close_reason(const std::string &reason) = 0;
146  virtual void increment_flap_count() = 0;
147  virtual uint32_t flap_count() const = 0;
148  virtual const std::string last_flap_at() const = 0;
149 
150  virtual void WriteReady();
151 
152  friend class XmppStateMachineTest;
153 
154  int GetConfiguredHoldTime() const {
155  return state_machine_->GetConfiguredHoldTime();
156  }
157 
158  int GetNegotiatedHoldTime() const {
159  return state_machine_->hold_time();
160  }
161 
162  std::string StateName() const {
163  return state_machine_->StateName();
164  }
165 
166  std::string LastStateName() const {
167  return state_machine_->LastStateName();
168  }
169 
170  std::string LastStateChangeAt() const {
171  return state_machine_->LastStateChangeAt();
172  }
173 
174  std::string LastEvent() const {
175  return state_machine_->last_event();
176  }
177 
178  uint32_t tx_open() const {
179  return stats_[1].open;
180  }
181  uint32_t tx_keepalive() const {
182  return stats_[1].keepalive;
183  }
184  uint32_t tx_close() const {
185  return stats_[1].close;
186  }
187  uint32_t tx_update() const {
188  return stats_[1].update;
189  }
190 
191  uint32_t rx_open() const {
192  return stats_[0].open;
193  }
194  uint32_t rx_keepalive() const {
195  return stats_[0].keepalive;
196  }
197  uint32_t rx_close() const {
198  return stats_[0].close;
199  }
200  uint32_t rx_update() const {
201  return stats_[0].update;
202  }
203 
204  void LogMsg(std::string msg);
205  bool disable_read() const { return disable_read_; }
208  const XmppStateMachine *state_machine() const;
209 
211  state_machine_.reset(state_machine);
212  }
213 
215  state_machine_.swap(other->state_machine_);
216  }
217  uint8_t dscp_value() const { return dscp_value_; }
218  int SetDscpValue(uint8_t value);
219 
220  void inc_connect_error();
221  void inc_session_close();
222  void inc_open_fail();
224  void inc_handshake_failure();
225  size_t get_connect_error();
226  size_t get_session_close();
227  size_t get_open_fail();
228  size_t get_stream_feature_fail();
229  size_t get_handshake_failure();
230  size_t get_sm_connect_attempts();
231  size_t get_sm_keepalive_count();
232 
233  static const char *kAuthTypeNil;
234  static const char *kAuthTypeTls;
235  std::string GetXmppAuthenticationType() const;
236  void SwapContents(XmppConnection *other);
237  boost::asio::ip::tcp::endpoint &endpoint() { return endpoint_; }
238  const Timer *keepalive_timer() const { return keepalive_timer_; }
239 
240 protected:
243  const XmppChannelMux *channel_mux() const;
244 
245 private:
246  bool KeepAliveTimerExpired();
247  void KeepaliveTimerErrorHanlder(std::string error_name,
248  std::string error_message);
249  XmppStanza::XmppMessage *XmppDecode(const std::string &msg);
250  void LogKeepAliveSend();
251  int GetTaskInstance(bool is_client) const;
252 
253  boost::asio::ip::tcp::endpoint endpoint_;
254  boost::asio::ip::tcp::endpoint local_endpoint_;
256 
257  // Protection for session_ and keepalive_timer_
258  tbb::spin_mutex spin_mutex_;
260 
262  bool log_uve_;
265  std::string from_; // bare jid
266  std::string to_;
268  uint8_t dscp_value_;
269  std::string xmlns_;
270  mutable std::string uve_key_str_;
271 
272  boost::scoped_ptr<XmppStateMachine> state_machine_;
273  boost::scoped_ptr<XmppChannelMux> mux_;
274  std::unique_ptr<XmppStanza::XmppMessage> last_msg_;
275 
277  void IncProtoStats(unsigned int type);
279 
281 };
282 
284 public:
286  virtual ~XmppServerConnection();
287 
288  virtual void ManagedDelete();
289  virtual void RetryDelete();
290  virtual LifetimeActor *deleter();
291  virtual const LifetimeActor *deleter() const;
293  XmppServer *server();
294 
295  virtual void set_close_reason(const std::string &reason);
296  virtual uint32_t flap_count() const;
297  virtual void increment_flap_count();
298  virtual const std::string last_flap_at() const;
299 
300  bool duplicate() const { return duplicate_; }
301  void set_duplicate() { duplicate_ = true; }
302 
303  bool on_work_queue() const { return on_work_queue_; }
306 
310  }
311  void FillShowInfo(ShowXmppConnection *show_connection) const;
312 
313 private:
314  class DeleteActor;
315 
316  bool duplicate_;
319  boost::scoped_ptr<DeleteActor> deleter_;
321 };
322 
324 public:
326  virtual ~XmppClientConnection();
327 
328  virtual void ManagedDelete();
329  virtual void RetryDelete();
330  virtual LifetimeActor *deleter();
331  virtual const LifetimeActor *deleter() const;
333  XmppClient *server();
334 
335  virtual void set_close_reason(const std::string &reason);
336  virtual uint32_t flap_count() const;
337  virtual void increment_flap_count();
338  virtual const std::string last_flap_at() const;
339 
340 private:
341  class DeleteActor;
342 
343  std::string close_reason_;
344  uint32_t flap_count_;
345  uint64_t last_flap_;
346  boost::scoped_ptr<DeleteActor> deleter_;
348 };
349 
351 public:
352  XmppConnectionEndpoint(const std::string &client);
353 
354  void set_close_reason(const std::string &close_reason);
355  uint32_t flap_count() const;
356  void increment_flap_count();
357  uint64_t last_flap() const;
358  const std::string last_flap_at() const;
360  const XmppConnection *connection() const;
361  void set_connection(XmppConnection *connection);
362  void reset_connection();
363 
364 private:
365  std::string client_;
366  std::string close_reason_;
367  uint32_t flap_count_;
368  uint64_t last_flap_;
370 };
371 
372 #endif // __XMPP_CHANNEL_H__
const std::string & FromString() const
void SetTo(const std::string &)
virtual void WriteReady()
boost::scoped_ptr< DeleteActor > deleter_
XmppSession * CreateSession()
bool MayDelete() const
virtual const std::string last_flap_at() const =0
std::string StateName() const
std::string to_
size_t get_stream_feature_fail()
void SetConfig(const XmppChannelConfig *)
tbb::atomic< uint32_t > update
virtual void set_close_reason(const std::string &reason)
virtual bool AcceptSession(XmppSession *session)
virtual LifetimeActor * deleter()=0
const std::string last_flap_at() const
virtual const std::string last_flap_at() const
uint32_t flap_count() const
void KeepaliveTimerErrorHanlder(std::string error_name, std::string error_message)
void inc_stream_feature_fail()
tbb::atomic< uint32_t > open
tbb::atomic< uint32_t > close
bool KeepAliveTimerExpired()
const XmppChannelConfig * config_
uint32_t tx_update() const
virtual boost::asio::ip::tcp::endpoint endpoint() const
XmppServerConnection(XmppServer *server, const XmppChannelConfig *config)
bool disable_read() const
std::string endpoint_string() const
void UpdateKeepAliveTimer(uint8_t time_out)
XmppConnectionEndpoint * conn_endpoint()
void SetAdminState(bool down)
friend class XmppStateMachineTest
void set_state_machine(XmppStateMachine *state_machine)
size_t get_sm_keepalive_count()
bool on_work_queue() const
Timer * keepalive_timer_
virtual void ManagedDelete()
void inc_handshake_failure()
void set_close_reason(const std::string &close_reason)
void set_conn_endpoint(XmppConnectionEndpoint *conn_endpoint)
boost::intrusive_ptr< SslSession > SslSessionPtr
Definition: ssl_session.h:11
std::string from_
std::string & GetControllerHostName()
tbb::atomic< uint32_t > keepalive
void StartKeepAliveTimer()
LifetimeRef< XmppServerConnection > server_delete_ref_
virtual void increment_flap_count()=0
tbb::atomic< uint32_t > open_fail
boost::scoped_ptr< DeleteActor > deleter_
XmppConnection(TcpServer *server, const XmppChannelConfig *config)
virtual LifetimeActor * deleter()
std::unique_ptr< XmppStanza::XmppMessage > last_msg_
virtual ~XmppConnection()
std::string LastStateName() const
std::string & GetComputeHostName()
void SendClose(XmppSession *session)
int GetConfiguredHoldTime() const
bool IsClient() const
XmppConnectionEndpoint(const std::string &client)
virtual void RetryDelete()
int GetNegotiatedHoldTime() const
void SetAdminDown(bool toggle)
xmsm::XmOpenConfirmState GetStateMcOpenConfirmState() const
virtual void increment_flap_count()
virtual bool SendProceedTls(XmppSession *session)
XmppConnection * connection()
bool Send(const uint8_t *data, size_t size, const std::string *msg_str=NULL)
const Timer * keepalive_timer() const
virtual void ManagedDelete()
virtual LifetimeActor * deleter()
bool IsDeleted() const
uint8_t type
Definition: load_balance.h:109
bool duplicate() const
virtual LifetimeManager * lifetime_manager()
std::string LastEvent() const
boost::asio::ip::tcp::endpoint local_endpoint_
std::string local_endpoint_string() const
virtual void RetryDelete()=0
virtual bool SendOpenConfirm(XmppSession *session)
uint32_t rx_open() const
int SetDscpValue(uint8_t value)
virtual void RetryDelete()
virtual const std::string last_flap_at() const
virtual bool SendStreamFeatureRequest(XmppSession *session)
LifetimeRef< XmppClientConnection > server_delete_ref_
xmsm::XmState GetStateMcState() const
uint32_t tx_open() const
tbb::atomic< uint32_t > session_close
virtual void set_close_reason(const std::string &reason)=0
bool IsActiveChannel() const
int ProcessXmppChatMessage(const XmppStanza::XmppChatMessage *)
virtual uint32_t flap_count() const
virtual void increment_flap_count()
XmppChannelMux * ChannelMux()
static const char * kAuthTypeNil
std::string & GetTo()
std::string GetXmppAuthenticationType() const
uint64_t last_flap() const
virtual void ReceiveMsg(XmppSession *session, const std::string &)
size_t get_sm_connect_attempts()
XmppClientConnection(XmppClient *server, const XmppChannelConfig *config)
void set_connection(XmppConnection *connection)
const std::string & ToString() const
void set_disable_read(bool disable_read)
TcpServer * server()
virtual uint32_t flap_count() const =0
int GetTaskInstance() const
XmppSession * session_
boost::scoped_ptr< XmppChannelMux > mux_
const XmppChannelMux * channel_mux() const
void set_session(XmppSession *session)
void ProcessSslHandShakeResponse(SslSessionPtr session, const boost::system::error_code &error)
TcpServer * server_
void SetChannelMux(XmppChannelMux *channel_mux)
size_t get_session_close()
tbb::atomic< uint32_t > stream_feature_fail
int ProcessXmppIqMessage(const XmppStanza::XmppMessage *)
ErrorStats error_stats_
virtual uint32_t flap_count() const
void IncProtoStats(unsigned int type)
std::string LastStateChangeAt() const
std::string & GetFrom()
void SwapXmppStateMachine(XmppConnection *other)
tbb::atomic< uint32_t > handshake_fail
static const char * kAuthTypeTls
virtual void set_close_reason(const std::string &reason)
ProtoStats stats_[2]
tbb::spin_mutex spin_mutex_
virtual void ManagedDelete()=0
bool logUVE() const
size_t get_open_fail()
size_t get_connect_error()
boost::scoped_ptr< XmppStateMachine > state_machine_
void FillShowInfo(ShowXmppConnection *show_connection) const
virtual bool SendOpen(XmppSession *session)
DISALLOW_COPY_AND_ASSIGN(XmppConnection)
uint32_t rx_close() const
Definition: timer.h:54
XmppStateMachine * state_machine()
boost::asio::ip::tcp::endpoint endpoint_
void LogMsg(std::string msg)
void SwapContents(XmppConnection *other)
const XmppSession * session() const
virtual boost::asio::ip::tcp::endpoint local_endpoint() const
tbb::atomic< uint32_t > connect_error
boost::asio::ip::tcp::endpoint & endpoint()
virtual LifetimeManager * lifetime_manager()=0
std::string uve_key_str_
const std::string & ToUVEKey() const
virtual bool SendStartTls(XmppSession *session)
uint8_t dscp_value() const
uint32_t rx_update() const
uint32_t tx_keepalive() const
XmppConnection * connection_
XmppConnectionEndpoint * conn_endpoint_
uint32_t tx_close() const
uint32_t rx_keepalive() const
size_t get_handshake_failure()
XmppStanza::XmppMessage * XmppDecode(const std::string &msg)
virtual LifetimeManager * lifetime_manager()
std::string xmlns_