internal.h revision 748945ec6f1c67b7efc934ab0808e1d32f2fb98d
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 microspdy/internal.h
21 * @brief  internal functions and macros for the framing layer
22 * @author Andrey Uzunov
23 */
24
25#ifndef INTERNAL_H_H
26#define INTERNAL_H_H
27
28#include "platform.h"
29#include "microspdy.h"
30
31/**
32 * size of read buffers for each connection
33 * must be at least the size of SPDY_MAX_SUPPORTED_FRAME_SIZE
34 */
35#define SPDYF_BUFFER_SIZE 8192
36
37/**
38 * initial size of window for each stream (this is for the data
39 * within data frames that can be handled)
40 */
41#define SPDYF_INITIAL_WINDOW_SIZE 65536
42
43/**
44 * number of frames written to the socket at once. After X frames
45 * everything should be run again. In this way the application can
46 * response to more important requests while a big file is still
47 * being transmitted to the client
48 */
49#define SPDYF_NUM_SENT_FRAMES_AT_ONCE 10
50
51
52/**
53 * Handler for fatal errors.
54 */
55extern SPDY_PanicCallback spdyf_panic;
56
57
58/**
59 * Closure argument for "mhd_panic".
60 */
61extern void *spdyf_panic_cls;
62
63
64/**
65 * Trigger 'panic' action based on fatal errors.
66 *
67 * @param msg error message (const char *)
68 */
69#define SPDYF_PANIC(msg) \
70	spdyf_panic (spdyf_panic_cls, __FILE__, __LINE__, msg)
71
72
73/**
74 * Asserts the validity of an expression.
75 *
76 * @param expr (bool)
77 * @param msg message to print on error (const char *)
78 */
79#define SPDYF_ASSERT(expr, msg) \
80	if(!(expr)){\
81		SPDYF_PANIC(msg);\
82		abort();\
83	}
84
85
86/**
87 * Convert 24 bit integer from host byte order to network byte order.
88 *
89 * @param n input value (int32_t)
90 * @return converted value (uint32_t)
91 */
92#if HAVE_BIG_ENDIAN
93#define HTON24(n) n
94#else
95#define HTON24(n) (((((uint32_t)(n) & 0xFF)) << 16)\
96	| (((uint32_t)(n) & 0xFF00))\
97	| ((((uint32_t)(n) & 0xFF0000)) >> 16))
98#endif
99
100
101/**
102 * Convert 24 bit integer from network byte order to host byte order.
103 *
104 * @param n input value (int32_t)
105 * @return converted value (uint32_t)
106 */
107#if HAVE_BIG_ENDIAN
108#define NTOH24(n) n
109#else
110#define NTOH24(n) (((((uint32_t)(n) & 0xFF)) << 16)\
111	| (((uint32_t)(n) & 0xFF00))\
112	| ((((uint32_t)(n) & 0xFF0000)) >> 16))
113#endif
114
115
116/**
117 * Convert 31 bit integer from network byte order to host byte order.
118 *
119 * @param n input value (int32_t)
120 * @return converted value (uint32_t)
121 */
122#if HAVE_BIG_ENDIAN
123#define NTOH31(n) n
124#else
125#define NTOH31(n) (((((uint32_t)(n) & 0x7F)) << 24) | \
126                  ((((uint32_t)(n) & 0xFF00)) << 8) | \
127                  ((((uint32_t)(n) & 0xFF0000)) >> 8) | \
128                  ((((uint32_t)(n) & 0xFF000000)) >> 24))
129#endif
130
131
132/**
133 * Convert 31 bit integer from host byte order to network byte order.
134 *
135 * @param n input value (int32_t)
136 * @return converted value (uint32_t)
137 */
138#if HAVE_BIG_ENDIAN
139#define HTON31(n) n
140#else
141#define HTON31(n) (((((uint32_t)(n) & 0xFF)) << 24) | \
142                  ((((uint32_t)(n) & 0xFF00)) << 8) | \
143                  ((((uint32_t)(n) & 0xFF0000)) >> 8) | \
144                  ((((uint32_t)(n) & 0x7F000000)) >> 24))
145#endif
146
147
148/**
149 * Print formatted debug value.
150 *
151 * @param fmt format (const char *)
152 * @param ... args for format
153 */
154#define SPDYF_DEBUG(fmt, ...) do { \
155	fprintf (stdout, "%s\n%u: ",__FILE__, __LINE__);\
156	fprintf(stdout,fmt,##__VA_ARGS__);\
157	fprintf(stdout,"\n");\
158	fflush(stdout); } while (0)
159
160
161/**
162 * Print stream for debuging.
163 *
164 * @param strm (void *)
165 * @param size (int)
166 */
167#define SPDYF_PRINT_STREAM(strm, size) do { \
168	int ___i;\
169	for(___i=0;___i<size;___i++){\
170		fprintf(stdout,"%x ",*((uint8_t *) strm + ___i));\
171		fflush(stdout);\
172	}\
173	fprintf(stdout,"\n");\
174	} while (0)
175
176
177/**
178 * Print message and raise SIGINT for debug purposes.
179 *
180 * @param msg message (const char *)
181 */
182#define SPDYF_SIGINT(msg) do { \
183	fprintf(stdout,"%i : %s\n", __LINE__,__FILE__);\
184	fprintf(stdout,msg);\
185	fprintf(stdout,"\n");\
186	fflush(stdout);\
187	raise(SIGINT); } while (0)
188
189
190/**
191 * Returns monotonic time, to be used for session timeouts.
192 *
193 * @return time in milliseconds
194 */
195unsigned long long
196SPDYF_monotonic_time(void);
197
198#endif
199