]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Thu Apr 16 12:04:08 CDT 2009 Pekka Pessi <first.last@nokia.com>
authorMichael Jerris <mike@jerris.com>
Thu, 16 Apr 2009 17:18:56 +0000 (17:18 +0000)
committerMichael Jerris <mike@jerris.com>
Thu, 16 Apr 2009 17:18:56 +0000 (17:18 +0000)
  * nua_client, nua_session: avoid restarting in-progress transactions

  This is supposed to fix bugs #SFSIP-135 and #SFSIP-137. Thanks for Tamas
  Jalsovszky and kawarod for reporting the problem.

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13062 d0543943-73ff-0310-b7d9-9358b9ac24b2

libs/sofia-sip/.update
libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c
libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h
libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c

index 47636e21595541dce2371f404926625c51c59479..7a13aa0cf0a32cf734ef8daf1b15f34f678dfc48 100644 (file)
@@ -1 +1 @@
-Thu Apr 16 10:00:29 CDT 2009
+Thu Apr 16 12:18:30 CDT 2009
index 5b60a3a69d5e57df2dd7991836ad8c3420536b08..66e24af77582801de53e2ef719d56f18e35e7f91 100644 (file)
@@ -413,6 +413,20 @@ int nua_client_bind(nua_client_request_t *cr, nua_dialog_usage_t *du)
   return 0;
 }
 
+/** Check if client request is in progress.
+ *
+ * A client request is in progress, if
+ * 1) it has actual transaction going on
+ * 2) it is waiting credentials from application
+ * 3) it is waiting for Retry-After timer
+ */
+int
+nua_client_request_in_progress(nua_client_request_t const *cr)
+{
+  return cr &&
+    (cr->cr_orq || cr->cr_wait_for_cred || cr->cr_timer);
+}
+
 /**Initialize client request for sending.
  *
  * This function is called when the request is taken from queue and sent.
@@ -1564,7 +1578,7 @@ int nua_client_next_request(nua_client_request_t *cr, int invite)
       break;
   }
 
-  if (cr && cr->cr_orq == NULL) {
+  if (cr && !nua_client_request_in_progress(cr)) {
     nua_client_init_request(cr);
   }
 
index ae4cafb5938dfe47d5141becc42b37cfa4d79976..2c18dca5f53fa773f4995e31a410e1e8774e0192 100644 (file)
@@ -250,6 +250,8 @@ su_inline int nua_client_is_queued(nua_client_request_t const *cr)
   return cr && cr->cr_prev;
 }
 
+int nua_client_request_in_progress(nua_client_request_t const *cr);
+
 int nua_client_request_complete(nua_client_request_t *cr);
 int nua_client_request_remove(nua_client_request_t *cr);
 int nua_client_request_clean(nua_client_request_t *cr);
index bba8915386f519a167e1557b8ee9d63024039130..6852ae7de074a03241c20d88f00f780a1959c5e5 100644 (file)
@@ -1535,7 +1535,7 @@ static void nua_session_usage_refresh(nua_handle_t *nh,
 
   if (ss->ss_state >= nua_callstate_terminating ||
       /* INVITE is in progress or being authenticated */
-      (cr && (cr->cr_orq || cr->cr_wait_for_cred)))
+      nua_client_request_in_progress(cr))
     return;
 
   /* UPDATE has been queued */