diff -Nurp -x .svn a/channels/chan_sip.c b/channels/chan_sip.c --- a/channels/chan_sip.c 2009-10-06 11:18:37.588627540 -0400 +++ b/channels/chan_sip.c 2009-10-06 11:46:47.384630126 -0400 @@ -3565,8 +3565,21 @@ static void ast_sip_ouraddrfor(struct in } externexpire = time(NULL) + externrefresh; } - if (externip.sin_addr.s_addr) + if (externip.sin_addr.s_addr) { *us = externip; + switch (p->socket.type) { + case SIP_TRANSPORT_TCP: + us->sin_port = htons(sip_tcp_desc.externtcpport); + break; + case SIP_TRANSPORT_TLS: + us->sin_port = htons(sip_tls_desc.externtlsport); + break; + case SIP_TRANSPORT_UDP: + /* fall through */ + default: + us->sin_port = htons(STANDARD_SIP_PORT); + } + } else ast_log(LOG_WARNING, "stun failed\n"); ast_debug(1, "Target address %s is not local, substituting externip\n", @@ -24926,6 +24939,8 @@ static int reload_config(enum channelrel default_primary_transport = 0; /*!< Reset default primary transport to zero here, default value later on */ ourport_tcp = STANDARD_SIP_PORT; ourport_tls = STANDARD_TLS_PORT; + sip_tcp_desc.externtcpport = STANDARD_SIP_PORT; + sip_tls_desc.externtlsport = STANDARD_TLS_PORT; bindaddr.sin_port = htons(STANDARD_SIP_PORT); sip_cfg.srvlookup = DEFAULT_SRVLOOKUP; global_tos_sip = DEFAULT_TOS_SIP; @@ -25304,6 +25319,16 @@ static int reload_config(enum channelrel ast_log(LOG_WARNING, "Invalid externrefresh value '%s', must be an integer >0 at line %d\n", v->value, v->lineno); externrefresh = 10; } + } else if (!strcasecmp(v->name, "externtcpport")) { + if (!(sip_tcp_desc.externtcpport = port_str2int(v->value, 0))) { + ast_log(LOG_WARNING, "Invalid externtcpport value, must be a positive integer between 1 and 65535 at line %d\n", v->lineno); + sip_tcp_desc.externtcpport = ntohs(sip_tcp_desc.local_address.sin_port); + } + } else if (!strcasecmp(v->name, "externtlsport")) { + if (!(sip_tls_desc.externtlsport = port_str2int(v->value, 0))) { + ast_log(LOG_WARNING, "Invalid externtlsport value, must be a positive integer between 1 and 65535 at line %d\n", v->lineno); + sip_tls_desc.externtlsport = ntohs(sip_tls_desc.local_address.sin_port); + } } else if (!strcasecmp(v->name, "allow")) { int error = ast_parse_allow_disallow(&default_prefs, &sip_cfg.capability, v->value, TRUE); if (error) diff -Nurp -x .svn a/configs/sip.conf.sample b/configs/sip.conf.sample --- a/configs/sip.conf.sample 2009-10-06 11:18:37.731629360 -0400 +++ b/configs/sip.conf.sample 2009-10-06 11:18:59.770703922 -0400 @@ -643,6 +643,8 @@ srvlookup=yes ; Enable ; externip = 12.34.56.78 ; use this address. ; externip = 12.34.56.78:9900 ; use this address and port. ; externip = mynat.my.org:12600 ; Public address of my nat box. +; externtcpport = 5060 ; The externally mapped tcp port, when using static NAT or PAT +; externtlsport = 5061 ; The externally mapped tls port, when using static NAT or PAT ; ; b. "externhost = hostname[:port]" is similar to "externip" except ; that the hostname is looked up every "externrefresh" seconds diff -Nurp -x .svn a/include/asterisk/tcptls.h b/include/asterisk/tcptls.h --- a/include/asterisk/tcptls.h 2009-09-15 15:33:47.117511917 -0400 +++ b/include/asterisk/tcptls.h 2009-10-06 11:18:59.771695444 -0400 @@ -132,6 +132,8 @@ struct ast_tcptls_session_args { void (*periodic_fn)(void *);/*!< something we may want to run before after select on the accept socket */ void *(*worker_fn)(void *); /*!< the function in charge of doing the actual work */ const char *name; + int externtcpport; + int externtlsport; }; /*