[svn-commits] jpdionne: branch group/v6-new r271299 - in /team/group/v6-new: channels/ incl...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Thu Jun 17 16:22:52 CDT 2010
Author: jpdionne
Date: Thu Jun 17 16:22:49 2010
New Revision: 271299
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=271299
Log:
DNS resolution returns addresses according to the family of the udp sip socket.
- bindaddr=[::], the resolved addresses can be IPv6 or IPv4.
- bindaddr=a.b.c.d, the resolved addresses are IPv4 only.
- bindaddr=[i:p:v:6], the resolved addresses are IPv6 only.
Modified:
team/group/v6-new/channels/chan_sip.c
team/group/v6-new/include/asterisk/acl.h
team/group/v6-new/include/asterisk/dnsmgr.h
team/group/v6-new/main/acl.c
team/group/v6-new/main/dnsmgr.c
Modified: team/group/v6-new/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/v6-new/channels/chan_sip.c?view=diff&rev=271299&r1=271298&r2=271299
==============================================================================
--- team/group/v6-new/channels/chan_sip.c (original)
+++ team/group/v6-new/channels/chan_sip.c Thu Jun 17 16:22:49 2010
@@ -1256,6 +1256,7 @@
static int handle_request_do(struct sip_request *req, struct ast_sockaddr *addr);
static int sip_standard_port(enum sip_transport type, int port);
static int sip_prepare_socket(struct sip_pvt *p);
+static int get_address_family_filter(const struct ast_sockaddr *addr);
/*--- Transmitting responses and requests */
static int sipsock_read(int *id, int fd, short events, void *ignore);
@@ -2857,6 +2858,7 @@
if (!ast_sockaddr_parse(&proxy->ip, proxy->name, 0)) {
/* Ok, not an IP address, then let's check if it's a domain or host */
/* XXX Todo - if we have proxy port, don't do SRV */
+ proxy->ip.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
if (ast_get_ip_or_srv(&proxy->ip, proxy->name, sip_cfg.srvlookup ? "_sip._udp" : NULL) < 0) {
ast_log(LOG_WARNING, "Unable to locate host '%s'\n", proxy->name);
return FALSE;
@@ -11073,6 +11075,8 @@
if (!mwi->dnsmgr) {
char transport[MAXHOSTNAMELEN];
snprintf(transport, sizeof(transport), "_sip._%s", get_transport(mwi->transport));
+
+ mwi->us.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
ast_dnsmgr_lookup(mwi->hostname, &mwi->us, &mwi->dnsmgr, sip_cfg.srvlookup ? transport : NULL);
}
@@ -11788,6 +11792,7 @@
char transport[MAXHOSTNAMELEN];
peer = find_peer(r->hostname, NULL, TRUE, FINDPEERS, FALSE, 0);
snprintf(transport, sizeof(transport), "_sip._%s", get_transport(r->transport)); /* have to use static get_transport function */
+ r->us.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
ast_dnsmgr_lookup(peer ? peer->tohost : r->hostname, &r->us, &r->dnsmgr, sip_cfg.srvlookup ? transport : NULL);
if (peer) {
peer = unref_peer(peer, "removing peer ref for dnsmgr_lookup");
@@ -23484,6 +23489,17 @@
}
return tcptls_instance;
+}
+
+/*!
+ * \brief Helper for dns resolution to filter by address family.
+ *
+ * \note return 0 if addr is [::] else it returns addr's family.
+ */
+int get_address_family_filter(const struct ast_sockaddr *addr) {
+ if (ast_sockaddr_is_ipv6(addr) && ast_sockaddr_is_any(addr))
+ return 0;
+ return addr->ss.ss_family;
}
/*! \todo Get socket for dialog, prepare if needed, and return file handle */
@@ -25672,6 +25688,7 @@
snprintf(transport, sizeof(transport), "_sip._%s", get_transport(peer->socket.type));
+ peer->addr.ss.ss_family = get_address_family_filter(&bindaddr); /* Filter address family */
if (ast_dnsmgr_lookup(_srvlookup, &peer->addr, &peer->dnsmgr, sip_cfg.srvlookup && !peer->portinuri ? transport : NULL)) {
ast_log(LOG_ERROR, "srvlookup failed for host: %s, on peer %s, removing peer\n", _srvlookup, peer->name);
unref_peer(peer, "getting rid of a peer pointer");
Modified: team/group/v6-new/include/asterisk/acl.h
URL: http://svnview.digium.com/svn/asterisk/team/group/v6-new/include/asterisk/acl.h?view=diff&rev=271299&r1=271298&r2=271299
==============================================================================
--- team/group/v6-new/include/asterisk/acl.h (original)
+++ team/group/v6-new/include/asterisk/acl.h Thu Jun 17 16:22:49 2010
@@ -142,7 +142,10 @@
* an SRV lookup will be done for "_sip._udp.example.com". If service is NULL,
* then this function acts exactly like a call to ast_get_ip.
*
- * \param[out] addr The IP address found
+ * \param addr The IP address found. The address family is used as an input parameter to
+ * filter the returned adresses. if it is 0, both IPv4 and IPv6 addresses
+ * can be returned.
+ *
* \param value The hostname to look up
* \param service A specific service provided by the host. A NULL service results
* in an A-record lookup instead of an SRV lookup
Modified: team/group/v6-new/include/asterisk/dnsmgr.h
URL: http://svnview.digium.com/svn/asterisk/team/group/v6-new/include/asterisk/dnsmgr.h?view=diff&rev=271299&r1=271298&r2=271299
==============================================================================
--- team/group/v6-new/include/asterisk/dnsmgr.h (original)
+++ team/group/v6-new/include/asterisk/dnsmgr.h Thu Jun 17 16:22:49 2010
@@ -66,7 +66,8 @@
* \brief Allocate and initialize a DNS manager entry
*
* \param name the hostname
- * \param result where to store the IP address as the DNS manager refreshes it
+ * \param result where to store the IP address as the DNS manager refreshes it. The address family
+ * is used as an input parameter to filter the returned adresses. if it is 0, both IPv4 * and IPv6 addresses can be returned.
* \param dnsmgr Where to store the allocate DNS manager entry
* \param service
*
Modified: team/group/v6-new/main/acl.c
URL: http://svnview.digium.com/svn/asterisk/team/group/v6-new/main/acl.c?view=diff&rev=271299&r1=271298&r2=271299
==============================================================================
--- team/group/v6-new/main/acl.c (original)
+++ team/group/v6-new/main/acl.c Thu Jun 17 16:22:49 2010
@@ -392,7 +392,7 @@
}
}
- addrs_cnt = ast_sockaddr_resolve(&addrs, value, PARSE_PORT_FORBID, 0);
+ addrs_cnt = ast_sockaddr_resolve(&addrs, value, PARSE_PORT_FORBID, addr->ss.ss_family);
if (addrs_cnt > 0) {
if (addrs_cnt > 1)
ast_log(LOG_WARNING, "Multiple addresses. Using the first only\n");
Modified: team/group/v6-new/main/dnsmgr.c
URL: http://svnview.digium.com/svn/asterisk/team/group/v6-new/main/dnsmgr.c?view=diff&rev=271299&r1=271298&r2=271299
==============================================================================
--- team/group/v6-new/main/dnsmgr.c (original)
+++ team/group/v6-new/main/dnsmgr.c Thu Jun 17 16:22:49 2010
@@ -126,11 +126,6 @@
return -1;
if (*dnsmgr && !strcasecmp((*dnsmgr)->name, name))
- return 0;
-
- /* if it's actually an IP address and not a name,
- there's no need for a managed lookup */
- if (ast_sockaddr_parse(result, name, PARSE_PORT_FORBID))
return 0;
ast_verb(4, "doing dnsmgr_lookup for '%s'\n", name);
More information about the svn-commits
mailing list