summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2009-08-12 19:04:02 +0000
committerNanang Izzuddin <nanang@teluu.com>2009-08-12 19:04:02 +0000
commit72a29c18539dafd89bf609f2dc58d488e93f5712 (patch)
tree6b8dd6995cc3bf2e627483b6993553b4415ba104
parentf4f120afc306e03d3fbc54701759bd8f7efbbf53 (diff)
Ticket #833: Updated Session Timer to keep the refresher role unchanged on any refreshes, by timer or manual.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2870 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/src/pjsip-ua/sip_timer.c48
1 files changed, 41 insertions, 7 deletions
diff --git a/pjsip/src/pjsip-ua/sip_timer.c b/pjsip/src/pjsip-ua/sip_timer.c
index 3c60e01d..af885ffb 100644
--- a/pjsip/src/pjsip-ua/sip_timer.c
+++ b/pjsip/src/pjsip-ua/sip_timer.c
@@ -605,6 +605,24 @@ PJ_DEF(pj_status_t) pjsip_timer_update_req(pjsip_inv_session *inv,
if (inv->timer == NULL)
pjsip_timer_init_session(inv, NULL);
+ /* If refresher role (i.e: ours or peer) has been set/negotiated,
+ * better to keep it.
+ */
+ if (inv->timer->refresher != TR_UNKNOWN) {
+ pj_bool_t as_refresher;
+
+ /* Check our refresher role */
+ as_refresher =
+ (inv->timer->refresher==TR_UAC && inv->timer->role==PJSIP_ROLE_UAC) ||
+ (inv->timer->refresher==TR_UAS && inv->timer->role==PJSIP_ROLE_UAS);
+
+ /* Update transaction role */
+ inv->timer->role = PJSIP_ROLE_UAC;
+
+ /* Update refresher role */
+ inv->timer->refresher = as_refresher? TR_UAC : TR_UAS;
+ }
+
/* Add Session Timers headers */
add_timer_headers(inv, tdata, PJ_TRUE, PJ_TRUE);
@@ -878,11 +896,30 @@ PJ_DEF(pj_status_t) pjsip_timer_process_req(pjsip_inv_session *inv,
inv->timer->refresher = TR_UAC;
else if (se_hdr && pj_stricmp(&se_hdr->refresher, &STR_UAS) == 0)
inv->timer->refresher = TR_UAS;
- else
- /* If UAC support timer (currently check the existance of
- * Session-Expires header in the request), set UAC as refresher.
+ else {
+ /* If refresher role (i.e: ours or peer) has been set/negotiated,
+ * better to keep it.
*/
- inv->timer->refresher = se_hdr? TR_UAC : TR_UAS;
+ if (inv->timer->refresher != TR_UNKNOWN) {
+ pj_bool_t as_refresher;
+
+ /* Check our refresher role */
+ as_refresher =
+ (inv->timer->refresher==TR_UAC && inv->timer->role==PJSIP_ROLE_UAC) ||
+ (inv->timer->refresher==TR_UAS && inv->timer->role==PJSIP_ROLE_UAS);
+
+ /* Update refresher role */
+ inv->timer->refresher = as_refresher? TR_UAS : TR_UAC;
+ } else {
+ /* If UAC support timer (currently check the existance of
+ * Session-Expires header in the request), set UAC as refresher.
+ */
+ inv->timer->refresher = se_hdr? TR_UAC : TR_UAS;
+ }
+ }
+
+ /* Remember our role in this transaction */
+ inv->timer->role = PJSIP_ROLE_UAS;
/* Set active flag */
inv->timer->active = PJ_TRUE;
@@ -910,9 +947,6 @@ PJ_DEF(pj_status_t) pjsip_timer_update_resp(pjsip_inv_session *inv,
if (msg->line.status.code/100 == 2)
{
if (inv->timer && inv->timer->active) {
- /* Remember our role in this transaction */
- inv->timer->role = PJSIP_ROLE_UAS;
-
/* Add Session-Expires header and start the timer */
add_timer_headers(inv, tdata, PJ_TRUE, PJ_FALSE);
start_timer(inv);