Module: kamailio
Branch: master
Commit: 8ac570943f1dfd47f9d02686cc399d3cd1cdcd92
URL: 
https://github.com/kamailio/kamailio/commit/8ac570943f1dfd47f9d02686cc399d3cd1cdcd92

Author: Maksym Sobolyev <sobo...@sippysoft.com>
Committer: Victor Seva <linuxman...@torreviejawireless.org>
Date: 2023-10-20T09:56:56+02:00

rtpproxy: Make timeout notification feature useable.

Add an new "timeout_tag_pv" option to set notify tag along
with the notification socket path. Both are required by the
RTPProxy.

Reported by:    James Lipski <jameslip...@protonmail.com>

---

Modified: src/modules/rtpproxy/rtpproxy.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/8ac570943f1dfd47f9d02686cc399d3cd1cdcd92.diff
Patch: 
https://github.com/kamailio/kamailio/commit/8ac570943f1dfd47f9d02686cc399d3cd1cdcd92.patch

---

diff --git a/src/modules/rtpproxy/rtpproxy.c b/src/modules/rtpproxy/rtpproxy.c
index bc252982e1c..74da691e705 100644
--- a/src/modules/rtpproxy/rtpproxy.c
+++ b/src/modules/rtpproxy/rtpproxy.c
@@ -1,6 +1,6 @@
 /**
  *
- * Copyright (C) 2003-2008 Sippy Software, Inc., http://www.sippysoft.com
+ * Copyright (C) 2003-2023 Sippy Software, Inc., http://www.sippysoft.com
  *
  * This file is part of Kamailio, a free SIP server.
  *
@@ -187,6 +187,8 @@ static struct tm_binds tmb;
 unsigned int *natping_state = 0;
 
 static str timeout_socket_str = {0, 0};
+static str timeout_tag_pv_str = {0, 0};
+static pv_elem_t *timeout_tag_pv = NULL;
 static pv_elem_t *extra_id_pv = NULL;
 
 static cmd_export_t cmds[] = {
@@ -243,6 +245,7 @@ static param_export_t params[] = {
                {"rtpproxy_retr", INT_PARAM, &rtpproxy_retr},
                {"rtpproxy_tout", INT_PARAM, &rtpproxy_tout},
                {"timeout_socket", PARAM_STR, &timeout_socket_str},
+               {"timeout_tag_pv", PARAM_STR, &timeout_tag_pv_str},
                {"ice_candidate_priority_avp", PARAM_STRING,
                                &ice_candidate_priority_avp_param},
                {"extra_id_pv", PARAM_STR, &extra_id_pv_param},
@@ -735,6 +738,20 @@ static int mod_init(void)
        } else {
                extra_id_pv = NULL;
        }
+       if(timeout_socket_str.s != NULL && timeout_tag_pv_str.s == NULL) {
+               LM_ERR("The timeout_tag_pv has to be set along with 
timeout_socket\n");
+               return -1;
+       }
+       if(timeout_tag_pv_str.s != NULL) {
+               if(timeout_tag_pv_str.len == 0) {
+                       LM_ERR("Empty timeout_tag_pv is not allowed\n");
+                       return -1;
+               }
+               if(pv_parse_format(&timeout_tag_pv_str, &timeout_tag_pv) < 0) {
+                       LM_ERR("malformed PV string: %s\n", 
timeout_tag_pv_str.s);
+                       return -1;
+               }
+       }
 
        if(rtpp_strings)
                pkg_free(rtpp_strings);
@@ -1488,6 +1505,21 @@ static int get_extra_id(struct sip_msg *msg, str *id_str)
 }
 
 
+static int get_timeout_tag(struct sip_msg *msg, str *ntag_str)
+{
+       if(msg == NULL || timeout_tag_pv == NULL || ntag_str == NULL) {
+               LM_ERR("bad parameters\n");
+               return 0;
+       }
+       if(pv_printf_s(msg, timeout_tag_pv, ntag_str) < 0) {
+               LM_ERR("cannot print the notify tag\n");
+               return 0;
+       }
+
+       return 1;
+}
+
+
 static int unforce_rtp_proxy1_f(struct sip_msg *msg, char *str1, char *str2)
 {
        str flags;
@@ -1969,6 +2001,8 @@ static int force_rtp_proxy(
                        {NULL, 0}, /* medianum */
                        {" ", 1},  /* separator */
                        {NULL, 0}, /* Timeout-Socket */
+                       {" ", 1},  /* separator */
+                       {NULL, 0}, /* Timeout-Tag */
        };
        int iovec_param_count;
        int autobridge_ipv4v6;
@@ -2410,14 +2444,21 @@ static int force_rtp_proxy(
                                }
                                if(to_tag.len > 0) {
                                        iovec_param_count = 20;
-                                       if(opts.s.s[0] == 'U' && 
timeout_socket_str.len > 0) {
-                                               iovec_param_count = 22;
-                                               STR2IOVEC(timeout_socket_str, 
v[21]);
-                                       }
                                } else {
                                        iovec_param_count = 16;
                                }
-
+                               if(opts.s.s[0] == 'U' && timeout_socket_str.len 
> 0) {
+                                       str ntag = {0, 0};
+                                       if(get_timeout_tag(msg, &ntag) == 0 || 
ntag.s == NULL
+                                                       || ntag.len == 0) {
+                                               LM_ERR("can't get timeout 
notification tag\n");
+                                               FORCE_RTP_PROXY_RET(-1);
+                                       }
+                                       STR2IOVEC(timeout_socket_str, 
v[iovec_param_count + 1]);
+                                       iovec_param_count += 2;
+                                       STR2IOVEC(ntag, v[iovec_param_count + 
1]);
+                                       iovec_param_count += 2;
+                               }
                                cp = send_rtpp_command(node, v, 
iovec_param_count);
                        } while(cp == NULL);
                        LM_DBG("proxy reply: %s\n", cp);

_______________________________________________
Kamailio (SER) - Development Mailing List
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org

Reply via email to