diff options
-rw-r--r-- | channels/chan_iax2.c | 40 | ||||
-rw-r--r-- | configs/iax.conf.sample | 6 |
2 files changed, 28 insertions, 18 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 24ce54ac0..1d0c3169e 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -13256,7 +13256,6 @@ static int set_config(const char *config_file, int reload, int forced) else if (ast_parse_arg(v->value, PARSE_UINT32 | PARSE_IN_RANGE, &portno, 1024, 65535)) { portno = IAX_DEFAULT_PORTNO; } - ast_sockaddr_set_port(&bindaddr, portno); } else if (!strcasecmp(v->name, "pingtime")){ ping_time = atoi(v->value); } @@ -13318,18 +13317,28 @@ static int set_config(const char *config_file, int reload, int forced) if (reload) { ast_log(LOG_NOTICE, "Ignoring bindaddr on reload\n"); } else { - /* remember port if it has already been set */ - int setport = ast_sockaddr_port(&bindaddr); - if (ast_parse_arg(v->value, PARSE_ADDR | PARSE_PORT_IGNORE, NULL)) { - ast_log(LOG_WARNING, "Invalid address '%s' specified, default '%s' will be used\n", v->value, - ast_sockaddr_stringify(&bindaddr)); - } else { - ast_sockaddr_parse(&bindaddr, v->value, PARSE_PORT_IGNORE); - } + if (!ast_parse_arg(v->value, PARSE_ADDR, NULL)) { + + ast_sockaddr_parse(&bindaddr, v->value, 0); + + if (!ast_sockaddr_port(&bindaddr)) { + ast_sockaddr_set_port(&bindaddr, portno); + } + + if (!(ns = ast_netsock_bindaddr(netsock, io, &bindaddr, qos.tos, qos.cos, socket_read, NULL))) { + ast_log(LOG_WARNING, "Unable to apply binding to '%s' at line %d\n", v->value, v->lineno); + } else { + ast_verb(2, "Binding IAX2 to address %s\n", ast_sockaddr_stringify(&bindaddr)); - if (setport) { - ast_sockaddr_set_port(&bindaddr, setport); + if (defaultsockfd < 0) { + defaultsockfd = ast_netsock_sockfd(ns); + } + ast_netsock_unref(ns); + } + + } else { + ast_log(LOG_WARNING, "Invalid address '%s' specified, at line %d\n", v->value, v->lineno); } } } else if (!strcasecmp(v->name, "authdebug")) { @@ -13528,15 +13537,14 @@ static int set_config(const char *config_file, int reload, int forced) network_change_stasis_unsubscribe(); } - if (!ast_sockaddr_port(&bindaddr)) { - ast_sockaddr_set_port(&bindaddr, IAX_DEFAULT_PORTNO); - } - if (defaultsockfd < 0) { + + ast_sockaddr_set_port(&bindaddr, portno); + if (!(ns = ast_netsock_bindaddr(netsock, io, &bindaddr, qos.tos, qos.cos, socket_read, NULL))) { ast_log(LOG_ERROR, "Unable to create network socket: %s\n", strerror(errno)); } else { - ast_verb(2, "Binding IAX2 to address %s\n", ast_sockaddr_stringify(&bindaddr)); + ast_verb(2, "Binding IAX2 to default address %s\n", ast_sockaddr_stringify(&bindaddr)); defaultsockfd = ast_netsock_sockfd(ns); ast_netsock_unref(ns); } diff --git a/configs/iax.conf.sample b/configs/iax.conf.sample index d5ff72469..b74adc4b0 100644 --- a/configs/iax.conf.sample +++ b/configs/iax.conf.sample @@ -22,11 +22,13 @@ ;bindport=4569 ; The default port to listen on ; NOTE: bindport must be specified BEFORE bindaddr or ; may be specified on a specific bindaddr if followed by - ; colon and port (e.g. bindaddr=192.168.0.1:4569) + ; colon and port (e.g. bindaddr=192.168.0.1:4569) or for + ; IPv6 the address needs to be in brackets then colon + ; and port (e.g. bindaddr=[2001:db8::1]:4569). ;bindaddr=192.168.0.1 ; You can specify 'bindaddr' more than once to bind to ; multiple addresses, but the first will be the - ; default. + ; default. IPv6 addresses are accepted. ; ; Set 'iaxcompat' to yes if you plan to use layered switches or some other |