[sr-dev] git:master:a051bd98: mohqueue: prevent calls sticking in queue

GitHub noreply at github.com
Wed Sep 7 22:39:25 CEST 2016


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

Author: rdboisvert <rdbprog at gmail.com>
Committer: GitHub <noreply at github.com>
Date: 2016-09-07T16:39:21-04:00

mohqueue: prevent calls sticking in queue

- query RTP to see if the link is active
- update user-agent version
- fixed edge case where REFER response arrives after call closed

---

Modified: modules/mohqueue/mohq.c
Modified: modules/mohqueue/mohq.h
Modified: modules/mohqueue/mohq_funcs.c

---

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

---

diff --git a/modules/mohqueue/mohq.c b/modules/mohqueue/mohq.c
index bc54aca..55a85ea 100644
--- a/modules/mohqueue/mohq.c
+++ b/modules/mohqueue/mohq.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013-15 Robert Boisvert
+ * Copyright (C) 2013-16 Robert Boisvert
  *
  * This file is part of the mohqueue module for Kamailio, a free SIP server.
  *
@@ -42,6 +42,7 @@ static int mod_init (void);
 **********/
 
 mod_data *pmod_data;
+pv_spec_t *prtp_pv;
 
 /**********
 * module exports
@@ -98,6 +99,12 @@ struct module_exports exports = {
 };
 
 /**********
+* local constants
+**********/
+
+str prtpstat [1] = {STR_STATIC_INIT ("$rtpstat")};
+
+/**********
 * local functions
 **********/
 
@@ -349,6 +356,8 @@ return;
 int mod_init (void)
 
 {
+int rtplen;
+
 /**********
 * o allocate shared mem and init
 * o init configuration data
@@ -431,6 +440,23 @@ if (!pmod_data->fn_rtp_destroy)
   }
 
 /**********
+* get RTPSTAT pv spec
+**********/
+
+rtplen = pv_locate_name (prtpstat);
+if(rtplen != prtpstat->len)
+  {
+  LM_ERR ("Unable to find RTPSTAT pv!\n");
+  goto initerr;
+  }
+prtp_pv = pv_cache_get (&prtpstat);
+if(!prtp_pv)
+  {
+  LM_ERR ("Unable to find pv spec for RTPSTAT!\n");
+  goto initerr;
+  }
+
+/**********
 * init MOH and call queue locks
 **********/
 
diff --git a/modules/mohqueue/mohq.h b/modules/mohqueue/mohq.h
index 207bcba..de2ef66 100644
--- a/modules/mohqueue/mohq.h
+++ b/modules/mohqueue/mohq.h
@@ -131,6 +131,7 @@ typedef struct
 **********/
 
 extern mod_data *pmod_data;
+extern pv_spec_t *prtp_pv;
 extern rtpmap prtpmap [];
 
 #endif /* MOHQ_H */
\ No newline at end of file
diff --git a/modules/mohqueue/mohq_funcs.c b/modules/mohqueue/mohq_funcs.c
index 86699ae..3722e00 100644
--- a/modules/mohqueue/mohq_funcs.c
+++ b/modules/mohqueue/mohq_funcs.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013-15 Robert Boisvert
+ * Copyright (C) 2013-16 Robert Boisvert
  *
  * This file is part of the mohqueue module for Kamailio, a free SIP server.
  *
@@ -32,7 +32,7 @@
 #define ALLOWHDR "Allow: INVITE, ACK, BYE, CANCEL, NOTIFY, PRACK"
 #define CLENHDR "Content-Length"
 #define SIPEOL  "\r\n"
-#define USRAGNT "Kamailio MOH Queue v1.2"
+#define USRAGNT "Kamailio MOH Queue v1.3"
 
 /**********
 * local constants
@@ -404,6 +404,26 @@ return;
 }
 
 /**********
+* Check if RTP Still Active
+*
+* INPUT:
+*   Arg (1) = SIP message pointer
+* OUTPUT: =0 if inactive
+**********/
+
+int chk_rtpstat (sip_msg_t *pmsg)
+
+{
+pv_value_t pval [1];
+memset (pval, 0, sizeof (pv_value_t));
+if (pv_get_spec_value (pmsg, prtp_pv, pval))
+  { return 0; }
+if (pval->flags & PV_VAL_NULL)
+  { return 0; }
+return 1;
+}
+
+/**********
 * Close the Call
 *
 * INPUT:
@@ -1664,10 +1684,23 @@ return nret;
 
 static void refer_cb
   (struct cell *ptrans, int ntype, struct tmcb_params *pcbp)
-
 {
 char *pfncname = "refer_cb: ";
 call_lst *pcall = (call_lst *)*pcbp->param;
+if (pcall->call_state != CLSTA_REFER)
+  {
+  if (!pcall->call_state)
+    {
+    LM_ERR
+      ("%sREFER response ignored because call not in queue!\n", pfncname);
+    }
+  else
+    {
+    LM_ERR ("%sCall (%s) ignored because not in REFER state!\n", pfncname,
+      pcall->call_from);
+    }
+  return;
+  }
 if ((ntype == TMCB_ON_FAILURE) || (pcbp->req == FAKED_REPLY))
   {
   LM_ERR ("%sCall (%s) did not respond to REFER!\n", pfncname,
@@ -1676,6 +1709,11 @@ if ((ntype == TMCB_ON_FAILURE) || (pcbp->req == FAKED_REPLY))
   delete_call (pcall);
   return;
   }
+
+/**********
+* check reply
+**********/
+
 int nreply = pcbp->code;
 if ((nreply / 100) == 2)
   {
@@ -1692,8 +1730,17 @@ else
     { delete_call (pcall); }
   else
     {
-    pcall->call_state = CLSTA_INQUEUE;
-    update_call_rec (pcall);
+    if (!chk_rtpstat (pcbp->req))
+      {
+      LM_ERR ("%sRTP for call (%s) no longer active!\n",
+        pfncname, pcall->call_from);
+      delete_call (pcall);
+      }
+    else
+      {
+      pcall->call_state = CLSTA_INQUEUE;
+      update_call_rec (pcall);
+      }
     }
   }
 return;




More information about the sr-dev mailing list