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