Module: sip-router Branch: pd/websocket Commit: 1f139814262a4c5979c5301812f81304d885e92c URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1f139814...
Author: Peter Dunkley peter.dunkley@crocodile-rcs.com Committer: Peter Dunkley peter.dunkley@crocodile-rcs.com Date: Sat Jun 23 19:10:03 2012 +0100
core: added events and data-structures so that Kamailio core can transmit through the WebSocket module
---
events.c | 29 +++++++++++++++++++++-------- events.h | 6 ++++-- forward.h | 25 ++++++++++++++++++++++++- tcp_conn.h | 7 +++++++ tcp_read.c | 6 +++--- 5 files changed, 59 insertions(+), 14 deletions(-)
diff --git a/events.c b/events.c index d4a24f8..d26ae9b 100644 --- a/events.c +++ b/events.c @@ -96,9 +96,14 @@ int sr_event_register_cb(int type, sr_event_cb_f f) _sr_events_list.tcp_msrp_frame = f; else return -1; break; - case SREV_TCP_WS_FRAME: - if(_sr_events_list.tcp_ws_frame==0) - _sr_events_list.tcp_ws_frame = f; + case SREV_TCP_WS_FRAME_IN: + if(_sr_events_list.tcp_ws_frame_in==0) + _sr_events_list.tcp_ws_frame_in = f; + else return -1; + break; + case SREV_TCP_WS_FRAME_OUT: + if(_sr_events_list.tcp_ws_frame_out==0) + _sr_events_list.tcp_ws_frame_out = f; else return -1; break; default: @@ -192,10 +197,16 @@ int sr_event_exec(int type, void *data) ret = _sr_events_list.tcp_msrp_frame(data); return ret; } else return 1; - case SREV_TCP_WS_FRAME: - if(unlikely(_sr_events_list.tcp_ws_frame!=0)) + case SREV_TCP_WS_FRAME_IN: + if(unlikely(_sr_events_list.tcp_ws_frame_in!=0)) + { + ret = _sr_events_list.tcp_ws_frame_in(data); + return ret; + } else return 1; + case SREV_TCP_WS_FRAME_OUT: + if(unlikely(_sr_events_list.tcp_ws_frame_out!=0)) { - ret = _sr_events_list.tcp_ws_frame(data); + ret = _sr_events_list.tcp_ws_frame_out(data); return ret; } else return 1; default: @@ -227,8 +238,10 @@ int sr_event_enabled(int type) return (_sr_events_list.tcp_http_100c!=0)?1:0; case SREV_TCP_MSRP_FRAME: return (_sr_events_list.tcp_msrp_frame!=0)?1:0; - case SREV_TCP_WS_FRAME: - return (_sr_events_list.tcp_ws_frame!=0)?1:0; + case SREV_TCP_WS_FRAME_IN: + return (_sr_events_list.tcp_ws_frame_in!=0)?1:0; + case SREV_TCP_WS_FRAME_OUT: + return (_sr_events_list.tcp_ws_frame_out!=0)?1:0; } return 0; } diff --git a/events.h b/events.h index f919a00..734e90c 100644 --- a/events.h +++ b/events.h @@ -32,7 +32,8 @@ #define SREV_NET_DGRAM_IN 7 #define SREV_TCP_HTTP_100C 8 #define SREV_TCP_MSRP_FRAME 9 -#define SREV_TCP_WS_FRAME 10 +#define SREV_TCP_WS_FRAME_IN 10 +#define SREV_TCP_WS_FRAME_OUT 11
typedef int (*sr_event_cb_f)(void *data); @@ -47,7 +48,8 @@ typedef struct sr_event_cb { sr_event_cb_f net_dgram_in; sr_event_cb_f tcp_http_100c; sr_event_cb_f tcp_msrp_frame; - sr_event_cb_f tcp_ws_frame; + sr_event_cb_f tcp_ws_frame_in; + sr_event_cb_f tcp_ws_frame_out; } sr_event_cb_t;
void sr_event_cb_init(void); diff --git a/forward.h b/forward.h index 674a6f0..d3831f9 100644 --- a/forward.h +++ b/forward.h @@ -54,6 +54,7 @@ #include "udp_server.h" #ifdef USE_TCP #include "tcp_server.h" +#include "tcp_conn.h" #endif #ifdef USE_SCTP #include "sctp_server.h" @@ -128,12 +129,34 @@ static inline int msg_send(struct dest_info* dst, char* buf, int len) #ifdef USE_TCP union sockaddr_union* from; union sockaddr_union local_addr; + struct tcp_connection *con = NULL; + struct ws_event_info wsev; #endif outb.s = buf; outb.len = len; sr_event_exec(SREV_NET_DATA_OUT, (void*)&outb); - + +#ifdef USE_TCP + if (unlikely(sr_event_enabled(SREV_TCP_WS_FRAME_OUT))) { + if (dst->proto == PROTO_TCP) + con = tcpconn_get(dst->id, 0, 0, 0, 0); +#ifdef USE_TLS + else if (dst->proto == PROTO_TLS) + con = tcpconn_get(dst->id, 0, 0, 0, 0); +#endif + if (con->flags & F_CONN_WS) + { + memset(&wsev, 0, sizeof(ws_event_info_t)); + wsev.type = SREV_TCP_WS_FRAME_OUT; + wsev.buf = outb.s; + wsev.len = outb.len; + wsev.id = dst->id; + return sr_event_exec(SREV_TCP_WS_FRAME_OUT, (void *) &wsev); + } + } +#endif + if (likely(dst->proto==PROTO_UDP)){ if (unlikely((dst->send_sock==0) || (dst->send_sock->flags & SI_IS_MCAST))){ diff --git a/tcp_conn.h b/tcp_conn.h index 3b3f546..ec7c44f 100644 --- a/tcp_conn.h +++ b/tcp_conn.h @@ -355,6 +355,13 @@ typedef struct tcp_event_info { struct tcp_connection *con; } tcp_event_info_t;
+typedef struct ws_event_info { + int type; + char *buf; + unsigned int len; + int id; +} ws_event_info_t; + #endif
diff --git a/tcp_read.c b/tcp_read.c index d8b4653..e33984b 100644 --- a/tcp_read.c +++ b/tcp_read.c @@ -1132,14 +1132,14 @@ static int ws_process_msg(char* tcpbuf, unsigned int len,
ret = 0; LM_DBG("WebSocket Message: [[>>>\n%.*s<<<]]\n", len, tcpbuf); - if(likely(sr_event_enabled(SREV_TCP_WS_FRAME))) { + if(likely(sr_event_enabled(SREV_TCP_WS_FRAME_IN))) { memset(&tev, 0, sizeof(tcp_event_info_t)); - tev.type = SREV_TCP_WS_FRAME; + tev.type = SREV_TCP_WS_FRAME_IN; tev.buf = tcpbuf; tev.len = len; tev.rcv = rcv_info; tev.con = con; - ret = sr_event_exec(SREV_TCP_WS_FRAME, (void*)(&tev)); + ret = sr_event_exec(SREV_TCP_WS_FRAME_IN, (void*)(&tev)); } else { LM_DBG("no callback registering for handling WebSockets - dropping!\n"); }