Module: sip-router Branch: master Commit: 3beef50c69d60fcb372d555a561d8e2258ff5734 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=3beef50c...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Wed Feb 22 22:17:29 2012 +0100
dialog(k): new function to set dialog timeout by internal id
- dlg_set_timeout(timeout [, h_entry, h_id])
---
modules_k/dialog/README | 27 +++++++++++++++++ modules_k/dialog/dialog.c | 53 +++++++++++++++++++++++++++++++++ modules_k/dialog/doc/dialog_admin.xml | 44 +++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 0 deletions(-)
diff --git a/modules_k/dialog/README b/modules_k/dialog/README index 36f0187..e29ac45 100644 --- a/modules_k/dialog/README +++ b/modules_k/dialog/README @@ -102,6 +102,7 @@ Alex Balashov 6.11. dlg_bridge(from, to, op) 6.12. dlg_get(callid, ftag, ttag) 6.13. is_known_dlg() + 6.14. dlg_set_timeout(timeout [, h_entry, h_id])
7. Statistics
@@ -217,6 +218,7 @@ Alex Balashov 1.56. dlg_bridge usage 1.57. dlg_get usage 1.58. is_known_dlg() usage + 1.59. dlg_set_timeout usage
Chapter 1. Admin Guide
@@ -293,6 +295,7 @@ Chapter 1. Admin Guide 6.11. dlg_bridge(from, to, op) 6.12. dlg_get(callid, ftag, ttag) 6.13. is_known_dlg() + 6.14. dlg_set_timeout(timeout [, h_entry, h_id])
7. Statistics
@@ -1063,6 +1066,7 @@ modparam("dialog", "wait_ack", 0) 6.11. dlg_bridge(from, to, op) 6.12. dlg_get(callid, ftag, ttag) 6.13. is_known_dlg() + 6.14. dlg_set_timeout(timeout [, h_entry, h_id])
6.1. set_dlg_profile(profile,[value])
@@ -1329,6 +1333,29 @@ if(!uri == myself) { } ...
+6.14. dlg_set_timeout(timeout [, h_entry, h_id]) + + Set the dialog timeout. Dialog timeout will be updated if it was + already set. If h_entry and h_id parameters are not provided, the + dialog will be searched based on (callid, fromtag, totag) of currently + processed SIP message. + + Meaning of the parameters is as follows: + * timeout - the interval in seconds after which the dialog will time + out. + * h_entry - h_entry value of the iternal dialog identifier. + * h_id - h_id valye if the internal dialog identifier. + + This function can be used from ANY_ROUTE. + + Example 1.59. dlg_set_timeout usage +... +if(dlg_set_timeout("180", "123", "456")) +{ + ... +} +... + 7. Statistics
7.1. active_dialogs diff --git a/modules_k/dialog/dialog.c b/modules_k/dialog/dialog.c index a919b62..b89eb9b 100644 --- a/modules_k/dialog/dialog.c +++ b/modules_k/dialog/dialog.c @@ -155,6 +155,7 @@ static int w_dlg_manage(struct sip_msg*, char*, char*); static int w_dlg_bye(struct sip_msg*, char*, char*); static int w_dlg_refer(struct sip_msg*, char*, char*); static int w_dlg_bridge(struct sip_msg*, char*, char*, char*); +static int w_dlg_set_timeout(struct sip_msg*, char*, char*, char*); static int fixup_dlg_bye(void** param, int param_no); static int fixup_dlg_refer(void** param, int param_no); static int fixup_dlg_bridge(void** param, int param_no); @@ -196,6 +197,10 @@ static cmd_export_t cmds[]={ 0, ANY_ROUTE }, {"is_known_dlg", (cmd_function)w_is_known_dlg, 0, NULL, 0, ANY_ROUTE }, + {"dlg_set_timeout", (cmd_function)w_dlg_set_timeout, 1,fixup_igp_null, + 0, ANY_ROUTE }, + {"dlg_set_timeout", (cmd_function)w_dlg_set_timeout, 3,fixup_igp_all, + 0, ANY_ROUTE }, {"load_dlg", (cmd_function)load_dlg, 0, 0, 0, 0}, {0,0,0,0,0,0} }; @@ -1068,6 +1073,54 @@ static int w_dlg_bridge(struct sip_msg *msg, char *from, char *to, char *op) return 1; }
+/** + * + */ +static int w_dlg_set_timeout(struct sip_msg *msg, char *pto, char *phe, char *phi) +{ + int to = 0; + unsigned int he = 0; + unsigned int hi = 0; + dlg_cell_t *dlg = NULL; + + if(fixup_get_ivalue(msg, (gparam_p)pto, &to)!=0) + { + LM_ERR("no timeout value\n"); + return -1; + } + if(phe!=NULL) + { + if(fixup_get_ivalue(msg, (gparam_p)phe, (int*)&he)!=0) + { + LM_ERR("no hash entry value value\n"); + return -1; + } + if(fixup_get_ivalue(msg, (gparam_p)phi, (int*)&hi)!=0) + { + LM_ERR("no hash id value value\n"); + return -1; + } + dlg = dlg_lookup(he, hi); + } else { + dlg = dlg_get_msg_dialog(msg); + } + + if(dlg==NULL) + { + LM_DBG("no dialog found\n"); + return -1; + } + + if(update_dlg_timer(&dlg->tl, to)<0) { + LM_ERR("failed to update dialog lifetime\n"); + dlg_release(dlg); + return -1; + } + dlg->lifetime = to; + dlg->dflags |= DLG_FLAG_CHANGED; + dlg_release(dlg); + return 1; +}
static int fixup_dlg_bye(void** param, int param_no) { diff --git a/modules_k/dialog/doc/dialog_admin.xml b/modules_k/dialog/doc/dialog_admin.xml index b5898c2..714c0fb 100644 --- a/modules_k/dialog/doc/dialog_admin.xml +++ b/modules_k/dialog/doc/dialog_admin.xml @@ -1633,6 +1633,50 @@ if(!uri == myself) { </example> </section>
+ <section> + <title> + <function moreinfo="none">dlg_set_timeout(timeout [, h_entry, h_id])</function> + </title> + <para> + Set the dialog timeout. Dialog timeout will be updated if it was + already set. If h_entry and h_id parameters are not provided, the + dialog will be searched based on (callid, fromtag, totag) of + currently processed SIP message. + </para> + <para>Meaning of the parameters is as follows:</para> + <itemizedlist> + <listitem> + <para><emphasis>timeout</emphasis> - the interval in seconds after + which the dialog will time out. + </para> + </listitem> + <listitem> + <para><emphasis>h_entry</emphasis> - h_entry value of the iternal + dialog identifier. + </para> + </listitem> + <listitem> + <para><emphasis>h_id</emphasis> - h_id valye if the internal dialog + identifier. + </para> + </listitem> + </itemizedlist> + <para> + This function can be used from ANY_ROUTE. + </para> + <example> + <title><function>dlg_set_timeout</function> usage</title> + <programlisting format="linespecific"> +... +if(dlg_set_timeout("180", "123", "456")) +{ + ... +} +... +</programlisting> + </example> + </section> + </section>