summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2012-08-07 02:18:15 +0000
committerBenny Prijono <bennylp@teluu.com>2012-08-07 02:18:15 +0000
commited7f9eba764e5fb47f7bc881bd96ceeb359bb3cc (patch)
tree76d7643b5b7725d63a0c85694394d4d4ca6e34d4 /pjsip/src/pjsua-lib
parent3c0866d754867d94b8d3160d61e01b6b362d1ccb (diff)
Fixed #1412: Account specific NAT settings: STUN, ICE, and TURN
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4218 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c249
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c2
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c62
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c50
4 files changed, 294 insertions, 69 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 28acf6ee..fc57f179 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -133,6 +133,9 @@ PJ_DEF(void) pjsua_acc_config_dup( pj_pool_t *pool,
pjsua_transport_config_dup(pool, &dst->rtp_cfg, &src->rtp_cfg);
+ pjsua_ice_config_dup(pool, &dst->ice_cfg, &src->ice_cfg);
+ pjsua_turn_config_dup(pool, &dst->turn_cfg, &src->turn_cfg);
+
pj_strdup(pool, &dst->ka_data, &src->ka_data);
}
@@ -283,7 +286,7 @@ static pj_status_t initialize_acc(unsigned acc_id)
* contact params.
*/
#if PJSUA_ADD_ICE_TAGS
- if (pjsua_var.media_cfg.enable_ice) {
+ if (acc_cfg->ice_cfg.enable_ice) {
unsigned new_len;
pj_str_t new_prm;
@@ -348,6 +351,18 @@ static pj_status_t initialize_acc(unsigned acc_id)
}
}
+ /* If account's ICE and TURN customization is not set, then
+ * initialize it with the settings from the global media config.
+ */
+ if (acc->cfg.ice_cfg_use == PJSUA_ICE_CONFIG_USE_DEFAULT) {
+ pjsua_ice_config_from_media_config(NULL, &acc->cfg.ice_cfg,
+ &pjsua_var.media_cfg);
+ }
+ if (acc->cfg.turn_cfg_use == PJSUA_TURN_CONFIG_USE_DEFAULT) {
+ pjsua_turn_config_from_media_config(NULL, &acc->cfg.turn_cfg,
+ &pjsua_var.media_cfg);
+ }
+
/* Mark account as valid */
pjsua_var.acc[acc_id].valid = PJ_TRUE;
@@ -1152,6 +1167,68 @@ PJ_DEF(pj_status_t) pjsua_acc_modify( pjsua_acc_id acc_id,
update_reg = PJ_TRUE;
}
+ /* Video settings */
+ acc->cfg.vid_in_auto_show = cfg->vid_in_auto_show;
+ acc->cfg.vid_out_auto_transmit = cfg->vid_out_auto_transmit;
+ acc->cfg.vid_wnd_flags = cfg->vid_wnd_flags;
+ acc->cfg.vid_cap_dev = cfg->vid_cap_dev;
+ acc->cfg.vid_rend_dev = cfg->vid_rend_dev;
+ acc->cfg.vid_stream_rc_cfg = cfg->vid_stream_rc_cfg;
+
+ /* Media settings */
+ if (pj_stricmp(&acc->cfg.rtp_cfg.public_addr, &cfg->rtp_cfg.public_addr) ||
+ pj_stricmp(&acc->cfg.rtp_cfg.bound_addr, &cfg->rtp_cfg.bound_addr))
+ {
+ pjsua_transport_config_dup(acc->pool, &acc->cfg.rtp_cfg,
+ &cfg->rtp_cfg);
+ } else {
+ /* ..to save memory by not using the pool */
+ acc->cfg.rtp_cfg = cfg->rtp_cfg;
+ }
+
+ /* STUN and Media customization */
+ if (acc->cfg.sip_stun_use != cfg->sip_stun_use) {
+ acc->cfg.sip_stun_use = cfg->sip_stun_use;
+ update_reg = PJ_TRUE;
+ }
+ acc->cfg.media_stun_use = cfg->media_stun_use;
+
+ /* ICE settings */
+ acc->cfg.ice_cfg_use = cfg->ice_cfg_use;
+ switch (acc->cfg.ice_cfg_use) {
+ case PJSUA_ICE_CONFIG_USE_DEFAULT:
+ /* Copy ICE settings from media settings so that we don't need to
+ * check the media config if we look for ICE config.
+ */
+ pjsua_ice_config_from_media_config(NULL, &acc->cfg.ice_cfg,
+ &pjsua_var.media_cfg);
+ break;
+ case PJSUA_ICE_CONFIG_USE_CUSTOM:
+ pjsua_ice_config_dup(acc->pool, &acc->cfg.ice_cfg, &cfg->ice_cfg);
+ break;
+ }
+
+ /* TURN settings */
+ acc->cfg.turn_cfg_use = cfg->turn_cfg_use;
+ switch (acc->cfg.turn_cfg_use) {
+ case PJSUA_TURN_CONFIG_USE_DEFAULT:
+ /* Copy TURN settings from media settings so that we don't need to
+ * check the media config if we look for TURN config.
+ */
+ pjsua_turn_config_from_media_config(NULL, &acc->cfg.turn_cfg,
+ &pjsua_var.media_cfg);
+ break;
+ case PJSUA_TURN_CONFIG_USE_CUSTOM:
+ pjsua_turn_config_dup(acc->pool, &acc->cfg.turn_cfg,
+ &cfg->turn_cfg);
+ break;
+ }
+
+ acc->cfg.use_srtp = cfg->use_srtp;
+
+ /* Call hold type */
+ acc->cfg.call_hold_type = cfg->call_hold_type;
+
/* Unregister first */
if (unreg_first) {
pjsua_acc_set_registration(acc->index, PJ_FALSE);
@@ -1174,16 +1251,6 @@ PJ_DEF(pj_status_t) pjsua_acc_modify( pjsua_acc_id acc_id,
pjsua_start_mwi(acc_id, PJ_TRUE);
}
- /* Video settings */
- acc->cfg.vid_in_auto_show = cfg->vid_in_auto_show;
- acc->cfg.vid_out_auto_transmit = cfg->vid_out_auto_transmit;
- acc->cfg.vid_wnd_flags = cfg->vid_wnd_flags;
- acc->cfg.vid_cap_dev = cfg->vid_cap_dev;
- acc->cfg.vid_rend_dev = cfg->vid_rend_dev;
-
- /* Call hold type */
- acc->cfg.call_hold_type = cfg->call_hold_type;
-
on_return:
PJSUA_UNLOCK();
pj_log_pop_indent();
@@ -1515,6 +1582,7 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc,
const char *ob = ";ob";
char *tmp;
const char *beginquote, *endquote;
+ char transport_param[32];
int len;
/* Enclose IPv6 address in square brackets */
@@ -1525,9 +1593,20 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc,
beginquote = endquote = "";
}
+ /* Don't add transport parameter if it's UDP */
+ if (tp->key.type != PJSIP_TRANSPORT_UDP &&
+ tp->key.type != PJSIP_TRANSPORT_UDP6)
+ {
+ pj_ansi_snprintf(transport_param, sizeof(transport_param),
+ ";transport=%s",
+ pjsip_transport_get_type_name(tp->key.type));
+ } else {
+ transport_param[0] = '\0';
+ }
+
tmp = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
len = pj_ansi_snprintf(tmp, PJSIP_MAX_URL_SIZE,
- "<sip:%.*s%s%s%.*s%s:%d;transport=%s%.*s%s>%.*s",
+ "<sip:%.*s%s%s%.*s%s:%d%s%.*s%s>%.*s",
(int)acc->user_part.slen,
acc->user_part.ptr,
(acc->user_part.slen? "@" : ""),
@@ -1536,7 +1615,7 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc,
via_addr->ptr,
endquote,
rport,
- tp->type_name,
+ transport_param,
(int)acc->cfg.contact_uri_params.slen,
acc->cfg.contact_uri_params.ptr,
(acc->cfg.use_rfc5626? ob: ""),
@@ -2146,6 +2225,13 @@ static pj_status_t pjsua_regc_init(int acc_id)
return PJ_SUCCESS;
}
+pj_bool_t pjsua_sip_acc_is_using_stun(pjsua_acc_id acc_id)
+{
+ pjsua_acc *acc = &pjsua_var.acc[acc_id];
+
+ return acc->cfg.sip_stun_use != PJSUA_STUN_USE_DISABLED &&
+ pjsua_var.ua_cfg.stun_srv_cnt != 0;
+}
/*
* Update registration or perform unregistration.
@@ -2153,6 +2239,7 @@ static pj_status_t pjsua_regc_init(int acc_id)
PJ_DEF(pj_status_t) pjsua_acc_set_registration( pjsua_acc_id acc_id,
pj_bool_t renew)
{
+ pjsua_acc *acc;
pj_status_t status = 0;
pjsip_tx_data *tdata = 0;
@@ -2166,6 +2253,8 @@ PJ_DEF(pj_status_t) pjsua_acc_set_registration( pjsua_acc_id acc_id,
PJSUA_LOCK();
+ acc = &pjsua_var.acc[acc_id];
+
/* Cancel any re-registration timer */
if (pjsua_var.acc[acc_id].auto_rereg.timer.id) {
pjsua_var.acc[acc_id].auto_rereg.timer.id = PJ_FALSE;
@@ -2232,6 +2321,15 @@ PJ_DEF(pj_status_t) pjsua_acc_set_registration( pjsua_acc_id acc_id,
pjsip_regc_set_via_sent_by(pjsua_var.acc[acc_id].regc,
&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
+ */
+ pjsua_acc_get_uac_addr(acc_id, tdata->pool,
+ &acc->cfg.reg_uri,
+ &tdata->via_addr,
+ NULL, NULL,
+ &tdata->via_tp);
}
//pjsua_process_msg_data(tdata, NULL);
@@ -2612,46 +2710,40 @@ PJ_DEF(pj_status_t) pjsua_acc_create_request(pjsua_acc_id acc_id,
return PJ_SUCCESS;
}
-
-PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
- pj_str_t *contact,
- pjsua_acc_id acc_id,
- const pj_str_t *suri)
+/* Get local transport address suitable to be used for Via or Contact address
+ * to send request to the specified destination URI.
+ */
+pj_status_t pjsua_acc_get_uac_addr(pjsua_acc_id acc_id,
+ pj_pool_t *pool,
+ const pj_str_t *dst_uri,
+ pjsip_host_port *addr,
+ pjsip_transport_type_e *p_tp_type,
+ int *secure,
+ const void **p_tp)
{
pjsua_acc *acc;
pjsip_sip_uri *sip_uri;
pj_status_t status;
pjsip_transport_type_e tp_type = PJSIP_TRANSPORT_UNSPECIFIED;
- pj_str_t local_addr;
- pjsip_tpselector tp_sel;
unsigned flag;
- int secure;
- int local_port;
- const char *beginquote, *endquote;
- char transport_param[32];
- const char *ob = ";ob";
+ pjsip_tpselector tp_sel;
+ pjsip_tpmgr *tpmgr;
+ pjsip_tpmgr_fla2_param tfla2_prm;
-
PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
acc = &pjsua_var.acc[acc_id];
- /* If force_contact is configured, then use use it */
- if (acc->cfg.force_contact.slen) {
- *contact = acc->cfg.force_contact;
- return PJ_SUCCESS;
- }
-
- /* If route-set is configured for the account, then URI is the
+ /* If route-set is configured for the account, then URI is the
* first entry of the route-set.
*/
if (!pj_list_empty(&acc->route_set)) {
- sip_uri = (pjsip_sip_uri*)
+ sip_uri = (pjsip_sip_uri*)
pjsip_uri_get_uri(acc->route_set.next->name_addr.uri);
} else {
pj_str_t tmp;
pjsip_uri *uri;
- pj_strdup_with_null(pool, &tmp, suri);
+ pj_strdup_with_null(pool, &tmp, dst_uri);
uri = pjsip_parse_uri(pool, tmp.ptr, tmp.slen, 0);
if (uri == NULL)
@@ -2671,7 +2763,7 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
tp_type = PJSIP_TRANSPORT_UDP;
} else
tp_type = pjsip_transport_get_type_from_name(&sip_uri->transport_param);
-
+
if (tp_type == PJSIP_TRANSPORT_UNSPECIFIED)
return PJSIP_EUNSUPTRANSPORT;
@@ -2682,15 +2774,66 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
tp_type = (pjsip_transport_type_e)(((int)tp_type) + PJSIP_TRANSPORT_IPV6);
flag = pjsip_transport_get_flag_from_type(tp_type);
- secure = (flag & PJSIP_TRANSPORT_SECURE) != 0;
/* Init transport selector. */
- pjsua_init_tpselector(pjsua_var.acc[acc_id].cfg.transport_id, &tp_sel);
+ pjsua_init_tpselector(acc->cfg.transport_id, &tp_sel);
/* Get local address suitable to send request from */
- status = pjsip_tpmgr_find_local_addr(pjsip_endpt_get_tpmgr(pjsua_var.endpt),
- pool, tp_type, &tp_sel,
- &local_addr, &local_port);
+ pjsip_tpmgr_fla2_param_default(&tfla2_prm);
+ tfla2_prm.tp_type = tp_type;
+ tfla2_prm.tp_sel = &tp_sel;
+ tfla2_prm.dst_host = sip_uri->host;
+ tfla2_prm.local_if = (!pjsua_sip_acc_is_using_stun(acc_id) ||
+ (flag & PJSIP_TRANSPORT_RELIABLE));
+
+ tpmgr = pjsip_endpt_get_tpmgr(pjsua_var.endpt);
+ status = pjsip_tpmgr_find_local_addr2(tpmgr, pool, &tfla2_prm);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ addr->host = tfla2_prm.ret_addr;
+ addr->port = tfla2_prm.ret_port;
+
+ if (p_tp_type)
+ *p_tp_type = tp_type;
+
+ if (secure) {
+ *secure = (flag & PJSIP_TRANSPORT_SECURE) != 0;
+ }
+
+ if (p_tp)
+ *p_tp = tfla2_prm.ret_tp;
+
+ return PJ_SUCCESS;
+}
+
+
+PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
+ pj_str_t *contact,
+ pjsua_acc_id acc_id,
+ const pj_str_t *suri)
+{
+ pjsua_acc *acc;
+ pj_status_t status;
+ pjsip_transport_type_e tp_type;
+ pjsip_host_port addr;
+ int secure;
+ const char *beginquote, *endquote;
+ char transport_param[32];
+ const char *ob = ";ob";
+
+
+ PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
+ acc = &pjsua_var.acc[acc_id];
+
+ /* If force_contact is configured, then use use it */
+ if (acc->cfg.force_contact.slen) {
+ *contact = acc->cfg.force_contact;
+ return PJ_SUCCESS;
+ }
+
+ status = pjsua_acc_get_uac_addr(acc_id, pool, suri, &addr,
+ &tp_type, &secure, NULL);
if (status != PJ_SUCCESS)
return status;
@@ -2725,10 +2868,10 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uac_contact( pj_pool_t *pool,
acc->user_part.ptr,
(acc->user_part.slen?"@":""),
beginquote,
- (int)local_addr.slen,
- local_addr.ptr,
+ (int)addr.host.slen,
+ addr.host.ptr,
endquote,
- local_port,
+ addr.port,
transport_param,
(int)acc->cfg.contact_uri_params.slen,
acc->cfg.contact_uri_params.ptr,
@@ -2760,6 +2903,8 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool,
pjsip_transport_type_e tp_type = PJSIP_TRANSPORT_UNSPECIFIED;
pj_str_t local_addr;
pjsip_tpselector tp_sel;
+ pjsip_tpmgr *tpmgr;
+ pjsip_tpmgr_fla2_param tfla2_prm;
unsigned flag;
int secure;
int local_port;
@@ -2847,12 +2992,22 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool,
pjsua_init_tpselector(pjsua_var.acc[acc_id].cfg.transport_id, &tp_sel);
/* Get local address suitable to send request from */
- status = pjsip_tpmgr_find_local_addr(pjsip_endpt_get_tpmgr(pjsua_var.endpt),
- pool, tp_type, &tp_sel,
- &local_addr, &local_port);
+ pjsip_tpmgr_fla2_param_default(&tfla2_prm);
+ tfla2_prm.tp_type = tp_type;
+ tfla2_prm.tp_sel = &tp_sel;
+ tfla2_prm.dst_host = sip_uri->host;
+ tfla2_prm.local_if = (!pjsua_sip_acc_is_using_stun(acc_id) ||
+ (flag & PJSIP_TRANSPORT_RELIABLE));
+
+ tpmgr = pjsip_endpt_get_tpmgr(pjsua_var.endpt);
+ status = pjsip_tpmgr_find_local_addr2(tpmgr, pool, &tfla2_prm);
if (status != PJ_SUCCESS)
return status;
+ local_addr = tfla2_prm.ret_addr;
+ local_port = tfla2_prm.ret_port;
+
+
/* Enclose IPv6 address in square brackets */
if (tp_type & PJSIP_TRANSPORT_IPV6) {
beginquote = "[";
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 45ce8eb8..b972bb8a 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -1182,7 +1182,7 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
options |= PJSIP_INV_SUPPORT_TIMER;
if (pjsua_var.acc[acc_id].cfg.require_100rel == PJSUA_100REL_MANDATORY)
options |= PJSIP_INV_REQUIRE_100REL;
- if (pjsua_var.media_cfg.enable_ice)
+ if (pjsua_var.acc[acc_id].cfg.ice_cfg.enable_ice)
options |= PJSIP_INV_SUPPORT_ICE;
if (pjsua_var.acc[acc_id].cfg.use_timer == PJSUA_SIP_TIMER_REQUIRED)
options |= PJSIP_INV_REQUIRE_TIMER;
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index f4071c0e..bfcae3f9 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -196,12 +196,64 @@ PJ_DEF(void) pjsua_transport_config_dup(pj_pool_t *pool,
pjsua_transport_config *dst,
const pjsua_transport_config *src)
{
+ pj_memcpy(dst, src, sizeof(*src));
+ pj_strdup(pool, &dst->public_addr, &src->public_addr);
+ pj_strdup(pool, &dst->bound_addr, &src->bound_addr);
+}
+
+PJ_DEF(void) pjsua_ice_config_from_media_config( pj_pool_t *pool,
+ pjsua_ice_config *dst,
+ const pjsua_media_config *src)
+{
+ PJ_UNUSED_ARG(pool);
+
+ dst->enable_ice = src->enable_ice;
+ dst->ice_max_host_cands = src->ice_max_host_cands;
+ dst->ice_opt = src->ice_opt;
+ dst->ice_no_rtcp = src->ice_no_rtcp;
+}
+
+PJ_DEF(void) pjsua_ice_config_dup( pj_pool_t *pool,
+ pjsua_ice_config *dst,
+ const pjsua_ice_config *src)
+{
PJ_UNUSED_ARG(pool);
pj_memcpy(dst, src, sizeof(*src));
}
+PJ_DEF(void) pjsua_turn_config_from_media_config(pj_pool_t *pool,
+ pjsua_turn_config *dst,
+ const pjsua_media_config *src)
+{
+ dst->enable_turn = src->enable_turn;
+ dst->turn_conn_type = src->turn_conn_type;
+ if (pool == NULL) {
+ dst->turn_server = src->turn_server;
+ dst->turn_auth_cred = src->turn_auth_cred;
+ } else {
+ if (pj_stricmp(&dst->turn_server, &src->turn_server))
+ pj_strdup(pool, &dst->turn_server, &src->turn_server);
+ pj_stun_auth_cred_dup(pool, &dst->turn_auth_cred,
+ &src->turn_auth_cred);
+ }
+}
+
+PJ_DEF(void) pjsua_turn_config_dup(pj_pool_t *pool,
+ pjsua_turn_config *dst,
+ const pjsua_turn_config *src)
+{
+ pj_memcpy(dst, src, sizeof(*src));
+ if (pool) {
+ pj_strdup(pool, &dst->turn_server, &src->turn_server);
+ pj_stun_auth_cred_dup(pool, &dst->turn_auth_cred,
+ &src->turn_auth_cred);
+ }
+}
+
PJ_DEF(void) pjsua_acc_config_default(pjsua_acc_config *cfg)
{
+ pjsua_media_config med_cfg;
+
pj_bzero(cfg, sizeof(*cfg));
cfg->reg_timeout = PJSUA_REG_INTERVAL;
@@ -224,6 +276,11 @@ PJ_DEF(void) pjsua_acc_config_default(pjsua_acc_config *cfg)
pjmedia_vid_stream_rc_config_default(&cfg->vid_stream_rc_cfg);
#endif
pjsua_transport_config_default(&cfg->rtp_cfg);
+
+ pjsua_media_config_default(&med_cfg);
+ pjsua_ice_config_from_media_config(NULL, &cfg->ice_cfg, &med_cfg);
+ pjsua_turn_config_from_media_config(NULL, &cfg->turn_cfg, &med_cfg);
+
cfg->use_srtp = pjsua_var.ua_cfg.use_srtp;
cfg->srtp_secure_signaling = pjsua_var.ua_cfg.srtp_secure_signaling;
cfg->srtp_optional_dup_offer = pjsua_var.ua_cfg.srtp_optional_dup_offer;
@@ -2805,6 +2862,7 @@ PJ_DEF(void) pjsua_dump(pj_bool_t detail)
PJ_LOG(3,(THIS_FILE, "Dumping media transports:"));
for (i=0; i<pjsua_var.ua_cfg.max_calls; ++i) {
pjsua_call *call = &pjsua_var.calls[i];
+ pjsua_acc_config *acc_cfg;
pjmedia_transport *tp[PJSUA_MAX_CALL_MEDIA*2];
unsigned tp_cnt = 0;
unsigned j;
@@ -2830,6 +2888,8 @@ PJ_DEF(void) pjsua_dump(pj_bool_t detail)
}
}
+ acc_cfg = &pjsua_var.acc[call->acc_id].cfg;
+
/* Dump the media transports in this call */
for (j = 0; j < tp_cnt; ++j) {
pjmedia_transport_info tpinfo;
@@ -2838,7 +2898,7 @@ PJ_DEF(void) pjsua_dump(pj_bool_t detail)
pjmedia_transport_info_init(&tpinfo);
pjmedia_transport_get_info(tp[j], &tpinfo);
PJ_LOG(3,(THIS_FILE, " %s: %s",
- (pjsua_var.media_cfg.enable_ice ? "ICE" : "UDP"),
+ (acc_cfg->ice_cfg.enable_ice ? "ICE" : "UDP"),
pj_sockaddr_print(&tpinfo.sock_info.rtp_addr_name,
addr_buf,
sizeof(addr_buf), 3)));
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 22b363cb..24f0ee61 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -165,9 +165,11 @@ pj_status_t pjsua_media_subsys_start(void)
#endif
/* Perform NAT detection */
- status = pjsua_detect_nat_type();
- if (status != PJ_SUCCESS) {
- PJ_PERROR(1,(THIS_FILE, status, "NAT type detection failed"));
+ if (pjsua_var.ua_cfg.stun_srv_cnt) {
+ status = pjsua_detect_nat_type();
+ if (status != PJ_SUCCESS) {
+ PJ_PERROR(1,(THIS_FILE, status, "NAT type detection failed"));
+ }
}
pj_log_pop_indent();
@@ -226,7 +228,8 @@ pj_status_t pjsua_media_subsys_destroy(unsigned flags)
* Create RTP and RTCP socket pair, and possibly resolve their public
* address via STUN.
*/
-static pj_status_t create_rtp_rtcp_sock(const pjsua_transport_config *cfg,
+static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
+ const pjsua_transport_config *cfg,
pjmedia_sock_info *skinfo)
{
enum {
@@ -240,10 +243,12 @@ static pj_status_t create_rtp_rtcp_sock(const pjsua_transport_config *cfg,
pj_sock_t sock[2];
/* Make sure STUN server resolution has completed */
- status = resolve_stun_server(PJ_TRUE);
- if (status != PJ_SUCCESS) {
- pjsua_perror(THIS_FILE, "Error resolving STUN server", status);
- return status;
+ if (pjsua_sip_acc_is_using_stun(call_med->call->acc_id)) {
+ status = resolve_stun_server(PJ_TRUE);
+ if (status != PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE, "Error resolving STUN server", status);
+ return status;
+ }
}
if (next_rtp_port == 0)
@@ -318,7 +323,9 @@ static pj_status_t create_rtp_rtcp_sock(const pjsua_transport_config *cfg,
* If we're configured to use STUN, then find out the mapped address,
* and make sure that the mapped RTCP port is adjacent with the RTP.
*/
- if (pjsua_var.stun_srv.addr.sa_family != 0) {
+ if (pjsua_sip_acc_is_using_stun(call_med->call->acc_id) &&
+ pjsua_var.stun_srv.addr.sa_family != 0)
+ {
char ip_addr[32];
pj_str_t stun_srv;
@@ -440,7 +447,7 @@ static pj_status_t create_udp_media_transport(const pjsua_transport_config *cfg,
pjmedia_sock_info skinfo;
pj_status_t status;
- status = create_rtp_rtcp_sock(cfg, &skinfo);
+ status = create_rtp_rtcp_sock(call_med, cfg, &skinfo);
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Unable to create RTP/RTCP socket",
status);
@@ -660,12 +667,15 @@ static pj_status_t create_ice_media_transport(
pj_bool_t async)
{
char stunip[PJ_INET6_ADDRSTRLEN];
+ pjsua_acc_config *acc_cfg;
pj_ice_strans_cfg ice_cfg;
pjmedia_ice_cb ice_cb;
char name[32];
unsigned comp_cnt;
pj_status_t status;
+ acc_cfg = &pjsua_var.acc[call_med->call->acc_id].cfg;
+
/* Make sure STUN server resolution has completed */
status = resolve_stun_server(PJ_TRUE);
if (status != PJ_SUCCESS) {
@@ -682,7 +692,7 @@ static pj_status_t create_ice_media_transport(
ice_cfg.af = pj_AF_INET();
ice_cfg.resolver = pjsua_var.resolver;
- ice_cfg.opt = pjsua_var.media_cfg.ice_opt;
+ ice_cfg.opt = acc_cfg->ice_cfg.ice_opt;
/* Configure STUN settings */
if (pj_sockaddr_has_addr(&pjsua_var.stun_srv)) {
@@ -690,8 +700,8 @@ static pj_status_t create_ice_media_transport(
ice_cfg.stun.server = pj_str(stunip);
ice_cfg.stun.port = pj_sockaddr_get_port(&pjsua_var.stun_srv);
}
- if (pjsua_var.media_cfg.ice_max_host_cands >= 0)
- ice_cfg.stun.max_host_cands = pjsua_var.media_cfg.ice_max_host_cands;
+ if (acc_cfg->ice_cfg.ice_max_host_cands >= 0)
+ ice_cfg.stun.max_host_cands = acc_cfg->ice_cfg.ice_max_host_cands;
/* Copy QoS setting to STUN setting */
ice_cfg.stun.cfg.qos_type = cfg->qos_type;
@@ -699,8 +709,8 @@ static pj_status_t create_ice_media_transport(
sizeof(cfg->qos_params));
/* Configure TURN settings */
- if (pjsua_var.media_cfg.enable_turn) {
- status = parse_host_port(&pjsua_var.media_cfg.turn_server,
+ if (acc_cfg->turn_cfg.enable_turn) {
+ status = parse_host_port(&acc_cfg->turn_cfg.turn_server,
&ice_cfg.turn.server,
&ice_cfg.turn.port);
if (status != PJ_SUCCESS || ice_cfg.turn.server.slen == 0) {
@@ -709,9 +719,9 @@ static pj_status_t create_ice_media_transport(
}
if (ice_cfg.turn.port == 0)
ice_cfg.turn.port = 3479;
- ice_cfg.turn.conn_type = pjsua_var.media_cfg.turn_conn_type;
+ ice_cfg.turn.conn_type = acc_cfg->turn_cfg.turn_conn_type;
pj_memcpy(&ice_cfg.turn.auth_cred,
- &pjsua_var.media_cfg.turn_auth_cred,
+ &acc_cfg->turn_cfg.turn_auth_cred,
sizeof(ice_cfg.turn.auth_cred));
/* Copy QoS setting to TURN setting */
@@ -730,7 +740,7 @@ static pj_status_t create_ice_media_transport(
call_med->tp_ready = PJ_EPENDING;
comp_cnt = 1;
- if (PJMEDIA_ADVERTISE_RTCP && !pjsua_var.media_cfg.ice_no_rtcp)
+ if (PJMEDIA_ADVERTISE_RTCP && !acc_cfg->ice_cfg.ice_no_rtcp)
++comp_cnt;
status = pjmedia_ice_create3(pjsua_var.med_endpt, name, comp_cnt,
@@ -858,7 +868,7 @@ PJ_DEF(pj_status_t) pjsua_media_transports_create(
pjsua_transport_config_dup(pjsua_var.pool, &cfg, app_cfg);
/* Create the transports */
- if (pjsua_var.media_cfg.enable_ice) {
+ if (pjsua_var.ice_cfg.enable_ice) {
status = create_ice_media_transports(&cfg);
} else {
status = create_udp_media_transports(&cfg);
@@ -1244,7 +1254,7 @@ pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
pjsua_set_media_tp_state(call_med, PJSUA_MED_TP_CREATING);
- if (pjsua_var.media_cfg.enable_ice) {
+ if (pjsua_var.acc[call_med->call->acc_id].cfg.ice_cfg.enable_ice) {
status = create_ice_media_transport(tcfg, call_med, async);
if (async && status == PJ_EPENDING) {
/* We will resume call media initialization in the