[sr-dev] git:pd/outbound: modules_k/path: Added outbound support to add_path()

Peter Dunkley peter.dunkley at crocodile-rcs.com
Wed Dec 26 15:25:08 CET 2012


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

Author: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Date:   Wed Dec 26 14:15:48 2012 +0000

modules_k/path: Added outbound support to add_path()

---

 modules_k/path/path.c     |   68 +++++++++++++++++++++++++++++++++++---------
 modules_k/path/path_mod.c |   12 ++++++++
 modules_k/path/path_mod.h |    4 ++-
 3 files changed, 69 insertions(+), 15 deletions(-)

diff --git a/modules_k/path/path.c b/modules_k/path/path.c
index a8fb8aa..2362066 100644
--- a/modules_k/path/path.c
+++ b/modules_k/path/path.c
@@ -41,6 +41,10 @@
 #include "path.h"
 #include "path_mod.h"
 
+typedef enum {
+	PATH_PARAM_NONE, PATH_PARAM_RECEIVED, PATH_PARAM_OB
+} path_param_t;
+
 #define PATH_PREFIX		"Path: <sip:"
 #define PATH_PREFIX_LEN		(sizeof(PATH_PREFIX)-1)
 
@@ -50,10 +54,20 @@
 #define PATH_RC_PARAM		";received="
 #define PATH_RC_PARAM_LEN	(sizeof(PATH_RC_PARAM)-1)
 
+#define PATH_OB_PARAM		";ob"
+#define PATH_OB_PARAM_LEN	(sizeof(PATH_OB_PARAM)-1)
+
 #define	PATH_CRLF		">\r\n"
 #define PATH_CRLF_LEN		(sizeof(PATH_CRLF)-1)
 
-static int prepend_path(struct sip_msg* _m, str *user, int recv)
+#define ALLOC_AND_COPY_PATH_HDR() \
+	if ((suffix = pkg_malloc(suffix_len)) == NULL) { \
+		LM_ERR("no pkg memory left for suffix\n"); \
+		goto out1; \
+	} \
+	memcpy(suffix, PATH_LR_PARAM, PATH_LR_PARAM_LEN);
+
+static int prepend_path(struct sip_msg* _m, str *user, path_param_t param)
 {
 	struct lump *l;
 	char *prefix, *suffix, *crlf;
@@ -76,15 +90,24 @@ static int prepend_path(struct sip_msg* _m, str *user, int recv)
 		memcpy(prefix + prefix_len - 1, "@", 1);
 	}
 
-	suffix_len = PATH_LR_PARAM_LEN + (recv ? PATH_RC_PARAM_LEN : 0);
-	suffix = pkg_malloc(suffix_len);
-	if (!suffix) {
-		LM_ERR("no pkg memory left for suffix\n");
-		goto out1;
+	switch(param) {
+	default:
+		suffix_len = PATH_LR_PARAM_LEN;
+		ALLOC_AND_COPY_PATH_HDR();
+		break;
+	case PATH_PARAM_RECEIVED:
+		suffix_len = PATH_LR_PARAM_LEN + PATH_RC_PARAM_LEN;
+		ALLOC_AND_COPY_PATH_HDR();
+		memcpy(suffix + PATH_LR_PARAM_LEN, PATH_RC_PARAM,	
+			PATH_RC_PARAM_LEN);
+		break;
+	case PATH_PARAM_OB:
+		suffix_len = PATH_LR_PARAM_LEN + PATH_OB_PARAM_LEN;
+		ALLOC_AND_COPY_PATH_HDR();
+		memcpy(suffix + PATH_LR_PARAM_LEN, PATH_OB_PARAM,
+			PATH_OB_PARAM_LEN);
+		break;
 	}
-	memcpy(suffix, PATH_LR_PARAM, PATH_LR_PARAM_LEN);
-	if(recv)
-		memcpy(suffix+PATH_LR_PARAM_LEN, PATH_RC_PARAM, PATH_RC_PARAM_LEN);
 
 	crlf = pkg_malloc(PATH_CRLF_LEN);
 	if (!crlf) {
@@ -119,7 +142,7 @@ static int prepend_path(struct sip_msg* _m, str *user, int recv)
 	if (!l) goto out2;
 	l = insert_new_lump_before(l, suffix, suffix_len, 0);
 	if (!l) goto out2;
-	if (recv) {
+	if (param == PATH_PARAM_RECEIVED) {
 		/* TODO: agranig: optimize this one! */
 		src_ip = ip_addr2a(&_m->rcv.src_ip);
 		rcv_addr.s = pkg_malloc(6 + IP_ADDR_MAX_STR_SIZE + 22); /* 'sip:<ip>:<port>;transport=sctp'\0 */
@@ -174,7 +197,24 @@ out4:
 int add_path(struct sip_msg* _msg, char* _a, char* _b)
 {
 	str user = {0,0};
-	return prepend_path(_msg, &user, 0);
+	int ret;
+	path_param_t param = PATH_PARAM_NONE;
+
+	if (path_obb.use_outbound != NULL
+		&& path_obb.use_outbound(_msg)) {
+		if (path_obb.encode_flow_token(&user, _msg->rcv) != 0) {
+			LM_ERR("encoding outbound flow token\n");
+			return -1;	
+		}
+		param = PATH_PARAM_OB;
+	}
+
+	ret = prepend_path(_msg, &user, param);
+
+	if (user.s != NULL)
+		pkg_free(user.s);
+
+	return ret;
 }
 
 /*! \brief
@@ -183,7 +223,7 @@ int add_path(struct sip_msg* _msg, char* _a, char* _b)
  */
 int add_path_usr(struct sip_msg* _msg, char* _usr, char* _b)
 {
-	return prepend_path(_msg, (str*)_usr, 0);
+	return prepend_path(_msg, (str*)_usr, PATH_PARAM_NONE);
 }
 
 /*! \brief
@@ -193,7 +233,7 @@ int add_path_usr(struct sip_msg* _msg, char* _usr, char* _b)
 int add_path_received(struct sip_msg* _msg, char* _a, char* _b)
 {
 	str user = {0,0};
-	return prepend_path(_msg, &user, 1);
+	return prepend_path(_msg, &user, PATH_PARAM_RECEIVED);
 }
 
 /*! \brief
@@ -202,7 +242,7 @@ int add_path_received(struct sip_msg* _msg, char* _a, char* _b)
  */
 int add_path_received_usr(struct sip_msg* _msg, char* _usr, char* _b)
 {
-	return prepend_path(_msg, (str*)_usr, 1);
+	return prepend_path(_msg, (str*)_usr, PATH_PARAM_RECEIVED);
 }
 
 /*! \brief
diff --git a/modules_k/path/path_mod.c b/modules_k/path/path_mod.c
index 5e91927..15fbc4d 100644
--- a/modules_k/path/path_mod.c
+++ b/modules_k/path/path_mod.c
@@ -52,6 +52,7 @@
 #include "../../sr_module.h"
 #include "../../mem/mem.h"
 #include "../../mod_fix.h"
+#include "../outbound/api.h"
 #include "../rr/api.h"
 
 #include "path.h"
@@ -74,6 +75,10 @@ static int mod_init(void);
  */
 struct rr_binds path_rrb;
 
+/*! \brief
+ * outbound API
+ */
+ob_api_t path_obb;
 
 /*! \brief
  * Exported functions
@@ -131,6 +136,13 @@ static int mod_init(void)
 			return -1;
 		}
 	}
+
+	if (ob_load_api(&path_obb) == 0)
+		LM_INFO("Bound path module to outbound module\n");
+	else {
+		LM_INFO("outbound module not available\n");
+		memset(&path_obb, 0, sizeof(ob_api_t));
+	}
 	
 	return 0;
 }
diff --git a/modules_k/path/path_mod.h b/modules_k/path/path_mod.h
index 77f4897..f580362 100644
--- a/modules_k/path/path_mod.h
+++ b/modules_k/path/path_mod.h
@@ -34,7 +34,9 @@
 #ifndef PATH_MOD_H
 #define PATH_MOD_H
 
-extern int use_received;
+#include "../outbound/api.h"
 
+extern int use_received;
+extern ob_api_t path_obb;
 
 #endif /* PATH_MOD_H */




More information about the sr-dev mailing list