Module: sip-router
Branch: pd/websocket
Commit: 1f139814262a4c5979c5301812f81304d885e92c
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1f139814262a4c5979c5301812f81304d885e92c

Author: Peter Dunkley <[email protected]>
Committer: Peter Dunkley <[email protected]>
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");
        }


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to