Module: sip-router Branch: kamailio_3.0 Commit: cecadda371383083e083ecebaba4f2c456a09f4d URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=cecadda3...
Author: Andrei Pelinescu-Onciul andrei@iptel.org Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Thu Nov 5 16:21:35 2009 +0100
tcp: use the forced socket ip as source
- if a socket is forced always use the forced socket ip as source (if a connection exists with different ip as source, open a new one with the forced ip). (cherry picked from commit 6fcba958595c5189c1b9d97c8fc4c9f434a3c7ad)
---
forward.h | 23 +++++++++++++++++++++-- 1 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/forward.h b/forward.h index 2a6e91e..b365753 100644 --- a/forward.h +++ b/forward.h @@ -123,6 +123,11 @@ 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; + union sockaddr_union local_addr; +#endif + outb.s = buf; outb.len = len; sr_event_exec(SREV_NET_DATA_OUT, (void*)&outb); @@ -152,7 +157,14 @@ static inline int msg_send(struct dest_info* dst, char* buf, int len) " support is disabled\n"); goto error; }else{ - if (unlikely(tcp_send(dst, 0, outb.s, outb.len)<0)){ + from=0; + if (unlikely((dst->send_flags & 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"); goto error; @@ -167,7 +179,14 @@ static inline int msg_send(struct dest_info* dst, char* buf, int len) " support is disabled\n"); goto error; }else{ - if (unlikely(tcp_send(dst, 0, outb.s, outb.len)<0)){ + from=0; + if (unlikely((dst->send_flags & 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"); goto error;