@ -2910,8 +2910,8 @@ static void rtp_add_candidates_to_ice(struct ast_rtp_instance *instance, struct
}
/* If configured to use a STUN server to get our external mapped address do so */
if ( stunaddr. sin_addr . s_addr & & count & & ast_sockaddr_is_ipv4 ( addr )
& & ! stun_address_is_blacklisted ( addr ) ) {
if ( count & & stunaddr. sin_addr . s_addr & & ! stun_address_is_blacklisted ( addr ) & &
( ast_sockaddr_is_ipv4 ( addr ) | | ast_sockaddr_is_any ( addr ) ) ) {
struct sockaddr_in answer ;
int rsp ;
@ -2925,27 +2925,40 @@ static void rtp_add_candidates_to_ice(struct ast_rtp_instance *instance, struct
ao2_lock ( instance ) ;
if ( ! rsp ) {
pj_sockaddr base ;
pj_sockaddr ext ;
pj_str_t mapped = pj_str ( ast_strdupa ( ast_inet_ntoa ( answer . sin_addr ) ) ) ;
int srflx = 1 ;
/* Use the first local host candidate as the base */
pj_sockaddr_cp ( & base , & address [ basepos ] ) ;
pj_sockaddr_init ( pj_AF_INET ( ) , & ext , & mapped , ntohs ( answer . sin_port ) ) ;
/* If the returned address is the same as one of our host candidates, don't send the srflx */
for ( pos = 0 ; pos < count ; pos + + ) {
if ( ( pj_sockaddr_cmp ( & address [ pos ] , & ext ) = = 0 ) & & ! rtp_address_is_ice_blacklisted ( & address [ pos ] ) ) {
srflx = 0 ;
/* Use the first local IPv4 host candidate as the base */
for ( pos = basepos ; pos < count ; pos + + ) {
if ( address [ pos ] . addr . sa_family = = PJ_AF_INET & &
! rtp_address_is_ice_blacklisted ( & address [ pos ] ) ) {
pj_sockaddr_cp ( & base , & address [ pos ] ) ;
break ;
}
}
if ( srflx ) {
ast_rtp_ice_add_cand ( instance , rtp , component , transport ,
PJ_ICE_CAND_TYPE_SRFLX , 65535 , & ext , & base , & base ,
pj_sockaddr_get_len ( & ext ) ) ;
if ( pos < count ) {
pj_sockaddr ext ;
pj_str_t mapped = pj_str ( ast_strdupa ( ast_inet_ntoa ( answer . sin_addr ) ) ) ;
int srflx = 1 ;
pj_sockaddr_init ( pj_AF_INET ( ) , & ext , & mapped , ntohs ( answer . sin_port ) ) ;
/*
* If the returned address is the same as one of our host
* candidates , don ' t send the srflx
*/
for ( pos = 0 ; pos < count ; pos + + ) {
if ( pj_sockaddr_cmp ( & address [ pos ] , & ext ) = = 0 & &
! rtp_address_is_ice_blacklisted ( & address [ pos ] ) ) {
srflx = 0 ;
break ;
}
}
if ( srflx ) {
ast_rtp_ice_add_cand ( instance , rtp , component , transport ,
PJ_ICE_CAND_TYPE_SRFLX , 65535 , & ext , & base , & base ,
pj_sockaddr_get_len ( & ext ) ) ;
}
}
}
}