diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2009-08-12 19:04:02 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2009-08-12 19:04:02 +0000 |
commit | 72a29c18539dafd89bf609f2dc58d488e93f5712 (patch) | |
tree | 6b8dd6995cc3bf2e627483b6993553b4415ba104 /pjsip/src/pjsip-ua/sip_timer.c | |
parent | f4f120afc306e03d3fbc54701759bd8f7efbbf53 (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
Diffstat (limited to 'pjsip/src/pjsip-ua/sip_timer.c')
-rw-r--r-- | pjsip/src/pjsip-ua/sip_timer.c | 48 |
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); |