summaryrefslogtreecommitdiff
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authorMichael L. Young <elgueromexicano@gmail.com>2013-10-23 02:36:01 +0000
committerMichael L. Young <elgueromexicano@gmail.com>2013-10-23 02:36:01 +0000
commit4ca92e3b8af8351a7d7cc66f9713b427c7cf1827 (patch)
tree5b099b254416981967b4e6f36cc4adbdb7975abf /channels/chan_iax2.c
parentf04a4328d823059b4d8c2abca732d4cdeb22a04f (diff)
chan_iax2: Fix Binding To Multiple Addresses Again
When reworking chan_iax2 for IPv6, the ability to bind to multiple addresses was removed by mistake. This patch restores this functionality and adds notes about IPv6 addresses in the sample config. (closes issue ASTERISK-22741) Reported by: Joshua Colp Tested by: Michael L. Young Patches: asterisk-22741-fix-binding-multiple-addr.diff uploaded by Michael L. Young (license 5026) Review: https://reviewboard.asterisk.org/r/2945/ ........ Merged revisions 401488 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@401489 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r--channels/chan_iax2.c40
1 files changed, 24 insertions, 16 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);
}