summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-04-20 03:01:50 +0000
committerBenny Prijono <bennylp@teluu.com>2007-04-20 03:01:50 +0000
commit0077817a9d0cc585f8f4d40dbf7c20ab653227cf (patch)
tree218483e152a220d34fd9c0d2d866822cf79e3fdc
parent38ab2ef151a61a89707598d3c4f83af230400a93 (diff)
Fix for ticket #220: retransmit timer wasn't cleared when 2xx response for NIT is received, causing assertion failure
git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/pjproject-0.5-stable@1208 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/src/pjsip/sip_transaction.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/pjsip/src/pjsip/sip_transaction.c b/pjsip/src/pjsip/sip_transaction.c
index 61b3bfa5..9934e0dd 100644
--- a/pjsip/src/pjsip/sip_transaction.c
+++ b/pjsip/src/pjsip/sip_transaction.c
@@ -1794,14 +1794,13 @@ static void tsx_resched_retransmission( pjsip_transaction *tsx )
pj_assert((tsx->transport_flag & TSX_HAS_PENDING_TRANSPORT) == 0);
- pj_assert(tsx->status_code < 200);
-
- if (tsx->status_code >= 100)
+ if (tsx->role==PJSIP_ROLE_UAC && tsx->status_code >= 100)
msec_time = PJSIP_T2_TIMEOUT;
else
msec_time = (1 << (tsx->retransmit_count)) * PJSIP_T1_TIMEOUT;
if (tsx->role == PJSIP_ROLE_UAC) {
+ pj_assert(tsx->status_code < 200);
/* Retransmission for non-INVITE transaction caps-off at T2 */
if (msec_time>PJSIP_T2_TIMEOUT && tsx->method.id!=PJSIP_INVITE_METHOD)
msec_time = PJSIP_T2_TIMEOUT;
@@ -2421,6 +2420,12 @@ static pj_status_t tsx_on_state_proceeding_uac(pjsip_transaction *tsx,
pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer,
&timeout);
+ /* Cancel retransmission timer */
+ if (tsx->retransmit_timer._timer_id != -1) {
+ pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer);
+ tsx->retransmit_timer._timer_id = -1;
+ }
+
/* Move state to Completed, inform TU. */
tsx_set_state( tsx, PJSIP_TSX_STATE_COMPLETED,
PJSIP_EVENT_RX_MSG, event->body.rx_msg.rdata );