rtpproxy: allow pv as parameter to set_rtpproxy_set() function
authorDaniel-Constantin Mierla <miconda@gmail.com>
Fri, 27 Jul 2012 11:14:53 +0000 (13:14 +0200)
committerDaniel-Constantin Mierla <miconda@gmail.com>
Fri, 27 Jul 2012 11:15:49 +0000 (13:15 +0200)
modules/rtpproxy/README
modules/rtpproxy/doc/rtpproxy_admin.xml
modules/rtpproxy/rtpproxy.c

index 61f4720..059c326 100644 (file)
@@ -24,13 +24,13 @@ Edited by
 
 Sas Ovidiu
 
-   Copyright Â© 2003-2008 Sippy Software, Inc.
+   Copyright © 2003-2008 Sippy Software, Inc.
 
-   Copyright Â© 2005 Voice Sistem SRL
+   Copyright © 2005 Voice Sistem SRL
 
-   Copyright Â© 2009 TuTPro Inc.
+   Copyright © 2009 TuTPro Inc.
 
-   Copyright Â© 2010 VoIPEmbedded Inc.
+   Copyright © 2010 VoIPEmbedded Inc.
      __________________________________________________________________
 
    Table of Contents
@@ -56,7 +56,7 @@ Sas Ovidiu
 
         5. Functions
 
-              5.1. set_rtp_proxy_set()
+              5.1. set_rtp_proxy_set(setid)
               5.2. rtpproxy_offer([flags [, ip_address]])
               5.3. rtpproxy_answer([flags [, ip_address]])
               5.4. rtpproxy_destroy([flags])
@@ -122,7 +122,7 @@ Chapter 1. Admin Guide
 
    5. Functions
 
-        5.1. set_rtp_proxy_set()
+        5.1. set_rtp_proxy_set(setid)
         5.2. rtpproxy_offer([flags [, ip_address]])
         5.3. rtpproxy_answer([flags [, ip_address]])
         5.4. rtpproxy_destroy([flags])
@@ -162,7 +162,7 @@ Chapter 1. Admin Guide
    load-balancing will be performed over a set and the user has the
    ability to choose what set should be used. The set is selected via its
    id - the id being defined along with the set. Refer to the
-   “rtpproxy_sock” module parameter definition for syntax description.
+   "rtpproxy_sock" module parameter definition for syntax description.
 
    The balancing inside a set is done automatically by the module based on
    the weight of each rtpproxy from the set.
@@ -210,7 +210,7 @@ Chapter 1. Admin Guide
    Definition of socket(s) used to connect to (a set) RTPProxy. It may
    specify a UNIX socket or an IPv4/IPv6 UDP socket.
 
-   Default value is “NONE” (disabled).
+   Default value is "NONE" (disabled).
 
    Example 1.1. Set rtpproxy_sock parameter
 ...
@@ -232,7 +232,7 @@ modparam("rtpproxy", "rtpproxy_sock",
    will not attempt to establish communication to RTPProxy for
    rtpproxy_disable_tout seconds.
 
-   Default value is “60”.
+   Default value is "60".
 
    Example 1.2. Set rtpproxy_disable_tout parameter
 ...
@@ -243,7 +243,7 @@ modparam("rtpproxy", "rtpproxy_disable_tout", 20)
 
    Timeout value in waiting for reply from RTPProxy.
 
-   Default value is “1”.
+   Default value is "1".
 
    Example 1.3. Set rtpproxy_tout parameter
 ...
@@ -255,7 +255,7 @@ modparam("rtpproxy", "rtpproxy_tout", 2)
    How many times rtpproxy should retry to send and receive after timeout
    was generated.
 
-   Default value is “5”.
+   Default value is "5".
 
    Example 1.4. Set rtpproxy_retr parameter
 ...
@@ -267,7 +267,7 @@ modparam("rtpproxy", "rtpproxy_retr", 2)
    Socket to be forced in communicating to RTPProxy. It makes sense only
    for UDP communication. If no one specified, the OS will choose.
 
-   Default value is “NULL”.
+   Default value is "NULL".
 
    Example 1.5. Set force_socket parameter
 ...
@@ -285,7 +285,7 @@ Note
 
    The string must be a complete SDP line, including the EOH (\r\n).
 
-   Default value is “a=nortpproxy:yes\r\n”.
+   Default value is "a=nortpproxy:yes\r\n".
 
    Example 1.6. Set nortpproxy_str parameter
 ...
@@ -300,7 +300,7 @@ modparam("rtpproxy", "nortpproxy_str", "a=sdpmangled:yes\r\n")
    If it is an empty string, no timeout socket will be transmitted to the
    RTP-Proxy.
 
-   Default value is “” (nothing).
+   Default value is "" (nothing).
 
    Example 1.7. Set timeout_socket parameter
 ...
@@ -309,7 +309,7 @@ modparam("nathelper", "timeout_socket", "xmlrpc:http://127.0.0.1:8000/RPC2")
 
 5. Functions
 
-   5.1. set_rtp_proxy_set()
+   5.1. set_rtp_proxy_set(setid)
    5.2. rtpproxy_offer([flags [, ip_address]])
    5.3. rtpproxy_answer([flags [, ip_address]])
    5.4. rtpproxy_destroy([flags])
@@ -321,10 +321,12 @@ modparam("nathelper", "timeout_socket", "xmlrpc:http://127.0.0.1:8000/RPC2")
    5.10. start_recording()
    5.11. rtpproxy_stop_stream2uas(prompt_name, count)
 
-5.1.  set_rtp_proxy_set()
+5.1. set_rtp_proxy_set(setid)
 
    Sets the Id of the rtpproxy set to be used for the next
-   unforce_rtp_proxy(), rtpproxy_offer() or rtpproxy_answer() command.
+   unforce_rtp_proxy(), rtpproxy_offer(), rtpproxy_answer() or
+   rtpproxy_manage() command. The parameter can be an integer or a config
+   variable holding an integer.
 
    This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE,
    BRANCH_ROUTE.
@@ -335,7 +337,7 @@ set_rtp_proxy_set("2");
 rtpproxy_offer();
 ...
 
-5.2.  rtpproxy_offer([flags [, ip_address]])
+5.2. rtpproxy_offer([flags [, ip_address]])
 
    Rewrites SDP body to ensure that media is passed through an RTP proxy.
    To be invoked on INVITE for the cases the SDPs are in INVITE and 200 OK
@@ -345,22 +347,22 @@ rtpproxy_offer();
      * flags - flags to turn on some features.
           + 1 - append first Via branch to Call-ID when sending command to
             rtpproxy. This can be used to create one media session per
-            branch on the rtpproxy. When sending a subsequent “delete”
+            branch on the rtpproxy. When sending a subsequent "delete"
             command to the rtpproxy, you can then stop just the session
             for a specific branch when passing the flag '1' or '2' in the
-            “unforce_rtpproxy”, or stop all sessions for a call when not
+            "unforce_rtpproxy", or stop all sessions for a call when not
             passing one of those two flags there. This is especially
             useful if you have serially forked call scenarios where
-            rtpproxy gets an “update” command for a new branch, and then a
-            “delete” command for the previous branch, which would
+            rtpproxy gets an "update" command for a new branch, and then a
+            "delete" command for the previous branch, which would
             otherwise delete the full call, breaking the subsequent
-            “lookup” for the new branch. This flag is only supported by
+            "lookup" for the new branch. This flag is only supported by
             the ngcp-mediaproxy-ng rtpproxy at the moment!
           + 2 - append second Via branch to Call-ID when sending command
             to rtpproxy. See flag '1' for its meaning.
           + a - flags that UA from which message is received doesn't
             support symmetric RTP. (automatically sets the 'r' flag)
-          + l - force “lookup”, that is, only rewrite SDP when
+          + l - force "lookup", that is, only rewrite SDP when
             corresponding session is already exists in the RTP proxy. By
             default is on when the session is to be completed.
           + i, e - these flags specify the direction of the SIP message.
@@ -438,7 +440,7 @@ onreply_route[2]
 ...
 }
 
-5.3.  rtpproxy_answer([flags [, ip_address]])
+5.3. rtpproxy_answer([flags [, ip_address]])
 
    Rewrites SDP body to ensure that media is passed through an RTP proxy.
    To be invoked on 200 OK for the cases the SDPs are in INVITE and 200 OK
@@ -454,7 +456,7 @@ onreply_route[2]
 
    See rtpproxy_offer() function example above for example.
 
-5.4.  rtpproxy_destroy([flags])
+5.4. rtpproxy_destroy([flags])
 
    Tears down the RTPProxy session for the current call.
 
@@ -464,16 +466,16 @@ onreply_route[2]
      * flags - flags to turn on some features.
           + 1 - append first Via branch to Call-ID when sending command to
             rtpproxy. This can be used to create one media session per
-            branch on the rtpproxy. When sending a subsequent “delete”
+            branch on the rtpproxy. When sending a subsequent "delete"
             command to the rtpproxy, you can then stop just the session
             for a specific branch when passing the flag '1' or '2' in the
-            “unforce_rtpproxy”, or stop all sessions for a call when not
+            "unforce_rtpproxy", or stop all sessions for a call when not
             passing one of those two flags there. This is especially
             useful if you have serially forked call scenarios where
-            rtpproxy gets an “update” command for a new branch, and then a
-            “delete” command for the previous branch, which would
+            rtpproxy gets an "update" command for a new branch, and then a
+            "delete" command for the previous branch, which would
             otherwise delete the full call, breaking the subsequent
-            “lookup” for the new branch. This flag is only supported by
+            "lookup" for the new branch. This flag is only supported by
             the ngcp-mediaproxy-ng rtpproxy at the moment!
           + 2 - append second Via branch to Call-ID when sending command
             to rtpproxy. See flag '1' for its meaning.
@@ -483,11 +485,11 @@ onreply_route[2]
 rtpproxy_destroy();
 ...
 
-5.5.  unforce_rtp_proxy()
+5.5. unforce_rtp_proxy()
 
    Same as rtpproxy_destroy().
 
-5.6.  rtpproxy_manage([flags [, ip_address]])
+5.6. rtpproxy_manage([flags [, ip_address]])
 
    Manage the RTPProxy session - it combines the functionality of
    rtpproxy_offer(), rtpproxy_answer() and unfroce_rtpproxy(), detecting
@@ -515,7 +517,7 @@ rtpproxy_destroy();
 rtpproxy_manage();
 ...
 
-5.7.  rtpproxy_stream2uac(prompt_name, count),
+5.7. rtpproxy_stream2uac(prompt_name, count),
 
    Instruct the RTPproxy to stream prompt/announcement pre-encoded with
    the makeann command from the RTPproxy distribution. The uac/uas suffix
@@ -557,11 +559,11 @@ rtpproxy_manage();
     };
 ...
 
-5.8.  rtpproxy_stream2uas(prompt_name, count)
+5.8. rtpproxy_stream2uas(prompt_name, count)
 
    See function rtpproxy_stream2uac(prompt_name, count).
 
-5.9.  rtpproxy_stop_stream2uac(),
+5.9. rtpproxy_stop_stream2uac(),
 
    Stop streaming of announcement/prompt/MOH started previously by the
    respective rtpproxy_stream2xxx. The uac/uas suffix selects whose
@@ -570,7 +572,7 @@ rtpproxy_manage();
 
    These functions can be used from REQUEST_ROUTE, ONREPLY_ROUTE.
 
-5.10.  start_recording()
+5.10. start_recording()
 
    This command will send a signal to the RTP-Proxy to record the RTP
    stream on the RTP-Proxy.
@@ -582,7 +584,7 @@ rtpproxy_manage();
 start_recording();
 ...
 
-5.11.  rtpproxy_stop_stream2uas(prompt_name, count)
+5.11. rtpproxy_stop_stream2uas(prompt_name, count)
 
    See function rtpproxy_stop_stream2uac(prompt_name, count).
 
@@ -620,7 +622,7 @@ start_recording();
    NOTE: if a rtpproxy is defined multiple times (in the same or diferente
    sete), all its instances will be enables/disabled.
 
-   Example 1.16.  nh_enable_rtpp usage
+   Example 1.16. nh_enable_rtpp usage
 ...
 $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
 ...
@@ -632,52 +634,52 @@ $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
 
    No parameter.
 
-   Example 1.17.  nh_show_rtpp usage
+   Example 1.17. nh_show_rtpp usage
 ...
 $ kamctl fifo nh_show_rtpp
 ...
 
 Chapter 2. Frequently Asked Questions
 
-   2.1. What happend with “rtpproxy_disable” parameter?
+   2.1. What happend with "rtpproxy_disable" parameter?
    2.2. Where can I find more about Kamailio?
    2.3. Where can I post a question about this module?
    2.4. How can I report a bug?
 
    2.1.
 
-       What happend with “rtpproxy_disable” parameter?
+   What happend with "rtpproxy_disable" parameter?
 
-       It was removed as it became obsolete - now “rtpproxy_sock” can take
-       empty value to disable the rtpproxy functionality.
+   It was removed as it became obsolete - now "rtpproxy_sock" can take
+   empty value to disable the rtpproxy functionality.
 
    2.2.
 
-       Where can I find more about Kamailio?
+   Where can I find more about Kamailio?
 
-       Take a look at http://www.kamailio.org/.
+   Take a look at http://www.kamailio.org/.
 
    2.3.
 
-       Where can I post a question about this module?
+   Where can I post a question about this module?
 
-       First at all check if your question was already answered on one of our
-       mailing lists:
-         * User Mailing List -
-           http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
-         * Developer Mailing List -
-           http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
+   First at all check if your question was already answered on one of our
+   mailing lists:
+     * User Mailing List -
+       http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
+     * Developer Mailing List -
+       http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
 
-       E-mails regarding any stable Kamailio release should be sent to
-       <sr-users@lists.sip-router.org> and e-mails regarding development
-       versions should be sent to <sr-dev@lists.sip-router.org>.
+   E-mails regarding any stable Kamailio release should be sent to
+   <sr-users@lists.sip-router.org> and e-mails regarding development
+   versions should be sent to <sr-dev@lists.sip-router.org>.
 
-       If you want to keep the mail private, send it to
-       <sr-users@lists.sip-router.org>.
+   If you want to keep the mail private, send it to
+   <sr-users@lists.sip-router.org>.
 
    2.4.
 
-       How can I report a bug?
+   How can I report a bug?
 
-       Please follow the guidelines provided at:
-       http://sip-router.org/tracker.
+   Please follow the guidelines provided at:
+   http://sip-router.org/tracker.
index 6b9577a..a245d73 100644 (file)
@@ -260,12 +260,13 @@ modparam("nathelper", "timeout_socket", "xmlrpc:http://127.0.0.1:8000/RPC2")
        <title>Functions</title>
        <section>
                <title>
-               <function moreinfo="none">set_rtp_proxy_set()</function>
+               <function moreinfo="none">set_rtp_proxy_set(setid)</function>
                </title>
                <para>
                Sets the Id of the rtpproxy set to be used for the next
-               unforce_rtp_proxy(), rtpproxy_offer() or rtpproxy_answer()
-               command.
+               unforce_rtp_proxy(), rtpproxy_offer(), rtpproxy_answer()
+               or rtpproxy_manage() command. The parameter can be an integer or
+               a config variable holding an integer.
                </para>
                <para>
                This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE,
index eee5ce0..6cecc0f 100644 (file)
@@ -337,6 +337,11 @@ static unsigned int rtpp_no = 0;
 static int *rtpp_socks = 0;
 
 
+typedef struct rtpp_set_link {
+       struct rtpp_set *rset;
+       pv_spec_t *rpv;
+} rtpp_set_link_t;
+
 /* tm */
 static struct tm_binds tmb;
 
@@ -669,21 +674,45 @@ static int fixup_set_id(void ** param, int param_no)
 {
        int int_val, err;
        struct rtpp_set* rtpp_list;
+       rtpp_set_link_t *rtpl = NULL;
+       str s;
 
-       int_val = str2s(*param, strlen(*param), &err);
-       if (err == 0) {
-               pkg_free(*param);
-               if((rtpp_list = select_rtpp_set(int_val)) ==0){
-                       LM_ERR("rtpp_proxy set %i not configured\n", int_val);
-                       return E_CFG;
+       rtpl = (rtpp_set_link_t*)pkg_malloc(sizeof(rtpp_set_link_t));
+       if(rtpl==NULL) {
+               LM_ERR("no more pkg memory\n");
+               return -1;
+       }
+       memset(rtpl, 0, sizeof(rtpp_set_link_t));
+       s.s = (char*)*param;
+       s.len = strlen(s.s);
+
+       if(s.s[0] == PV_MARKER) {
+               int_val = pv_locate_name(&s);
+               if(int_val<0 || int_val!=s.len) {
+                       LM_ERR("invalid parameter %s\n", s.s);
+                       return -1;
+               }
+               rtpl->rpv = pv_cache_get(&s);
+               if(rtpl->rpv == NULL) {
+                       LM_ERR("invalid pv parameter %s\n", s.s);
+                       return -1;
                }
-               *param = (void *)rtpp_list;
-       
-               return 0;
        } else {
-               LM_ERR("bad number <%s>\n",     (char *)(*param));
-               return E_CFG;
+               int_val = str2s(*param, strlen(*param), &err);
+               if (err == 0) {
+                       pkg_free(*param);
+                       if((rtpp_list = select_rtpp_set(int_val)) ==0){
+                               LM_ERR("rtpp_proxy set %i not configured\n", int_val);
+                               return E_CFG;
+                       }
+                       rtpl->rset = rtpp_list;
+               } else {
+                       LM_ERR("bad number <%s>\n",     (char *)(*param));
+                       return E_CFG;
+               }
        }
+       *param = (void*)rtpl;
+       return 0;
 }
 
 static struct mi_root* mi_enable_rtp_proxy(struct mi_root* cmd_tree, 
@@ -1713,8 +1742,33 @@ unforce_rtp_proxy_f(struct sip_msg* msg, char* str1, char* str2)
 static int
 set_rtp_proxy_set_f(struct sip_msg * msg, char * str1, char * str2)
 {
-       current_msg_id = msg->id;
-       selected_rtpp_set = (struct rtpp_set *)str1;
+       rtpp_set_link_t *rtpl;
+       pv_value_t val;
+
+       rtpl = (rtpp_set_link_t*)str1;
+
+       current_msg_id = 0;
+       selected_rtpp_set = 0;
+
+       if(rtpl->rset != NULL) {
+               current_msg_id = msg->id;
+               selected_rtpp_set = rtpl->rset;
+       } else {
+               if(pv_get_spec_value(msg, rtpl->rpv, &val)<0) {
+                       LM_ERR("cannot evaluate pv param\n");
+                       return -1;
+               }
+               if(!(val.flags & PV_VAL_INT)) {
+                       LM_ERR("pv param must hold an integer value\n");
+                       return -1;
+               }
+               selected_rtpp_set = select_rtpp_set(val.ri);
+               if(selected_rtpp_set==NULL) {
+                       LM_ERR("could not locate rtpproxy set %d\n", val.ri);
+                       return -1;
+               }
+               current_msg_id = msg->id;
+       }
        return 1;
 }