OpenSDN source code
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 <mutex>
9 
10 #include "io/tcp_session.h"
11 #include "io/ssl_server.h"
12 
13 class SslSession;
14 typedef boost::intrusive_ptr<SslSession> SslSessionPtr;
15 typedef boost::function<void(SslSessionPtr,
16  const boost::system::error_code& error)> SslHandShakeCallbackHandler;
17 
18 class SslSession : public TcpSession {
19 public:
20  typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SslSocket;
21 
22  // SslSession constructor takes ownership of socket.
24  bool async_read_ready = true);
25 
26  virtual Socket *socket() const;
27 
28  // Trigger delayed SslHandShake
30 
31  // Additional states to determine the trigger of SSL handshake
32  bool IsSslDisabled() {
33  return (!ssl_enabled_);
34  }
35 
38  }
39 
41  std::scoped_lock lock(mutex_);
43  }
44 
47  }
48 
50  std::scoped_lock lock(mutex_);
52  }
53 
54  void SetSslHandShakeInProgress(bool state) {
55  std::scoped_lock lock(mutex_);
57  }
58 
59  static bool IsSocketErrorHard(const boost::system::error_code &ec);
60 protected:
61  virtual ~SslSession();
62 
63 private:
64  class SslReader;
65  friend class SslServer;
66 
67  // SslSession do actual ssl socket read for data in this context with
68  // session mutex held, to avoid concurrent read and write operations
69  // on same socket.
70  size_t ReadSome(boost::asio::mutable_buffer buffer,
71  boost::system::error_code *error);
72  void AsyncWrite(const uint8_t *data, std::size_t size);
73 
76 
77  virtual Task* CreateReaderTask(boost::asio::mutable_buffer, size_t);
78 
80  SslSessionPtr, const boost::system::error_code &error);
81 
83  std::scoped_lock lock(mutex_);
85  }
86 
88  std::scoped_lock lock(mutex_);
89  ssl_handshake_success_ = false;
90  }
91  virtual size_t GetReadBufferSize() const;
92  virtual void AsyncReadSome();
93 
94  boost::scoped_ptr<SslSocket> ssl_socket_;
95 
96  /**************** protected by mutex_ *************************/
97  bool ssl_handshake_in_progress_; // ssl handshake ongoing
98  bool ssl_handshake_success_; // ssl handshake success
99  /**************** end protected by mutex_ *********************/
100 
101  /**************** config knobs ********************************/
102  bool ssl_enabled_; // default true
103  bool ssl_handshake_delayed_; // default false
104  /**************************************************************/
105 
106  size_t ssl_last_read_len_; // data len of the last read done
107 
109 };
110 
111 #endif // SRC_IO_SSL_SESSION_H_
void SetSslHandShakeSuccess()
Definition: ssl_session.h:82
static bool IsSocketErrorHard(const boost::system::error_code &ec)
Definition: ssl_session.cc:133
size_t ReadSome(boost::asio::mutable_buffer buffer, boost::system::error_code *error)
Definition: ssl_session.cc:150
bool IsSslHandShakeDelayed()
Definition: ssl_session.h:36
bool IsSslDisabled()
Definition: ssl_session.h:32
virtual Socket * socket() const
Definition: ssl_session.cc:98
boost::asio::ssl::stream< boost::asio::ip::tcp::socket > SslSocket
Definition: ssl_session.h:20
void SetSslHandShakeFailure()
Definition: ssl_session.h:87
virtual void AsyncReadSome()
Definition: ssl_session.cc:108
bool IsSslHandShakeInProgress()
Definition: ssl_session.h:49
void AsyncWrite(const uint8_t *data, std::size_t size)
Definition: ssl_session.cc:159
virtual ~SslSession()
Definition: ssl_session.cc:86
SslSession(SslServer *server, SslSocket *socket, bool async_read_ready=true)
Definition: ssl_session.cc:70
DISALLOW_COPY_AND_ASSIGN(SslSession)
bool ssl_handshake_success_
Definition: ssl_session.h:98
bool ssl_enabled_
Definition: ssl_session.h:102
static void SslHandShakeCallback(SslHandShakeCallbackHandler cb, SslSessionPtr, const boost::system::error_code &error)
Definition: ssl_session.cc:169
size_t ssl_last_read_len_
Definition: ssl_session.h:106
virtual Task * CreateReaderTask(boost::asio::mutable_buffer, size_t)
Definition: ssl_session.cc:89
void SetSslHandShakeInProgress(bool state)
Definition: ssl_session.h:54
boost::scoped_ptr< SslSocket > ssl_socket_
Definition: ssl_session.h:94
bool ssl_handshake_delayed_
Definition: ssl_session.h:103
bool IsSslHandShakeSuccess()
Definition: ssl_session.h:40
virtual size_t GetReadBufferSize() const
Definition: ssl_session.cc:124
void TriggerSslHandShake(SslHandShakeCallbackHandler)
Definition: ssl_session.cc:200
bool IsSslHandShakeSuccessLocked()
Definition: ssl_session.h:45
static void TriggerSslHandShakeInternal(SslSessionPtr ptr, SslHandShakeCallbackHandler cb)
Definition: ssl_session.cc:184
bool ssl_handshake_in_progress_
Definition: ssl_session.h:97
Task is a class to describe a computational task within OpenSDN control plane applications....
Definition: task.h:79
TcpServer * server()
Definition: tcp_session.h:84
std::mutex mutex_
Definition: tcp_session.h:221
boost::asio::ip::tcp::socket Socket
Definition: tcp_session.h:56
boost::intrusive_ptr< SslSession > SslSessionPtr
Definition: ssl_session.h:13
boost::function< void(SslSessionPtr, const boost::system::error_code &error)> SslHandShakeCallbackHandler
Definition: ssl_session.h:16