aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2009-10-01 19:35:11 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2009-10-01 19:35:11 +0000
commitae2dd119da23a728f52f23b9a683f9cfa4283cae (patch)
tree3eaa23b08a0d3fef77cc7abaa097328af1bbec7b
parent4905ad7478996d14eda5c07beb4b1fe4451b1a6d (diff)
Merged revisions 221697 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r221697 | dvossel | 2009-10-01 14:33:33 -0500 (Thu, 01 Oct 2009) | 9 lines outbound tls connections were not defaulting to port 5061 (closes issue #15854) Reported by: dvossel Patches: sip_port_config_trunk.diff uploaded by dvossel (license 671) Tested by: dvossel ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.2@221698 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_sip.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index b1a27046b..783e674e6 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7328,29 +7328,32 @@ static int sip_register(const char *value, int lineno)
AST_NONSTANDARD_RAW_ARGS(host3, host2.hostpart, ':');
if (host3.port) {
- if (sscanf(host3.port, "%5u", &portnum) != 1 || portnum > 65535) {
+ if (!(portnum = port_str2int(host3.port, 0))) {
ast_log(LOG_NOTICE, "'%s' is not a valid port number on line %d of sip.conf. using default.\n", host3.port, lineno);
- portnum = -1;
}
}
+ /* set transport type */
if (!pre2.transport) {
transport = SIP_TRANSPORT_UDP;
} else if (!strncasecmp(pre2.transport, "tcp", 3)) {
transport = SIP_TRANSPORT_TCP;
} else if (!strncasecmp(pre2.transport, "tls", 3)) {
transport = SIP_TRANSPORT_TLS;
- if (portnum < 0) {
- portnum = STANDARD_TLS_PORT;
- }
} else if (!strncasecmp(pre2.transport, "udp", 3)) {
transport = SIP_TRANSPORT_UDP;
} else {
+ transport = SIP_TRANSPORT_UDP;
ast_log(LOG_NOTICE, "'%.3s' is not a valid transport type on line %d of sip.conf. defaulting to udp.\n", pre2.transport, lineno);
}
- if (portnum < 0) {
- portnum = STANDARD_SIP_PORT;
+ /* if no portnum specified, set default for transport */
+ if (!portnum) {
+ if (transport == SIP_TRANSPORT_TLS) {
+ portnum = STANDARD_TLS_PORT;
+ } else {
+ portnum = STANDARD_SIP_PORT;
+ }
}
if (!(reg = ast_calloc(1, sizeof(*reg)))) {
@@ -23083,6 +23086,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
struct ast_ha *oldha = NULL;
int found = 0;
int firstpass = 1;
+ uint16_t port = 0;
int format = 0; /* Ama flags */
time_t regseconds = 0;
struct ast_flags peerflags[2] = {{(0)}};
@@ -23256,17 +23260,15 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
/* Initialize stuff if this is a new peer, or if it used to
* not be dynamic before the reload. */
memset(&peer->addr.sin_addr, 0, 4);
- if (peer->addr.sin_port) {
- /* If we've already got a port, make it the default rather than absolute */
- peer->defaddr.sin_port = peer->addr.sin_port;
- peer->addr.sin_port = 0;
- }
+ peer->addr.sin_port = 0;
}
peer->host_dynamic = TRUE;
} else {
/* Non-dynamic. Make sure we become that way if we're not */
AST_SCHED_DEL_UNREF(sched, peer->expire,
unref_peer(peer, "removing register expire ref"));
+ /* the port will either be set to a default value or a config specified value once all option parsing is complete */
+ peer->addr.sin_port = 0;
peer->host_dynamic = FALSE;
srvlookup = v->value;
if (global_dynamic_exclude_static) {
@@ -23296,10 +23298,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
}
} else if (!strcasecmp(v->name, "port")) {
peer->portinuri = 1;
- if (!realtime && peer->host_dynamic) {
- peer->defaddr.sin_port = htons(atoi(v->value));
- } else {
- peer->addr.sin_port = htons(atoi(v->value));
+ if (!(port = port_str2int(v->value, 0))) {
+ ast_log(LOG_WARNING, "Invalid peer port configuration at line %d : %s\n", v->lineno, v->value);
}
} else if (!strcasecmp(v->name, "callingpres")) {
peer->callingpres = ast_parse_caller_presentation(v->value);
@@ -23512,6 +23512,12 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
set_socket_transport(&peer->socket, peer->default_outbound_transport);
}
+ if (port && !realtime && peer->host_dynamic) {
+ peer->defaddr.sin_port = htons(port);
+ } else if (port) {
+ peer->addr.sin_port = htons(port);
+ }
+
if (ast_str_strlen(fullcontact)) {
ast_string_field_set(peer, fullcontact, ast_str_buffer(fullcontact));
peer->rt_fromcontact = TRUE;
@@ -23552,7 +23558,9 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
if (!peer->addr.sin_port) {
peer->addr.sin_port = htons(((peer->socket.type & SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT));
}
-
+ if (!peer->defaddr.sin_port) {
+ peer->defaddr.sin_port = htons(((peer->socket.type & SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT));
+ }
if (!peer->socket.port) {
peer->socket.port = htons(((peer->socket.type & SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT));
}