[sr-dev] git:rfuchs/rtpproxy-ng: rtpproxy-ng: implement $rtpstat and document start_recording()

Richard Fuchs rfuchs at sipwise.com
Thu Jul 11 21:37:16 CEST 2013


Module: sip-router
Branch: rfuchs/rtpproxy-ng
Commit: eba7dcbe6b3ba7b88c0fa0b231cb265a68995e47
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=eba7dcbe6b3ba7b88c0fa0b231cb265a68995e47

Author: Richard Fuchs <rfuchs at sipwise.com>
Committer: Richard Fuchs <rfuchs at sipwise.com>
Date:   Thu Jul 11 15:36:54 2013 -0400

rtpproxy-ng: implement $rtpstat and document start_recording()

---

 modules/rtpproxy-ng/README                 |   43 +++++++---
 modules/rtpproxy-ng/doc/rtpproxy_admin.xml |   16 ++--
 modules/rtpproxy-ng/rtpproxy.c             |  123 +++++++++++++--------------
 3 files changed, 98 insertions(+), 84 deletions(-)

diff --git a/modules/rtpproxy-ng/README b/modules/rtpproxy-ng/README
index 6c33f36..3155db6 100644
--- a/modules/rtpproxy-ng/README
+++ b/modules/rtpproxy-ng/README
@@ -74,10 +74,11 @@ Richard Fuchs
               5.4. rtpproxy_destroy([flags])
               5.5. unforce_rtp_proxy()
               5.6. rtpproxy_manage([flags [, ip_address]])
+              5.7. start_recording()
 
         6. Exported Pseudo Variables
 
-              6.1. $rtpstart
+              6.1. $rtpstat
 
         7. MI Commands
 
@@ -98,9 +99,10 @@ Richard Fuchs
    1.8. rtpproxy_answer usage
    1.9. rtpproxy_destroy usage
    1.10. rtpproxy_manage usage
-   1.11. $rtpstat-Usage
-   1.12. nh_enable_rtpp usage
-   1.13. nh_show_rtpp usage
+   1.11. start_recording usage
+   1.12. $rtpstat Usage
+   1.13. nh_enable_rtpp usage
+   1.14. nh_show_rtpp usage
 
 Chapter 1. Admin Guide
 
@@ -129,10 +131,11 @@ Chapter 1. Admin Guide
         5.4. rtpproxy_destroy([flags])
         5.5. unforce_rtp_proxy()
         5.6. rtpproxy_manage([flags [, ip_address]])
+        5.7. start_recording()
 
    6. Exported Pseudo Variables
 
-        6.1. $rtpstart
+        6.1. $rtpstat
 
    7. MI Commands
 
@@ -278,6 +281,7 @@ modparam("rtpproxy-ng", "extra_id_pv", "$avp(extra_id)")
    5.4. rtpproxy_destroy([flags])
    5.5. unforce_rtp_proxy()
    5.6. rtpproxy_manage([flags [, ip_address]])
+   5.7. start_recording()
 
 5.1.  set_rtp_proxy_set(setid)
 
@@ -538,18 +542,31 @@ rtpproxy_destroy();
 rtpproxy_manage();
 ...
 
+5.7.  start_recording()
+
+   This function will send a signal to the RTP Proxy to record the RTP
+   stream on the RTP Proxy. This function is not supported by
+   ngcp-mediaproxy-ng at the moment!
+
+   This function can be used from REQUEST_ROUTE and ONREPLY_ROUTE.
+
+   Example 1.11. start_recording usage
+...
+start_recording();
+...
+
 6. Exported Pseudo Variables
 
-   6.1. $rtpstart
+   6.1. $rtpstat
 
-6.1. $rtpstart
+6.1. $rtpstat
 
-   Returns the RTP-Statistics from the RTP-Proxy. The RTP-Statistics from
-   the RTP-Proxy are provided as a string and it does contain several
-   packet-counters. The statistics must be retrieved before the session is
+   Returns the RTP Statistics from the RTP Proxy. The RTP Statistics from
+   the RTP Proxy are provided as a string and it does contain several
+   packet counters. The statistics must be retrieved before the session is
    deleted (before unforce_rtpproxy()).
 
-   Example 1.11. $rtpstat-Usage
+   Example 1.12. $rtpstat Usage
 ...
     append_hf("X-RTP-Statistics: $rtpstat\r\n");
 ...
@@ -572,7 +589,7 @@ rtpproxy_manage();
    NOTE: if a rtpproxy is defined multiple times (in the same or diferente
    sete), all of its instances will be enables/disabled.
 
-   Example 1.12.  nh_enable_rtpp usage
+   Example 1.13.  nh_enable_rtpp usage
 ...
 $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
 ...
@@ -584,7 +601,7 @@ $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
 
    No parameter.
 
-   Example 1.13.  nh_show_rtpp usage
+   Example 1.14.  nh_show_rtpp usage
 ...
 $ kamctl fifo nh_show_rtpp
 ...
diff --git a/modules/rtpproxy-ng/doc/rtpproxy_admin.xml b/modules/rtpproxy-ng/doc/rtpproxy_admin.xml
index 074beeb..9ad60c3 100644
--- a/modules/rtpproxy-ng/doc/rtpproxy_admin.xml
+++ b/modules/rtpproxy-ng/doc/rtpproxy_admin.xml
@@ -710,14 +710,15 @@ rtpproxy_manage();
 	    These functions can be used from REQUEST_ROUTE, ONREPLY_ROUTE.
 	</para>
 	</section>
+-->
 	<section>
 		<title>
 		<function moreinfo="none">start_recording()</function>
 		</title>
 		<para>
-		This function will send a signal to the RTP-Proxy to record
-		the RTP stream on the RTP-Proxy.
-		<emphasis>This function is only supported by Sippy RTPproxy at the moment!</emphasis>
+		This function will send a signal to the RTP Proxy to record
+		the RTP stream on the RTP Proxy.
+		<emphasis>This function is not supported by ngcp-mediaproxy-ng at the moment!</emphasis>
 		</para>
 		<para>
 		This function can be used from REQUEST_ROUTE and ONREPLY_ROUTE.
@@ -731,6 +732,7 @@ start_recording();
 		</programlisting>
 		</example>
 	</section>
+<!--
 	<section id="rtpproxy_stop_stream2uas">
 	<title>
 	    <function>rtpproxy_stop_stream2uas(prompt_name, count)</function>
@@ -747,15 +749,15 @@ start_recording();
 	<section>
 		<title>Exported Pseudo Variables</title>
 		<section>
-			<title><function moreinfo="none">$rtpstart</function></title>
+			<title><function moreinfo="none">$rtpstat</function></title>
 			<para>
-			Returns the RTP-Statistics from the RTP-Proxy. The RTP-Statistics from the RTP-Proxy
-			are provided as a string and it does contain several packet-counters. The statistics
+			Returns the RTP Statistics from the RTP Proxy. The RTP Statistics from the RTP Proxy
+			are provided as a string and it does contain several packet counters. The statistics
 			must be retrieved before the session is deleted	(before <function>unforce_rtpproxy()</function>).
 			</para>
 
 		<example>
-		<title>$rtpstat-Usage</title>
+		<title>$rtpstat Usage</title>
 		<programlisting format="linespecific">
 ...
     append_hf("X-RTP-Statistics: $rtpstat\r\n");
diff --git a/modules/rtpproxy-ng/rtpproxy.c b/modules/rtpproxy-ng/rtpproxy.c
index fe49329..7675cc8 100644
--- a/modules/rtpproxy-ng/rtpproxy.c
+++ b/modules/rtpproxy-ng/rtpproxy.c
@@ -283,13 +283,15 @@ enum rtpp_operation {
 	OP_ANSWER,
 	OP_DELETE,
 	OP_START_RECORDING,
+	OP_QUERY,
 };
 
 static const char *command_strings[] = {
-	[1] = "offer",
-	[2] = "answer",
-	[3] = "delete",
-	[4] = "start recording",
+	[OP_OFFER]		= "offer",
+	[OP_ANSWER]		= "answer",
+	[OP_DELETE]		= "delete",
+	[OP_START_RECORDING]	= "start recording",
+	[OP_QUERY]		= "query",
 };
 
 static char *gencookie();
@@ -1364,6 +1366,23 @@ static int rtpp_function_call_simple(struct sip_msg *msg, enum rtpp_operation op
 	return 1;
 }
 
+static bencode_item_t *rtpp_function_call_ok(bencode_buffer_t *bencbuf, struct sip_msg *msg,
+		enum rtpp_operation op, const char *flags_str, str *body) {
+	bencode_item_t *ret;
+
+	ret = rtpp_function_call(bencbuf, msg, op, flags_str, body);
+	if (!ret)
+		return NULL;
+
+	if (bencode_dictionary_get_strcmp(ret, "result", "ok")) {
+		LM_ERR("proxy didn't return \"ok\" result\n");
+		bencode_buffer_free(bencbuf);
+		return NULL;
+	}
+
+	return ret;
+}
+
 
 
 static int
@@ -1865,15 +1884,10 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, int offer, int forc
 	str body, newbody;
 	struct lump *anchor;
 
-	dict = rtpp_function_call(&bencbuf, msg, offer ? OP_OFFER : OP_ANSWER, str1, &body);
+	dict = rtpp_function_call_ok(&bencbuf, msg, offer ? OP_OFFER : OP_ANSWER, str1, &body);
 	if (!dict)
 		return -1;
 
-	if (bencode_dictionary_get_strcmp(dict, "result", "ok")) {
-		LM_ERR("proxy didn't return \"ok\" result\n");
-		goto error;
-	}
-
 	if (!bencode_dictionary_get_str_dup(dict, "sdp", &newbody)) {
 		LM_ERR("failed to extract sdp body from proxy reply\n");
 		goto error;
@@ -1913,59 +1927,40 @@ static int
 pv_get_rtpstat_f(struct sip_msg *msg, pv_param_t *param,
 		  pv_value_t *res)
 {
-#if 0
-    str ret_val = {0, 0};
-    int nitems;
-    str callid = {0, 0};
-    str from_tag = {0, 0};
-    str to_tag = {0, 0};
-    struct rtpp_node *node;
-    struct iovec v[1 + 4 + 3 + 1] = {{NULL, 0}, {"Q", 1}, {" ", 1}, {NULL, 0},
-		{" ", 1}, {NULL, 0}, {";1 ", 3}, {";1", }, {NULL, 0}};
-
-    if (get_callid(msg, &callid) == -1 || callid.len == 0) {
-        LM_ERR("can't get Call-Id field\n");
-		return pv_get_null(msg, param, res);
-    }
-    if (get_to_tag(msg, &to_tag) == -1) {
-        LM_ERR("can't get To tag\n");
-		return pv_get_null(msg, param, res);
-    }
-    if (get_from_tag(msg, &from_tag) == -1 || from_tag.len == 0) {
-        LM_ERR("can't get From tag\n");
-		return pv_get_null(msg, param, res);
-    }
-    if(msg->id != current_msg_id){
-        selected_rtpp_set = default_rtpp_set;
-    }
-
-    STR2IOVEC(callid, v[3]);
-    STR2IOVEC(from_tag, v[5]);
-    STR2IOVEC(to_tag, v[7]);
-    node = select_rtpp_node(callid, 1);
-    if (!node) {
-        LM_ERR("no available proxies\n");
-        return -1;
-    }
-    nitems = 8;
-    if (msg->first_line.type == SIP_REPLY) {
-        if (to_tag.len == 0)
-            return -1;
-        STR2IOVEC(to_tag, v[5]);
-        STR2IOVEC(from_tag, v[7]);
-    } else {
-        STR2IOVEC(from_tag, v[5]);
-        STR2IOVEC(to_tag, v[7]);
-        if (to_tag.len <= 0)
-            nitems = 6;
-    }
-    ret_val.s = send_rtpp_command(node, v, nitems);
-	if(ret_val.s==NULL)
-		return pv_get_null(msg, param, res);
-    ret_val.len = strlen(ret_val.s);
-    return pv_get_strval(msg, param, res, &ret_val);
-#else
-	return 1;
-#endif
+	bencode_buffer_t bencbuf;
+	bencode_item_t *dict, *tot, *in, *out;
+	static char buf[256];
+	str ret;
+
+	dict = rtpp_function_call_ok(&bencbuf, msg, OP_QUERY, NULL, NULL);
+	if (!dict)
+		return -1;
+
+	tot = bencode_dictionary_get_expect(dict, "totals", BENCODE_DICTIONARY);
+	in = bencode_dictionary_get_expect(tot, "input", BENCODE_DICTIONARY);
+	in = bencode_dictionary_get_expect(in, "rtp", BENCODE_DICTIONARY);
+	out = bencode_dictionary_get_expect(tot, "output", BENCODE_DICTIONARY);
+	out = bencode_dictionary_get_expect(out, "rtp", BENCODE_DICTIONARY);
+
+	if (!in || !out)
+		goto error;
+
+	ret.s = buf;
+	ret.len = snprintf(buf, sizeof(buf),
+			"Input: %lli bytes, %lli packets, %lli errors; "
+			"Output: %lli bytes, %lli packets, %lli errors",
+			bencode_dictionary_get_integer(in, "bytes", -1),
+			bencode_dictionary_get_integer(in, "packets", -1),
+			bencode_dictionary_get_integer(in, "errors", -1),
+			bencode_dictionary_get_integer(out, "bytes", -1),
+			bencode_dictionary_get_integer(out, "packets", -1),
+			bencode_dictionary_get_integer(out, "errors", -1));
+
+	bencode_buffer_free(&bencbuf);
+	return pv_get_strval(msg, param, res, &ret);
+
+error:
+	bencode_buffer_free(&bencbuf);
+	return -1;
 }
 




More information about the sr-dev mailing list