[sr-dev] git:andrei/send_flags: core: send flags support
Andrei Pelinescu-Onciul
andrei at iptel.org
Tue Sep 15 18:40:13 CEST 2009
Module: sip-router
Branch: andrei/send_flags
Commit: 67c9277aaa07fb6b8c91fc38e761d30426ded8b5
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=67c9277aaa07fb6b8c91fc38e761d30426ded8b5
Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date: Tue Sep 15 17:38:06 2009 +0200
core: send flags support
Added support for send flags and per message send flags.
Right now there are 2 flags defined:
- SND_F_FORCE_CON_REUSE (forces connection reuse, send will fail if
a connection does not already exist to the destination)
- SND_F_CON_CLOSE (hint that after the send completes the
connection should be closed).
The send flags can be passed directly to msg_send() via
dest_info.send_flags or they can be set for each sip_msg, in which
case forward_request() and forward_reply() will obey them.
The sip_msg flags can be set for replies or for forwarding.
---
forward.c | 15 ++++++++++-----
ip_addr.h | 9 +++++++++
parser/msg_parser.h | 2 ++
3 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/forward.c b/forward.c
index dea7584..d7fb827 100644
--- a/forward.c
+++ b/forward.c
@@ -384,9 +384,12 @@ int check_self_port(unsigned short port, unsigned short proto)
* default port or non srv. lookup is desired, the port must
* be !=0
* port - used only if dst!=0 (else the port in send_info->to is used)
- * send_info - filled dest_info structure:
- * if the send_socket member is null, a send_socket will be
- * chosen automatically
+ * send_info - value/result partially filled dest_info structure:
+ * - send_info->proto and comp are used
+ * - send_info->to will be filled (dns)
+ * - send_info->send_flags is filled from the message
+ * - if the send_socket member is null, a send_socket will be
+ * chosen automatically
* WARNING: don't forget to zero-fill all the unused members (a non-zero
* random id along with proto==PROTO_TCP can have bad consequences, same for
* a bogus send_socket value)
@@ -438,13 +441,14 @@ int forward_request(struct sip_msg* msg, str* dst, unsigned short port,
goto error;
}
}/* dst */
+ send_info->send_flags=msg->fwd_send_flags;
/* calculate branch for outbound request; if syn_branch is turned off,
calculate is from transaction key, i.e., as an md5 of From/To/CallID/
CSeq exactly the same way as TM does; good for reboot -- than messages
belonging to transaction lost due to reboot will still be forwarded
with the same branch parameter and will be match-able downstream
-
- if it is turned on, we don't care about reboot; we simply put a simple
+
+ if it is turned on, we don't care about reboot; we simply put a simple
value in there; better for performance
*/
if (syn_branch ) {
@@ -694,6 +698,7 @@ int forward_reply(struct sip_msg* msg)
}
dst.proto=msg->via2->proto;
+ dst.send_flags=msg->fwd_send_flags | msg->rpl_send_flags;
if (update_sock_struct_from_via( &dst.to, msg, msg->via2 )==-1) goto error;
#ifdef USE_COMP
dst.comp=msg->via2->comp_no;
diff --git a/ip_addr.h b/ip_addr.h
index 50bcbe4..355fc77 100644
--- a/ip_addr.h
+++ b/ip_addr.h
@@ -34,6 +34,7 @@
* 2006-04-21 added init_dst_from_rcv (andrei)
* 2007-06-26 added ip_addr_mk_any() (andrei)
* 2008-05-21 added su2a(), ip_addr2sbuf(), ip4tosbuf(), ip62sbuf() (andrei)
+ * 2009-09-14 added send flags support to dest_info (andrei)
*/
#ifndef ip_addr_h
@@ -136,11 +137,18 @@ struct receive_info{
};
+/* send flags */
+#define SND_F_FORCE_CON_REUSE 1 /* reuse an existing connection or fail */
+#define SND_F_CON_CLOSE 2 /* close the connection after sending */
+
+typedef unsigned char snd_flags_t;
+
struct dest_info{
struct socket_info* send_sock;
union sockaddr_union to;
int id; /* tcp stores the connection id here */
char proto;
+ snd_flags_t send_flags;
#ifdef USE_COMP
short comp;
#endif
@@ -748,6 +756,7 @@ inline static void init_dst_from_rcv(struct dest_info* dst,
dst->to=rcv->src_su;
dst->id=rcv->proto_reserved1;
dst->proto=rcv->proto;
+ dst->send_flags=0;
#ifdef USE_COMP
dst->comp=rcv->comp;
#endif
diff --git a/parser/msg_parser.h b/parser/msg_parser.h
index 1ce00bb..22b3167 100644
--- a/parser/msg_parser.h
+++ b/parser/msg_parser.h
@@ -246,6 +246,8 @@ typedef struct msg_body {
typedef struct sip_msg {
unsigned int id; /* message id, unique/process*/
+ snd_flags_t fwd_send_flags; /* send flags for forwarding */
+ snd_flags_t rpl_send_flags; /* send flags for replies */
struct msg_start first_line; /* Message first line */
struct via_body* via1; /* The first via */
struct via_body* via2; /* The second via */
More information about the sr-dev
mailing list