summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2014-11-25 09:53:14 +0000
committerNanang Izzuddin <nanang@teluu.com>2014-11-25 09:53:14 +0000
commit63a1d319ef3c72575494a3b664a1ccb80d6b4776 (patch)
tree5d6bfc81dcefbbe2dcb7cf86184bfc073dd641c7 /pjsip
parentd6698b48908d6047cc1d903eaa4f08192fc528f9 (diff)
Fix #1804: Call should use local IP in Via sent-by when the account is not using STUN.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4963 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 5938ccbe..cbadd3c7 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -772,8 +772,23 @@ PJ_DEF(pj_status_t) pjsua_call_make_call(pjsua_acc_id acc_id,
*/
pjsip_dlg_inc_lock(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(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/1804
+ */
+ pjsip_host_port via_addr;
+ const void *via_tp;
+
+ if (pjsua_acc_get_uac_addr(acc_id, dlg->pool, &acc->cfg.id,
+ &via_addr, NULL, NULL,
+ &via_tp) == PJ_SUCCESS)
+ {
+ pjsip_dlg_set_via_sent_by(dlg, &via_addr,
+ (pjsip_transport*)via_tp);
+ }
+ }
/* Calculate call's secure level */
call->secure_level = get_secure_level(acc_id, dest_uri);
@@ -1349,6 +1364,28 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
{
pjsip_dlg_set_via_sent_by(dlg, &pjsua_var.acc[acc_id].via_addr,
pjsua_var.acc[acc_id].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/1804
+ */
+ 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 */