summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Halley <halley@dnspython.org>2007-06-13 16:00:14 +0000
committerBob Halley <halley@dnspython.org>2007-06-13 16:00:14 +0000
commitf26fb84cd3b158ffb48021a5be889fed2937d9a7 (patch)
treea655df4dc2c19bc1ba985ebad6e6c667899d0d73
parent0b3fa60e0575b1e39c8543d31d6fa2a4798fe89d (diff)
downloaddnspython-f26fb84cd3b158ffb48021a5be889fed2937d9a7.tar.gz
add basic multicast support
-rw-r--r--ChangeLog8
-rw-r--r--dns/inet.py18
-rw-r--r--dns/query.py4
3 files changed, 29 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 62e54fa..00aeb5d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-06-13 Bob Halley <halley@dnspython.org>
+
+ * dns/inet.py: Added is_multicast().
+
+ * dns/query.py (udp): If the queried address is a multicast address, then
+ don't check that the address of the response is the same as the address
+ queried.
+
2007-05-24 Bob Halley <halley@dnspython.org>
* dns/rdtypes/IN/NAPTR.py: NAPTR comparisons didn't compare the
diff --git a/dns/inet.py b/dns/inet.py
index 1470925..67bd614 100644
--- a/dns/inet.py
+++ b/dns/inet.py
@@ -88,3 +88,21 @@ def af_for_address(text):
return AF_INET6
except:
raise ValueError
+
+def is_multicast(text):
+ """Is the textual-form network address a multicast address?
+
+ @param text: the textual address
+ @raises ValueError: the address family cannot be determined from the input.
+ @rtype: bool
+ """
+ try:
+ first = ord(dns.ipv4.inet_aton(text)[0])
+ return (first >= 224 and first <= 239)
+ except:
+ try:
+ first = ord(dns.ipv6.inet_aton(text)[0])
+ return (first == 255)
+ except:
+ raise ValueError
+
diff --git a/dns/query.py b/dns/query.py
index f2ff9a1..785e423 100644
--- a/dns/query.py
+++ b/dns/query.py
@@ -117,7 +117,9 @@ def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0,
while 1:
_wait_for_readable(s, expiration)
(wire, from_address) = s.recvfrom(65535)
- if from_address == destination:
+ if from_address == destination or \
+ (dns.inet.is_multicast(where) and \
+ from_address[1:] == destination[1:]):
break
if not ignore_unexpected:
raise UnexpectedSource, \