summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--channels/chan_iax2.c40
-rw-r--r--configs/iax.conf.sample6
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