From: Michael Jerris Date: Thu, 16 Apr 2009 17:18:56 +0000 (+0000) Subject: Thu Apr 16 12:04:08 CDT 2009 Pekka Pessi X-Git-Tag: v1.0.4~1130 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=59478dd599fb275c3afdc19a621600ae264df7a4;p=thirdparty%2Ffreeswitch.git Thu Apr 16 12:04:08 CDT 2009 Pekka Pessi * 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 --- diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 47636e2159..7a13aa0cf0 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Thu Apr 16 10:00:29 CDT 2009 +Thu Apr 16 12:18:30 CDT 2009 diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c b/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c index 5b60a3a69d..66e24af775 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c +++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c @@ -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); } diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h b/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h index ae4cafb593..2c18dca5f5 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h +++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h @@ -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); diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c b/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c index bba8915386..6852ae7de0 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c +++ b/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c @@ -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 */