aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpabelanger <pabelanger@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-14 15:15:12 +0000
committerpabelanger <pabelanger@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-14 15:15:12 +0000
commit1a629f8a54982fc50c01125690fe04b4aa2fa924 (patch)
treeb40da03943df7385877f89513794963cb6e8ea32
parent681aee87a208fe0efa5f325fcfa0a18f472d4c97 (diff)
Add the ability for ast_find_ourip to return IPv4, IPv6 or both.
While testing chan_gtalk I noticed jabber was using my IPv6 address and not IPv4. When using bindaddr=0.0.0.0 it is possible for ast_find_ourip() to return both IPv6 and IPv4 results. Adding a family parameter gives you the ablility to choose. Since jabber/gtalk/h323 do not support IPv6, we should only return IPv4 results. Review: https://reviewboard.asterisk.org/r/973/ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.8@291758 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_gtalk.c4
-rw-r--r--channels/chan_h323.c2
-rw-r--r--channels/chan_jingle.c10
-rw-r--r--channels/chan_sip.c2
-rw-r--r--include/asterisk/acl.h4
-rw-r--r--main/acl.c4
6 files changed, 15 insertions, 11 deletions
diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c
index 326ea7035..36ef90307 100644
--- a/channels/chan_gtalk.c
+++ b/channels/chan_gtalk.c
@@ -859,7 +859,7 @@ static int gtalk_create_candidates(struct gtalk *client, struct gtalk_pvt *p, ch
ast_rtp_instance_get_local_address(p->rtp, &sin_tmp);
ast_sockaddr_to_sin(&sin_tmp, &sin);
ast_sockaddr_from_sin(&bindaddr_tmp, &bindaddr);
- ast_find_ourip(&us, &bindaddr_tmp);
+ ast_find_ourip(&us, &bindaddr_tmp, AF_INET);
if (!strcmp(ast_sockaddr_stringify_addr(&us), "127.0.0.1")) {
ast_log(LOG_WARNING, "Found a loopback IP on the system, check your network configuration or set the bindaddr attribute.");
}
@@ -2217,7 +2217,7 @@ static int load_module(void)
}
ast_sockaddr_from_sin(&bindaddr_tmp, &bindaddr);
- if (ast_find_ourip(&ourip_tmp, &bindaddr_tmp)) {
+ if (ast_find_ourip(&ourip_tmp, &bindaddr_tmp, AF_INET)) {
ast_log(LOG_WARNING, "Unable to get own IP address, Gtalk disabled\n");
return 0;
}
diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index 2362d9a49..89b452dbc 100644
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -965,7 +965,7 @@ static int __oh323_rtp_create(struct oh323_pvt *pvt)
struct ast_sockaddr tmp;
ast_sockaddr_from_sin(&tmp, &bindaddr);
- if (ast_find_ourip(&our_addr, &tmp)) {
+ if (ast_find_ourip(&our_addr, &tmp, AF_INET)) {
ast_mutex_unlock(&pvt->lock);
ast_log(LOG_ERROR, "Unable to locate local IP address for RTP stream\n");
return -1;
diff --git a/channels/chan_jingle.c b/channels/chan_jingle.c
index 25b4d7e45..c12704835 100644
--- a/channels/chan_jingle.c
+++ b/channels/chan_jingle.c
@@ -623,7 +623,7 @@ static int jingle_create_candidates(struct jingle *client, struct jingle_pvt *p,
ast_rtp_instance_get_local_address(p->rtp, &sin_tmp);
ast_sockaddr_to_sin(&sin_tmp, &sin);
ast_sockaddr_from_sin(&bindaddr_tmp, &bindaddr);
- ast_find_ourip(&us_tmp, &bindaddr_tmp);
+ ast_find_ourip(&us_tmp, &bindaddr_tmp, AF_INET);
us.s_addr = htonl(ast_sockaddr_ipv4(&us_tmp));
/* Setup our first jingle candidate */
@@ -1904,15 +1904,17 @@ static int load_module(void)
}
sched = sched_context_create();
- if (!sched)
+ if (!sched) {
ast_log(LOG_WARNING, "Unable to create schedule context\n");
+ }
io = io_context_create();
- if (!io)
+ if (!io) {
ast_log(LOG_WARNING, "Unable to create I/O context\n");
+ }
ast_sockaddr_from_sin(&bindaddr_tmp, &bindaddr);
- if (ast_find_ourip(&ourip_tmp, &bindaddr_tmp)) {
+ if (ast_find_ourip(&ourip_tmp, &bindaddr_tmp, AF_INET)) {
ast_log(LOG_WARNING, "Unable to get own IP address, Jingle disabled\n");
return 0;
}
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 58e3f5c4f..302ca35a1 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -27086,7 +27086,7 @@ static int reload_config(enum channelreloadreason reason)
/* Set UDP address and open socket */
ast_sockaddr_copy(&internip, &bindaddr);
- if (ast_find_ourip(&internip, &bindaddr)) {
+ if (ast_find_ourip(&internip, &bindaddr, 0)) {
ast_log(LOG_WARNING, "Unable to get own IP address, SIP disabled\n");
ast_config_destroy(cfg);
return 0;
diff --git a/include/asterisk/acl.h b/include/asterisk/acl.h
index a8c311cb2..86053f431 100644
--- a/include/asterisk/acl.h
+++ b/include/asterisk/acl.h
@@ -220,10 +220,12 @@ struct ast_ha *ast_duplicate_ha_list(struct ast_ha *original);
* \param[out] ourip Our IP address is written here when it is found
* \param bindaddr A hint used for finding our IP. See the steps above for
* more details
+ * \param family Only addresses of the given family will be returned. Use 0
+ * or AST_SOCKADDR_UNSPEC to get addresses of all families.
* \retval 0 Success
* \retval -1 Failure
*/
-int ast_find_ourip(struct ast_sockaddr *ourip, const struct ast_sockaddr *bindaddr);
+int ast_find_ourip(struct ast_sockaddr *ourip, const struct ast_sockaddr *bindaddr, int family);
/*!
* \brief Convert a string to the appropriate COS value
diff --git a/main/acl.c b/main/acl.c
index 1ca0cc0bd..dcbc3a965 100644
--- a/main/acl.c
+++ b/main/acl.c
@@ -720,7 +720,7 @@ int ast_ouraddrfor(const struct ast_sockaddr *them, struct ast_sockaddr *us)
return 0;
}
-int ast_find_ourip(struct ast_sockaddr *ourip, const struct ast_sockaddr *bindaddr)
+int ast_find_ourip(struct ast_sockaddr *ourip, const struct ast_sockaddr *bindaddr, int family)
{
char ourhost[MAXHOSTNAMELEN] = "";
struct ast_sockaddr root;
@@ -735,7 +735,7 @@ int ast_find_ourip(struct ast_sockaddr *ourip, const struct ast_sockaddr *bindad
if (gethostname(ourhost, sizeof(ourhost) - 1)) {
ast_log(LOG_WARNING, "Unable to get hostname\n");
} else {
- if (resolve_first(ourip, ourhost, PARSE_PORT_FORBID, 0) == 0) {
+ if (resolve_first(ourip, ourhost, PARSE_PORT_FORBID, family) == 0) {
return 0;
}
}