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

Author: Peter Dunkley <[email protected]>
Committer: Peter Dunkley <[email protected]>
Date:   Thu Jun 28 17:54:45 2012 +0100

core: Fix to msg_send() so that requests destined for a WebSocket connection go 
through the websocket module

- responses already worked

---

 forward.h |   63 +++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/forward.h b/forward.h
index f5137df..8b91c15 100644
--- a/forward.h
+++ b/forward.h
@@ -127,7 +127,9 @@ static inline int msg_send(struct dest_info* dst, char* 
buf, int len)
        struct dest_info new_dst;
        str outb;
 #ifdef USE_TCP 
-       union sockaddr_union* from;
+       int port;
+       struct ip_addr ip;
+       union sockaddr_union* from = NULL;
        union sockaddr_union local_addr;
        struct tcp_connection *con = NULL;
        struct ws_event_info wsev;
@@ -138,21 +140,40 @@ static inline int msg_send(struct dest_info* dst, char* 
buf, int 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);
+       if (dst->proto == PROTO_TCP
 #ifdef USE_TLS
-               else if (dst->proto == PROTO_TLS)
-                       con = tcpconn_get(dst->id, 0, 0, 0, 0);
+               || dst->proto == PROTO_TLS
 #endif
-               if (con && 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);
+       ) {
+               if (unlikely(dst->send_flags.f & SND_F_FORCE_SOCKET
+                               && dst->send_sock)) {
+                       local_addr = dst->send_sock->su;
+                       su_setport(&local_addr, 0); /* any local port will do */
+                       from = &local_addr;
+               }
+
+               if (unlikely(sr_event_enabled(SREV_TCP_WS_FRAME_OUT))) {
+                       port = su_getport(&dst->to);
+                       if (likely(port)) {
+                               su2ip_addr(&ip, &dst->to);
+                               con = tcpconn_get(dst->id, &ip, port, from, 0);
+                       }
+                       else if (likely(dst->id))
+                               con = tcpconn_get(dst->id, 0, 0, 0, 0);
+                       else {
+                               LM_CRIT("BUG: msg_send called with null_id & 
to\n");
+                               return -1;
+                       }
+
+                       if (con && 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 = con->id;
+                               return sr_event_exec(SREV_TCP_WS_FRAME_OUT, 
(void *) &wsev);
+                       }
                }
        }
 #endif
@@ -182,13 +203,6 @@ static inline int msg_send(struct dest_info* dst, char* 
buf, int len)
                                        " support is disabled\n");
                        goto error;
                }else{
-                       from=0;
-                       if (unlikely((dst->send_flags.f & SND_F_FORCE_SOCKET) &&
-                                               dst->send_sock)) {
-                               local_addr=dst->send_sock->su;
-                               su_setport(&local_addr, 0); /* any local port 
will do */
-                               from=&local_addr;
-                       }
                        if (unlikely(tcp_send(dst, from, outb.s, outb.len)<0)){
                                STATS_TX_DROPS;
                                LOG(L_ERR, "msg_send: ERROR: tcp_send 
failed\n");
@@ -204,13 +218,6 @@ static inline int msg_send(struct dest_info* dst, char* 
buf, int len)
                                        " support is disabled\n");
                        goto error;
                }else{
-                       from=0;
-                       if (unlikely((dst->send_flags.f & SND_F_FORCE_SOCKET) &&
-                                               dst->send_sock)) {
-                               local_addr=dst->send_sock->su;
-                               su_setport(&local_addr, 0); /* any local port 
will do */
-                               from=&local_addr;
-                       }
                        if (unlikely(tcp_send(dst, from, outb.s, outb.len)<0)){
                                STATS_TX_DROPS;
                                LOG(L_ERR, "msg_send: ERROR: tcp_send 
failed\n");


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

Reply via email to