Module: sip-router Branch: master Commit: 0ed33c0c3332ed3868509d8ae0b035d9420a7df4 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0ed33c0c...
Author: Peter Dunkley peter.dunkley@crocodile-rcs.com Committer: Peter Dunkley peter.dunkley@crocodile-rcs.com Date: Thu Oct 25 18:21:41 2012 +0100
modules/msrp: Fixed a problem with relaying that I added when I put in WebSocket support
---
modules/msrp/msrp_netio.c | 74 +++++++++++++++++++++++++------------------- 1 files changed, 42 insertions(+), 32 deletions(-)
diff --git a/modules/msrp/msrp_netio.c b/modules/msrp/msrp_netio.c index 86e16d6..ba8e884 100644 --- a/modules/msrp/msrp_netio.c +++ b/modules/msrp/msrp_netio.c @@ -113,7 +113,8 @@ int msrp_relay(msrp_frame_t *mf) memcpy(p, fpath->name.s + 11, mf->buf.s + mf->buf.len - fpath->name.s - 11); p += mf->buf.s + mf->buf.len - fpath->name.s - 11;
- + sar = (str_array_t*)tpath->parsed.data; + env = msrp_get_env(); if(env->envflags&MSRP_ENV_DSTINFO) { @@ -125,7 +126,6 @@ int msrp_relay(msrp_frame_t *mf) LM_ERR("error parsing To-Path header\n"); return -1; } - sar = (str_array_t*)tpath->parsed.data; if(sar==NULL || sar->size<2) { LM_DBG("To-Path has no next hop URI -- nowehere to forward\n"); @@ -138,41 +138,51 @@ int msrp_relay(msrp_frame_t *mf) } dst = &env->dstinfo; done: - port = su_getport(&dst->to); - if (likely(port)) + if (sar->size == 2) { - ticks_t con_lifetime; - struct ip_addr ip; + /* If the next hop is a client a connection must already + exist... */ + port = su_getport(&dst->to); + if (likely(port)) + { + ticks_t con_lifetime; + struct ip_addr ip;
- con_lifetime = cfg_get(tcp, tcp_cfg, con_lifetime); - su2ip_addr(&ip, &dst->to); - con = tcpconn_get(dst->id, &ip, port, NULL, con_lifetime); - } - else if (likely(dst->id)) - { - con = tcpconn_get(dst->id, 0, 0, 0, 0); - } + con_lifetime = cfg_get(tcp, tcp_cfg, con_lifetime); + su2ip_addr(&ip, &dst->to); + con = tcpconn_get(dst->id, &ip, port, NULL, con_lifetime); + } + else if (likely(dst->id)) + { + con = tcpconn_get(dst->id, 0, 0, 0, 0); + }
- if (con == NULL) - { - LM_WARN("TCP/TLS connection not found\n"); - return -1; - } + if (con == NULL) + { + LM_WARN("TCP/TLS connection not found\n"); + return -1; + } - if (unlikely((con->rcv.proto == PROTO_WS || con->rcv.proto == PROTO_WSS) - && sr_event_enabled(SREV_TCP_WS_FRAME_OUT))) { - ws_event_info_t wsev; - - memset(&wsev, 0, sizeof(ws_event_info_t)); - wsev.type = SREV_TCP_WS_FRAME_OUT; - wsev.buf = reqbuf; - wsev.len = p - reqbuf; - wsev.id = con->id; - return sr_event_exec(SREV_TCP_WS_FRAME_OUT, (void *) &wsev); + if (unlikely((con->rcv.proto == PROTO_WS || con->rcv.proto == PROTO_WSS) + && sr_event_enabled(SREV_TCP_WS_FRAME_OUT))) { + ws_event_info_t wsev; + + memset(&wsev, 0, sizeof(ws_event_info_t)); + wsev.type = SREV_TCP_WS_FRAME_OUT; + wsev.buf = reqbuf; + wsev.len = p - reqbuf; + wsev.id = con->id; + return sr_event_exec(SREV_TCP_WS_FRAME_OUT, (void *) &wsev); + } + else if (tcp_send(dst, 0, reqbuf, p - reqbuf) < 0) { + LM_ERR("forwarding frame failed\n"); + return -1; + } } + /* If the next hop is a relay just throw it out there... */ else if (tcp_send(dst, 0, reqbuf, p - reqbuf) < 0) { - LM_ERR("forwarding frame failed\n"); - return -1; + LM_ERR("forwarding frame failed\n"); + return -1; }
return 0;