[sr-dev] git:master:5f98fddd: rr: new config variables $fti and $tti

Daniel-Constantin Mierla miconda at gmail.com
Tue Mar 10 09:49:41 CET 2015


Module: kamailio
Branch: master
Commit: 5f98fddd971a28dbc2f29d19337a1645e869f69a
URL: https://github.com/kamailio/kamailio/commit/5f98fddd971a28dbc2f29d19337a1645e869f69a

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2015-03-10T09:48:15+01:00

rr: new config variables $fti and $tti

- $fti - from tag as in initial INVITE
- $tti - to tag as in the response to the initial INVITE
- requires append_fromtag to be set in order to detect the direction for
  requests within dialog

---

Modified: modules/rr/rr_mod.c

---

Diff:  https://github.com/kamailio/kamailio/commit/5f98fddd971a28dbc2f29d19337a1645e869f69a.diff
Patch: https://github.com/kamailio/kamailio/commit/5f98fddd971a28dbc2f29d19337a1645e869f69a.patch

---

diff --git a/modules/rr/rr_mod.c b/modules/rr/rr_mod.c
index 9147abe..67eb905 100644
--- a/modules/rr/rr_mod.c
+++ b/modules/rr/rr_mod.c
@@ -38,6 +38,8 @@
 #include "../../mem/mem.h"
 #include "../../mod_fix.h"
 #include "../../parser/parse_rr.h"
+#include "../../parser/parse_from.h"
+#include "../../parser/parse_to.h"
 #include "../outbound/api.h"
 #include "loose.h"
 #include "record.h"
@@ -77,6 +79,10 @@ static int w_is_direction(struct sip_msg *,char *, char *);
 static int remove_record_route(sip_msg_t*, char*, char*);
 /* PV functions */
 static int pv_get_route_uri_f(struct sip_msg *, pv_param_t *, pv_value_t *);
+static int pv_get_from_tag_initial(sip_msg_t *msg, pv_param_t *param,
+		pv_value_t *res);
+static int pv_get_to_tag_initial(sip_msg_t *msg, pv_param_t *param,
+		pv_value_t *res);
 /*!
  * \brief Exported functions
  */
@@ -127,7 +133,11 @@ static param_export_t params[] ={
  */
 static pv_export_t mod_pvs[] = {
     {{"route_uri", (sizeof("route_uri")-1)}, /* URI of the first Route-Header */
-     PVT_OTHER, pv_get_route_uri_f, 0, 0, 0, 0, 0},
+		PVT_OTHER, pv_get_route_uri_f, 0, 0, 0, 0, 0},
+    {{"fti", (sizeof("fti")-1)}, /* From-Tag as for initial request */
+		PVT_OTHER, pv_get_from_tag_initial, 0, 0, 0, 0, 0},
+    {{"tti", (sizeof("tti")-1)}, /* To-Tag as for response to initial request */
+		PVT_OTHER, pv_get_to_tag_initial, 0, 0, 0, 0, 0},
     {{0, 0}, 0, 0, 0, 0, 0, 0, 0}
 };
 
@@ -478,3 +488,75 @@ static int remove_record_route(sip_msg_t* _m, char* _s1, char* _s2)
 	free_rr_lump(&(_m->add_rm));
 	return 1;
 }
+
+static int pv_get_to_tag_initial(sip_msg_t *msg, pv_param_t *param,
+		pv_value_t *res)
+{
+	struct to_body *xto;
+	if(msg==NULL)
+		return -1;
+
+	if(msg->to==NULL && parse_headers(msg, HDR_TO_F, 0)==-1) {
+		LM_ERR("cannot parse To header\n");
+		return pv_get_null(msg, param, res);
+	}
+	if(msg->to==NULL || get_to(msg)==NULL) {
+		LM_DBG("no To header\n");
+		return pv_get_null(msg, param, res);
+	}
+	xto = get_to(msg);
+
+	if(is_direction(msg, RR_FLOW_UPSTREAM)==0) {
+		if(parse_from_header(msg)<0) {
+			LM_ERR("cannot parse From header\n");
+			return pv_get_null(msg, param, res);
+		}
+		if(msg->from==NULL || get_from(msg)==NULL) {
+			LM_DBG("no From header\n");
+			return pv_get_null(msg, param, res);
+		}
+		xto = get_from(msg);
+	}
+
+	if (xto->tag_value.s==NULL || xto->tag_value.len<=0) {
+		LM_DBG("no Tag parameter\n");
+		return pv_get_null(msg, param, res);
+	}
+	return pv_get_strval(msg, param, res, &xto->tag_value);
+}
+
+static int pv_get_from_tag_initial(sip_msg_t *msg, pv_param_t *param,
+		pv_value_t *res)
+{
+	struct to_body *xto;
+	if(msg==NULL)
+		return -1;
+
+	if(parse_from_header(msg)<0) {
+		LM_ERR("cannot parse From header\n");
+		return pv_get_null(msg, param, res);
+	}
+	if(msg->from==NULL || get_from(msg)==NULL) {
+		LM_DBG("no From header\n");
+		return pv_get_null(msg, param, res);
+	}
+	xto = get_from(msg);
+
+	if(is_direction(msg, RR_FLOW_UPSTREAM)==0) {
+		if(msg->to==NULL && parse_headers(msg, HDR_TO_F, 0)==-1) {
+			LM_ERR("cannot parse To header\n");
+			return pv_get_null(msg, param, res);
+		}
+		if(msg->to==NULL || get_to(msg)==NULL) {
+			LM_DBG("no To header\n");
+			return pv_get_null(msg, param, res);
+		}
+		xto = get_to(msg);
+	}
+
+	if (xto->tag_value.s==NULL || xto->tag_value.len<=0) {
+		LM_DBG("no Tag parameter\n");
+		return pv_get_null(msg, param, res);
+	}
+	return pv_get_strval(msg, param, res, &xto->tag_value);
+}




More information about the sr-dev mailing list