[sr-dev] git:pd/outbound: core: added ruid to msg and branch structures

Peter Dunkley peter.dunkley at crocodile-rcs.com
Thu Mar 14 23:59:19 CET 2013


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

Author: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Date:   Thu Mar 14 22:42:16 2013 +0000

core: added ruid to msg and branch structures

---

 config.h            |    2 ++
 dset.c              |   19 ++++++++++++++++++-
 dset.h              |   11 ++++++++---
 parser/msg_parser.c |   39 +++++++++++++++++++++++++++++++++++++++
 parser/msg_parser.h |    5 +++++
 5 files changed, 72 insertions(+), 4 deletions(-)

diff --git a/config.h b/config.h
index 2368503..85e6388 100644
--- a/config.h
+++ b/config.h
@@ -75,6 +75,8 @@
 
 #define MAX_INSTANCE_SIZE 256 		/*!< Maximum length of +sip.instance contact header param value buffer */
 
+#define MAX_RUID_SIZE 65		/*!< Maximum length of ruid for location records */
+
 #define MY_VIA "Via: SIP/2.0/UDP "
 #define MY_VIA_LEN (sizeof(MY_VIA) - 1)
 
diff --git a/dset.c b/dset.c
index 536a7ae..d0aef89 100644
--- a/dset.c
+++ b/dset.c
@@ -297,7 +297,8 @@ void clear_branches(void)
 int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str* path,
 		  qvalue_t q, unsigned int flags,
 		  struct socket_info* force_socket,
-		  str* instance, unsigned int reg_id)
+		  str* instance, unsigned int reg_id,
+		  str* ruid)
 {
 	str luri;
 
@@ -381,6 +382,22 @@ int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str* path,
 	/* copy reg_id */
 	branches[nr_branches].reg_id = reg_id;
 
+	/* copy ruid string */
+	if (unlikely(ruid && ruid->len && ruid->s)) {
+		if (unlikely(ruid->len > MAX_RUID_SIZE - 1)) {
+			LOG(L_ERR, "too long ruid: %.*s\n",
+			    ruid->len, ruid->s);
+			return -1;
+		}
+		memcpy(branches[nr_branches].ruid, ruid->s,
+		       ruid->len);
+		branches[nr_branches].ruid[ruid->len] = 0;
+		branches[nr_branches].ruid_len = ruid->len;
+	} else {
+		branches[nr_branches].ruid[0] = '\0';
+		branches[nr_branches].ruid_len = 0;
+	}
+
 	nr_branches++;
 	return 1;
 }
diff --git a/dset.h b/dset.h
index bc131ef..3140f95 100644
--- a/dset.h
+++ b/dset.h
@@ -66,6 +66,10 @@ struct branch
     /* reg-id contact header param value */
     unsigned int reg_id;
 
+    /* ruid value from usrloc */
+    char ruid[MAX_RUID_SIZE];
+    unsigned int ruid_len;
+
     /* Branch flags */
     flag_t flags;
 };
@@ -88,11 +92,12 @@ int drop_sip_branch(int idx);
 int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str* path,
 		  qvalue_t q, unsigned int flags,
 		  struct socket_info* force_socket,
-		  str* instance, unsigned int reg_id);
+		  str* instance, unsigned int reg_id,
+		  str* ruid);
 
 /*! \brief kamailio compatible version */
 #define km_append_branch(msg, uri, dst_uri, path, q, flags, force_socket) \
-    append_branch(msg, uri, dst_uri, path, q, flags, force_socket, 0, 0)
+    append_branch(msg, uri, dst_uri, path, q, flags, force_socket, 0, 0, 0)
 
 /*! \brief ser compatible append_branch version.
  *  append_branch version compatible with ser: no path or branch flags support
@@ -109,7 +114,7 @@ static inline int ser_append_branch(struct sip_msg* msg,
     s_uri.len=uri_len;
     s_dst_uri.s=dst_uri;
     s_dst_uri.len=dst_uri_len;
-    return append_branch(msg, &s_uri, &s_dst_uri, 0, q, 0, force_socket, 0, 0);
+    return append_branch(msg, &s_uri, &s_dst_uri, 0, q, 0, force_socket, 0, 0, 0);
 }
 
 
diff --git a/parser/msg_parser.c b/parser/msg_parser.c
index dfed08d..9e5bd34 100644
--- a/parser/msg_parser.c
+++ b/parser/msg_parser.c
@@ -859,6 +859,45 @@ void reset_instance(struct sip_msg* const msg)
 }
 
 
+int set_ruid(struct sip_msg* msg, str* ruid)
+{
+	char* ptr;
+
+	if (unlikely(!msg || !ruid)) {
+		LM_ERR("invalid ruid parameter value\n");
+		return -1;
+	}
+
+	if (unlikely(ruid->len == 0)) {
+		reset_ruid(msg);
+	} else if (msg->ruid.s && (msg->ruid.len >= ruid->len)) {
+		memcpy(msg->ruid.s, ruid->s, ruid->len);
+		msg->ruid.len = ruid->len;
+	} else {
+		ptr = (char*)pkg_malloc(ruid->len);
+		if (!ptr) {
+			LM_ERR("not enough pkg memory for ruid\n");
+			return -1;
+		}
+		memcpy(ptr, ruid->s, ruid->len);
+		if (msg->ruid.s) pkg_free(msg->ruid.s);
+		msg->ruid.s = ptr;
+		msg->ruid.len = ruid->len;
+	}
+	return 0;
+}
+
+
+void reset_ruid(struct sip_msg* const msg)
+{
+	if(msg->ruid.s != 0) {
+		pkg_free(msg->ruid.s);
+	}
+	msg->ruid.s = 0;
+	msg->ruid.len = 0;
+}
+
+
 hdr_field_t* get_hdr(const sip_msg_t* const msg, const enum _hdr_types_t ht)
 {
 	hdr_field_t *hdr;
diff --git a/parser/msg_parser.h b/parser/msg_parser.h
index 79194e3..09a8460 100644
--- a/parser/msg_parser.h
+++ b/parser/msg_parser.h
@@ -365,6 +365,7 @@ typedef struct sip_msg {
 	str path_vec;
         str instance;
         unsigned int reg_id;
+	str ruid;
 } sip_msg_t;
 
 /*! \brief pointer to a fakes message which was never received ;
@@ -453,6 +454,10 @@ int set_instance(struct sip_msg* msg, str* instance);
 
 void reset_instance(struct sip_msg* const msg);
 
+int set_ruid(struct sip_msg* msg, str* ruid);
+
+void reset_ruid(struct sip_msg* const msg);
+
 /** force a specific send socket for forwarding a request.
  * @param msg - sip msg.
  * @param fsocket - forced socket, pointer to struct socket_info, can be 0 (in




More information about the sr-dev mailing list