Преглед на файлове

Merge pull request #73 from kamailio/coudot/rtpengine_pv_sdp

New parameter to return SDP in a pv instead of message body
Camille Oudot преди 10 години
родител
ревизия
a8783c033c
променени са 3 файла, в които са добавени 111 реда и са изтрити 26 реда
  1. 52 18
      modules/rtpengine/README
  2. 20 0
      modules/rtpengine/doc/rtpengine_admin.xml
  3. 39 8
      modules/rtpengine/rtpengine.c

+ 52 - 18
modules/rtpengine/README

@@ -67,6 +67,8 @@ Richard Fuchs
               4.5. extra_id_pv (string)
               4.6. setid_avp (string)
               4.7. force_send_interface (string)
+              4.8. write_sdp_pv (string)
+              4.9. rtp_inst_pvar (string)
 
         5. Functions
 
@@ -97,15 +99,17 @@ Richard Fuchs
    1.5. Set extra_id_pv parameter
    1.6. Set setid_avp parameter
    1.7. Set force_send_interface parameter
-   1.8. set_rtpengine_set usage
-   1.9. rtpengine_offer usage
-   1.10. rtpengine_answer usage
-   1.11. rtpengine_delete usage
-   1.12. rtpengine_manage usage
-   1.13. start_recording usage
-   1.14. $rtpstat Usage
-   1.15. nh_enable_rtpp usage
-   1.16. nh_show_rtpp usage
+   1.8. Set write_sdp_avp parameter
+   1.9. Set rtp_inst_pvar parameter
+   1.10. set_rtpengine_set usage
+   1.11. rtpengine_offer usage
+   1.12. rtpengine_answer usage
+   1.13. rtpengine_delete usage
+   1.14. rtpengine_manage usage
+   1.15. start_recording usage
+   1.16. $rtpstat Usage
+   1.17. nh_enable_rtpp usage
+   1.18. nh_show_rtpp usage
 
 Chapter 1. Admin Guide
 
@@ -127,6 +131,8 @@ Chapter 1. Admin Guide
         4.5. extra_id_pv (string)
         4.6. setid_avp (string)
         4.7. force_send_interface (string)
+        4.8. write_sdp_pv (string)
+        4.9. rtp_inst_pvar (string)
 
    5. Functions
 
@@ -216,6 +222,8 @@ Chapter 1. Admin Guide
    4.5. extra_id_pv (string)
    4.6. setid_avp (string)
    4.7. force_send_interface (string)
+   4.8. write_sdp_pv (string)
+   4.9. rtp_inst_pvar (string)
 
 4.1. rtpengine_sock (string)
 
@@ -314,6 +322,32 @@ modparam("rtpengine", "setid_avp", "$avp(setid)")
 modparam("rtpengine", "force_send_interface", "10.3.7.123")
 ...
 
+4.8. write_sdp_pv (string)
+
+   If this parameter is set to a valid AVP or script var specifier, the
+   SDP returned by rtpengine in the offer/answer operations is returned in
+   the specified variable instead of the message body.
+
+   There is no default value.
+
+   Example 1.8. Set write_sdp_avp parameter
+...
+modparam("rtpengine", "write_sdp_avp", "$avp(sdp)")
+...
+
+4.9. rtp_inst_pvar (string)
+
+   A pseudo variable to store the chosen RTP Engine 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.9. Set rtp_inst_pvar parameter
+...
+modparam("rtpproxy", "rtp_inst_pvar", "$avp(RTP_INSTANCE)")
+...
+
 5. Functions
 
    5.1. set_rtpengine_set(setid[, setid])
@@ -345,7 +379,7 @@ modparam("rtpengine", "force_send_interface", "10.3.7.123")
    This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE,
    BRANCH_ROUTE.
 
-   Example 1.8. set_rtpengine_set usage
+   Example 1.10. set_rtpengine_set usage
 ...
 set_rtpengine_set("2");
 rtpengine_offer();
@@ -515,7 +549,7 @@ rtpengine_offer();
 
    This function can be used from ANY_ROUTE.
 
-   Example 1.9. rtpengine_offer usage
+   Example 1.11. rtpengine_offer usage
 route {
 ...
     if (is_method("INVITE")) {
@@ -559,7 +593,7 @@ onreply_route[2]
    This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE,
    FAILURE_ROUTE, BRANCH_ROUTE.
 
-   Example 1.10. rtpengine_answer usage
+   Example 1.12. rtpengine_answer usage
 
    See rtpengine_offer() function example above for example.
 
@@ -572,7 +606,7 @@ onreply_route[2]
 
    This function can be used from ANY_ROUTE.
 
-   Example 1.11. rtpengine_delete usage
+   Example 1.13. rtpengine_delete usage
 ...
 rtpengine_delete();
 ...
@@ -602,7 +636,7 @@ rtpengine_delete();
 
    This function can be used from ANY_ROUTE.
 
-   Example 1.12. rtpengine_manage usage
+   Example 1.14. rtpengine_manage usage
 ...
 rtpengine_manage();
 ...
@@ -615,7 +649,7 @@ rtpengine_manage();
 
    This function can be used from REQUEST_ROUTE and ONREPLY_ROUTE.
 
-   Example 1.13. start_recording usage
+   Example 1.15. start_recording usage
 ...
 start_recording();
 ...
@@ -631,7 +665,7 @@ start_recording();
    packet counters. The statistics must be retrieved before the session is
    deleted (before rtpengine_delete()).
 
-   Example 1.14. $rtpstat Usage
+   Example 1.16. $rtpstat Usage
 ...
     append_hf("X-RTP-Statistics: $rtpstat\r\n");
 ...
@@ -654,7 +688,7 @@ start_recording();
    NOTE: if a RTP proxy is defined multiple times (in the same or
    diferente sete), all of its instances will be enables/disabled.
 
-   Example 1.15.  nh_enable_rtpp usage
+   Example 1.17.  nh_enable_rtpp usage
 ...
 $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
 ...
@@ -666,7 +700,7 @@ $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
 
    No parameter.
 
-   Example 1.16.  nh_show_rtpp usage
+   Example 1.18.  nh_show_rtpp usage
 ...
 $ kamctl fifo nh_show_rtpp
 ...

+ 20 - 0
modules/rtpengine/doc/rtpengine_admin.xml

@@ -257,6 +257,26 @@ modparam("rtpengine", "setid_avp", "$avp(setid)")
 ...
 modparam("rtpengine", "force_send_interface", "10.3.7.123")
 ...
+</programlisting>
+		</example>
+	</section>
+	<section id="rtpengine.p.write_sdp_pv">
+		<title><varname>write_sdp_pv</varname> (string)</title>
+		<para>
+			If this parameter is set to a valid AVP or script var specifier, the
+            SDP returned by rtpengine in the offer/answer operations
+            is returned in the specified variable instead of the
+            message body.
+		</para>
+		<para>
+			There is no default value.
+		</para>
+		<example>
+		<title>Set <varname>write_sdp_avp</varname> parameter</title>
+<programlisting format="linespecific">
+...
+modparam("rtpengine", "write_sdp_avp", "$avp(sdp)")
+...
 </programlisting>
 		</example>
 	</section>

+ 39 - 8
modules/rtpengine/rtpengine.c

@@ -211,8 +211,13 @@ static int *rtpp_socks = 0;
 static int     setid_avp_type;
 static int_str setid_avp;
 
+static str            write_sdp_pvar_str = {NULL, 0};
+static pv_spec_t*     write_sdp_pvar = NULL;
+
+
 char* force_send_ip_str="";
 
+
 typedef struct rtpp_set_link {
 	struct rtpp_set *rset;
 	pv_spec_t *rpv;
@@ -282,6 +287,7 @@ static param_export_t params[] = {
 	{"setid_avp",             PARAM_STRING, &setid_avp_param },
 	{"force_send_interface",  PARAM_STRING, &force_send_ip_str	},
 	{"rtp_inst_pvar",         PARAM_STR, &rtp_inst_pv_param },
+	{"write_sdp_pv",          PARAM_STR, &write_sdp_pvar_str          },
 	{0, 0, 0}
 };
 
@@ -853,6 +859,16 @@ mod_init(void)
 	    setid_avp_type = avp_flags;
 	}
 
+	if (write_sdp_pvar_str.len > 0) {
+		write_sdp_pvar = pv_cache_get(&write_sdp_pvar_str);
+		if (write_sdp_pvar == NULL
+		    || (write_sdp_pvar->type != PVT_AVP &&  write_sdp_pvar->type != PVT_SCRIPTVAR) ) {
+			LM_ERR("write_sdp_pv: not a valid AVP or VAR definition <%.*s>\n",
+		       write_sdp_pvar_str.len, write_sdp_pvar_str.s);
+			return -1;
+		}
+	}
+
 	if (rtpp_strings)
 		pkg_free(rtpp_strings);
 
@@ -1962,6 +1978,7 @@ rtpengine_offer_answer(struct sip_msg *msg, const char *flags, int op, int more)
 	bencode_item_t *dict;
 	str body, newbody;
 	struct lump *anchor;
+	pv_value_t pv_val;
 
 	dict = rtpp_function_call_ok(&bencbuf, msg, op, flags, &body);
 	if (!dict)
@@ -1978,14 +1995,28 @@ rtpengine_offer_answer(struct sip_msg *msg, const char *flags, int op, int more)
 	if (more)
 		body_intermediate = newbody;
 	else {
-		anchor = del_lump(msg, body.s - msg->buf, body.len, 0);
-		if (!anchor) {
-			LM_ERR("del_lump failed\n");
-			goto error_free;
-		}
-		if (!insert_new_lump_after(anchor, newbody.s, newbody.len, 0)) {
-			LM_ERR("insert_new_lump_after failed\n");
-			goto error_free;
+		if (write_sdp_pvar!= NULL) {
+			pv_val.rs = newbody;
+			pv_val.flags = PV_VAL_STR;
+
+			if (write_sdp_pvar->setf(msg,&write_sdp_pvar->pvp, (int)EQ_T, &pv_val) < 0)
+			{
+				LM_ERR("error setting pvar <%.*s>\n", write_sdp_pvar_str.len, write_sdp_pvar_str.s);
+				goto error_free;
+			}
+
+			pkg_free(newbody.s);
+
+		} else {
+			anchor = del_lump(msg, body.s - msg->buf, body.len, 0);
+			if (!anchor) {
+				LM_ERR("del_lump failed\n");
+				goto error_free;
+			}
+			if (!insert_new_lump_after(anchor, newbody.s, newbody.len, 0)) {
+				LM_ERR("insert_new_lump_after failed\n");
+				goto error_free;
+			}
 		}
 	}