• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * nghttp2 - HTTP/2 C Library
3  *
4  * Copyright (c) 2015 Tatsuhiro Tsujikawa
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sublicense, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be
15  * included in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 #ifndef SHRPX_CONNECTION_H
26 #define SHRPX_CONNECTION_H
27 
28 #include "shrpx_config.h"
29 
30 #include <sys/uio.h>
31 
32 #include <ev.h>
33 
34 #include <openssl/ssl.h>
35 
36 #include "shrpx_rate_limit.h"
37 #include "shrpx_error.h"
38 #include "memchunk.h"
39 
40 namespace shrpx {
41 
42 struct MemcachedRequest;
43 
44 namespace tls {
45 struct TLSSessionCache;
46 } // namespace tls
47 
48 enum class TLSHandshakeState {
49   NORMAL,
50   WAIT_FOR_SESSION_CACHE,
51   GOT_SESSION_CACHE,
52   CANCEL_SESSION_CACHE,
53   WRITE_STARTED,
54 };
55 
56 struct TLSConnection {
57   DefaultMemchunks wbuf;
58   DefaultPeekMemchunks rbuf;
59   // Stores TLSv1.3 early data.
60   DefaultMemchunks earlybuf;
61   SSL *ssl;
62   SSL_SESSION *cached_session;
63   MemcachedRequest *cached_session_lookup_req;
64   tls::TLSSessionCache *client_session_cache;
65   ev_tstamp last_write_idle;
66   size_t warmup_writelen;
67   // length passed to SSL_write and SSL_read last time.  This is
68   // required since these functions require the exact same parameters
69   // on non-blocking I/O.
70   size_t last_writelen, last_readlen;
71   TLSHandshakeState handshake_state;
72   bool initial_handshake_done;
73   bool reneg_started;
74   // true if ssl is prepared to do handshake as server.
75   bool server_handshake;
76   // true if ssl is initialized as server, and client requested
77   // signed_certificate_timestamp extension.
78   bool sct_requested;
79   // true if TLSv1.3 early data has been completely received.  Since
80   // SSL_read_early_data acts like SSL_do_handshake, this field may be
81   // true even if the negotiated TLS version is TLSv1.2 or earlier.
82   // This value is also true if this is client side connection for
83   // convenience.
84   bool early_data_finish;
85 };
86 
87 struct TCPHint {
88   size_t write_buffer_size;
89   uint32_t rwin;
90 };
91 
92 template <typename T> using EVCb = void (*)(struct ev_loop *, T *, int);
93 
94 using IOCb = EVCb<ev_io>;
95 using TimerCb = EVCb<ev_timer>;
96 
97 struct Connection {
98   Connection(struct ev_loop *loop, int fd, SSL *ssl, MemchunkPool *mcpool,
99              ev_tstamp write_timeout, ev_tstamp read_timeout,
100              const RateLimitConfig &write_limit,
101              const RateLimitConfig &read_limit, IOCb writecb, IOCb readcb,
102              TimerCb timeoutcb, void *data, size_t tls_dyn_rec_warmup_threshold,
103              ev_tstamp tls_dyn_rec_idle_timeout, Proto proto);
104   ~Connection();
105 
106   void disconnect();
107 
108   void prepare_client_handshake();
109   void prepare_server_handshake();
110 
111   int tls_handshake();
112   int write_tls_pending_handshake();
113 
114   int check_http2_requirement();
115 
116   // All write_* and writev_clear functions return number of bytes
117   // written.  If nothing cannot be written (e.g., there is no
118   // allowance in RateLimit or underlying connection blocks), return
119   // 0.  SHRPX_ERR_NETWORK is returned in case of error.
120   //
121   // All read_* functions return number of bytes read.  If nothing
122   // cannot be read (e.g., there is no allowance in Ratelimit or
123   // underlying connection blocks), return 0.  SHRPX_ERR_EOF is
124   // returned in case of EOF and no data was read.  Otherwise
125   // SHRPX_ERR_NETWORK is return in case of error.
126   ssize_t write_tls(const void *data, size_t len);
127   ssize_t read_tls(void *data, size_t len);
128 
129   size_t get_tls_write_limit();
130   // Updates the number of bytes written in warm up period.
131   void update_tls_warmup_writelen(size_t n);
132   // Tells there is no immediate write now.  This triggers timer to
133   // determine fallback to short record size mode.
134   void start_tls_write_idle();
135 
136   ssize_t write_clear(const void *data, size_t len);
137   ssize_t writev_clear(struct iovec *iov, int iovcnt);
138   ssize_t read_clear(void *data, size_t len);
139 
140   void handle_tls_pending_read();
141 
142   void set_ssl(SSL *ssl);
143 
144   int get_tcp_hint(TCPHint *hint) const;
145 
146   // These functions are provided for read timer which is frequently
147   // restarted.  We do a trick to make a bit more efficient than just
148   // calling ev_timer_again().
149 
150   // Restarts read timer with timeout value |t|.
151   void again_rt(ev_tstamp t);
152   // Restarts read timer without chainging timeout.
153   void again_rt();
154   // Returns true if read timer expired.
155   bool expired_rt();
156 
157   TLSConnection tls;
158   ev_io wev;
159   ev_io rev;
160   ev_timer wt;
161   ev_timer rt;
162   RateLimit wlimit;
163   RateLimit rlimit;
164   struct ev_loop *loop;
165   void *data;
166   int fd;
167   size_t tls_dyn_rec_warmup_threshold;
168   ev_tstamp tls_dyn_rec_idle_timeout;
169   // Application protocol used over the connection.  This field is not
170   // used in this object at the moment.  The rest of the program may
171   // use this value when it is useful.
172   Proto proto;
173   // The point of time when last read is observed.  Note: since we use
174   // |rt| as idle timer, the activity is not limited to read.
175   ev_tstamp last_read;
176   // Timeout for read timer |rt|.
177   ev_tstamp read_timeout;
178 };
179 
180 // Creates BIO_method shared by all SSL objects.
181 BIO_METHOD *create_bio_method();
182 
183 } // namespace shrpx
184 
185 #endif // SHRPX_CONNECTION_H
186