forked from Mirrors/freeswitch
97 lines
2.4 KiB
C
97 lines
2.4 KiB
C
|
|
#if 0
|
|
#ifdef WIN32
|
|
static
|
|
#else
|
|
static inline
|
|
#endif
|
|
void muxdebug(const char *format, ...)
|
|
{
|
|
va_list ap;
|
|
va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap);
|
|
}
|
|
#else
|
|
#ifdef WIN32
|
|
static
|
|
#else
|
|
static inline
|
|
#endif
|
|
void muxdebug(const char *format, ...)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#define MAX_XGM_SUBCHANNELS 8192
|
|
|
|
enum lws_ext_x_google_mux__parser_states {
|
|
LWS_EXT_XGM_STATE__MUX_BLOCK_1,
|
|
LWS_EXT_XGM_STATE__MUX_BLOCK_2,
|
|
LWS_EXT_XGM_STATE__MUX_BLOCK_3,
|
|
LWS_EXT_XGM_STATE__ADDCHANNEL_LEN,
|
|
LWS_EXT_XGM_STATE__ADDCHANNEL_LEN16_1,
|
|
LWS_EXT_XGM_STATE__ADDCHANNEL_LEN16_2,
|
|
LWS_EXT_XGM_STATE__ADDCHANNEL_LEN32_1,
|
|
LWS_EXT_XGM_STATE__ADDCHANNEL_LEN32_2,
|
|
LWS_EXT_XGM_STATE__ADDCHANNEL_LEN32_3,
|
|
LWS_EXT_XGM_STATE__ADDCHANNEL_LEN32_4,
|
|
LWS_EXT_XGM_STATE__ADDCHANNEL_HEADERS,
|
|
LWS_EXT_XGM_STATE__FLOWCONTROL_1,
|
|
LWS_EXT_XGM_STATE__FLOWCONTROL_2,
|
|
LWS_EXT_XGM_STATE__FLOWCONTROL_3,
|
|
LWS_EXT_XGM_STATE__FLOWCONTROL_4,
|
|
LWS_EXT_XGM_STATE__DATA,
|
|
};
|
|
|
|
enum lws_ext_x_goole_mux__mux_opcodes {
|
|
LWS_EXT_XGM_OPC__DATA,
|
|
LWS_EXT_XGM_OPC__ADDCHANNEL,
|
|
LWS_EXT_XGM_OPC__DROPCHANNEL,
|
|
LWS_EXT_XGM_OPC__FLOWCONTROL,
|
|
LWS_EXT_XGM_OPC__RESERVED_4,
|
|
LWS_EXT_XGM_OPC__RESERVED_5,
|
|
LWS_EXT_XGM_OPC__RESERVED_6,
|
|
LWS_EXT_XGM_OPC__RESERVED_7,
|
|
};
|
|
|
|
/* one of these per context (server or client) */
|
|
|
|
struct lws_ext_x_google_mux_context {
|
|
/*
|
|
* these are listing physical connections, not children sharing a
|
|
* parent mux physical connection
|
|
*/
|
|
struct libwebsocket *wsi_muxconns[MAX_CLIENTS];
|
|
/*
|
|
* when this is < 2, we do not do any mux blocks
|
|
* just pure websockets
|
|
*/
|
|
int active_conns;
|
|
};
|
|
|
|
/* one of these per connection (server or client) */
|
|
|
|
struct lws_ext_x_google_mux_conn {
|
|
enum lws_ext_x_goole_mux__mux_opcodes block_subopcode;
|
|
int block_subchannel;
|
|
unsigned int length;
|
|
enum lws_ext_x_google_mux__parser_states state;
|
|
/* child points to the mux wsi using this */
|
|
struct libwebsocket *wsi_parent;
|
|
int subchannel;
|
|
struct libwebsocket *wsi_children[MAX_CLIENTS];
|
|
int highest_child_subchannel;
|
|
char awaiting_POLLOUT;
|
|
int count_children_needing_POLLOUT;
|
|
int sticky_mux_used;
|
|
int defeat_mux_opcode_wrapping;
|
|
int original_ch1_closed;
|
|
int ignore_cmd;
|
|
};
|
|
|
|
extern int
|
|
lws_extension_callback_x_google_mux(struct libwebsocket_context *context,
|
|
struct libwebsocket_extension *ext,
|
|
struct libwebsocket *wsi,
|
|
enum libwebsocket_extension_callback_reasons reason,
|
|
void *user, void *in, size_t len);
|