summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_pres.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_pres.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_pres.c76
1 files changed, 72 insertions, 4 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_pres.c b/pjsip/src/pjsua-lib/pjsua_pres.c
index 4551c91..591f65b 100644
--- a/pjsip/src/pjsua-lib/pjsua_pres.c
+++ b/pjsip/src/pjsua-lib/pjsua_pres.c
@@ -1,4 +1,4 @@
-/* $Id: pjsua_pres.c 4186 2012-06-29 01:37:50Z ming $ */
+/* $Id: pjsua_pres.c 4294 2012-11-06 05:02:10Z nanang $ */
/*
* Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
* Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
@@ -864,8 +864,31 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
return PJ_TRUE;
}
- if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0)
+ if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0) {
pjsip_dlg_set_via_sent_by(dlg, &acc->via_addr, acc->via_tp);
+ } else if (!pjsua_sip_acc_is_using_stun(acc_id)) {
+ /* Choose local interface to use in Via if acc is not using
+ * STUN. See https://trac.pjsip.org/repos/ticket/1412
+ */
+ char target_buf[PJSIP_MAX_URL_SIZE];
+ pj_str_t target;
+ pjsip_host_port via_addr;
+ const void *via_tp;
+
+ target.ptr = target_buf;
+ target.slen = pjsip_uri_print(PJSIP_URI_IN_REQ_URI,
+ dlg->target,
+ target_buf, sizeof(target_buf));
+ if (target.slen < 0) target.slen = 0;
+
+ if (pjsua_acc_get_uac_addr(acc_id, dlg->pool, &target,
+ &via_addr, NULL, NULL,
+ &via_tp) == PJ_SUCCESS)
+ {
+ pjsip_dlg_set_via_sent_by(dlg, &via_addr,
+ (pjsip_transport*)via_tp);
+ }
+ }
/* Set credentials and preference. */
pjsip_auth_clt_set_credentials(&dlg->auth_sess, acc->cred_cnt, acc->cred);
@@ -1236,6 +1259,20 @@ static pj_status_t send_publish(int acc_id, pj_bool_t active)
if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0) {
pjsip_publishc_set_via_sent_by(acc->publish_sess, &acc->via_addr,
acc->via_tp);
+ } else if (!pjsua_sip_acc_is_using_stun(acc_id)) {
+ /* Choose local interface to use in Via if acc is not using
+ * STUN. See https://trac.pjsip.org/repos/ticket/1412
+ */
+ pjsip_host_port via_addr;
+ const void *via_tp;
+
+ if (pjsua_acc_get_uac_addr(acc_id, acc->pool, &acc_cfg->id,
+ &via_addr, NULL, NULL,
+ &via_tp) == PJ_SUCCESS)
+ {
+ pjsip_publishc_set_via_sent_by(acc->publish_sess, &via_addr,
+ (pjsip_transport*)via_tp);
+ }
}
/* Send the PUBLISH request */
@@ -1789,8 +1826,24 @@ static void subscribe_buddy_presence(pjsua_buddy_id buddy_id)
*/
pjsip_dlg_inc_lock(buddy->dlg);
- if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0)
+ if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0) {
pjsip_dlg_set_via_sent_by(buddy->dlg, &acc->via_addr, acc->via_tp);
+ } else if (!pjsua_sip_acc_is_using_stun(acc_id)) {
+ /* Choose local interface to use in Via if acc is not using
+ * STUN. See https://trac.pjsip.org/repos/ticket/1412
+ */
+ pjsip_host_port via_addr;
+ const void *via_tp;
+
+ if (pjsua_acc_get_uac_addr(acc_id, buddy->dlg->pool, &buddy->uri,
+ &via_addr, NULL, NULL,
+ &via_tp) == PJ_SUCCESS)
+ {
+ pjsip_dlg_set_via_sent_by(buddy->dlg, &via_addr,
+ (pjsip_transport*)via_tp);
+ }
+ }
+
status = pjsip_pres_create_uac( buddy->dlg, &pres_callback,
PJSIP_EVSUB_NO_EVENT_ID, &buddy->sub);
@@ -2114,8 +2167,23 @@ pj_status_t pjsua_start_mwi(pjsua_acc_id acc_id, pj_bool_t force_renew)
*/
pjsip_dlg_inc_lock(acc->mwi_dlg);
- if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0)
+ if (acc->cfg.allow_via_rewrite && acc->via_addr.host.slen > 0) {
pjsip_dlg_set_via_sent_by(acc->mwi_dlg, &acc->via_addr, acc->via_tp);
+ } else if (!pjsua_sip_acc_is_using_stun(acc_id)) {
+ /* Choose local interface to use in Via if acc is not using
+ * STUN. See https://trac.pjsip.org/repos/ticket/1412
+ */
+ pjsip_host_port via_addr;
+ const void *via_tp;
+
+ if (pjsua_acc_get_uac_addr(acc_id, acc->mwi_dlg->pool, &acc->cfg.id,
+ &via_addr, NULL, NULL,
+ &via_tp) == PJ_SUCCESS)
+ {
+ pjsip_dlg_set_via_sent_by(acc->mwi_dlg, &via_addr,
+ (pjsip_transport*)via_tp);
+ }
+ }
/* Create UAC subscription */
status = pjsip_mwi_create_uac(acc->mwi_dlg, &mwi_cb,