+def in_same_network_ipv6(address1, address2, netmask):
+ """
+ Returns True if two IPv6 addresses are in the same network. Faults
+ if an address is invalid.
+ """
+ address1 = struct.unpack('>2Q', socket.inet_pton(socket.AF_INET6, address1))[0]
+ address2 = struct.unpack('>2Q', socket.inet_pton(socket.AF_INET6, address2))[0]
+ netmask = struct.unpack('>2Q', socket.inet_pton(socket.AF_INET6, netmask))[0]
+
+ return (address1 & netmask) == (address2 & netmask)
+
+def in_same_network(address1, address2, netmask):
+ return in_same_network_ipv4(address1, address2, netmask) or \
+ in_same_network_ipv6(address1, address2, netmask)
+