summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_media.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_media.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index a2dfc118..8bca8700 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -926,10 +926,16 @@ static pj_status_t create_ice_media_transport(
if (acc_cfg->turn_cfg.enable_turn) {
ice_cfg.turn_tp_cnt = 1;
pj_ice_strans_turn_cfg_default(&ice_cfg.turn_tp[0]);
- if (use_ipv6 && PJ_ICE_MAX_TURN >= 2) {
- ice_cfg.turn_tp_cnt = 2;
+ if (use_ipv6 && PJ_ICE_MAX_TURN >= 3) {
+ ice_cfg.turn_tp_cnt = 3;
+
pj_ice_strans_turn_cfg_default(&ice_cfg.turn_tp[1]);
ice_cfg.turn_tp[1].af = pj_AF_INET6();
+
+ /* Additional candidate: IPv4 relay via IPv6 TURN server */
+ pj_ice_strans_turn_cfg_default(&ice_cfg.turn_tp[2]);
+ ice_cfg.turn_tp[2].af = pj_AF_INET6();
+ ice_cfg.turn_tp[2].alloc_param.af = pj_AF_INET();
}
/* Configure TURN server */
@@ -956,6 +962,13 @@ static pj_status_t create_ice_media_transport(
pj_memcpy(&ice_cfg.turn_tp[1].auth_cred,
&acc_cfg->turn_cfg.turn_auth_cred,
sizeof(ice_cfg.turn_tp[1].auth_cred));
+
+ ice_cfg.turn_tp[2].server = ice_cfg.turn_tp[0].server;
+ ice_cfg.turn_tp[2].port = ice_cfg.turn_tp[0].port;
+ ice_cfg.turn_tp[2].conn_type = ice_cfg.turn_tp[0].conn_type;
+ pj_memcpy(&ice_cfg.turn_tp[2].auth_cred,
+ &acc_cfg->turn_cfg.turn_auth_cred,
+ sizeof(ice_cfg.turn_tp[2].auth_cred));
}
/* Configure QoS setting */
@@ -966,6 +979,10 @@ static pj_status_t create_ice_media_transport(
ice_cfg.turn_tp[1].cfg.qos_type = cfg->qos_type;
pj_memcpy(&ice_cfg.turn_tp[1].cfg.qos_params, &cfg->qos_params,
sizeof(cfg->qos_params));
+
+ ice_cfg.turn_tp[2].cfg.qos_type = cfg->qos_type;
+ pj_memcpy(&ice_cfg.turn_tp[2].cfg.qos_params, &cfg->qos_params,
+ sizeof(cfg->qos_params));
}
/* Configure binding address */
@@ -983,12 +1000,20 @@ static pj_status_t create_ice_media_transport(
&IN6_ADDR_ANY, (pj_uint16_t)cfg->port);
ice_cfg.turn_tp[1].cfg.port_range =
ice_cfg.turn_tp[0].cfg.port_range;
+
+ pj_sockaddr_init(pj_AF_INET6(),
+ &ice_cfg.turn_tp[2].cfg.bound_addr,
+ &IN6_ADDR_ANY, (pj_uint16_t)cfg->port);
+ ice_cfg.turn_tp[2].cfg.port_range =
+ ice_cfg.turn_tp[0].cfg.port_range;
}
/* Configure max packet size */
ice_cfg.turn_tp[0].cfg.max_pkt_size = PJMEDIA_MAX_MRU;
- if (use_ipv6 && ice_cfg.turn_tp_cnt > 1)
+ if (use_ipv6 && ice_cfg.turn_tp_cnt > 1) {
ice_cfg.turn_tp[1].cfg.max_pkt_size = PJMEDIA_MAX_MRU;
+ ice_cfg.turn_tp[2].cfg.max_pkt_size = PJMEDIA_MAX_MRU;
+ }
}
pj_bzero(&ice_cb, sizeof(pjmedia_ice_cb));