diff options
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_media.c')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 31 |
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)); |