Home | History | Annotate | Download | only in microspdy
      1 /*
      2     This file is part of libmicrospdy
      3     Copyright Copyright (C) 2012 Andrey Uzunov
      4 
      5     This program is free software: you can redistribute it and/or modify
      6     it under the terms of the GNU General Public License as published by
      7     the Free Software Foundation, either version 3 of the License, or
      8     (at your option) any later version.
      9 
     10     This program is distributed in the hope that it will be useful,
     11     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13     GNU General Public License for more details.
     14 
     15     You should have received a copy of the GNU General Public License
     16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17 */
     18 
     19 /**
     20  * @file structures.h
     21  * @brief  internal and public structures -- most of the structs used by
     22  * 			the library are defined here
     23  * @author Andrey Uzunov
     24  */
     25 
     26 #ifndef STRUCTURES_H
     27 #define STRUCTURES_H
     28 
     29 #include "platform.h"
     30 #include "microspdy.h"
     31 #include "io.h"
     32 
     33 
     34 /**
     35  * All possible SPDY control frame types. The number is used in the header
     36  * of the control frame.
     37  */
     38 enum SPDY_CONTROL_FRAME_TYPES
     39 {
     40 	/**
     41 	 * The SYN_STREAM control frame allows the sender to asynchronously
     42 	 * create a stream between the endpoints.
     43 	 */
     44 	SPDY_CONTROL_FRAME_TYPES_SYN_STREAM = 1,
     45 
     46 	/**
     47 	 * SYN_REPLY indicates the acceptance of a stream creation by
     48 	 * the recipient of a SYN_STREAM frame.
     49 	 */
     50 	SPDY_CONTROL_FRAME_TYPES_SYN_REPLY = 2,
     51 
     52 	/**
     53 	 * The RST_STREAM frame allows for abnormal termination of a stream.
     54 	 * When sent by the creator of a stream, it indicates the creator
     55 	 * wishes to cancel the stream. When sent by the recipient of a
     56 	 * stream, it indicates an error or that the recipient did not want
     57 	 * to accept the stream, so the stream should be closed.
     58 	 */
     59 	SPDY_CONTROL_FRAME_TYPES_RST_STREAM = 3,
     60 
     61 	/**
     62 	 * A SETTINGS frame contains a set of id/value pairs for
     63 	 * communicating configuration data about how the two endpoints may
     64 	 * communicate. SETTINGS frames can be sent at any time by either
     65 	 * endpoint, are optionally sent, and are fully asynchronous. When
     66 	 * the server is the sender, the sender can request that
     67 	 * configuration data be persisted by the client across SPDY
     68 	 * sessions and returned to the server in future communications.
     69 	 */
     70 	SPDY_CONTROL_FRAME_TYPES_SETTINGS = 4,
     71 
     72 	/**
     73 	 * The PING control frame is a mechanism for measuring a minimal
     74 	 * round-trip time from the sender. It can be sent from the client
     75 	 * or the server. Recipients of a PING frame should send an
     76 	 * identical frame to the sender as soon as possible (if there is
     77 	 * other pending data waiting to be sent, PING should take highest
     78 	 * priority). Each ping sent by a sender should use a unique ID.
     79 	 */
     80 	SPDY_CONTROL_FRAME_TYPES_PING = 6,
     81 
     82 	/**
     83 	 * The GOAWAY control frame is a mechanism to tell the remote side
     84 	 * of the connection to stop creating streams on this session. It
     85 	 * can be sent from the client or the server.
     86 	 */
     87 	SPDY_CONTROL_FRAME_TYPES_GOAWAY = 7,
     88 
     89 	/**
     90 	 * The HEADERS frame augments a stream with additional headers. It
     91 	 * may be optionally sent on an existing stream at any time.
     92 	 * Specific application of the headers in this frame is
     93 	 * application-dependent. The name/value header block within this
     94 	 * frame is compressed.
     95 	 */
     96 	SPDY_CONTROL_FRAME_TYPES_HEADERS = 8,
     97 
     98 	/**
     99 	 * The WINDOW_UPDATE control frame is used to implement per stream
    100 	 * flow control in SPDY. Flow control in SPDY is per hop, that is,
    101 	 * only between the two endpoints of a SPDY connection. If there are
    102 	 * one or more intermediaries between the client and the origin
    103 	 * server, flow control signals are not explicitly forwarded by the
    104 	 * intermediaries.
    105 	 */
    106 	SPDY_CONTROL_FRAME_TYPES_WINDOW_UPDATE = 9,
    107 
    108 	/**
    109 	 * The CREDENTIAL control frame is used by the client to send
    110 	 * additional client certificates to the server. A SPDY client may
    111 	 * decide to send requests for resources from different origins on
    112 	 * the same SPDY session if it decides that that server handles both
    113 	 * origins. For example if the IP address associated with both
    114 	 * hostnames matches and the SSL server certificate presented in the
    115 	 * initial handshake is valid for both hostnames. However, because
    116 	 * the SSL connection can contain at most one client certificate,
    117 	 * the client needs a mechanism to send additional client
    118 	 * certificates to the server.
    119 	 */
    120 	SPDY_CONTROL_FRAME_TYPES_CREDENTIAL = 11
    121 };
    122 
    123 
    124 /**
    125  * SPDY_SESSION_STATUS is used to show the current receiving state
    126  * of each session, i.e. what is expected to come now, and how it should
    127  * be handled.
    128  */
    129 enum SPDY_SESSION_STATUS
    130 {
    131 	/**
    132 	 * The session is in closing state, do not read read anything from
    133 	 * it. Do not write anything to it.
    134 	 */
    135 	SPDY_SESSION_STATUS_CLOSING = 0,
    136 
    137 	/**
    138 	 * Wait for new SPDY frame to come.
    139 	 */
    140 	SPDY_SESSION_STATUS_WAIT_FOR_HEADER = 1,
    141 
    142 	/**
    143 	 * The standard 8 byte header of the SPDY frame was received and
    144 	 * handled. Wait for the specific (sub)headers according to the
    145 	 * frame type.
    146 	 */
    147 	SPDY_SESSION_STATUS_WAIT_FOR_SUBHEADER = 2,
    148 
    149 	/**
    150 	 * The specific (sub)headers were received and handled. Wait for the
    151 	 * "body", i.e. wait for the name/value pairs compressed by zlib.
    152 	 */
    153 	SPDY_SESSION_STATUS_WAIT_FOR_BODY = 3,
    154 
    155 	/**
    156 	 * Ignore all the bytes read from the socket, e.g. larger frames.
    157 	 */
    158 	SPDY_SESSION_STATUS_IGNORE_BYTES= 4,
    159 
    160 	/**
    161 	 * The session is in pre-closing state, do not read read anything
    162 	 * from it. In this state the output queue will be written to the
    163 	 * socket.
    164 	 */
    165 	SPDY_SESSION_STATUS_FLUSHING = 5,
    166 };
    167 
    168 
    169 /**
    170  * Specific flags for the SYN_STREAM control frame.
    171  */
    172 enum SPDY_SYN_STREAM_FLAG
    173 {
    174 	/**
    175 	 * The sender won't send any more frames on this stream.
    176 	 */
    177 	SPDY_SYN_STREAM_FLAG_FIN = 1,
    178 
    179 	/**
    180 	 * The sender creates this stream as unidirectional.
    181 	 */
    182 	SPDY_SYN_STREAM_FLAG_UNIDIRECTIONAL = 2
    183 };
    184 
    185 
    186 /**
    187  * Specific flags for the SYN_REPLY control frame.
    188  */
    189 enum SPDY_SYN_REPLY_FLAG
    190 {
    191 	/**
    192 	 * The sender won't send any more frames on this stream.
    193 	 */
    194 	SPDY_SYN_REPLY_FLAG_FIN = 1
    195 };
    196 
    197 
    198 /**
    199  * Specific flags for the data frame.
    200  */
    201 enum SPDY_DATA_FLAG
    202 {
    203 	/**
    204 	 * The sender won't send any more frames on this stream.
    205 	 */
    206 	SPDY_DATA_FLAG_FIN = 1,
    207 
    208 	/**
    209 	 * The data in the frame is compressed.
    210 	 * This flag appears only in the draft on ietf.org but not on
    211 	 * chromium.org.
    212 	 */
    213 	SPDY_DATA_FLAG_COMPRESS = 2
    214 };
    215 
    216 /**
    217  * Status code within RST_STREAM control frame.
    218  */
    219 enum SPDY_RST_STREAM_STATUS
    220 {
    221 	/**
    222 	 * This is a generic error, and should only be used if a more
    223 	 * specific error is not available.
    224 	 */
    225 	SPDY_RST_STREAM_STATUS_PROTOCOL_ERROR = 1,
    226 
    227 	/**
    228 	 * This is returned when a frame is received for a stream which is
    229 	 * not active.
    230 	 */
    231 	SPDY_RST_STREAM_STATUS_INVALID_STREAM = 2,
    232 
    233 	/**
    234 	 * Indicates that the stream was refused before any processing has
    235 	 * been done on the stream.
    236 	 */
    237 	SPDY_RST_STREAM_STATUS_REFUSED_STREAM = 3,
    238 
    239 	/**
    240 	 * Indicates that the recipient of a stream does not support the
    241 	 * SPDY version requested.
    242 	 */
    243 	SPDY_RST_STREAM_STATUS_UNSUPPORTED_VERSION = 4,
    244 
    245 	/**
    246 	 * Used by the creator of a stream to indicate that the stream is
    247 	 * no longer needed.
    248 	 */
    249 	SPDY_RST_STREAM_STATUS_CANCEL = 5,
    250 
    251 	/**
    252 	 * This is a generic error which can be used when the implementation
    253 	 * has internally failed, not due to anything in the protocol.
    254 	 */
    255 	SPDY_RST_STREAM_STATUS_INTERNAL_ERROR = 6,
    256 
    257 	/**
    258 	 * The endpoint detected that its peer violated the flow control
    259 	 * protocol.
    260 	 */
    261 	SPDY_RST_STREAM_STATUS_FLOW_CONTROL_ERROR = 7,
    262 
    263 	/**
    264 	 * The endpoint received a SYN_REPLY for a stream already open.
    265 	 */
    266 	SPDY_RST_STREAM_STATUS_STREAM_IN_USE = 8,
    267 
    268 	/**
    269 	 * The endpoint received a data or SYN_REPLY frame for a stream
    270 	 * which is half closed.
    271 	 */
    272 	SPDY_RST_STREAM_STATUS_STREAM_ALREADY_CLOSED = 9,
    273 
    274 	/**
    275 	 * The server received a request for a resource whose origin does
    276 	 * not have valid credentials in the client certificate vector.
    277 	 */
    278 	SPDY_RST_STREAM_STATUS_INVALID_CREDENTIALS = 10,
    279 
    280 	/**
    281 	 * The endpoint received a frame which this implementation could not
    282 	 * support. If FRAME_TOO_LARGE is sent for a SYN_STREAM, HEADERS,
    283 	 * or SYN_REPLY frame without fully processing the compressed
    284 	 * portion of those frames, then the compression state will be
    285 	 * out-of-sync with the other endpoint. In this case, senders of
    286 	 * FRAME_TOO_LARGE MUST close the session.
    287 	 */
    288 	SPDY_RST_STREAM_STATUS_FRAME_TOO_LARGE = 11
    289 };
    290 
    291 
    292 /**
    293  * Status code within GOAWAY control frame.
    294  */
    295 enum SPDY_GOAWAY_STATUS
    296 {
    297 	/**
    298 	 * This is a normal session teardown.
    299 	 */
    300 	SPDY_GOAWAY_STATUS_OK = 0,
    301 
    302 	/**
    303 	 * This is a generic error, and should only be used if a more
    304 	 * specific error is not available.
    305 	 */
    306 	SPDY_GOAWAY_STATUS_PROTOCOL_ERROR = 1,
    307 
    308 	/**
    309 	 * This is a generic error which can be used when the implementation
    310 	 * has internally failed, not due to anything in the protocol.
    311 	 */
    312 	SPDY_GOAWAY_STATUS_INTERNAL_ERROR = 11
    313 };
    314 
    315 
    316 struct SPDYF_Stream;
    317 
    318 struct SPDYF_Response_Queue;
    319 
    320 
    321 /**
    322  * Callback for received new data chunk.
    323  *
    324  * @param cls client-defined closure
    325  * @param stream handler
    326  * @param buf data chunk from the data
    327  * @param size the size of the data chunk 'buf' in bytes
    328  * @param more false if this is the last frame received on this stream. Note:
    329  *             true does not mean that more data will come, exceptional
    330  *             situation is possible
    331  * @return SPDY_YES to continue calling the function,
    332  *         SPDY_NO to stop calling the function for this stream
    333  */
    334 typedef int
    335 (*SPDYF_NewDataCallback) (void * cls,
    336 					 struct SPDYF_Stream *stream,
    337 					 const void * buf,
    338 					 size_t size,
    339 					 bool more);
    340 
    341 
    342 /**
    343  * Callback for new stream. To be used in the application layer of the
    344  * lib.
    345  *
    346  * @param cls
    347  * @param stream the new stream
    348  * @return SPDY_YES on success,
    349  *         SPDY_NO if error occurs
    350  */
    351 typedef int
    352 (*SPDYF_NewStreamCallback) (void *cls,
    353 						struct SPDYF_Stream * stream);
    354 
    355 
    356 /**
    357  * Callback to be called when the response queue object was handled and
    358  * the data was already sent.
    359  *
    360  * @param cls
    361  * @param response_queue the SPDYF_Response_Queue structure which will
    362  * 			be cleaned very soon
    363  * @param status shows if actually the response was sent or it was
    364  * 			discarded by the lib for any reason (e.g., closing session,
    365  * 			closing stream, stopping daemon, etc.). It is possible that
    366  * 			status indicates an error but part of the response (in one
    367  * 			or several frames) was sent to the client.
    368  */
    369 typedef void
    370 (*SPDYF_ResponseQueueResultCallback) (void * cls,
    371 								struct SPDYF_Response_Queue *response_queue,
    372 								enum SPDY_RESPONSE_RESULT status);
    373 
    374 
    375 /**
    376  * Representation of the control frame's headers, which are common for
    377  * all types.
    378  */
    379 struct __attribute__((__packed__)) SPDYF_Control_Frame
    380 {
    381 	uint16_t version : 15;
    382 	uint16_t control_bit : 1; /* always 1 for control frames */
    383 	uint16_t type;
    384 	uint32_t flags : 8;
    385 	uint32_t length : 24;
    386 };
    387 
    388 
    389 /**
    390  * Representation of the data frame's headers.
    391  */
    392 struct __attribute__((__packed__)) SPDYF_Data_Frame
    393 {
    394 	uint32_t stream_id : 31;
    395 	uint32_t control_bit : 1; /* always 0 for data frames */
    396 	uint32_t flags : 8;
    397 	uint32_t length : 24;
    398 };
    399 
    400 
    401 /**
    402  * Queue of the responses, to be handled (e.g. compressed) and sent later.
    403  */
    404 struct SPDYF_Response_Queue
    405 {
    406 	/**
    407 	 * This is a doubly-linked list.
    408 	 */
    409 	struct SPDYF_Response_Queue *next;
    410 
    411 	/**
    412 	 * This is a doubly-linked list.
    413 	 */
    414 	struct SPDYF_Response_Queue *prev;
    415 
    416 	/**
    417 	 * Stream (Request) for which is the response.
    418 	 */
    419 	struct SPDYF_Stream *stream;
    420 
    421 	/**
    422 	 * Response structure with all the data (uncompressed headers) to be sent.
    423 	 */
    424 	struct SPDY_Response *response;
    425 
    426 	/**
    427 	 * Control frame. The length field should be set after compressing
    428 	 * the headers!
    429 	 */
    430 	struct SPDYF_Control_Frame *control_frame;
    431 
    432 	/**
    433 	 * Data frame. The length field should be set after compressing
    434 	 * the body!
    435 	 */
    436 	struct SPDYF_Data_Frame *data_frame;
    437 
    438 	/**
    439 	 * Data to be sent: name/value pairs in control frames or body in data frames.
    440 	 */
    441 	void *data;
    442 
    443 	/**
    444 	 * Specific handler for different frame types.
    445 	 */
    446 	int (* process_response_handler)(struct SPDY_Session *session);
    447 
    448 	/**
    449 	 * Callback to be called when the last bytes from the response was sent
    450 	 * to the client.
    451 	 */
    452 	SPDYF_ResponseQueueResultCallback frqcb;
    453 
    454 	/**
    455 	 * Closure for frqcb.
    456 	 */
    457 	void *frqcb_cls;
    458 
    459 	/**
    460 	 * Callback to be used by the application layer.
    461 	 */
    462 	SPDY_ResponseResultCallback rrcb;
    463 
    464 	/**
    465 	 * Closure for rcb.
    466 	 */
    467 	void *rrcb_cls;
    468 
    469 	/**
    470 	 * Data size.
    471 	 */
    472 	size_t data_size;
    473 
    474 	/**
    475 	 * True if data frame should be sent. False if control frame should
    476 	 * be sent.
    477 	 */
    478 	bool is_data;
    479 };
    480 
    481 
    482 
    483 /**
    484  * Collection of HTTP headers used in requests and responses.
    485  */
    486 struct SPDY_NameValue
    487 {
    488 	/**
    489 	* This is a doubly-linked list.
    490 	*/
    491 	struct SPDY_NameValue *next;
    492 
    493 	/**
    494 	* This is a doubly-linked list.
    495 	*/
    496 	struct SPDY_NameValue *prev;
    497 
    498 	/**
    499 	* Null terminated string for name.
    500 	*/
    501     char *name;
    502 
    503 	/**
    504 	* Array of Null terminated strings for value. num_values is the
    505 	* length of the array.
    506 	*/
    507 	char **value;
    508 
    509 	/**
    510 	* Number of values, this is >= 0.
    511 	*/
    512 	unsigned int num_values;
    513 };
    514 
    515 
    516 /**
    517  * Represents a SPDY stream
    518  */
    519 struct SPDYF_Stream
    520 {
    521 	/**
    522 	 * This is a doubly-linked list.
    523 	 */
    524 	struct SPDYF_Stream *next;
    525 
    526 	/**
    527 	 * This is a doubly-linked list.
    528 	 */
    529 	struct SPDYF_Stream *prev;
    530 
    531 	/**
    532 	 * Reference to the SPDY_Session struct.
    533 	 */
    534 	struct SPDY_Session *session;
    535 
    536 	/**
    537 	 * Name value pairs, sent within the frame which created the stream.
    538 	 */
    539 	struct SPDY_NameValue *headers;
    540 
    541 	/**
    542 	 * Any object to be used by the application layer.
    543 	 */
    544 	void *cls;
    545 
    546 	/**
    547 	 * This stream's ID.
    548 	 */
    549 	uint32_t stream_id;
    550 
    551 	/**
    552 	 * Stream to which this one is associated.
    553 	 */
    554 	uint32_t assoc_stream_id;
    555 
    556 	/**
    557 	 * The window of the data within data frames.
    558 	 */
    559 	uint32_t window_size;
    560 
    561 	/**
    562 	 * Stream priority. 0 is the highest, 7 is the lowest.
    563 	 */
    564 	uint8_t priority;
    565 
    566 	/**
    567 	 * Integer specifying the index in the server's CREDENTIAL vector of
    568 	 * the client certificate to be used for this request The value 0
    569 	 * means no client certificate should be associated with this stream.
    570 	 */
    571 	uint8_t slot;
    572 
    573 	/**
    574 	 * If initially the stream was created as unidirectional.
    575 	 */
    576 	bool flag_unidirectional;
    577 
    578 	/**
    579 	 * If the stream won't be used for receiving frames anymore. The
    580 	 * client has sent FLAG_FIN or the stream was terminated with
    581 	 * RST_STREAM.
    582 	 */
    583 	bool is_in_closed;
    584 
    585 	/**
    586 	 * If the stream won't be used for sending out frames anymore. The
    587 	 * server has sent FLAG_FIN or the stream was terminated with
    588 	 * RST_STREAM.
    589 	 */
    590 	bool is_out_closed;
    591 
    592 	/**
    593 	 * Which entity (server/client) has created the stream.
    594 	 */
    595 	bool is_server_initiator;
    596 };
    597 
    598 
    599 /**
    600  * Represents a SPDY session which is just a TCP connection
    601  */
    602 struct SPDY_Session
    603 {
    604 	/**
    605 	 * zlib stream for decompressing all the name/pair values from the
    606 	 * received frames. All the received compressed data must be
    607 	 * decompressed within one context: this stream. Thus, it should be
    608 	 * unique for the session and initialized at its creation.
    609 	 */
    610 	z_stream zlib_recv_stream;
    611 
    612 	/**
    613 	 * zlib stream for compressing all the name/pair values from the
    614 	 * frames to be sent. All the sent compressed data must be
    615 	 * compressed within one context: this stream. Thus, it should be
    616 	 * unique for the session and initialized at its creation.
    617 	 */
    618 	z_stream zlib_send_stream;
    619 
    620 	/**
    621 	 * This is a doubly-linked list.
    622 	 */
    623 	struct SPDY_Session *next;
    624 
    625 	/**
    626 	 * This is a doubly-linked list.
    627 	 */
    628 	struct SPDY_Session *prev;
    629 
    630 	/**
    631 	 * Reference to the SPDY_Daemon struct.
    632 	 */
    633 	struct SPDY_Daemon *daemon;
    634 
    635 	/**
    636 	 * Foreign address (of length addr_len).
    637 	 */
    638 	struct sockaddr *addr;
    639 
    640 	/**
    641 	 * Head of doubly-linked list of the SPDY streams belonging to the
    642 	 * session.
    643 	 */
    644 	struct SPDYF_Stream *streams_head;
    645 
    646 	/**
    647 	 * Tail of doubly-linked list of the streams.
    648 	 */
    649 	struct SPDYF_Stream *streams_tail;
    650 
    651 	/**
    652 	 * Unique IO context for the session. Initialized on each creation
    653 	 * (actually when the TCP connection is established).
    654 	 */
    655 	void *io_context;
    656 
    657 	/**
    658 	 * Head of doubly-linked list of the responses.
    659 	 */
    660 	struct SPDYF_Response_Queue *response_queue_head;
    661 
    662 	/**
    663 	 * Tail of doubly-linked list of the responses.
    664 	 */
    665 	struct SPDYF_Response_Queue *response_queue_tail;
    666 
    667 	/**
    668 	 * Buffer for reading requests.
    669 	 */
    670 	void *read_buffer;
    671 
    672 	/**
    673 	 * Buffer for writing responses.
    674 	 */
    675 	void *write_buffer;
    676 
    677 	/**
    678 	 * Specific handler for the frame that is currently being received.
    679 	 */
    680 	void (*frame_handler) (struct SPDY_Session * session);
    681 
    682 	/**
    683 	 * Closure for frame_handler.
    684 	 */
    685 	void *frame_handler_cls;
    686 
    687 	/**
    688 	 * Extra field to be used by the user with set/get func for whatever
    689 	 * purpose he wants.
    690 	 */
    691 	void *user_cls;
    692 
    693 	/**
    694 	 * Function to initialize the IO context for a new session.
    695 	 */
    696 	SPDYF_IONewSession fio_new_session;
    697 
    698 	/**
    699 	 * Function to deinitialize the IO context for a session.
    700 	 */
    701 	SPDYF_IOCloseSession fio_close_session;
    702 
    703 	/**
    704 	 * Function to read data from socket.
    705 	 */
    706 	SPDYF_IORecv fio_recv;
    707 
    708 	/**
    709 	 * Function to write data to socket.
    710 	 */
    711 	SPDYF_IOSend fio_send;
    712 
    713 	/**
    714 	 * Function to check for pending data in IO buffers.
    715 	 */
    716 	SPDYF_IOIsPending fio_is_pending;
    717 
    718 	/**
    719 	 * Function to call before writing set of frames.
    720 	 */
    721 	SPDYF_IOBeforeWrite fio_before_write;
    722 
    723 	/**
    724 	 * Function to call after writing set of frames.
    725 	 */
    726 	SPDYF_IOAfterWrite fio_after_write;
    727 
    728 	/**
    729 	 * Number of bytes that the lib must ignore immediately after they
    730 	 * are read from the TLS socket without adding them to the read buf.
    731 	 * This is needed, for instance, when receiving frame bigger than
    732 	 * the buffer to avoid deadlock situations.
    733 	 */
    734 	size_t read_ignore_bytes;
    735 
    736 	/**
    737 	 * Size of read_buffer (in bytes).  This value indicates
    738 	 * how many bytes we're willing to read into the buffer;
    739 	 * the real buffer is one byte longer to allow for
    740 	 * adding zero-termination (when needed).
    741 	 */
    742 	size_t read_buffer_size;
    743 
    744 	/**
    745 	 * Position where we currently append data in
    746 	 * read_buffer (last valid position).
    747 	 */
    748 	size_t read_buffer_offset;
    749 
    750 	/**
    751 	 * Position until where everything was already read
    752 	 */
    753 	size_t read_buffer_beginning;
    754 
    755 	/**
    756 	 * Size of write_buffer (in bytes).  This value indicates
    757 	 * how many bytes we're willing to prepare for writing.
    758 	 */
    759 	size_t write_buffer_size;
    760 
    761 	/**
    762 	 * Position where we currently append data in
    763 	 * write_buffer (last valid position).
    764 	 */
    765 	size_t write_buffer_offset;
    766 
    767 	/**
    768 	 * Position until where everything was already written to the socket
    769 	 */
    770 	size_t write_buffer_beginning;
    771 
    772 	/**
    773 	 * Last time this connection had any activity
    774 	 * (reading or writing). In milliseconds.
    775 	 */
    776 	unsigned long long last_activity;
    777 
    778 	/**
    779 	 * Socket for this connection.  Set to -1 if
    780 	 * this connection has died (daemon should clean
    781 	 * up in that case).
    782 	 */
    783 	int socket_fd;
    784 
    785 	/**
    786 	 * Length of the foreign address.
    787 	 */
    788 	socklen_t addr_len;
    789 
    790 	/**
    791 	 * The biggest stream ID for this session for streams initiated
    792 	 * by the client.
    793 	 */
    794 	uint32_t last_in_stream_id;
    795 
    796 	/**
    797 	 * The biggest stream ID for this session for streams initiated
    798 	 * by the server.
    799 	 */
    800 	uint32_t last_out_stream_id;
    801 
    802 	/**
    803 	 * This value is updated whenever SYN_REPLY or RST_STREAM are sent
    804 	 * and is used later in GOAWAY frame.
    805 	 * TODO it is not clear in the draft what happens when streams are
    806 	 * not answered in the order of their IDs. Moreover, why should we
    807 	 * send GOAWAY with the ID of received bogus SYN_STREAM with huge ID?
    808 	 */
    809 	uint32_t last_replied_to_stream_id;
    810 
    811 	/**
    812 	 * Shows the stream id of the currently handled frame. This value is
    813 	 * to be used when sending RST_STREAM in answer to a problematic
    814 	 * frame, e.g. larger than supported.
    815 	 */
    816 	uint32_t current_stream_id;
    817 
    818 	/**
    819 	 * Maximum number of frames to be written to the socket at once. The
    820    * library tries to send max_num_frames in a single call to SPDY_run
    821    * for a single session. This means no requests can be received nor
    822    * other sessions can send data as long the current one has enough
    823    * frames to send and there is no error on writing.
    824 	 */
    825 	uint32_t max_num_frames;
    826 
    827 	/**
    828 	 * Shows the current receiving state the session, i.e. what is
    829 	 * expected to come now, and how it shold be handled.
    830 	 */
    831 	enum SPDY_SESSION_STATUS status;
    832 
    833 	/**
    834 	 * Has this socket been closed for reading (i.e.
    835 	 * other side closed the connection)?  If so,
    836 	 * we must completely close the connection once
    837 	 * we are done sending our response (and stop
    838 	 * trying to read from this socket).
    839 	 */
    840 	bool read_closed;
    841 
    842 	/**
    843 	 * If the server sends GOAWAY, it must ignore all SYN_STREAMS for
    844 	 * this session. Normally the server will soon close the TCP session.
    845 	 */
    846 	bool is_goaway_sent;
    847 
    848 	/**
    849 	 * If the server receives GOAWAY, it must not send new SYN_STREAMS
    850 	 * on this session. Normally the client will soon close the TCP
    851 	 * session.
    852 	 */
    853 	bool is_goaway_received;
    854 };
    855 
    856 
    857 /**
    858  * State and settings kept for each SPDY daemon.
    859  */
    860 struct SPDY_Daemon
    861 {
    862 
    863 	/**
    864 	 * Tail of doubly-linked list of our current, active sessions.
    865 	 */
    866 	struct SPDY_Session *sessions_head;
    867 
    868 	/**
    869 	 * Tail of doubly-linked list of our current, active sessions.
    870 	 */
    871 	struct SPDY_Session *sessions_tail;
    872 
    873 	/**
    874 	 * Tail of doubly-linked list of connections to clean up.
    875 	 */
    876 	struct SPDY_Session *cleanup_head;
    877 
    878 	/**
    879 	 * Tail of doubly-linked list of connections to clean up.
    880 	 */
    881 	struct SPDY_Session *cleanup_tail;
    882 
    883 	/**
    884 	 * Unique IO context for the daemon. Initialized on daemon start.
    885 	 */
    886 	void *io_context;
    887 
    888 	/**
    889 	 * Certificate file of the server. File path is kept here.
    890 	 */
    891 	char *certfile;
    892 
    893 	/**
    894 	 * Key file for the certificate of the server. File path is
    895 	 * kept here.
    896 	 */
    897 	char *keyfile;
    898 
    899 
    900 	/**
    901 	 * The address to which the listening socket is bound.
    902 	 */
    903 	struct sockaddr *address;
    904 
    905 	/**
    906 	 * Callback called when a new SPDY session is
    907 	 * established by a client
    908 	 */
    909 	SPDY_NewSessionCallback new_session_cb;
    910 
    911 	/**
    912 	 * Callback called when a client closes the session
    913 	 */
    914 	SPDY_SessionClosedCallback session_closed_cb;
    915 
    916 	/**
    917 	 * Callback called when a client sends request
    918 	 */
    919 	SPDY_NewRequestCallback new_request_cb;
    920 
    921 	/**
    922 	* Callback called when HTTP POST params are received
    923 	* after request. To be used by the application layer
    924 	*/
    925 	SPDY_NewDataCallback received_data_cb;
    926 
    927 	/**
    928 	* Callback called when DATA frame is received.
    929 	*/
    930 	SPDYF_NewDataCallback freceived_data_cb;
    931 
    932 	/**
    933 	 * Closure argument for all the callbacks that can be used by the client.
    934 	 */
    935 	void *cls;
    936 
    937 	/**
    938 	 * Callback called when new stream is created.
    939 	 */
    940 	SPDYF_NewStreamCallback fnew_stream_cb;
    941 
    942 	/**
    943 	 * Closure argument for all the callbacks defined in the framing layer.
    944 	 */
    945 	void *fcls;
    946 
    947 	/**
    948 	 * Function to initialize the IO context for the daemon.
    949 	 */
    950 	SPDYF_IOInit fio_init;
    951 
    952 	/**
    953 	 * Function to deinitialize the IO context for the daemon.
    954 	 */
    955 	SPDYF_IODeinit fio_deinit;
    956 
    957 	/**
    958 	 * After how many milliseconds of inactivity should
    959 	 * connections time out? Zero for no timeout.
    960 	 */
    961 	unsigned long long session_timeout;
    962 
    963 	/**
    964 	 * Listen socket.
    965 	 */
    966 	int socket_fd;
    967 
    968 	/**
    969    * This value is inherited by all sessions of the daemon.
    970 	 * Maximum number of frames to be written to the socket at once. The
    971    * library tries to send max_num_frames in a single call to SPDY_run
    972    * for a single session. This means no requests can be received nor
    973    * other sessions can send data as long the current one has enough
    974    * frames to send and there is no error on writing.
    975 	 */
    976 	uint32_t max_num_frames;
    977 
    978 	/**
    979 	 * Daemon's options.
    980 	 */
    981 	enum SPDY_DAEMON_OPTION options;
    982 
    983 	/**
    984 	 * Daemon's flags.
    985 	 */
    986 	enum SPDY_DAEMON_FLAG flags;
    987 
    988 	/**
    989 	 * IO subsystem type used by daemon and all its sessions.
    990 	 */
    991 	enum SPDY_IO_SUBSYSTEM io_subsystem;
    992 
    993 	/**
    994 	 * Listen port.
    995 	 */
    996 	uint16_t port;
    997 };
    998 
    999 
   1000 /**
   1001  * Represents a SPDY response.
   1002  */
   1003 struct SPDY_Response
   1004 {
   1005 	/**
   1006 	 * Raw uncompressed stream of the name/value pairs in SPDY frame
   1007 	 * used for the HTTP headers.
   1008 	 */
   1009     void *headers;
   1010 
   1011 	/**
   1012 	 * Raw stream of the data to be sent. Equivalent to the body in HTTP
   1013 	 * response.
   1014 	 */
   1015 	void *data;
   1016 
   1017 	/**
   1018 	 * Callback function to be used when the response data is provided
   1019 	 * with callbacks. In this case data must be NULL and data_size must
   1020 	 * be 0.
   1021 	 */
   1022 	SPDY_ResponseCallback rcb;
   1023 
   1024 	/**
   1025 	 * Extra argument to rcb.
   1026 	 */
   1027 	void *rcb_cls;
   1028 
   1029 	/**
   1030 	 * Length of headers.
   1031 	 */
   1032 	size_t headers_size;
   1033 
   1034 	/**
   1035 	 * Length of data.
   1036 	 */
   1037 	size_t data_size;
   1038 
   1039 	/**
   1040 	 * The callback func will be called to get that amount of bytes to
   1041 	 * put them into a DATA frame. It is either user preffered or
   1042 	 * the maximum supported by the lib value.
   1043 	 */
   1044 	uint32_t rcb_block_size;
   1045 };
   1046 
   1047 
   1048 /* Macros for handling data and structures */
   1049 
   1050 
   1051 /**
   1052  * Insert an element at the head of a DLL. Assumes that head, tail and
   1053  * element are structs with prev and next fields.
   1054  *
   1055  * @param head pointer to the head of the DLL (struct ? *)
   1056  * @param tail pointer to the tail of the DLL (struct ? *)
   1057  * @param element element to insert (struct ? *)
   1058  */
   1059 #define DLL_insert(head,tail,element) do { \
   1060 	(element)->next = (head); \
   1061 	(element)->prev = NULL; \
   1062 	if ((tail) == NULL) \
   1063 		(tail) = element; \
   1064 	else \
   1065 		(head)->prev = element; \
   1066 	(head) = (element); } while (0)
   1067 
   1068 
   1069 /**
   1070  * Remove an element from a DLL. Assumes
   1071  * that head, tail and element are structs
   1072  * with prev and next fields.
   1073  *
   1074  * @param head pointer to the head of the DLL (struct ? *)
   1075  * @param tail pointer to the tail of the DLL (struct ? *)
   1076  * @param element element to remove (struct ? *)
   1077  */
   1078 #define DLL_remove(head,tail,element) do { \
   1079 	if ((element)->prev == NULL) \
   1080 		(head) = (element)->next;  \
   1081 	else \
   1082 		(element)->prev->next = (element)->next; \
   1083 	if ((element)->next == NULL) \
   1084 		(tail) = (element)->prev;  \
   1085 	else \
   1086 		(element)->next->prev = (element)->prev; \
   1087 	(element)->next = NULL; \
   1088 	(element)->prev = NULL; } while (0)
   1089 
   1090 
   1091 /**
   1092  * Convert all integers in a SPDY control frame headers structure from
   1093  * host byte order to network byte order.
   1094  *
   1095  * @param frame input and output structure (struct SPDY_Control_Frame *)
   1096  */
   1097 #if HAVE_BIG_ENDIAN
   1098 #define SPDYF_CONTROL_FRAME_HTON(frame)
   1099 #else
   1100 #define SPDYF_CONTROL_FRAME_HTON(frame) do { \
   1101 	(*((uint16_t *) frame  )) = (*((uint8_t *) (frame) +1 )) | ((*((uint8_t *) frame  ))<<8);\
   1102 	(frame)->type = htons((frame)->type); \
   1103 	(frame)->length = HTON24((frame)->length); \
   1104 	} while (0)
   1105 #endif
   1106 
   1107 
   1108 /**
   1109  * Convert all integers in a SPDY control frame headers structure from
   1110  * network byte order to host byte order.
   1111  *
   1112  * @param frame input and output structure (struct SPDY_Control_Frame *)
   1113  */
   1114 #if HAVE_BIG_ENDIAN
   1115 #define SPDYF_CONTROL_FRAME_NTOH(frame)
   1116 #else
   1117 #define SPDYF_CONTROL_FRAME_NTOH(frame) do { \
   1118 	(*((uint16_t *) frame  )) = (*((uint8_t *) (frame) +1 )) | ((*((uint8_t *) frame  ))<<8);\
   1119 	(frame)->type = ntohs((frame)->type); \
   1120 	(frame)->length = NTOH24((frame)->length); \
   1121 	} while (0)
   1122 #endif
   1123 
   1124 
   1125 /**
   1126  * Convert all integers in a SPDY data frame headers structure from
   1127  * host byte order to network byte order.
   1128  *
   1129  * @param frame input and output structure (struct SPDY_Data_Frame *)
   1130  */
   1131 #if HAVE_BIG_ENDIAN
   1132 #define SPDYF_DATA_FRAME_HTON(frame)
   1133 #else
   1134 #define SPDYF_DATA_FRAME_HTON(frame) do { \
   1135 	*((uint32_t *) frame  ) = htonl(*((uint32_t *) frame  ));\
   1136 	(frame)->length = HTON24((frame)->length); \
   1137 	} while (0)
   1138 #endif
   1139 
   1140 
   1141 /**
   1142  * Convert all integers in a SPDY data frame headers structure from
   1143  * network byte order to host byte order.
   1144  *
   1145  * @param frame input and output structure (struct SPDY_Data_Frame *)
   1146  */
   1147 #if HAVE_BIG_ENDIAN
   1148 #define SPDYF_DATA_FRAME_NTOH(frame)
   1149 #else
   1150 #define SPDYF_DATA_FRAME_NTOH(frame) do { \
   1151 	*((uint32_t *) frame  ) = ntohl(*((uint32_t *) frame  ));\
   1152 	(frame)->length = NTOH24((frame)->length); \
   1153 	} while (0)
   1154 #endif
   1155 
   1156 
   1157 /**
   1158  * Creates one or more new SPDYF_Response_Queue object to be put on the
   1159  * response queue.
   1160  *
   1161  * @param is_data whether new data frame or new control frame will be
   1162  *                crerated
   1163  * @param data the row stream which will be used as the body of the frame
   1164  * @param data_size length of data
   1165  * @param response object, part of which is the frame
   1166  * @param stream on which data is to be sent
   1167  * @param closestream TRUE if the frame must close the stream (with flag)
   1168  * @param frqcb callback to notify application layer when the frame
   1169  *              has been sent or discarded
   1170  * @param frqcb_cls closure for frqcb
   1171  * @param rrcb callback used by the application layer to notify the
   1172  *             application when the frame has been sent or discarded.
   1173  *             frqcb will call it
   1174  * @param rrcb_cls closure for rrcb
   1175  * @return double linked list of SPDYF_Response_Queue structures: one or
   1176  *         more frames are returned based on the size of the data
   1177  */
   1178 struct SPDYF_Response_Queue *
   1179 SPDYF_response_queue_create(bool is_data,
   1180 						void *data,
   1181 						size_t data_size,
   1182 						struct SPDY_Response *response,
   1183 						struct SPDYF_Stream *stream,
   1184 						bool closestream,
   1185 						SPDYF_ResponseQueueResultCallback frqcb,
   1186 						void *frqcb_cls,
   1187 						SPDY_ResponseResultCallback rrcb,
   1188 						void *rrcb_cls);
   1189 
   1190 
   1191 /**
   1192  * Destroys SPDYF_Response_Queue structure and whatever is in it.
   1193  *
   1194  * @param response_queue to destroy
   1195  */
   1196 void
   1197 SPDYF_response_queue_destroy(struct SPDYF_Response_Queue *response_queue);
   1198 
   1199 
   1200 /**
   1201  * Checks if the container is empty, i.e. created but no values were
   1202  * added to it.
   1203  *
   1204  * @param container
   1205  * @return SPDY_YES if empty
   1206  *         SPDY_NO if not
   1207  */
   1208 int
   1209 SPDYF_name_value_is_empty(struct SPDY_NameValue *container);
   1210 
   1211 
   1212 /**
   1213  * Transforms raw binary decomressed stream of headers
   1214  * into SPDY_NameValue, containing all of the headers and values.
   1215  *
   1216  * @param stream that is to be transformed
   1217  * @param size length of the stream
   1218  * @param container will contain the newly created SPDY_NameValue
   1219  *        container. Should point to NULL.
   1220  * @return SPDY_YES on success
   1221  *         SPDY_NO on memory error
   1222  *         SPDY_INPUT_ERROR if the provided stream is not valid
   1223  */
   1224 int
   1225 SPDYF_name_value_from_stream(void *stream,
   1226 							size_t size,
   1227 							struct SPDY_NameValue ** container);
   1228 
   1229 
   1230 /**
   1231  * Transforms array of objects of name/values tuples, containing HTTP
   1232  * headers, into raw binary stream. The resulting stream is ready to
   1233  * be compressed and sent.
   1234  *
   1235  * @param container one or more SPDY_NameValue objects. Each object
   1236  *        contains multiple number of name/value tuples.
   1237  * @param num_containers length of the array
   1238  * @param stream will contain the resulting stream. Should point to NULL.
   1239  * @return length of stream or value less than 0 indicating error
   1240  */
   1241 ssize_t
   1242 SPDYF_name_value_to_stream(struct SPDY_NameValue * container[],
   1243 							int num_containers,
   1244 							void **stream);
   1245 
   1246 #endif
   1247