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 */
38enum 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 */
129enum 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 */
172enum 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 */
189enum 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 */
201enum 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 */
219enum 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 */
295enum 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
316struct SPDYF_Stream;
317
318struct 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 */
334typedef 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 */
351typedef 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 */
369typedef 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 */
379struct __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 */
392struct __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 */
404struct 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 */
486struct 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 */
519struct 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 */
602struct 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 */
860struct 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 */
1003struct 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 */
1178struct SPDYF_Response_Queue *
1179SPDYF_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 */
1196void
1197SPDYF_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 */
1208int
1209SPDYF_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 */
1224int
1225SPDYF_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 */
1241ssize_t
1242SPDYF_name_value_to_stream(struct SPDY_NameValue * container[],
1243							int num_containers,
1244							void **stream);
1245
1246#endif
1247