Author: mikej Date: Thu Apr 16 12:18:56 2009 New Revision: 13062 Log: Thu Apr 16 12:04:08 CDT 2009 Pekka Pessi <first.last@nokia.com> * 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. Modified: freeswitch/trunk/libs/sofia-sip/.update freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c Modified: freeswitch/trunk/libs/sofia-sip/.update ============================================================================== --- freeswitch/trunk/libs/sofia-sip/.update (original) +++ freeswitch/trunk/libs/sofia-sip/.update Thu Apr 16 12:18:56 2009 @@ -1 +1 @@ -Thu Apr 16 10:00:29 CDT 2009 +Thu Apr 16 12:18:30 CDT 2009 Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c ============================================================================== --- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c (original) +++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.c Thu Apr 16 12:18:56 2009 @@ -413,6 +413,20 @@ 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 @@ break; } - if (cr && cr->cr_orq == NULL) { + if (cr && !nua_client_request_in_progress(cr)) { nua_client_init_request(cr); } Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h ============================================================================== --- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h (original) +++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_client.h Thu Apr 16 12:18:56 2009 @@ -250,6 +250,8 @@ 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); Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c ============================================================================== --- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c (original) +++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c Thu Apr 16 12:18:56 2009 @@ -1535,7 +1535,7 @@ 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 */