summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-10-04 09:48:25 +0000
committerBenny Prijono <bennylp@teluu.com>2007-10-04 09:48:25 +0000
commit5a17c9a249ae2804b3b0ae558a0a63275ef14259 (patch)
tree873830ecbe756906a3bb7909b443244b29f51657 /pjsip
parent3e7fd859b0c02776768f4ef1649a06929918fbe3 (diff)
Ticket #390: Register session will keep transport instance so that keep-alive is sent
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1472 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsip-ua/sip_reg.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/pjsip/src/pjsip-ua/sip_reg.c b/pjsip/src/pjsip-ua/sip_reg.c
index bbabf0c5..7e061537 100644
--- a/pjsip/src/pjsip-ua/sip_reg.c
+++ b/pjsip/src/pjsip-ua/sip_reg.c
@@ -84,6 +84,11 @@ struct pjsip_regc
/* Transport selector */
pjsip_tpselector tp_sel;
+
+ /* Last transport used. We acquire the transport to keep
+ * it open.
+ */
+ pjsip_transport *last_transport;
};
@@ -133,6 +138,10 @@ PJ_DEF(pj_status_t) pjsip_regc_destroy(pjsip_regc *regc)
regc->cb = NULL;
} else {
pjsip_tpselector_dec_ref(&regc->tp_sel);
+ if (regc->last_transport) {
+ pjsip_transport_dec_ref(regc->last_transport);
+ regc->last_transport = NULL;
+ }
pjsip_endpt_release_pool(regc->endpt, regc->pool);
}
@@ -609,6 +618,19 @@ static void tsx_callback(void *token, pjsip_event *event)
pj_assert(regc->has_tsx);
regc->has_tsx = PJ_FALSE;
+ /* Add reference to the transport */
+ if (tsx->transport != regc->last_transport) {
+ if (regc->last_transport) {
+ pjsip_transport_dec_ref(regc->last_transport);
+ regc->last_transport = NULL;
+ }
+
+ if (tsx->transport) {
+ regc->last_transport = tsx->transport;
+ pjsip_transport_add_ref(regc->last_transport);
+ }
+ }
+
/* Handle 401/407 challenge (even when _delete_flag is set) */
if (tsx->status_code == PJSIP_SC_PROXY_AUTHENTICATION_REQUIRED ||
tsx->status_code == PJSIP_SC_UNAUTHORIZED)