aboutsummaryrefslogtreecommitdiffstats
path: root/main/manager.c
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-08 22:08:07 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-08 22:08:07 +0000
commitc3c2e5edfd715b3a99aac1567623a0b1b7d49de0 (patch)
treec05335b563c3f7cb9a3edbf3e101d8e1b80e0be4 /main/manager.c
parentaf344f1a5be5b43f1d10b95ea6e57ebfa761cf50 (diff)
Add IPv6 to Asterisk.
This adds a generic API for accommodating IPv6 and IPv4 addresses within Asterisk. While many files have been updated to make use of the API, chan_sip and the RTP code are the files which actually support IPv6 addresses at the time of this commit. The way has been paved for easier upgrading for other files in the near future, though. Big thanks go to Simon Perrault, Marc Blanchet, and Jean-Philippe Dionne for their hard work on this. (closes issue #17565) Reported by: russell Patches: asteriskv6-test-report.pdf uploaded by russell (license 2) Review: https://reviewboard.asterisk.org/r/743 git-svn-id: http://svn.digium.com/svn/asterisk/trunk@274783 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/manager.c')
-rw-r--r--main/manager.c91
1 files changed, 67 insertions, 24 deletions
diff --git a/main/manager.c b/main/manager.c
index dffe92a15..5c8f893af 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1984,7 +1984,8 @@ static enum ast_security_event_transport_type mansession_get_transport(const str
static struct sockaddr_in *mansession_encode_sin_local(const struct mansession *s,
struct sockaddr_in *sin_local)
{
- *sin_local = s->tcptls_session->parent->local_address;
+ ast_sockaddr_to_sin(&s->tcptls_session->parent->local_address,
+ sin_local);
return sin_local;
}
@@ -4598,14 +4599,18 @@ static int do_message(struct mansession *s)
static void *session_do(void *data)
{
struct ast_tcptls_session_instance *ser = data;
- struct mansession_session *session = build_mansession(ser->remote_address);
+ struct mansession_session *session;
struct mansession s = {
.tcptls_session = data,
};
int flags;
int res;
+ struct sockaddr_in ser_remote_address_tmp;
struct protoent *p;
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ session = build_mansession(ser_remote_address_tmp);
+
if (session == NULL) {
goto done;
}
@@ -4640,7 +4645,7 @@ static void *session_do(void *data)
/* these fields duplicate those in the 'ser' structure */
session->fd = s.fd = ser->fd;
session->f = s.f = ser->f;
- session->sin = ser->remote_address;
+ session->sin = ser_remote_address_tmp;
s.session = session;
AST_LIST_HEAD_INIT_NOLOCK(&session->datastores);
@@ -5912,17 +5917,35 @@ out_401:
static int manager_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return generic_http_callback(ser, method, FORMAT_HTML, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = generic_http_callback(ser, method, FORMAT_HTML, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static int mxml_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return generic_http_callback(ser, method, FORMAT_XML, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = generic_http_callback(ser, method, FORMAT_XML, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static int rawman_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return generic_http_callback(ser, method, FORMAT_RAW, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = generic_http_callback(ser, method, FORMAT_RAW, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static struct ast_http_uri rawmanuri = {
@@ -5953,17 +5976,35 @@ static struct ast_http_uri managerxmluri = {
/* Callback with Digest authentication */
static int auth_manager_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return auth_http_callback(ser, method, FORMAT_HTML, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = auth_http_callback(ser, method, FORMAT_HTML, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static int auth_mxml_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return auth_http_callback(ser, method, FORMAT_XML, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = auth_http_callback(ser, method, FORMAT_XML, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static int auth_rawman_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return auth_http_callback(ser, method, FORMAT_RAW, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = auth_http_callback(ser, method, FORMAT_RAW, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static struct ast_http_uri arawmanuri = {
@@ -6049,12 +6090,10 @@ static char *handle_manager_show_settings(struct ast_cli_entry *e, int cmd, stru
ast_cli(a->fd, "----------------\n");
ast_cli(a->fd, FORMAT, "Manager (AMI):", AST_CLI_YESNO(manager_enabled));
ast_cli(a->fd, FORMAT, "Web Manager (AMI/HTTP):", AST_CLI_YESNO(webmanager_enabled));
- ast_cli(a->fd, FORMAT, "TCP Bindaddress:", ast_inet_ntoa(ami_desc.local_address.sin_addr));
- ast_cli(a->fd, FORMAT2, "TCP Port:", ntohs(ami_desc.local_address.sin_port));
+ ast_cli(a->fd, FORMAT, "TCP Bindaddress:", ast_sockaddr_stringify(&ami_desc.local_address));
ast_cli(a->fd, FORMAT2, "HTTP Timeout (minutes):", httptimeout);
ast_cli(a->fd, FORMAT, "TLS Enable:", AST_CLI_YESNO(ami_tls_cfg.enabled));
- ast_cli(a->fd, FORMAT, "TLS Bindaddress:", ast_inet_ntoa(amis_desc.local_address.sin_addr));
- ast_cli(a->fd, FORMAT2, "TLS Port:", ntohs(amis_desc.local_address.sin_port));
+ ast_cli(a->fd, FORMAT, "TLS Bindaddress:", ast_sockaddr_stringify(&amis_desc.local_address));
ast_cli(a->fd, FORMAT, "TLS Certfile:", ami_tls_cfg.certfile);
ast_cli(a->fd, FORMAT, "TLS Privatekey:", ami_tls_cfg.pvtfile);
ast_cli(a->fd, FORMAT, "TLS Cipher:", ami_tls_cfg.cipher);
@@ -6093,6 +6132,8 @@ static int __init_manager(int reload)
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
char a1[256];
char a1_hash[256];
+ struct sockaddr_in ami_desc_local_address_tmp = { 0, };
+ struct sockaddr_in amis_desc_local_address_tmp = { 0, };
manager_enabled = 0;
@@ -6151,10 +6192,8 @@ static int __init_manager(int reload)
/* default values */
ast_copy_string(global_realm, S_OR(ast_config_AST_SYSTEM_NAME, DEFAULT_REALM), sizeof(global_realm));
- memset(&ami_desc.local_address, 0, sizeof(struct sockaddr_in));
- memset(&amis_desc.local_address, 0, sizeof(amis_desc.local_address));
- amis_desc.local_address.sin_port = htons(5039);
- ami_desc.local_address.sin_port = htons(DEFAULT_MANAGER_PORT);
+ amis_desc_local_address_tmp.sin_port = htons(5039);
+ ami_desc_local_address_tmp.sin_port = htons(DEFAULT_MANAGER_PORT);
ami_tls_cfg.enabled = 0;
if (ami_tls_cfg.certfile) {
@@ -6186,11 +6225,12 @@ static int __init_manager(int reload)
} else if (!strcasecmp(var->name, "webenabled")) {
webmanager_enabled = ast_true(val);
} else if (!strcasecmp(var->name, "port")) {
- ami_desc.local_address.sin_port = htons(atoi(val));
+ ami_desc_local_address_tmp.sin_port = htons(atoi(val));
} else if (!strcasecmp(var->name, "bindaddr")) {
- if (!inet_aton(val, &ami_desc.local_address.sin_addr)) {
+ if (!inet_aton(val, &ami_desc_local_address_tmp.sin_addr)) {
ast_log(LOG_WARNING, "Invalid address '%s' specified, using 0.0.0.0\n", val);
- memset(&ami_desc.local_address.sin_addr, 0, sizeof(ami_desc.local_address.sin_addr));
+ memset(&ami_desc_local_address_tmp.sin_addr, 0,
+ sizeof(ami_desc_local_address_tmp.sin_addr));
}
} else if (!strcasecmp(var->name, "brokeneventsaction")) {
broken_events_action = ast_true(val);
@@ -6228,15 +6268,18 @@ static int __init_manager(int reload)
}
if (manager_enabled) {
- ami_desc.local_address.sin_family = AF_INET;
+ ami_desc_local_address_tmp.sin_family = AF_INET;
}
/* if the amis address has not been set, default is the same as non secure ami */
- if (!amis_desc.local_address.sin_addr.s_addr) {
- amis_desc.local_address.sin_addr = ami_desc.local_address.sin_addr;
+ if (!amis_desc_local_address_tmp.sin_addr.s_addr) {
+ amis_desc_local_address_tmp.sin_addr =
+ ami_desc_local_address_tmp.sin_addr;
}
if (ami_tls_cfg.enabled) {
- amis_desc.local_address.sin_family = AF_INET;
+ amis_desc_local_address_tmp.sin_family = AF_INET;
}
+ ast_sockaddr_from_sin(&ami_desc.local_address, &ami_desc_local_address_tmp);
+ ast_sockaddr_from_sin(&amis_desc.local_address, &amis_desc_local_address_tmp);
AST_RWLIST_WRLOCK(&users);