summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2011-03-15 03:20:37 +0000
committerLiong Sauw Ming <ming@teluu.com>2011-03-15 03:20:37 +0000
commitab69db8c96ae19269067fd98e5ff1a046d78a2de (patch)
tree3849b7cf4c1f21625f0378ccd0d0c048000f256a
parent477ebed76f7657565ef181da813ea2f7b409d24b (diff)
Fixed #1205: Configurable delay before registration refresh setting in pjsua_acc_config
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3441 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip-apps/src/python/_pjsua.h10
-rw-r--r--pjsip/include/pjsip-ua/sip_regc.h14
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h8
-rw-r--r--pjsip/src/pjsip-ua/sip_reg.c15
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c33
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c1
6 files changed, 71 insertions, 10 deletions
diff --git a/pjsip-apps/src/python/_pjsua.h b/pjsip-apps/src/python/_pjsua.h
index 754066a4..dd70f14e 100644
--- a/pjsip-apps/src/python/_pjsua.h
+++ b/pjsip-apps/src/python/_pjsua.h
@@ -1658,6 +1658,7 @@ typedef struct
PyObject *force_contact;
PyListObject *proxy;
unsigned reg_timeout;
+ unsigned reg_delay_before_refresh;
PyListObject *cred_info;
int transport_id;
int auth_initial_send;
@@ -1720,6 +1721,7 @@ static void PyObj_pjsua_acc_config_import(PyObj_pjsua_acc_config *obj,
}
obj->reg_timeout = cfg->reg_timeout;
+ obj->reg_delay_before_refresh = cfg->reg_delay_before_refresh;
Py_XDECREF(obj->cred_info);
obj->cred_info = (PyListObject *)PyList_New(0);
@@ -1776,6 +1778,7 @@ static void PyObj_pjsua_acc_config_export(pjsua_acc_config *cfg,
}
cfg->reg_timeout = obj->reg_timeout;
+ cfg->reg_delay_before_refresh = obj->reg_delay_before_refresh;
cfg->cred_count = PyList_Size((PyObject*)obj->cred_info);
if (cfg->cred_count > PJ_ARRAY_SIZE(cfg->cred_info))
@@ -1899,6 +1902,13 @@ static PyMemberDef PyObj_pjsua_acc_config_members[] =
"(PJSUA_REG_INTERVAL, 55 seconds). "
},
{
+ "reg_delay_before_refresh", T_INT,
+ offsetof(PyObj_pjsua_acc_config, reg_delay_before_refresh), 0,
+ "Specify the number of seconds to refresh the client registration"
+ "before the registration expires."
+ "(PJSIP_REGISTER_CLIENT_DELAY_BEFORE_REFRESH, 5 seconds). "
+ },
+ {
"cred_info", T_OBJECT_EX,
offsetof(PyObj_pjsua_acc_config, cred_info), 0,
"Array of credentials. If registration is desired, normally there "
diff --git a/pjsip/include/pjsip-ua/sip_regc.h b/pjsip/include/pjsip-ua/sip_regc.h
index a003641a..e448cf6c 100644
--- a/pjsip/include/pjsip-ua/sip_regc.h
+++ b/pjsip/include/pjsip-ua/sip_regc.h
@@ -190,6 +190,20 @@ PJ_DECL(pj_status_t) pjsip_regc_init(pjsip_regc *regc,
const pj_str_t contact[],
pj_uint32_t expires);
+/**
+ * Set the number of seconds to refresh the client registration before
+ * the registration expires.
+ *
+ * @param regc The registration structure.
+ * @param delay The number of seconds to refresh the client
+ * registration before the registration expires.
+ *
+ * @return PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t)
+pjsip_regc_set_delay_before_refresh( pjsip_regc *regc,
+ pj_uint32_t delay );
+
/**
* Set authentication credentials to use by this registration.
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h
index d8243067..f7803175 100644
--- a/pjsip/include/pjsua-lib/pjsua.h
+++ b/pjsip/include/pjsua-lib/pjsua.h
@@ -2269,6 +2269,14 @@ typedef struct pjsua_acc_config
unsigned reg_timeout;
/**
+ * Specify the number of seconds to refresh the client registration
+ * before the registration expires.
+ *
+ * Default: PJSIP_REGISTER_CLIENT_DELAY_BEFORE_REFRESH, 5 seconds
+ */
+ unsigned reg_delay_before_refresh;
+
+ /**
* Specify the maximum time to wait for unregistration requests to
* complete during library shutdown sequence.
*
diff --git a/pjsip/src/pjsip-ua/sip_reg.c b/pjsip/src/pjsip-ua/sip_reg.c
index a53937fa..45a69ba2 100644
--- a/pjsip/src/pjsip-ua/sip_reg.c
+++ b/pjsip/src/pjsip-ua/sip_reg.c
@@ -37,7 +37,7 @@
#define REFRESH_TIMER 1
-#define DELAY_BEFORE_REFRESH PJSIP_REGISTER_CLIENT_DELAY_BEFORE_REFRESH
+#define DELAY_BEFORE_REFRESH PJSIP_REGISTER_CLIENT_DELAY_BEFORE_REFRESH
#define THIS_FILE "sip_reg.c"
/* Outgoing transaction timeout when server sends 100 but never replies
@@ -87,6 +87,7 @@ struct pjsip_regc
pjsip_contact_hdr removed_contact_hdr_list;
pjsip_expires_hdr *expires_hdr;
pj_uint32_t expires;
+ pj_uint32_t delay_before_refresh;
pjsip_route_hdr route_set;
pjsip_hdr hdr_list;
@@ -375,6 +376,7 @@ PJ_DEF(pj_status_t) pjsip_regc_init( pjsip_regc *regc,
/* Set "Expires" header, if required. */
set_expires( regc, expires);
+ regc->delay_before_refresh = DELAY_BEFORE_REFRESH;
/* Set "Call-ID" header. */
regc->cid_hdr = pjsip_cid_hdr_create(regc->pool);
@@ -389,6 +391,15 @@ PJ_DEF(pj_status_t) pjsip_regc_init( pjsip_regc *regc,
return PJ_SUCCESS;
}
+PJ_DEF(pj_status_t)
+pjsip_regc_set_delay_before_refresh( pjsip_regc *regc,
+ pj_uint32_t delay )
+{
+ PJ_ASSERT_RETURN(regc, PJ_EINVAL);
+ regc->delay_before_refresh = delay;
+ return PJ_SUCCESS;
+}
+
PJ_DEF(pj_status_t) pjsip_regc_set_credentials( pjsip_regc *regc,
int count,
const pjsip_cred_info cred[] )
@@ -1119,7 +1130,7 @@ handle_err:
if (regc->auto_reg && expiration > 0) {
pj_time_val delay = { 0, 0};
- delay.sec = expiration - DELAY_BEFORE_REFRESH;
+ delay.sec = expiration - regc->delay_before_refresh;
if (regc->expires != PJSIP_REGC_EXPIRATION_NOT_SPECIFIED &&
delay.sec > (pj_int32_t)regc->expires)
{
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 1cf273f3..8435738a 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -99,6 +99,7 @@ PJ_DEF(void) pjsua_acc_config_dup( pj_pool_t *pool,
pj_strdup_with_null(pool, &dst->proxy[i], &src->proxy[i]);
dst->reg_timeout = src->reg_timeout;
+ dst->reg_delay_before_refresh = src->reg_delay_before_refresh;
dst->cred_count = src->cred_count;
for (i=0; i<src->cred_count; ++i) {
@@ -392,11 +393,15 @@ PJ_DEF(pj_status_t) pjsua_acc_add( const pjsua_acc_config *cfg,
/* Copy config */
pjsua_acc_config_dup(acc->pool, &pjsua_var.acc[id].cfg, cfg);
- /* Normalize registration timeout */
- if (pjsua_var.acc[id].cfg.reg_uri.slen &&
- pjsua_var.acc[id].cfg.reg_timeout == 0)
- {
- pjsua_var.acc[id].cfg.reg_timeout = PJSUA_REG_INTERVAL;
+ /* Normalize registration timeout and refresh delay */
+ if (pjsua_var.acc[id].cfg.reg_uri.slen) {
+ if (pjsua_var.acc[id].cfg.reg_timeout == 0) {
+ pjsua_var.acc[id].cfg.reg_timeout = PJSUA_REG_INTERVAL;
+ }
+ if (pjsua_var.acc[id].cfg.reg_delay_before_refresh == 0) {
+ pjsua_var.acc[id].cfg.reg_delay_before_refresh =
+ PJSIP_REGISTER_CLIENT_DELAY_BEFORE_REFRESH;
+ }
}
/* Get CRC of account proxy setting */
@@ -940,14 +945,22 @@ PJ_DEF(pj_status_t) pjsua_acc_modify( pjsua_acc_id acc_id,
/* Registration */
acc->cfg.reg_timeout = cfg->reg_timeout;
+ acc->cfg.reg_delay_before_refresh = cfg->reg_delay_before_refresh;
acc->cfg.unreg_timeout = cfg->unreg_timeout;
acc->cfg.allow_contact_rewrite = cfg->allow_contact_rewrite;
acc->cfg.reg_retry_interval = cfg->reg_retry_interval;
acc->cfg.drop_calls_on_reg_fail = cfg->drop_calls_on_reg_fail;
- /* Normalize registration timeout */
- if (acc->cfg.reg_uri.slen && acc->cfg.reg_timeout == 0)
- acc->cfg.reg_timeout = PJSUA_REG_INTERVAL;
+ /* Normalize registration timeout and refresh delay */
+ if (acc->cfg.reg_uri.slen ) {
+ if (acc->cfg.reg_timeout == 0) {
+ acc->cfg.reg_timeout = PJSUA_REG_INTERVAL;
+ }
+ if (acc->cfg.reg_delay_before_refresh == 0) {
+ acc->cfg.reg_delay_before_refresh =
+ PJSIP_REGISTER_CLIENT_DELAY_BEFORE_REFRESH;
+ }
+ }
/* Registrar URI */
if (pj_strcmp(&acc->cfg.reg_uri, &cfg->reg_uri)) {
@@ -1816,6 +1829,10 @@ static pj_status_t pjsua_regc_init(int acc_id)
pjsip_regc_set_credentials( acc->regc, acc->cred_cnt, acc->cred);
}
+ /* Set delay before registration refresh */
+ pjsip_regc_set_delay_before_refresh(acc->regc,
+ acc->cfg.reg_delay_before_refresh);
+
/* Set authentication preference */
pjsip_regc_set_prefs(acc->regc, &acc->cfg.auth_pref);
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index 16dda48a..d07f0063 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -166,6 +166,7 @@ PJ_DEF(void) pjsua_acc_config_default(pjsua_acc_config *cfg)
pj_bzero(cfg, sizeof(*cfg));
cfg->reg_timeout = PJSUA_REG_INTERVAL;
+ cfg->reg_delay_before_refresh = PJSIP_REGISTER_CLIENT_DELAY_BEFORE_REFRESH;
cfg->unreg_timeout = PJSUA_UNREG_TIMEOUT;
pjsip_publishc_opt_default(&cfg->publish_opt);
cfg->unpublish_max_wait_time_msec = PJSUA_UNPUBLISH_MAX_WAIT_TIME_MSEC;