/*
This file is part of libmicrospdy
Copyright Copyright (C) 2012 Andrey Uzunov
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file microspdy/internal.h
* @brief internal functions and macros for the framing layer
* @author Andrey Uzunov
*/
#ifndef INTERNAL_H_H
#define INTERNAL_H_H
#include "platform.h"
#include "microspdy.h"
/**
* size of read buffers for each connection
* must be at least the size of SPDY_MAX_SUPPORTED_FRAME_SIZE
*/
#define SPDYF_BUFFER_SIZE 8192
/**
* initial size of window for each stream (this is for the data
* within data frames that can be handled)
*/
#define SPDYF_INITIAL_WINDOW_SIZE 65536
/**
* number of frames written to the socket at once. After X frames
* everything should be run again. In this way the application can
* response to more important requests while a big file is still
* being transmitted to the client
*/
#define SPDYF_NUM_SENT_FRAMES_AT_ONCE 10
/**
* Handler for fatal errors.
*/
extern SPDY_PanicCallback spdyf_panic;
/**
* Closure argument for "mhd_panic".
*/
extern void *spdyf_panic_cls;
/**
* Trigger 'panic' action based on fatal errors.
*
* @param msg error message (const char *)
*/
#define SPDYF_PANIC(msg) \
spdyf_panic (spdyf_panic_cls, __FILE__, __LINE__, msg)
/**
* Asserts the validity of an expression.
*
* @param expr (bool)
* @param msg message to print on error (const char *)
*/
#define SPDYF_ASSERT(expr, msg) \
if(!(expr)){\
SPDYF_PANIC(msg);\
abort();\
}
/**
* Convert 24 bit integer from host byte order to network byte order.
*
* @param n input value (int32_t)
* @return converted value (uint32_t)
*/
#if HAVE_BIG_ENDIAN
#define HTON24(n) n
#else
#define HTON24(n) (((((uint32_t)(n) & 0xFF)) << 16)\
| (((uint32_t)(n) & 0xFF00))\
| ((((uint32_t)(n) & 0xFF0000)) >> 16))
#endif
/**
* Convert 24 bit integer from network byte order to host byte order.
*
* @param n input value (int32_t)
* @return converted value (uint32_t)
*/
#if HAVE_BIG_ENDIAN
#define NTOH24(n) n
#else
#define NTOH24(n) (((((uint32_t)(n) & 0xFF)) << 16)\
| (((uint32_t)(n) & 0xFF00))\
| ((((uint32_t)(n) & 0xFF0000)) >> 16))
#endif
/**
* Convert 31 bit integer from network byte order to host byte order.
*
* @param n input value (int32_t)
* @return converted value (uint32_t)
*/
#if HAVE_BIG_ENDIAN
#define NTOH31(n) n
#else
#define NTOH31(n) (((((uint32_t)(n) & 0x7F)) << 24) | \
((((uint32_t)(n) & 0xFF00)) << 8) | \
((((uint32_t)(n) & 0xFF0000)) >> 8) | \
((((uint32_t)(n) & 0xFF000000)) >> 24))
#endif
/**
* Convert 31 bit integer from host byte order to network byte order.
*
* @param n input value (int32_t)
* @return converted value (uint32_t)
*/
#if HAVE_BIG_ENDIAN
#define HTON31(n) n
#else
#define HTON31(n) (((((uint32_t)(n) & 0xFF)) << 24) | \
((((uint32_t)(n) & 0xFF00)) << 8) | \
((((uint32_t)(n) & 0xFF0000)) >> 8) | \
((((uint32_t)(n) & 0x7F000000)) >> 24))
#endif
/**
* Print formatted debug value.
*
* @param fmt format (const char *)
* @param ... args for format
*/
#define SPDYF_DEBUG(fmt, ...) do { \
fprintf (stdout, "%s\n%u: ",__FILE__, __LINE__);\
fprintf(stdout,fmt,##__VA_ARGS__);\
fprintf(stdout,"\n");\
fflush(stdout); } while (0)
/**
* Print stream for debuging.
*
* @param strm (void *)
* @param size (int)
*/
#define SPDYF_PRINT_STREAM(strm, size) do { \
int ___i;\
for(___i=0;___i<size;___i++){\
fprintf(stdout,"%x ",*((uint8_t *) strm + ___i));\
fflush(stdout);\
}\
fprintf(stdout,"\n");\
} while (0)
/**
* Print message and raise SIGINT for debug purposes.
*
* @param msg message (const char *)
*/
#define SPDYF_SIGINT(msg) do { \
fprintf(stdout,"%i : %s\n", __LINE__,__FILE__);\
fprintf(stdout,msg);\
fprintf(stdout,"\n");\
fflush(stdout);\
raise(SIGINT); } while (0)
/**
* Returns monotonic time, to be used for session timeouts.
*
* @return time in milliseconds
*/
unsigned long long
SPDYF_monotonic_time(void);
#endif