]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 221697 via svnmerge from
authorDavid Vossel <dvossel@digium.com>
Thu, 1 Oct 2009 21:04:30 +0000 (21:04 +0000)
committerDavid Vossel <dvossel@digium.com>
Thu, 1 Oct 2009 21:04:30 +0000 (21:04 +0000)
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: https://origsvn.digium.com/svn/asterisk/branches/1.6.0@221745 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 9702b1ba5248e2b8659a30a20e6ec63d0218a3a9..9122d4425ceac6059c885c7c665b82b5c265c4d4 100644 (file)
@@ -21297,6 +21297,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)}};
@@ -21432,16 +21433,14 @@ 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(sched, peer->expire);
+                                       /* 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) {
@@ -21471,10 +21470,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);
@@ -21770,6 +21767,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_copy_string(peer->fullcontact, fullcontact->str, sizeof(peer->fullcontact));
                peer->rt_fromcontact = TRUE;
@@ -21801,6 +21804,16 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
                ast_copy_string(peer->tohost, srvlookup, sizeof(peer->tohost));
        }
 
+       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));
+       }
+
        if (!sip_cfg.ignore_regexpire && peer->host_dynamic && realtime) {
                time_t nowtime = time(NULL);