@ -1131,11 +1131,11 @@ struct ast_sockaddr bindaddr; /*!< UDP: The address we bind to */
static struct ast_sockaddr internip ;
/*! \brief our external IP address/port for SIP sessions.
* extern ip . sin_addr is only set when we know we might be behind
* extern addr . sin_addr is only set when we know we might be behind
* a NAT , and this is done using a variety of ( mutually exclusive )
* ways from the config file :
*
* + with " extern ip = host[:port]" we specify the address / port explicitly .
* + with " extern addr = host[:port]" we specify the address / port explicitly .
* The address is looked up only once when ( re ) loading the config file ;
*
* + with " externhost = host[:port] " we do a similar thing , but the
@ -1143,12 +1143,12 @@ static struct ast_sockaddr internip;
* is refreshed every ' externrefresh ' seconds ;
*
* + with " stunaddr = host[:port] " we run queries every externrefresh seconds
* to the specified server , and store the result in extern ip .
* to the specified server , and store the result in extern addr .
*
* Other variables ( externhost , externexpire , externrefresh ) are used
* to support the above functions .
*/
static struct ast_sockaddr extern ip ; /*!< External IP address if we are behind NAT */
static struct ast_sockaddr extern addr ; /*!< External IP address if we are behind NAT */
static struct ast_sockaddr media_address ; /*!< External RTP IP address if we are behind NAT */
static char externhost [ MAXHOSTNAMELEN ] ; /*!< External host name */
@ -3078,20 +3078,20 @@ static void build_via(struct sip_pvt *p)
*
* Using the localaddr structure built up with localnet statements in sip . conf
* apply it to their address to see if we need to substitute our
* extern ip or can get away with our internal bindaddr
* extern addr or can get away with our internal bindaddr
* ' us ' is always overwritten .
*/
static void ast_sip_ouraddrfor ( const struct ast_sockaddr * them , struct ast_sockaddr * us , struct sip_pvt * p )
{
struct ast_sockaddr theirs ;
struct sockaddr_in extern ip _sin;
struct sockaddr_in extern addr _sin;
/* Set want_remap to non-zero if we want to remap 'us' to an externally
* reachable IP address and port . This is done if :
* 1. we have a localaddr list ( containing ' internal ' addresses marked
* as ' deny ' , so ast_apply_ha ( ) will return AST_SENSE_DENY on them ,
* and AST_SENSE_ALLOW on ' external ' ones ) ;
* 2. either stunaddr or extern ip is set , so we know what to use as the
* 2. either stunaddr or extern addr is set , so we know what to use as the
* externally visible address ;
* 3. the remote address , ' them ' , is external ;
* 4. the address returned by ast_ouraddrfor ( ) is ' internal ' ( AST_SENSE_DENY
@ -3106,39 +3106,39 @@ static void ast_sip_ouraddrfor(const struct ast_sockaddr *them, struct ast_socka
ast_sockaddr_copy ( & theirs , them ) ;
if ( ast_sockaddr_is_ipv6 ( & theirs ) ) {
if ( localaddr & & ! ast_sockaddr_isnull ( & extern ip ) ) {
if ( localaddr & & ! ast_sockaddr_isnull ( & extern addr ) ) {
ast_log ( LOG_WARNING , " Address remapping activated in sip.conf "
" but we're using IPv6, which doesn't need it. Please "
" remove \" localnet \" and/or \" extern ip \" settings. \n " ) ;
" remove \" localnet \" and/or \" extern addr \" settings. \n " ) ;
}
} else {
want_remap = localaddr & &
! ( ast_sockaddr_isnull ( & extern ip ) & & stunaddr . sin_addr . s_addr ) & &
! ( ast_sockaddr_isnull ( & extern addr ) & & stunaddr . sin_addr . s_addr ) & &
ast_apply_ha ( localaddr , & theirs ) = = AST_SENSE_ALLOW ;
}
if ( want_remap & &
( ! sip_cfg . matchextern ip locally | | ! ast_apply_ha ( localaddr , us ) ) ) {
( ! sip_cfg . matchextern addr locally | | ! ast_apply_ha ( localaddr , us ) ) ) {
/* if we used externhost or stun, see if it is time to refresh the info */
if ( externexpire & & time ( NULL ) > = externexpire ) {
if ( stunaddr . sin_addr . s_addr ) {
ast_sockaddr_to_sin ( & extern ip, & externip _sin) ;
ast_stun_request ( sipsock , & stunaddr , NULL , & extern ip _sin) ;
ast_sockaddr_to_sin ( & extern addr, & externaddr _sin) ;
ast_stun_request ( sipsock , & stunaddr , NULL , & extern addr _sin) ;
} else {
if ( ast_sockaddr_resolve_first ( & extern ip , externhost , 0 ) ) {
if ( ast_sockaddr_resolve_first ( & extern addr , externhost , 0 ) ) {
ast_log ( LOG_NOTICE , " Warning: Re-lookup of '%s' failed! \n " , externhost ) ;
}
externexpire = time ( NULL ) ;
}
externexpire = time ( NULL ) + externrefresh ;
}
if ( ! ast_sockaddr_isnull ( & extern ip ) ) {
ast_sockaddr_copy ( us , & extern ip ) ;
if ( ! ast_sockaddr_isnull ( & extern addr ) ) {
ast_sockaddr_copy ( us , & extern addr ) ;
switch ( p - > socket . type ) {
case SIP_TRANSPORT_TCP :
if ( ! externtcpport & & ast_sockaddr_port ( & extern ip ) ) {
/* for consistency, default to the extern ip port */
externtcpport = ast_sockaddr_port ( & extern ip ) ;
if ( ! externtcpport & & ast_sockaddr_port ( & extern addr ) ) {
/* for consistency, default to the extern addr port */
externtcpport = ast_sockaddr_port ( & extern addr ) ;
}
ast_sockaddr_set_port ( us , externtcpport ) ;
break ;
@ -3146,16 +3146,18 @@ static void ast_sip_ouraddrfor(const struct ast_sockaddr *them, struct ast_socka
ast_sockaddr_set_port ( us , externtlsport ) ;
break ;
case SIP_TRANSPORT_UDP :
break ; /* fall through */
if ( ! ast_sockaddr_port ( & externaddr ) ) {
ast_sockaddr_set_port ( us , ast_sockaddr_port ( & bindaddr ) ) ;
}
break ;
default :
/* we should never get here */
ast_sockaddr_set_port ( us , STANDARD_SIP_PORT ) ;
break ;
}
}
else {
ast_log ( LOG_WARNING , " stun failed \n " ) ;
}
ast_debug ( 1 , " Target address %s is not local, substituting extern ip \n " ,
ast_debug ( 1 , " Target address %s is not local, substituting extern addr \n " ,
ast_sockaddr_stringify ( them ) ) ;
} else if ( p ) {
/* no remapping, but we bind to a specific address, so use it. */
@ -14397,7 +14399,7 @@ static int get_also_info(struct sip_pvt *p, struct sip_request *oreq)
* address and port in the SIP headers without the need for STUN .
* The address part is also reused for the media sessions .
* Note that ast_sip_ouraddrfor ( ) still rewrites p - > ourip
* if you specify extern ip / seternaddr / stunaddr .
* if you specify extern addr / seternaddr / stunaddr .
*/
static attribute_unused void check_via_response ( struct sip_pvt * p , struct sip_request * req )
{
@ -16586,17 +16588,17 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_
/* determine if/how SIP address can be remapped */
if ( localaddr = = NULL )
msg = " Disabled, no localnet list " ;
else if ( ast_sockaddr_isnull ( & extern ip ) )
else if ( ast_sockaddr_isnull ( & extern addr ) )
msg = " Disabled " ;
else if ( stunaddr . sin_addr . s_addr ! = 0 )
msg = " Enabled using STUN " ;
else if ( ! ast_strlen_zero ( externhost ) )
msg = " Enabled using externhost " ;
else
msg = " Enabled using extern ip " ;
msg = " Enabled using extern addr " ;
ast_cli ( a - > fd , " SIP address remapping: %s \n " , msg ) ;
ast_cli ( a - > fd , " Externhost: %s \n " , S_OR ( externhost , " <none> " ) ) ;
ast_cli ( a - > fd , " Externip : %s\n " , ast_sockaddr_stringify ( & extern ip ) ) ;
ast_cli ( a - > fd , " externaddr : %s\n " , ast_sockaddr_stringify ( & extern addr ) ) ;
ast_cli ( a - > fd , " Externrefresh: %d \n " , externrefresh ) ;
ast_cli ( a - > fd , " Internal IP: %s \n " , ast_sockaddr_stringify ( & internip ) ) ;
{
@ -26155,7 +26157,7 @@ static int reload_config(enum channelreloadreason reason)
struct ast_sockaddr old_bindaddr = bindaddr ;
int registry_count = 0 , peer_count = 0 , timerb_set = 0 , timert1_set = 0 ;
time_t run_start , run_end ;
struct sockaddr_in extern ip _sin;
struct sockaddr_in extern addr _sin;
int bindport = 0 ;
run_start = time ( 0 ) ;
@ -26264,7 +26266,7 @@ static int reload_config(enum channelreloadreason reason)
/* Free memory for local network address mask */
ast_free_ha ( localaddr ) ;
memset ( & localaddr , 0 , sizeof ( localaddr ) ) ;
memset ( & extern ip, 0 , sizeof ( externip ) ) ;
memset ( & extern addr, 0 , sizeof ( externaddr ) ) ;
memset ( & media_address , 0 , sizeof ( media_address ) ) ;
memset ( & default_prefs , 0 , sizeof ( default_prefs ) ) ;
memset ( & sip_cfg . outboundproxy , 0 , sizeof ( struct sip_proxy ) ) ;
@ -26373,7 +26375,7 @@ static int reload_config(enum channelreloadreason reason)
global_t38_maxdatagram = - 1 ;
global_shrinkcallerid = 1 ;
sip_cfg . matchextern iplocally = DEFAULT_MATCHEXTERNIP LOCALLY;
sip_cfg . matchextern addrlocally = DEFAULT_MATCHEXTERNADDR LOCALLY;
/* Copy the default jb config over global_jbconf */
memcpy ( & global_jbconf , & default_jbconf , sizeof ( struct ast_jb_conf ) ) ;
@ -26669,16 +26671,16 @@ static int reload_config(enum channelreloadreason reason)
} else if ( ! strcasecmp ( v - > name , " media_address " ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & media_address ) )
ast_log ( LOG_WARNING , " Invalid address for media_address keyword: %s \n " , v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " extern ip" ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & extern ip ) ) {
} else if ( ! strcasecmp ( v - > name , " extern addr" ) | | ! strcasecmp ( v - > name , " extern ip" ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & extern addr ) ) {
ast_log ( LOG_WARNING ,
" Invalid address for extern ip keyword: %s\n " ,
" Invalid address for extern addr keyword: %s\n " ,
v - > value ) ;
}
externexpire = 0 ;
} else if ( ! strcasecmp ( v - > name , " externhost " ) ) {
ast_copy_string ( externhost , v - > value , sizeof ( externhost ) ) ;
if ( ast_sockaddr_resolve_first ( & extern ip , externhost , 0 ) ) {
if ( ast_sockaddr_resolve_first ( & extern addr , externhost , 0 ) ) {
ast_log ( LOG_WARNING , " Invalid address for externhost keyword: %s \n " , externhost ) ;
}
externexpire = time ( NULL ) ;
@ -26797,8 +26799,8 @@ static int reload_config(enum channelreloadreason reason)
default_maxcallbitrate = atoi ( v - > value ) ;
if ( default_maxcallbitrate < 0 )
default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE ;
} else if ( ! strcasecmp ( v - > name , " matchextern iplocally" ) ) {
sip_cfg . matchextern ip locally = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " matchextern addrlocally" ) | | ! strcasecmp ( v - > name , " matchextern iplocally" ) ) {
sip_cfg . matchextern addr locally = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " session-timers " ) ) {
int i = ( int ) str2stmode ( v - > value ) ;
if ( i < 0 ) {
@ -26953,11 +26955,11 @@ static int reload_config(enum channelreloadreason reason)
if ( stunaddr . sin_addr . s_addr ! = 0 ) {
ast_debug ( 1 , " stun to %s:%d \n " ,
ast_inet_ntoa ( stunaddr . sin_addr ) , ntohs ( stunaddr . sin_port ) ) ;
ast_sockaddr_to_sin ( & extern ip, & externip _sin) ;
ast_sockaddr_to_sin ( & extern addr, & externaddr _sin) ;
ast_stun_request ( sipsock , & stunaddr ,
NULL , & extern ip _sin) ;
NULL , & extern addr _sin) ;
ast_debug ( 1 , " STUN sees us at %s \n " ,
ast_sockaddr_stringify ( & extern ip ) ) ;
ast_sockaddr_stringify ( & extern addr ) ) ;
}
ast_mutex_unlock ( & netlock ) ;
@ -27140,8 +27142,8 @@ static int reload_config(enum channelreloadreason reason)
}
/* Our extern IP address, if configured */
if ( ! ast_sockaddr_isnull ( & extern ip ) ) {
add_sip_domain ( ast_sockaddr_stringify ( & extern ip ) , SIP_DOMAIN_AUTO ,
if ( ! ast_sockaddr_isnull ( & extern addr ) ) {
add_sip_domain ( ast_sockaddr_stringify ( & extern addr ) , SIP_DOMAIN_AUTO ,
NULL ) ;
}