OpenSDN source code
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 <atomic>
9 #include <boost/asio/ip/tcp.hpp>
10 #include <boost/scoped_ptr.hpp>
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  void swap(ProtoStats& other) {
40  open.store(other.open.exchange(open));
41  close.store(other.close.exchange(close));
42  keepalive.store(other.keepalive.exchange(keepalive));
43  update.store(other.update.exchange(update));
44  }
45  std::atomic<uint32_t> open;
46  std::atomic<uint32_t> close;
47  std::atomic<uint32_t> keepalive;
48  std::atomic<uint32_t> update;
49  };
50 
51  struct ErrorStats {
53  connect_error = 0;
54  session_close = 0;
55  open_fail = 0;
57  handshake_fail = 0;
58  }
59  void swap(ErrorStats& other) {
60  connect_error.store(other.connect_error.exchange(connect_error));
61  session_close.store(other.session_close.exchange(session_close));
62  open_fail.store(other.open_fail.exchange(open_fail));
64  handshake_fail.store(other.handshake_fail.exchange(handshake_fail));
65  }
66  std::atomic<uint32_t> connect_error;
67  std::atomic<uint32_t> session_close;
68  std::atomic<uint32_t> open_fail;
69  std::atomic<uint32_t> stream_feature_fail;
70  std::atomic<uint32_t> handshake_fail;
71  };
72 
74  virtual ~XmppConnection();
75 
76  void SetConfig(const XmppChannelConfig *);
77 
78  // Invoked from XmppServer when a session is accepted.
79  virtual bool AcceptSession(XmppSession *session);
80  virtual void ReceiveMsg(XmppSession *session, const std::string &);
81 
82  virtual boost::asio::ip::tcp::endpoint endpoint() const;
83  virtual boost::asio::ip::tcp::endpoint local_endpoint() const;
84  std::string endpoint_string() const;
85  std::string local_endpoint_string() const;
86  TcpServer *server() { return server_; }
88  int GetTaskInstance() const { return GetTaskInstance(is_client_); }
89 
90  const std::string &ToUVEKey() const;
91  const std::string &ToString() const;
92  const std::string &FromString() const;
93  void SetAdminDown(bool toggle);
94  bool Send(const uint8_t *data, size_t size,
95  const std::string *msg_str = NULL);
96 
97  // Xmpp connection messages
98  virtual bool SendOpen(XmppSession *session);
99  virtual bool SendOpenConfirm(XmppSession *session);
101  virtual bool SendStartTls(XmppSession *session);
102  virtual bool SendProceedTls(XmppSession *session);
103 
104  void SendKeepAlive();
106 
107  // Ssl Handshake callback response
109  const boost::system::error_code& error);
110 
111  // PubSub Messages
113 
114  // chat messages
116 
117  void StartKeepAliveTimer();
118  void StopKeepAliveTimer();
119  void UpdateKeepAliveTimer(uint8_t time_out);
120 
122  void clear_session();
123  void SetTo(const std::string &);
124 
125  const XmppSession *session() const;
126  XmppSession *session();
127 
128  bool logUVE() const { return !is_client_ && log_uve_; }
129  bool IsClient() const { return is_client_; }
130  virtual void ManagedDelete() = 0;
131  virtual void RetryDelete() = 0;
132  virtual LifetimeActor *deleter() = 0;
133  virtual const LifetimeActor *deleter() const = 0;
137 
138  bool IsActiveChannel() const {
139  return state_machine_->IsActiveChannel();
140  }
141  XmppChannelMux *ChannelMux() {return mux_.get(); }
143 
144  void Initialize() { state_machine_->Initialize(); }
145  void Clear() { state_machine_->Clear(); }
146  void SetAdminState(bool down) { state_machine_->SetAdminState(down); }
147 
148  void Shutdown();
149  bool MayDelete() const;
150  bool IsDeleted() const;
151 
152  std::string &GetComputeHostName() { return to_; }
153  std::string &GetControllerHostName() { return from_; }
154 
155  std::string &GetFrom() { return from_; }
156  std::string &GetTo() { return to_; }
157 
158  virtual void set_close_reason(const std::string &reason) = 0;
159  virtual void increment_flap_count() = 0;
160  virtual uint32_t flap_count() const = 0;
161  virtual const std::string last_flap_at() const = 0;
162 
163  virtual void WriteReady();
164 
165  friend class XmppStateMachineTest;
166 
167  int GetConfiguredHoldTime() const {
168  return state_machine_->GetConfiguredHoldTime();
169  }
170 
171  int GetNegotiatedHoldTime() const {
172  return state_machine_->hold_time();
173  }
174 
175  std::string StateName() const {
176  return state_machine_->StateName();
177  }
178 
179  std::string LastStateName() const {
180  return state_machine_->LastStateName();
181  }
182 
183  std::string LastStateChangeAt() const {
184  return state_machine_->LastStateChangeAt();
185  }
186 
187  std::string LastEvent() const {
188  return state_machine_->last_event();
189  }
190 
191  uint32_t tx_open() const {
192  return stats_[1].open;
193  }
194  uint32_t tx_keepalive() const {
195  return stats_[1].keepalive;
196  }
197  uint32_t tx_close() const {
198  return stats_[1].close;
199  }
200  uint32_t tx_update() const {
201  return stats_[1].update;
202  }
203 
204  uint32_t rx_open() const {
205  return stats_[0].open;
206  }
207  uint32_t rx_keepalive() const {
208  return stats_[0].keepalive;
209  }
210  uint32_t rx_close() const {
211  return stats_[0].close;
212  }
213  uint32_t rx_update() const {
214  return stats_[0].update;
215  }
216 
217  void LogMsg(std::string msg);
218  bool disable_read() const { return disable_read_; }
221  const XmppStateMachine *state_machine() const;
222 
225  }
226 
228  state_machine_.swap(other->state_machine_);
229  }
230  uint8_t dscp_value() const { return dscp_value_; }
231  int SetDscpValue(uint8_t value);
232 
233  void inc_connect_error();
234  void inc_session_close();
235  void inc_open_fail();
237  void inc_handshake_failure();
238  size_t get_connect_error();
239  size_t get_session_close();
240  size_t get_open_fail();
241  size_t get_stream_feature_fail();
242  size_t get_handshake_failure();
243  size_t get_sm_connect_attempts();
244  size_t get_sm_keepalive_count();
245 
246  static const char *kAuthTypeNil;
247  static const char *kAuthTypeTls;
248  std::string GetXmppAuthenticationType() const;
249  void SwapContents(XmppConnection *other);
250  boost::asio::ip::tcp::endpoint &endpoint() { return endpoint_; }
251  const Timer *keepalive_timer() const { return keepalive_timer_; }
252 
253 protected:
256  const XmppChannelMux *channel_mux() const;
257 
258 private:
259  bool KeepAliveTimerExpired();
260  void KeepaliveTimerErrorHanlder(std::string error_name,
261  std::string error_message);
262  XmppStanza::XmppMessage *XmppDecode(const std::string &msg);
263  void LogKeepAliveSend();
264  int GetTaskInstance(bool is_client) const;
265  void IncProtoStats(unsigned int type);
266 
267  boost::asio::ip::tcp::endpoint endpoint_;
268  boost::asio::ip::tcp::endpoint local_endpoint_;
270 
271  // Protection for session_ and keepalive_timer_
272  tbb::spin_mutex spin_mutex_;
274 
276  bool log_uve_;
279  std::string from_; // bare jid
280  std::string to_;
282  uint8_t dscp_value_;
283  std::string xmlns_;
284  mutable std::string uve_key_str_;
285 
286  boost::scoped_ptr<XmppStateMachine> state_machine_;
287  boost::scoped_ptr<XmppChannelMux> mux_;
288  std::unique_ptr<XmppStanza::XmppMessage> last_msg_;
289 
292 
294 };
295 
297 public:
299  virtual ~XmppServerConnection();
300 
301  virtual void ManagedDelete();
302  virtual void RetryDelete();
303  virtual LifetimeActor *deleter();
304  virtual const LifetimeActor *deleter() const;
306  XmppServer *server();
307 
308  virtual void set_close_reason(const std::string &reason);
309  virtual uint32_t flap_count() const;
310  virtual void increment_flap_count();
311  virtual const std::string last_flap_at() const;
312 
313  bool duplicate() const { return duplicate_; }
314  void set_duplicate() { duplicate_ = true; }
315 
316  bool on_work_queue() const { return on_work_queue_; }
319 
323  }
324  void FillShowInfo(ShowXmppConnection *show_connection) const;
325 
326 private:
327  class DeleteActor;
328 
332  boost::scoped_ptr<DeleteActor> deleter_;
334 };
335 
337 public:
339  virtual ~XmppClientConnection();
340 
341  virtual void ManagedDelete();
342  virtual void RetryDelete();
343  virtual LifetimeActor *deleter();
344  virtual const LifetimeActor *deleter() const;
346  XmppClient *server();
347 
348  virtual void set_close_reason(const std::string &reason);
349  virtual uint32_t flap_count() const;
350  virtual void increment_flap_count();
351  virtual const std::string last_flap_at() const;
352 
353 private:
354  class DeleteActor;
355 
356  std::string close_reason_;
357  uint32_t flap_count_;
358  uint64_t last_flap_;
359  boost::scoped_ptr<DeleteActor> deleter_;
361 };
362 
364 public:
365  XmppConnectionEndpoint(const std::string &client);
366 
367  void set_close_reason(const std::string &close_reason);
368  uint32_t flap_count() const;
369  void increment_flap_count();
370  uint64_t last_flap() const;
371  const std::string last_flap_at() const;
373  const XmppConnection *connection() const;
375  void reset_connection();
376 
377 private:
378  std::string client_;
379  std::string close_reason_;
380  uint32_t flap_count_;
381  uint64_t last_flap_;
383 };
384 
385 #endif // __XMPP_CHANNEL_H__
Definition: timer.h:57
virtual void set_close_reason(const std::string &reason)
virtual void ManagedDelete()
virtual void increment_flap_count()
virtual const std::string last_flap_at() const
boost::scoped_ptr< DeleteActor > deleter_
virtual LifetimeManager * lifetime_manager()
virtual LifetimeActor * deleter()
LifetimeRef< XmppClientConnection > server_delete_ref_
XmppClientConnection(XmppClient *server, const XmppChannelConfig *config)
virtual uint32_t flap_count() const
virtual void RetryDelete()
void set_connection(XmppConnection *connection)
XmppConnectionEndpoint(const std::string &client)
void set_close_reason(const std::string &close_reason)
uint32_t flap_count() const
XmppConnection * connection()
XmppConnection * connection_
uint64_t last_flap() const
const std::string last_flap_at() const
boost::asio::ip::tcp::endpoint local_endpoint_
virtual void increment_flap_count()=0
void set_disable_read(bool disable_read)
virtual LifetimeActor * deleter()=0
std::string & GetFrom()
bool MayDelete() const
bool KeepAliveTimerExpired()
uint32_t tx_update() const
uint32_t rx_keepalive() const
const Timer * keepalive_timer() const
uint32_t rx_open() const
bool Send(const uint8_t *data, size_t size, const std::string *msg_str=NULL)
const XmppSession * session() const
std::string & GetControllerHostName()
std::string LastEvent() const
tbb::spin_mutex spin_mutex_
std::string local_endpoint_string() const
Timer * keepalive_timer_
int GetTaskInstance() const
std::string GetXmppAuthenticationType() const
std::string & GetComputeHostName()
boost::asio::ip::tcp::endpoint & endpoint()
bool IsActiveChannel() const
ProtoStats stats_[2]
std::string from_
XmppChannelMux * ChannelMux()
int GetConfiguredHoldTime() const
const XmppChannelMux * channel_mux() const
virtual bool SendStreamFeatureRequest(XmppSession *session)
bool disable_read() const
int ProcessXmppIqMessage(const XmppStanza::XmppMessage *)
std::string xmlns_
static const char * kAuthTypeNil
size_t get_connect_error()
XmppSession * CreateSession()
std::string & GetTo()
void inc_handshake_failure()
bool IsDeleted() const
void SwapContents(XmppConnection *other)
std::string uve_key_str_
size_t get_sm_connect_attempts()
virtual boost::asio::ip::tcp::endpoint local_endpoint() const
virtual void ReceiveMsg(XmppSession *session, const std::string &)
virtual ~XmppConnection()
virtual bool SendOpen(XmppSession *session)
virtual void ManagedDelete()=0
xmsm::XmOpenConfirmState GetStateMcOpenConfirmState() const
virtual bool SendStartTls(XmppSession *session)
virtual LifetimeManager * lifetime_manager()=0
virtual boost::asio::ip::tcp::endpoint endpoint() const
void UpdateKeepAliveTimer(uint8_t time_out)
XmppSession * session_
void KeepaliveTimerErrorHanlder(std::string error_name, std::string error_message)
TcpServer * server()
virtual bool SendProceedTls(XmppSession *session)
friend class XmppStateMachineTest
std::string StateName() const
void SetAdminDown(bool toggle)
XmppConnection(TcpServer *server, const XmppChannelConfig *config)
int ProcessXmppChatMessage(const XmppStanza::XmppChatMessage *)
std::string LastStateName() const
void SetConfig(const XmppChannelConfig *)
const std::string & FromString() const
XmppStanza::XmppMessage * XmppDecode(const std::string &msg)
void set_state_machine(XmppStateMachine *state_machine)
boost::scoped_ptr< XmppStateMachine > state_machine_
virtual bool AcceptSession(XmppSession *session)
uint32_t tx_keepalive() const
bool logUVE() const
void SetTo(const std::string &)
DISALLOW_COPY_AND_ASSIGN(XmppConnection)
uint32_t tx_close() const
void SwapXmppStateMachine(XmppConnection *other)
size_t get_open_fail()
uint32_t tx_open() const
std::string to_
virtual const LifetimeActor * deleter() const =0
void StartKeepAliveTimer()
int SetDscpValue(uint8_t value)
int GetNegotiatedHoldTime() const
const XmppChannelConfig * config_
virtual void RetryDelete()=0
size_t get_stream_feature_fail()
std::unique_ptr< XmppStanza::XmppMessage > last_msg_
boost::scoped_ptr< XmppChannelMux > mux_
virtual uint32_t flap_count() const =0
void inc_stream_feature_fail()
size_t get_session_close()
size_t get_handshake_failure()
void IncProtoStats(unsigned int type)
void SendClose(XmppSession *session)
virtual void WriteReady()
XmppStateMachine * state_machine()
bool IsClient() const
static const char * kAuthTypeTls
virtual bool SendOpenConfirm(XmppSession *session)
TcpServer * server_
xmsm::XmState GetStateMcState() const
std::string endpoint_string() const
void LogMsg(std::string msg)
std::string LastStateChangeAt() const
void ProcessSslHandShakeResponse(SslSessionPtr session, const boost::system::error_code &error)
const std::string & ToString() const
void SetChannelMux(XmppChannelMux *channel_mux)
ErrorStats error_stats_
void set_session(XmppSession *session)
uint8_t dscp_value() const
uint32_t rx_update() const
boost::asio::ip::tcp::endpoint endpoint_
const std::string & ToUVEKey() const
uint32_t rx_close() const
virtual void set_close_reason(const std::string &reason)=0
size_t get_sm_keepalive_count()
void SetAdminState(bool down)
virtual const std::string last_flap_at() const =0
virtual void ManagedDelete()
virtual uint32_t flap_count() const
bool on_work_queue() const
XmppConnectionEndpoint * conn_endpoint()
XmppServerConnection(XmppServer *server, const XmppChannelConfig *config)
virtual void increment_flap_count()
virtual LifetimeManager * lifetime_manager()
virtual const std::string last_flap_at() const
boost::scoped_ptr< DeleteActor > deleter_
virtual LifetimeActor * deleter()
XmppConnectionEndpoint * conn_endpoint_
LifetimeRef< XmppServerConnection > server_delete_ref_
void set_conn_endpoint(XmppConnectionEndpoint *conn_endpoint)
virtual void RetryDelete()
virtual void set_close_reason(const std::string &reason)
void FillShowInfo(ShowXmppConnection *show_connection) const
uint8_t type
Definition: load_balance.h:2
boost::intrusive_ptr< SslSession > SslSessionPtr
Definition: ssl_session.h:13
std::atomic< uint32_t > session_close
void swap(ErrorStats &other)
std::atomic< uint32_t > connect_error
std::atomic< uint32_t > stream_feature_fail
std::atomic< uint32_t > handshake_fail
std::atomic< uint32_t > open_fail
void swap(ProtoStats &other)
std::atomic< uint32_t > close
std::atomic< uint32_t > open
std::atomic< uint32_t > keepalive
std::atomic< uint32_t > update