@ -248,8 +248,11 @@ static int destroy_sip_transport_state(void *data)
ast_free ( transport_state - > id ) ;
ast_free_ha ( transport_state - > localnet ) ;
if ( transport_state - > external_address_refresher ) {
ast_dnsmgr_release ( transport_state - > external_address_refresher ) ;
if ( transport_state - > external_signaling_address_refresher ) {
ast_dnsmgr_release ( transport_state - > external_signaling_address_refresher ) ;
}
if ( transport_state - > external_media_address_refresher ) {
ast_dnsmgr_release ( transport_state - > external_media_address_refresher ) ;
}
if ( transport_state - > transport ) {
pjsip_transport_shutdown ( transport_state - > transport ) ;
@ -399,8 +402,8 @@ static void copy_state_to_transport(struct ast_sip_transport *transport)
memcpy ( & transport - > tls , & transport - > state - > tls , sizeof ( transport - > tls ) ) ;
memcpy ( & transport - > ciphers , & transport - > state - > ciphers , sizeof ( transport - > ciphers ) ) ;
transport - > localnet = transport - > state - > localnet ;
transport - > external_address_refresher = transport - > state - > external_ address_refresher;
memcpy ( & transport - > external_address , & transport - > state - > external_ address, sizeof ( transport - > external _address) ) ;
transport - > external_address_refresher = transport - > state - > external_ signaling_ address_refresher;
memcpy ( & transport - > external_address , & transport - > state - > external_ signaling_ address, sizeof ( transport - > external _signaling _address) ) ;
}
static int has_state_changed ( struct ast_sip_transport_state * a , struct ast_sip_transport_state * b )
@ -421,7 +424,11 @@ static int has_state_changed(struct ast_sip_transport_state *a, struct ast_sip_t
return - 1 ;
}
if ( ast_sockaddr_cmp ( & a - > external_address , & b - > external_address ) ) {
if ( ast_sockaddr_cmp ( & a - > external_signaling_address , & b - > external_signaling_address ) ) {
return - 1 ;
}
if ( ast_sockaddr_cmp ( & a - > external_media_address , & b - > external_media_address ) ) {
return - 1 ;
}
@ -515,24 +522,41 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj)
pj_sockaddr_set_port ( & temp_state - > state - > host , ( transport - > type = = AST_TRANSPORT_TLS ) ? 5061 : 5060 ) ;
}
/* Now that we know what address family we can set up a dnsmgr refresh for the external media address if present */
/* Now that we know what address family we can set up a dnsmgr refresh for the external addresse s if present */
if ( ! ast_strlen_zero ( transport - > external_signaling_address ) ) {
if ( temp_state - > state - > host . addr . sa_family = = pj_AF_INET ( ) ) {
temp_state - > state - > external_ address. ss . ss_family = AF_INET ;
temp_state - > state - > external_ signaling_ address. ss . ss_family = AF_INET ;
} else if ( temp_state - > state - > host . addr . sa_family = = pj_AF_INET6 ( ) ) {
temp_state - > state - > external_ address. ss . ss_family = AF_INET6 ;
temp_state - > state - > external_ signaling_ address. ss . ss_family = AF_INET6 ;
} else {
ast_log ( LOG_ERROR , " Unknown address family for transport '%s', could not get external signaling address \n " ,
transport_id ) ;
return - 1 ;
}
if ( ast_dnsmgr_lookup ( transport - > external_signaling_address , & temp_state - > state - > external_ address, & temp_state - > state - > external _address_refresher, NULL ) < 0 ) {
if ( ast_dnsmgr_lookup ( transport - > external_signaling_address , & temp_state - > state - > external_ signaling_ address, & temp_state - > state - > external _signaling _address_refresher, NULL ) < 0 ) {
ast_log ( LOG_ERROR , " Could not create dnsmgr for external signaling address on '%s' \n " , transport_id ) ;
return - 1 ;
}
}
if ( ! ast_strlen_zero ( transport - > external_media_address ) ) {
if ( temp_state - > state - > host . addr . sa_family = = pj_AF_INET ( ) ) {
temp_state - > state - > external_media_address . ss . ss_family = AF_INET ;
} else if ( temp_state - > state - > host . addr . sa_family = = pj_AF_INET6 ( ) ) {
temp_state - > state - > external_media_address . ss . ss_family = AF_INET6 ;
} else {
ast_log ( LOG_ERROR , " Unknown address family for transport '%s', could not get external media address \n " ,
transport_id ) ;
return - 1 ;
}
if ( ast_dnsmgr_lookup ( transport - > external_media_address , & temp_state - > state - > external_media_address , & temp_state - > state - > external_media_address_refresher , NULL ) < 0 ) {
ast_log ( LOG_ERROR , " Could not create dnsmgr for external media address on '%s' \n " , transport_id ) ;
return - 1 ;
}
}
if ( transport - > type = = AST_TRANSPORT_UDP ) {
for ( i = 0 ; i < BIND_TRIES & & res ! = PJ_SUCCESS ; i + + ) {