diff options
author | Liong Sauw Ming <ming@teluu.com> | 2013-09-04 10:07:45 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2013-09-04 10:07:45 +0000 |
commit | 387149bb4509fa04c19f71e7bfad587a6c9fc843 (patch) | |
tree | cd79753bfc6b686453f354e4f9c4161beed2ce04 /pjsip/src/pjsua-lib | |
parent | ef6704f279e8a331a8783f067bec99718940c83a (diff) |
Closed #1696: IP change detection (Contact rewrite method) based on REGISTER final response
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4586 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index e501791d..328d41e6 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -1494,6 +1494,7 @@ static pj_bool_t is_private_ip(const pj_str_t *addr) /* Update NAT address from the REGISTER response */ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc, + int contact_rewrite_method, struct pjsip_regc_cbparam *param) { pjsip_transport *tp; @@ -1678,12 +1679,13 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc, (int)via_addr->slen, via_addr->ptr, rport, - acc->cfg.contact_rewrite_method)); + contact_rewrite_method)); - pj_assert(acc->cfg.contact_rewrite_method == 1 || - acc->cfg.contact_rewrite_method == 2); + pj_assert(contact_rewrite_method == PJSUA_CONTACT_REWRITE_UNREGISTER || + contact_rewrite_method == PJSUA_CONTACT_REWRITE_NO_UNREG || + contact_rewrite_method == PJSUA_CONTACT_REWRITE_ALWAYS_UPDATE); - if (acc->cfg.contact_rewrite_method == 1) { + if (contact_rewrite_method == PJSUA_CONTACT_REWRITE_UNREGISTER) { /* Unregister current contact */ pjsua_acc_set_registration(acc->index, PJ_FALSE); if (acc->regc != NULL) { @@ -1761,12 +1763,16 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc, } - if (acc->cfg.contact_rewrite_method == 2 && acc->regc != NULL) { + if (contact_rewrite_method == PJSUA_CONTACT_REWRITE_NO_UNREG && + acc->regc != NULL) + { pjsip_regc_update_contact(acc->regc, 1, &acc->reg_contact); } /* Perform new registration */ - pjsua_acc_set_registration(acc->index, PJ_TRUE); + if (contact_rewrite_method < PJSUA_CONTACT_REWRITE_ALWAYS_UPDATE) { + pjsua_acc_set_registration(acc->index, PJ_TRUE); + } pj_pool_release(pool); @@ -2058,6 +2064,37 @@ on_return: "active": "not active"))); } +static void regc_tsx_cb(struct pjsip_regc_tsx_cb_param *param) +{ + pjsua_acc *acc = (pjsua_acc*) param->cbparam.token; + + PJSUA_LOCK(); + + if (param->cbparam.regc != acc->regc) { + PJSUA_UNLOCK(); + return; + } + + pj_log_push_indent(); + + if ((acc->cfg.contact_rewrite_method & + PJSUA_CONTACT_REWRITE_ALWAYS_UPDATE) == + PJSUA_CONTACT_REWRITE_ALWAYS_UPDATE && + param->cbparam.code >= 400 && + param->cbparam.rdata) + { + if (acc_check_nat_addr(acc, PJSUA_CONTACT_REWRITE_ALWAYS_UPDATE, + ¶m->cbparam)) + { + param->contact_cnt = 1; + param->contact[0] = acc->reg_contact; + } + } + + PJSUA_UNLOCK(); + pj_log_pop_indent(); +} + /* * This callback is called by pjsip_regc when outgoing register * request has completed. @@ -2126,7 +2163,9 @@ static void regc_cb(struct pjsip_regc_cbparam *param) update_rfc5626_status(acc, param->rdata); /* Check NAT bound address */ - if (acc_check_nat_addr(acc, param)) { + if (acc_check_nat_addr(acc, (acc->cfg.contact_rewrite_method & 3), + param)) + { PJSUA_UNLOCK(); pj_log_pop_indent(); return; @@ -2271,6 +2310,8 @@ static pj_status_t pjsua_regc_init(int acc_id) return status; } + pjsip_regc_set_reg_tsx_cb(acc->regc, regc_tsx_cb); + /* If account is locked to specific transport, then set transport to * the client registration. */ |