summaryrefslogtreecommitdiff
path: root/pjsip/src
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2009-04-26 11:02:04 +0000
committerBenny Prijono <bennylp@teluu.com>2009-04-26 11:02:04 +0000
commitb757220012cfbb65f835982be24a988d911ce1fb (patch)
treee6a1b6a3a1bbe067dd265b65a8d9051c442254e2 /pjsip/src
parent0d88d0975fe2a236bb99516e35c2290a3587d4bd (diff)
Fixed ticket #503: Handle the case when CANCEL is responded with 200/OK but 487 is not sent
- added new API pjsip_tsx_set_timeout() - set 64*T1 timeout after CANCEL is initiated - also added SIPp scenario to simulate the UAS git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2646 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src')
-rw-r--r--pjsip/src/pjsip-ua/sip_inv.c8
-rw-r--r--pjsip/src/pjsip/sip_transaction.c41
2 files changed, 49 insertions, 0 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
index a54a5f36..67d560b2 100644
--- a/pjsip/src/pjsip-ua/sip_inv.c
+++ b/pjsip/src/pjsip-ua/sip_inv.c
@@ -1886,6 +1886,14 @@ PJ_DEF(pj_status_t) pjsip_inv_end_session( pjsip_inv_session *inv,
status = pjsip_endpt_create_cancel(inv->dlg->endpt,
inv->invite_tsx->last_tx,
&tdata);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ /* Set timeout for the INVITE transaction, in case UAS is not
+ * able to respond the INVITE with 487 final response. The
+ * timeout value is 64*T1.
+ */
+ pjsip_tsx_set_timeout(inv->invite_tsx, 64 * pjsip_cfg()->tsx.t1);
} else {
diff --git a/pjsip/src/pjsip/sip_transaction.c b/pjsip/src/pjsip/sip_transaction.c
index 5a6f7dc6..525f9e37 100644
--- a/pjsip/src/pjsip/sip_transaction.c
+++ b/pjsip/src/pjsip/sip_transaction.c
@@ -1503,6 +1503,47 @@ PJ_DEF(pj_status_t) pjsip_tsx_stop_retransmit(pjsip_transaction *tsx)
/*
+ * Start a timer to terminate transaction after the specified time
+ * has elapsed.
+ */
+PJ_DEF(pj_status_t) pjsip_tsx_set_timeout( pjsip_transaction *tsx,
+ unsigned millisec)
+{
+ struct tsx_lock_data lck;
+ pj_time_val timeout;
+
+ PJ_ASSERT_RETURN(tsx != NULL, PJ_EINVAL);
+ PJ_ASSERT_RETURN(tsx->role == PJSIP_ROLE_UAC &&
+ tsx->method.id == PJSIP_INVITE_METHOD,
+ PJ_EINVALIDOP);
+
+ lock_tsx(tsx, &lck);
+
+ /* Transaction must not have got final response */
+ PJ_ASSERT_ON_FAIL(tsx->status_code < 200,
+ { unlock_tsx(tsx, &lck); return PJ_EINVALIDOP; });
+
+ if (tsx->timeout_timer.id != 0) {
+ pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer);
+ tsx->timeout_timer.id = 0;
+ }
+
+ timeout.sec = 0;
+ timeout.msec = millisec;
+ pj_time_val_normalize(&timeout);
+
+ tsx->timeout_timer.id = TIMER_ACTIVE;
+ pjsip_endpt_schedule_timer(tsx->endpt, &tsx->timeout_timer,
+ &timeout);
+
+
+ unlock_tsx(tsx, &lck);
+
+ return PJ_SUCCESS;
+}
+
+
+/*
* This function is called by TU to send a message.
*/
PJ_DEF(pj_status_t) pjsip_tsx_send_msg( pjsip_transaction *tsx,