OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ssl_session.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_IO_SSL_SESSION_H_
6 #define SRC_IO_SSL_SESSION_H_
7 
8 #include "io/tcp_session.h"
9 #include "io/ssl_server.h"
10 
11 class SslSession;
12 typedef boost::intrusive_ptr<SslSession> SslSessionPtr;
13 typedef boost::function<void(SslSessionPtr,
14  const boost::system::error_code& error)> SslHandShakeCallbackHandler;
15 
16 class SslSession : public TcpSession {
17 public:
18  typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SslSocket;
19 
20  // SslSession constructor takes ownership of socket.
22  bool async_read_ready = true);
23 
24  virtual Socket *socket() const;
25 
26  // Trigger delayed SslHandShake
28 
29  // Additional states to determine the trigger of SSL handshake
30  bool IsSslDisabled() {
31  return (!ssl_enabled_);
32  }
33 
36  }
37 
39  tbb::mutex::scoped_lock lock(mutex_);
41  }
42 
45  }
46 
48  tbb::mutex::scoped_lock lock(mutex_);
50  }
51 
52  void SetSslHandShakeInProgress(bool state) {
53  tbb::mutex::scoped_lock lock(mutex_);
55  }
56 
57  static bool IsSocketErrorHard(const boost::system::error_code &ec);
58 protected:
59  virtual ~SslSession();
60 
61 private:
62  class SslReader;
63  friend class SslServer;
64 
65  // SslSession do actual ssl socket read for data in this context with
66  // session mutex held, to avoid concurrent read and write operations
67  // on same socket.
68  size_t ReadSome(boost::asio::mutable_buffer buffer,
69  boost::system::error_code *error);
70  void AsyncWrite(const uint8_t *data, std::size_t size);
71 
74 
75  virtual Task* CreateReaderTask(boost::asio::mutable_buffer, size_t);
76 
78  SslSessionPtr, const boost::system::error_code &error);
79 
81  tbb::mutex::scoped_lock lock(mutex_);
83  }
84 
86  tbb::mutex::scoped_lock lock(mutex_);
87  ssl_handshake_success_ = false;
88  }
89  virtual size_t GetReadBufferSize() const;
90  virtual void AsyncReadSome();
91 
92  boost::scoped_ptr<SslSocket> ssl_socket_;
93 
94  /**************** protected by mutex_ *************************/
95  bool ssl_handshake_in_progress_; // ssl handshake ongoing
96  bool ssl_handshake_success_; // ssl handshake success
97  /**************** end protected by mutex_ *********************/
98 
99  /**************** config knobs ********************************/
100  bool ssl_enabled_; // default true
101  bool ssl_handshake_delayed_; // default false
102  /**************************************************************/
103 
104  size_t ssl_last_read_len_; // data len of the last read done
105 
107 };
108 
109 #endif // SRC_IO_SSL_SESSION_H_
SslSession(SslServer *server, SslSocket *socket, bool async_read_ready=true)
Definition: ssl_session.cc:69
bool IsSslDisabled()
Definition: ssl_session.h:30
bool IsSslHandShakeDelayed()
Definition: ssl_session.h:34
virtual ~SslSession()
Definition: ssl_session.cc:85
boost::intrusive_ptr< SslSession > SslSessionPtr
Definition: ssl_session.h:11
virtual Task * CreateReaderTask(boost::asio::mutable_buffer, size_t)
Definition: ssl_session.cc:88
size_t ReadSome(boost::asio::mutable_buffer buffer, boost::system::error_code *error)
Definition: ssl_session.cc:143
bool IsSslHandShakeSuccessLocked()
Definition: ssl_session.h:43
size_t ssl_last_read_len_
Definition: ssl_session.h:104
bool ssl_enabled_
Definition: ssl_session.h:100
boost::asio::ssl::stream< boost::asio::ip::tcp::socket > SslSocket
Definition: ssl_session.h:18
boost::scoped_ptr< SslSocket > ssl_socket_
Definition: ssl_session.h:92
bool ssl_handshake_in_progress_
Definition: ssl_session.h:95
boost::asio::ip::tcp::socket Socket
Definition: tcp_session.h:60
bool ssl_handshake_success_
Definition: ssl_session.h:96
bool ssl_handshake_delayed_
Definition: ssl_session.h:101
tbb::mutex mutex_
Definition: tcp_session.h:225
virtual size_t GetReadBufferSize() const
Definition: ssl_session.cc:123
static bool IsSocketErrorHard(const boost::system::error_code &ec)
Definition: ssl_session.cc:132
bool IsSslHandShakeInProgress()
Definition: ssl_session.h:47
void TriggerSslHandShake(SslHandShakeCallbackHandler)
Definition: ssl_session.cc:193
void SetSslHandShakeFailure()
Definition: ssl_session.h:85
virtual void AsyncReadSome()
Definition: ssl_session.cc:107
DISALLOW_COPY_AND_ASSIGN(SslSession)
static void TriggerSslHandShakeInternal(SslSessionPtr ptr, SslHandShakeCallbackHandler cb)
Definition: ssl_session.cc:177
TcpServer * server()
Definition: tcp_session.h:88
void AsyncWrite(const uint8_t *data, std::size_t size)
Definition: ssl_session.cc:152
static void SslHandShakeCallback(SslHandShakeCallbackHandler cb, SslSessionPtr, const boost::system::error_code &error)
Definition: ssl_session.cc:162
void SetSslHandShakeInProgress(bool state)
Definition: ssl_session.h:52
void SetSslHandShakeSuccess()
Definition: ssl_session.h:80
Task is a wrapper over tbb::task to support policies.
Definition: task.h:86
boost::function< void(SslSessionPtr, const boost::system::error_code &error)> SslHandShakeCallbackHandler
Definition: ssl_session.h:14
virtual Socket * socket() const
Definition: ssl_session.cc:97
bool IsSslHandShakeSuccess()
Definition: ssl_session.h:38