[sr-dev] git:master: rtpproxy: Allow any pvar for rtpproxy instance

Hugh Waite hugh.waite at crocodile-rcs.com
Tue Jan 7 12:58:33 CET 2014


Module: sip-router
Branch: master
Commit: 221cdf8497c2375133dd73ff0bed44ed6180245b
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=221cdf8497c2375133dd73ff0bed44ed6180245b

Author: Hugh Waite <hugh.waite at crocodile-rcs.com>
Committer: Hugh Waite <hugh.waite at crocodile-rcs.com>
Date:   Tue Jan  7 11:11:23 2014 +0000

rtpproxy: Allow any pvar for rtpproxy instance

---

 modules/rtpproxy/README                 |   20 ++++++------
 modules/rtpproxy/doc/rtpproxy_admin.xml |   10 +++---
 modules/rtpproxy/rtpproxy.c             |   49 +++++++++++++++----------------
 modules/rtpproxy/rtpproxy.h             |    2 +
 modules/rtpproxy/rtpproxy_db.c          |    1 +
 modules/rtpproxy/rtpproxy_stream.c      |    2 +
 6 files changed, 44 insertions(+), 40 deletions(-)

diff --git a/modules/rtpproxy/README b/modules/rtpproxy/README
index 8979560..82ecd1e 100644
--- a/modules/rtpproxy/README
+++ b/modules/rtpproxy/README
@@ -63,7 +63,7 @@ Carsten Bock
               4.8. extra_id_pv (string)
               4.9. db_url (string)
               4.10. table_name (string)
-              4.11. rtp_inst_avp (string)
+              4.11. rtp_inst_pvar (string)
 
         5. Functions
 
@@ -102,7 +102,7 @@ Carsten Bock
    1.8. Set extra_id_pv parameter
    1.9. Set db_url parameter
    1.10. Set table_name parameter
-   1.11. Set rtp_inst_avp parameter
+   1.11. Set rtp_inst_pvar parameter
    1.12. set_rtp_proxy_set usage
    1.13. rtpproxy_offer usage
    1.14. rtpproxy_answer usage
@@ -137,7 +137,7 @@ Chapter 1. Admin Guide
         4.8. extra_id_pv (string)
         4.9. db_url (string)
         4.10. table_name (string)
-        4.11. rtp_inst_avp (string)
+        4.11. rtp_inst_pvar (string)
 
    5. Functions
 
@@ -225,7 +225,7 @@ Chapter 1. Admin Guide
    4.8. extra_id_pv (string)
    4.9. db_url (string)
    4.10. table_name (string)
-   4.11. rtp_inst_avp (string)
+   4.11. rtp_inst_pvar (string)
 
 4.1. rtpproxy_sock (string)
 
@@ -381,17 +381,17 @@ modparam("rtpproxy", "db_url", "mysql://user:passwb@localhost/database")
 modparam("rtpproxy", "table_name", "my_rtpp_sets")
 ...
 
-4.11. rtp_inst_avp (string)
+4.11. rtp_inst_pvar (string)
 
-   An  avp  to store the chosen RTPProxy IP address. If this parameter is
-   set,   the   IP   address  and  port  of  the  instance  chosen  in  a
-   rtpproxy_manage() call will be stored in the given AVP.
+   A  pseudo  variable  to  store the chosen RTPProxy IP address. If this
+   parameter  is set, the IP address and port of the instance chosen will
+   be stored in the given variable.
 
    By default, this parameter is not set.
 
-   Example 1.11. Set rtp_inst_avp parameter
+   Example 1.11. Set rtp_inst_pvar parameter
 ...
-modparam("rtpproxy", "rtp_inst_avp", "$avp(RTP_INSTANCE)")
+modparam("rtpproxy", "rtp_inst_pvar", "$avp(RTP_INSTANCE)")
 ...
 
 5. Functions
diff --git a/modules/rtpproxy/doc/rtpproxy_admin.xml b/modules/rtpproxy/doc/rtpproxy_admin.xml
index c4f2c86..db206f7 100644
--- a/modules/rtpproxy/doc/rtpproxy_admin.xml
+++ b/modules/rtpproxy/doc/rtpproxy_admin.xml
@@ -322,19 +322,19 @@ modparam("rtpproxy", "table_name", "my_rtpp_sets")
 		</example>
 	</section>
 	<section>
-		<title><varname>rtp_inst_avp</varname> (string)</title>
+		<title><varname>rtp_inst_pvar</varname> (string)</title>
 		<para>
-			An avp to store the chosen RTPProxy IP address.
-			If this parameter is set, the IP address and port of the instance chosen in a rtpproxy_manage() call will be stored in the given AVP.
+			A pseudo variable to store the chosen RTPProxy IP address.
+			If this parameter is set, the IP address and port of the instance chosen will be stored in the given variable.
 		</para>
 		<para>
 			By default, this parameter is not set.
 		</para>
 		<example>
-		<title>Set <varname>rtp_inst_avp</varname> parameter</title>
+		<title>Set <varname>rtp_inst_pvar</varname> parameter</title>
 		<programlisting format="linespecific">
 ...
-modparam("rtpproxy", "rtp_inst_avp", "$avp(RTP_INSTANCE)")
+modparam("rtpproxy", "rtp_inst_pvar", "$avp(RTP_INSTANCE)")
 ...
 </programlisting>
 		</example>
diff --git a/modules/rtpproxy/rtpproxy.c b/modules/rtpproxy/rtpproxy.c
index 8cea776..073d954 100644
--- a/modules/rtpproxy/rtpproxy.c
+++ b/modules/rtpproxy/rtpproxy.c
@@ -308,8 +308,6 @@ static int mod_init(void);
 static int child_init(int);
 static void mod_destroy(void);
 
-static int set_rtp_inst_avp(const str * const uri);
-
 /* Pseudo-Variables */
 static int pv_get_rtpstat_f(struct sip_msg *, pv_param_t *, pv_value_t *);
 
@@ -339,9 +337,8 @@ struct rtpp_set * default_rtpp_set=0;
 static char *ice_candidate_priority_avp_param = NULL;
 static int ice_candidate_priority_avp_type;
 static int_str ice_candidate_priority_avp;
-static char *rtp_inst_avp_param = NULL;
-static int rtp_inst_avp_type;
-static int_str rtp_inst_avp;
+static str rtp_inst_pv_param = {NULL, 0};
+static pv_spec_t *rtp_inst_pvar = NULL;
 
 /* array with the sockets used by rtpporxy (per process)*/
 static unsigned int rtpp_no = 0;
@@ -442,7 +439,7 @@ static param_export_t params[] = {
 	{"extra_id_pv",           STR_PARAM, &extra_id_pv_param.s },
 	{"db_url",                STR_PARAM, &rtpp_db_url.s },
 	{"table_name",            STR_PARAM, &rtpp_table_name.s },
-	{"rtp_inst_avp",          STR_PARAM, &rtp_inst_avp_param },
+	{"rtp_inst_pvar",         STR_PARAM, &rtp_inst_pv_param.s },
 	{0, 0, 0}
 };
 
@@ -976,17 +973,16 @@ mod_init(void)
 	    ice_candidate_priority_avp_type = avp_flags;
 	}
 
-	if (rtp_inst_avp_param) {
-	    s.s = rtp_inst_avp_param; s.len = strlen(s.s);
-	    if (pv_parse_spec(&s, &avp_spec) == 0 || avp_spec.type != PVT_AVP) {
-		LM_ERR("malformed or non AVP definition <%s>\n", rtp_inst_avp_param);
-		return -1;
-	    }
-	    if (pv_get_avp_name(0, &(avp_spec.pvp), &rtp_inst_avp, &avp_flags) != 0) {
-		LM_ERR("invalid AVP definition <%s>\n", rtp_inst_avp_param);
+	if (rtp_inst_pv_param.s) {
+	    rtp_inst_pv_param.len = strlen(rtp_inst_pv_param.s);
+	    rtp_inst_pvar = pv_cache_get(&rtp_inst_pv_param);
+	    if ((rtp_inst_pvar == NULL) ||
+	    	((rtp_inst_pvar->type != PVT_AVP) &&
+	    	 (rtp_inst_pvar->type != PVT_XAVP) &&
+	    	 (rtp_inst_pvar->type != PVT_SCRIPTVAR))) {
+		LM_ERR("Invalid pvar name <%.*s>\n", rtp_inst_pv_param.len, rtp_inst_pv_param.s);
 		return -1;
 	    }
-	    rtp_inst_avp_type = avp_flags;
 	}
 
 	if (extra_id_pv_param.s && *extra_id_pv_param.s) {
@@ -1780,9 +1776,6 @@ select_rtpp_node(str callid, int do_test)
 		node = selected_rtpp_set->rn_first;
 		if (node->rn_disabled && node->rn_recheck_ticks <= get_ticks())
 			node->rn_disabled = rtpp_test(node, 1, 0);
-		if (!node->rn_disabled) {
-			set_rtp_inst_avp(&node->rn_url);
-		}
 		return node->rn_disabled ? NULL : node;
 	}
 
@@ -1833,7 +1826,6 @@ found:
 		if (node->rn_disabled)
 			goto retry;
 	}
-	set_rtp_inst_avp(&node->rn_url);
 	return node;
 }
 
@@ -1983,6 +1975,7 @@ unforce_rtp_proxy(struct sip_msg* msg, char* flags)
 		LM_ERR("no available proxies\n");
 		return -1;
 	}
+    	set_rtp_inst_pvar(msg, &node->rn_url);
 	send_rtpp_command(node, v, (to_tag.len > 0) ? 10 : 8);
 
 	return 1;
@@ -2654,6 +2647,7 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 					LM_ERR("no available proxies\n");
 					FORCE_RTP_PROXY_RET (-3);
 				}
+				set_rtp_inst_pvar(msg, &node->rn_url);
 				if (rep_opts.oidx > 0) {
 					if (node->rn_rep_supported == 0) {
 						LM_WARN("re-packetization is requested but is not "
@@ -2933,6 +2927,7 @@ static int start_recording_f(struct sip_msg* msg, char *foo, char *bar)
 		LM_ERR("no available proxies\n");
 		return -1;
 	}
+	set_rtp_inst_pvar(msg, &node->rn_url);
 
 	nitems = 8;
 	if (msg->first_line.type == SIP_REPLY) {
@@ -2991,6 +2986,7 @@ pv_get_rtpstat_f(struct sip_msg *msg, pv_param_t *param,
         LM_ERR("no available proxies\n");
         return -1;
     }
+    set_rtp_inst_pvar(msg, &node->rn_url);
     nitems = 8;
     if (msg->first_line.type == SIP_REPLY) {
         if (to_tag.len == 0)
@@ -3010,16 +3006,19 @@ pv_get_rtpstat_f(struct sip_msg *msg, pv_param_t *param,
     return pv_get_strval(msg, param, res, &ret_val);
 }
 
-static int set_rtp_inst_avp(const str * const uri) {
-	int_str avp_val;
-	avp_val.s = *uri;
+int set_rtp_inst_pvar(struct sip_msg *msg, const str * const uri) {
+	pv_value_t val;
 
-	if (rtp_inst_avp_param == NULL)
+	if (rtp_inst_pvar == NULL)
 		return 0;
 
-	if (add_avp(AVP_VAL_STR | rtp_inst_avp_type, rtp_inst_avp, avp_val) != 0)
+	memset(&val, 0, sizeof(pv_value_t));
+	val.flags = PV_VAL_STR;
+	val.rs = *uri;
+
+	if (rtp_inst_pvar->setf(msg, &rtp_inst_pvar->pvp, (int)EQ_T, &val) < 0)
 	{
-		LM_ERR("Failed to add RTPProxy URI to avp\n");
+		LM_ERR("Failed to add RTPProxy URI to pvar\n");
 		return -1;
 	}
 	return 0;
diff --git a/modules/rtpproxy/rtpproxy.h b/modules/rtpproxy/rtpproxy.h
index 8672926..d15a58b 100644
--- a/modules/rtpproxy/rtpproxy.h
+++ b/modules/rtpproxy/rtpproxy.h
@@ -72,6 +72,8 @@ char *send_rtpp_command(struct rtpp_node *, struct iovec *, int);
 struct rtpp_set *get_rtpp_set(str *set_name);
 int insert_rtpp_node(struct rtpp_set *const rtpp_list, const str *const url, const int weight, const int disabled);
 
+int set_rtp_inst_pvar(struct sip_msg *msg, const str * const uri);
+
 int init_rtpproxy_db(void);
 
 extern str rtpp_db_url;
diff --git a/modules/rtpproxy/rtpproxy_db.c b/modules/rtpproxy/rtpproxy_db.c
index 2d3e374..cacac30 100644
--- a/modules/rtpproxy/rtpproxy_db.c
+++ b/modules/rtpproxy/rtpproxy_db.c
@@ -24,6 +24,7 @@
 #include "../../lib/srdb1/db.h"
 #include "../../lib/srdb1/db_res.h"
 
+#include "../../parser/msg_parser.h"
 #include "rtpproxy.h"
 
 #define RTPP_TABLE_VERSION 1
diff --git a/modules/rtpproxy/rtpproxy_stream.c b/modules/rtpproxy/rtpproxy_stream.c
index 20693e0..944c8d2 100644
--- a/modules/rtpproxy/rtpproxy_stream.c
+++ b/modules/rtpproxy/rtpproxy_stream.c
@@ -119,6 +119,7 @@ rtpproxy_stream(struct sip_msg* msg, str *pname, int count, int stream2uac)
           "node.  Please upgrade the RTPproxy and try again.\n");
         return -1;
     }
+    set_rtp_inst_pvar(msg, &node->rn_url);
     nitems = 11;
     if (stream2uac == 0) {
         if (to_tag.len == 0)
@@ -202,6 +203,7 @@ rtpproxy_stop_stream(struct sip_msg* msg, int stream2uac)
           "node.  Please upgrade the RTPproxy and try again.\n");
         return -1;
     }
+    set_rtp_inst_pvar(msg, &node->rn_url);
     nitems = 9;
     if (stream2uac == 0) {
         if (to_tag.len == 0)




More information about the sr-dev mailing list