Hi,
I agree this is a better, more flexible solution. I haven't forgotten about it, but had enough time yet...

Hugh

On 04/12/2013 19:59, Daniel-Constantin Mierla wrote:
Hello Hugh,

I am wondering if doesn't make it more flexible to allow the parameter to be any writable variable (which can be avp as well, but then will work with xavp, $var(), etc). Modules such as mtree or dialplan should have example how to do it -- it is rather trivial, the setf() function from pv spec is used for setting the value.

Cheers,
Daniel

On 12/4/13 7:48 PM, Hugh Waite wrote:
Module: sip-router
Branch: master
Commit: 146e2b093ba57a9c48f2059863d214fcdfc1bd1a
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=146e2b093ba57a9c48f2059863d214fcdfc1bd1a

Author: Hugh Waite <[email protected]>
Committer: Hugh Waite <[email protected]>
Date:   Wed Dec  4 18:30:37 2013 +0000

rtpproxy: Add parameter to set an AVP to store the chosen RTPProxy instance IP address

---

modules/rtpproxy/README | 57 ++++++++++++++++++++-----------
  modules/rtpproxy/doc/rtpproxy_admin.xml |   18 ++++++++++
  modules/rtpproxy/rtpproxy.c             |   38 ++++++++++++++++++++
  3 files changed, 93 insertions(+), 20 deletions(-)

diff --git a/modules/rtpproxy/README b/modules/rtpproxy/README
index 43b57df..8979560 100644
--- a/modules/rtpproxy/README
+++ b/modules/rtpproxy/README
@@ -63,6 +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)
            5. Functions
  @@ -101,16 +102,17 @@ 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_proxy_set usage
-   1.12. rtpproxy_offer usage
-   1.13. rtpproxy_answer usage
-   1.14. rtpproxy_destroy usage
-   1.15. rtpproxy_manage usage
-   1.16. rtpproxy_stream2xxx usage
-   1.17. start_recording usage
-   1.18. $rtpstat-Usage
-   1.19. nh_enable_rtpp usage
-   1.20. nh_show_rtpp usage
+   1.11. Set rtp_inst_avp parameter
+   1.12. set_rtp_proxy_set usage
+   1.13. rtpproxy_offer usage
+   1.14. rtpproxy_answer usage
+   1.15. rtpproxy_destroy usage
+   1.16. rtpproxy_manage usage
+   1.17. rtpproxy_stream2xxx usage
+   1.18. start_recording usage
+   1.19. $rtpstat-Usage
+   1.20. nh_enable_rtpp usage
+   1.21. nh_show_rtpp usage
    Chapter 1. Admin Guide
  @@ -135,6 +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)
       5. Functions
  @@ -222,6 +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.1. rtpproxy_sock (string)
@@ -377,6 +381,19 @@ modparam("rtpproxy", "db_url", "mysql://user:passwb@localhost/database")
  modparam("rtpproxy", "table_name", "my_rtpp_sets")
  ...
  +4.11. rtp_inst_avp (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.
+
+   By default, this parameter is not set.
+
+   Example 1.11. Set rtp_inst_avp parameter
+...
+modparam("rtpproxy", "rtp_inst_avp", "$avp(RTP_INSTANCE)")
+...
+
  5. Functions
       5.1. set_rtp_proxy_set(setid)
@@ -401,7 +418,7 @@ modparam("rtpproxy", "table_name", "my_rtpp_sets")
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE,
     BRANCH_ROUTE.
  -   Example 1.11. set_rtp_proxy_set usage
+   Example 1.12. set_rtp_proxy_set usage
  ...
  set_rtp_proxy_set("2");
  rtpproxy_offer();
@@ -507,7 +524,7 @@ rtpproxy_offer();
       This function can be used from ANY_ROUTE.
  -   Example 1.12. rtpproxy_offer usage
+   Example 1.13. rtpproxy_offer usage
  route {
  ...
      if (is_method("INVITE")) {
@@ -551,7 +568,7 @@ onreply_route[2]
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE,
     FAILURE_ROUTE, BRANCH_ROUTE.
  -   Example 1.13. rtpproxy_answer usage
+   Example 1.14. rtpproxy_answer usage
       See rtpproxy_offer() function example above for example.
  @@ -587,7 +604,7 @@ onreply_route[2]
unused rtpproxy call when 200 OK is received on a branch,
              where rtpproxy is not needed.
  -   Example 1.14. rtpproxy_destroy usage
+   Example 1.15. rtpproxy_destroy usage
  ...
  rtpproxy_destroy();
  ...
@@ -621,7 +638,7 @@ rtpproxy_destroy();
       This function can be used from ANY_ROUTE.
  -   Example 1.15. rtpproxy_manage usage
+   Example 1.16. rtpproxy_manage usage
  ...
  rtpproxy_manage();
  ...
@@ -657,7 +674,7 @@ rtpproxy_manage();
-1 means that it will be streaming in a loop indefinitely, until
         the appropriate rtpproxy_stop_stream2xxx is issued.
  -   Example 1.16. rtpproxy_stream2xxx usage
+   Example 1.17. rtpproxy_stream2xxx usage
  ...
      if (is_method("INVITE")) {
          rtpproxy_offer();
@@ -690,7 +707,7 @@ rtpproxy_manage();
       This function can be used from REQUEST_ROUTE and ONREPLY_ROUTE.
  -   Example 1.17. start_recording usage
+   Example 1.18. start_recording usage
  ...
  start_recording();
  ...
@@ -710,7 +727,7 @@ start_recording();
packet-counters. The statistics must be retrieved before the session
     is deleted (before unforce_rtpproxy()).
  -   Example 1.18. $rtpstat-Usage
+   Example 1.19. $rtpstat-Usage
  ...
      append_hf("X-RTP-Statistics: $rtpstat\r\n");
  ...
@@ -733,7 +750,7 @@ start_recording();
NOTE: if a rtpproxy is defined multiple times (in the same or
     diferente sete), all of its instances will be enables/disabled.
  -   Example 1.19.  nh_enable_rtpp usage
+   Example 1.20.  nh_enable_rtpp usage
  ...
  $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
  ...
@@ -745,7 +762,7 @@ $ kamctl fifo nh_enable_rtpp udp:192.168.2.133:8081 0
       No parameter.
  -   Example 1.20.  nh_show_rtpp usage
+   Example 1.21.  nh_show_rtpp usage
  ...
  $ kamctl fifo nh_show_rtpp
  ...
diff --git a/modules/rtpproxy/doc/rtpproxy_admin.xml b/modules/rtpproxy/doc/rtpproxy_admin.xml
index 7a60c17..c4f2c86 100644
--- a/modules/rtpproxy/doc/rtpproxy_admin.xml
+++ b/modules/rtpproxy/doc/rtpproxy_admin.xml
@@ -321,6 +321,24 @@ modparam("rtpproxy", "table_name", "my_rtpp_sets")
  </programlisting>
          </example>
      </section>
+    <section>
+ <title><varname>rtp_inst_avp</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.
+        </para>
+        <para>
+            By default, this parameter is not set.
+        </para>
+        <example>
+        <title>Set <varname>rtp_inst_avp</varname> parameter</title>
+        <programlisting format="linespecific">
+...
+modparam("rtpproxy", "rtp_inst_avp", "$avp(RTP_INSTANCE)")
+...
+</programlisting>
+        </example>
+    </section>
      </section>
        <section>
diff --git a/modules/rtpproxy/rtpproxy.c b/modules/rtpproxy/rtpproxy.c
index ae9d291..8cea776 100644
--- a/modules/rtpproxy/rtpproxy.c
+++ b/modules/rtpproxy/rtpproxy.c
@@ -308,6 +308,8 @@ 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 *);
  @@ -337,6 +339,9 @@ 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;
    /* array with the sockets used by rtpporxy (per process)*/
  static unsigned int rtpp_no = 0;
@@ -437,6 +442,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 },
      {0, 0, 0}
  };
  @@ -970,6 +976,19 @@ 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);
+        return -1;
+        }
+        rtp_inst_avp_type = avp_flags;
+    }
+
      if (extra_id_pv_param.s && *extra_id_pv_param.s) {
          extra_id_pv_param.len = strlen(extra_id_pv_param.s);
          if(pv_parse_format(&extra_id_pv_param, &extra_id_pv) < 0) {
@@ -1761,6 +1780,9 @@ 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;
      }
  @@ -1811,6 +1833,7 @@ found:
          if (node->rn_disabled)
              goto retry;
      }
+    set_rtp_inst_avp(&node->rn_url);
      return node;
  }
@@ -2987,3 +3010,18 @@ 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;
+
+    if (rtp_inst_avp_param == NULL)
+        return 0;
+
+ if (add_avp(AVP_VAL_STR | rtp_inst_avp_type, rtp_inst_avp, avp_val) != 0)
+    {
+        LM_ERR("Failed to add RTPProxy URI to avp\n");
+        return -1;
+    }
+    return 0;
+}
+


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev



--
Hugh Waite
Principal Design Engineer
Crocodile RCS Ltd.


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to