[sr-dev] git:sr_3.0: tcp: use the forced socket ip as source

Andrei Pelinescu-Onciul andrei at iptel.org
Thu Nov 5 16:41:50 CET 2009


Module: sip-router
Branch: sr_3.0
Commit: 6fcba958595c5189c1b9d97c8fc4c9f434a3c7ad
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=6fcba958595c5189c1b9d97c8fc4c9f434a3c7ad

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
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).

---

 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;




More information about the sr-dev mailing list