summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2010-06-20 08:58:26 +0000
committerBenny Prijono <bennylp@teluu.com>2010-06-20 08:58:26 +0000
commit1ebdfe9fb3ec2c155ec09d31f82748ecfdf9c86e (patch)
treed14101455fb4753a518726a16b20ed5ad2b09363
parent8d35b8f739dbad39422332ecb8376cc18a858f2e (diff)
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
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h45
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c38
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c1
3 files changed, 72 insertions, 12 deletions
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
@@ -1900,6 +1900,30 @@ PJ_DECL(pj_status_t) pjsua_transport_close( pjsua_transport_id id,
/**
+ * 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
* this structure first by calling #pjsua_acc_config_default().
@@ -2106,11 +2130,32 @@ 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.
* The keep-alive transmission will be sent to the registrar's address,
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)