From 1ebdfe9fb3ec2c155ec09d31f82748ecfdf9c86e Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Sun, 20 Jun 2010 08:58:26 +0000 Subject: Fixed #1086 (New option to update the Contact URI in a single REGISTER request): added contact_rewrite_method account config to control this. Default is to use the new mechanism, i.e. the single REGISTER method. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3213 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/include/pjsua-lib/pjsua.h | 45 ++++++++++++++++++++++++++++++++++++++++ pjsip/src/pjsua-lib/pjsua_acc.c | 38 ++++++++++++++++++++++----------- pjsip/src/pjsua-lib/pjsua_core.c | 1 + 3 files changed, 72 insertions(+), 12 deletions(-) (limited to 'pjsip') diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index 01d1f801..2826c9fa 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -1899,6 +1899,30 @@ PJ_DECL(pj_status_t) pjsua_transport_close( pjsua_transport_id id, #endif +/** + * This macro specifies the default value for \a contact_rewrite_method + * field in pjsua_acc_config. I specifies how Contact update will be + * done with the registration, if \a allow_contact_rewrite is enabled in + * the account config. + * + * If set to 1, the Contact update will be done by sending unregistration + * to the currently registered Contact, while simultaneously sending new + * registration (with different Call-ID) for the updated Contact. + * + * If set to 2, the Contact update will be done in a single, current + * registration session, by removing the current binding (by setting its + * Contact's expires parameter to zero) and adding a new Contact binding, + * all done in a single request. + * + * Value 1 is the legacy behavior. + * + * Default value: 2 + */ +#ifndef PJSUA_CONTACT_REWRITE_METHOD +# define PJSUA_CONTACT_REWRITE_METHOD 2 +#endif + + /** * This structure describes account configuration to be specified when * adding a new account with #pjsua_acc_add(). Application MUST initialize @@ -2106,10 +2130,31 @@ typedef struct pjsua_acc_config * This will also update the public name of UDP transport if STUN is * configured. * + * See also contact_rewrite_method field. + * * Default: 1 (yes) */ pj_bool_t allow_contact_rewrite; + /** + * Specify how Contact update will be done with the registration, if + * \a allow_contact_rewrite is enabled. + * + * If set to 1, the Contact update will be done by sending unregistration + * to the currently registered Contact, while simultaneously sending new + * registration (with different Call-ID) for the updated Contact. + * + * If set to 2, the Contact update will be done in a single, current + * registration session, by removing the current binding (by setting its + * Contact's expires parameter to zero) and adding a new Contact binding, + * all done in a single request. + * + * Value 1 is the legacy behavior. + * + * Default value: PJSUA_CONTACT_REWRITE_METHOD (2) + */ + int contact_rewrite_method; + /** * Set the interval for periodic keep-alive transmission for this account. * If this value is zero, keep-alive will be disabled for this account. diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index ad25152f..925c71a9 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -1098,24 +1098,33 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc, } PJ_LOG(3,(THIS_FILE, "IP address change detected for account %d " - "(%.*s:%d --> %.*s:%d). Updating registration..", + "(%.*s:%d --> %.*s:%d). Updating registration " + "(using method %d)", acc->index, (int)uri->host.slen, uri->host.ptr, uri->port, (int)via_addr->slen, via_addr->ptr, - rport)); + rport, + acc->cfg.contact_rewrite_method)); - /* Unregister current contact */ - pjsua_acc_set_registration(acc->index, PJ_FALSE); - if (acc->regc != NULL) { - pjsip_regc_destroy(acc->regc); - acc->regc = NULL; - acc->contact.slen = 0; + pj_assert(acc->cfg.contact_rewrite_method == 1 || + acc->cfg.contact_rewrite_method == 2); + + if (acc->cfg.contact_rewrite_method == 1) { + /* Unregister current contact */ + pjsua_acc_set_registration(acc->index, PJ_FALSE); + if (acc->regc != NULL) { + pjsip_regc_destroy(acc->regc); + acc->regc = NULL; + acc->contact.slen = 0; + } } - /* Update account's Contact header */ + /* + * Build new Contact header + */ { char *tmp; const char *beginquote, *endquote; @@ -1151,11 +1160,16 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc, return PJ_FALSE; } pj_strdup2_with_null(acc->pool, &acc->contact, tmp); + + /* Always update, by http://trac.pjsip.org/repos/ticket/864. */ + pj_strdup_with_null(tp->pool, &tp->local_name.host, via_addr); + tp->local_name.port = rport; + } - /* Always update, by http://trac.pjsip.org/repos/ticket/864. */ - pj_strdup_with_null(tp->pool, &tp->local_name.host, via_addr); - tp->local_name.port = rport; + if (acc->cfg.contact_rewrite_method == 2 && acc->regc != NULL) { + pjsip_regc_update_contact(acc->regc, 1, &acc->contact); + } /* Perform new registration */ pjsua_acc_set_registration(acc->index, PJ_TRUE); diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 5d231cbf..888b3dbe 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -178,6 +178,7 @@ PJ_DEF(void) pjsua_acc_config_default(pjsua_acc_config *cfg) cfg->srtp_optional_dup_offer = pjsua_var.ua_cfg.srtp_optional_dup_offer; #endif cfg->reg_retry_interval = PJSUA_REG_RETRY_INTERVAL; + cfg->contact_rewrite_method = PJSUA_CONTACT_REWRITE_METHOD; } PJ_DEF(void) pjsua_buddy_config_default(pjsua_buddy_config *cfg) -- cgit v1.2.3