• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2007 Google Inc.
2#  Licensed to PSF under a Contributor Agreement.
3
4"""A fast, lightweight IPv4/IPv6 manipulation library in Python.
5
6This library is used to create/poke/manipulate IPv4 and IPv6 addresses
7and networks.
8
9"""
10
11__version__ = '1.0'
12
13
14import functools
15
16IPV4LENGTH = 32
17IPV6LENGTH = 128
18
19class AddressValueError(ValueError):
20    """A Value Error related to the address."""
21
22
23class NetmaskValueError(ValueError):
24    """A Value Error related to the netmask."""
25
26
27def ip_address(address):
28    """Take an IP string/int and return an object of the correct type.
29
30    Args:
31        address: A string or integer, the IP address.  Either IPv4 or
32          IPv6 addresses may be supplied; integers less than 2**32 will
33          be considered to be IPv4 by default.
34
35    Returns:
36        An IPv4Address or IPv6Address object.
37
38    Raises:
39        ValueError: if the *address* passed isn't either a v4 or a v6
40          address
41
42    """
43    try:
44        return IPv4Address(address)
45    except (AddressValueError, NetmaskValueError):
46        pass
47
48    try:
49        return IPv6Address(address)
50    except (AddressValueError, NetmaskValueError):
51        pass
52
53    raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
54                     address)
55
56
57def ip_network(address, strict=True):
58    """Take an IP string/int and return an object of the correct type.
59
60    Args:
61        address: A string or integer, the IP network.  Either IPv4 or
62          IPv6 networks may be supplied; integers less than 2**32 will
63          be considered to be IPv4 by default.
64
65    Returns:
66        An IPv4Network or IPv6Network object.
67
68    Raises:
69        ValueError: if the string passed isn't either a v4 or a v6
70          address. Or if the network has host bits set.
71
72    """
73    try:
74        return IPv4Network(address, strict)
75    except (AddressValueError, NetmaskValueError):
76        pass
77
78    try:
79        return IPv6Network(address, strict)
80    except (AddressValueError, NetmaskValueError):
81        pass
82
83    raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
84                     address)
85
86
87def ip_interface(address):
88    """Take an IP string/int and return an object of the correct type.
89
90    Args:
91        address: A string or integer, the IP address.  Either IPv4 or
92          IPv6 addresses may be supplied; integers less than 2**32 will
93          be considered to be IPv4 by default.
94
95    Returns:
96        An IPv4Interface or IPv6Interface object.
97
98    Raises:
99        ValueError: if the string passed isn't either a v4 or a v6
100          address.
101
102    Notes:
103        The IPv?Interface classes describe an Address on a particular
104        Network, so they're basically a combination of both the Address
105        and Network classes.
106
107    """
108    try:
109        return IPv4Interface(address)
110    except (AddressValueError, NetmaskValueError):
111        pass
112
113    try:
114        return IPv6Interface(address)
115    except (AddressValueError, NetmaskValueError):
116        pass
117
118    raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
119                     address)
120
121
122def v4_int_to_packed(address):
123    """Represent an address as 4 packed bytes in network (big-endian) order.
124
125    Args:
126        address: An integer representation of an IPv4 IP address.
127
128    Returns:
129        The integer address packed as 4 bytes in network (big-endian) order.
130
131    Raises:
132        ValueError: If the integer is negative or too large to be an
133          IPv4 IP address.
134
135    """
136    try:
137        return address.to_bytes(4, 'big')
138    except OverflowError:
139        raise ValueError("Address negative or too large for IPv4")
140
141
142def v6_int_to_packed(address):
143    """Represent an address as 16 packed bytes in network (big-endian) order.
144
145    Args:
146        address: An integer representation of an IPv6 IP address.
147
148    Returns:
149        The integer address packed as 16 bytes in network (big-endian) order.
150
151    """
152    try:
153        return address.to_bytes(16, 'big')
154    except OverflowError:
155        raise ValueError("Address negative or too large for IPv6")
156
157
158def _split_optional_netmask(address):
159    """Helper to split the netmask and raise AddressValueError if needed"""
160    addr = str(address).split('/')
161    if len(addr) > 2:
162        raise AddressValueError("Only one '/' permitted in %r" % address)
163    return addr
164
165
166def _find_address_range(addresses):
167    """Find a sequence of sorted deduplicated IPv#Address.
168
169    Args:
170        addresses: a list of IPv#Address objects.
171
172    Yields:
173        A tuple containing the first and last IP addresses in the sequence.
174
175    """
176    it = iter(addresses)
177    first = last = next(it)
178    for ip in it:
179        if ip._ip != last._ip + 1:
180            yield first, last
181            first = ip
182        last = ip
183    yield first, last
184
185
186def _count_righthand_zero_bits(number, bits):
187    """Count the number of zero bits on the right hand side.
188
189    Args:
190        number: an integer.
191        bits: maximum number of bits to count.
192
193    Returns:
194        The number of zero bits on the right hand side of the number.
195
196    """
197    if number == 0:
198        return bits
199    return min(bits, (~number & (number-1)).bit_length())
200
201
202def summarize_address_range(first, last):
203    """Summarize a network range given the first and last IP addresses.
204
205    Example:
206        >>> list(summarize_address_range(IPv4Address('192.0.2.0'),
207        ...                              IPv4Address('192.0.2.130')))
208        ...                                #doctest: +NORMALIZE_WHITESPACE
209        [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'),
210         IPv4Network('192.0.2.130/32')]
211
212    Args:
213        first: the first IPv4Address or IPv6Address in the range.
214        last: the last IPv4Address or IPv6Address in the range.
215
216    Returns:
217        An iterator of the summarized IPv(4|6) network objects.
218
219    Raise:
220        TypeError:
221            If the first and last objects are not IP addresses.
222            If the first and last objects are not the same version.
223        ValueError:
224            If the last object is not greater than the first.
225            If the version of the first address is not 4 or 6.
226
227    """
228    if (not (isinstance(first, _BaseAddress) and
229             isinstance(last, _BaseAddress))):
230        raise TypeError('first and last must be IP addresses, not networks')
231    if first.version != last.version:
232        raise TypeError("%s and %s are not of the same version" % (
233                         first, last))
234    if first > last:
235        raise ValueError('last IP address must be greater than first')
236
237    if first.version == 4:
238        ip = IPv4Network
239    elif first.version == 6:
240        ip = IPv6Network
241    else:
242        raise ValueError('unknown IP version')
243
244    ip_bits = first._max_prefixlen
245    first_int = first._ip
246    last_int = last._ip
247    while first_int <= last_int:
248        nbits = min(_count_righthand_zero_bits(first_int, ip_bits),
249                    (last_int - first_int + 1).bit_length() - 1)
250        net = ip((first_int, ip_bits - nbits))
251        yield net
252        first_int += 1 << nbits
253        if first_int - 1 == ip._ALL_ONES:
254            break
255
256
257def _collapse_addresses_internal(addresses):
258    """Loops through the addresses, collapsing concurrent netblocks.
259
260    Example:
261
262        ip1 = IPv4Network('192.0.2.0/26')
263        ip2 = IPv4Network('192.0.2.64/26')
264        ip3 = IPv4Network('192.0.2.128/26')
265        ip4 = IPv4Network('192.0.2.192/26')
266
267        _collapse_addresses_internal([ip1, ip2, ip3, ip4]) ->
268          [IPv4Network('192.0.2.0/24')]
269
270        This shouldn't be called directly; it is called via
271          collapse_addresses([]).
272
273    Args:
274        addresses: A list of IPv4Network's or IPv6Network's
275
276    Returns:
277        A list of IPv4Network's or IPv6Network's depending on what we were
278        passed.
279
280    """
281    # First merge
282    to_merge = list(addresses)
283    subnets = {}
284    while to_merge:
285        net = to_merge.pop()
286        supernet = net.supernet()
287        existing = subnets.get(supernet)
288        if existing is None:
289            subnets[supernet] = net
290        elif existing != net:
291            # Merge consecutive subnets
292            del subnets[supernet]
293            to_merge.append(supernet)
294    # Then iterate over resulting networks, skipping subsumed subnets
295    last = None
296    for net in sorted(subnets.values()):
297        if last is not None:
298            # Since they are sorted, last.network_address <= net.network_address
299            # is a given.
300            if last.broadcast_address >= net.broadcast_address:
301                continue
302        yield net
303        last = net
304
305
306def collapse_addresses(addresses):
307    """Collapse a list of IP objects.
308
309    Example:
310        collapse_addresses([IPv4Network('192.0.2.0/25'),
311                            IPv4Network('192.0.2.128/25')]) ->
312                           [IPv4Network('192.0.2.0/24')]
313
314    Args:
315        addresses: An iterator of IPv4Network or IPv6Network objects.
316
317    Returns:
318        An iterator of the collapsed IPv(4|6)Network objects.
319
320    Raises:
321        TypeError: If passed a list of mixed version objects.
322
323    """
324    addrs = []
325    ips = []
326    nets = []
327
328    # split IP addresses and networks
329    for ip in addresses:
330        if isinstance(ip, _BaseAddress):
331            if ips and ips[-1]._version != ip._version:
332                raise TypeError("%s and %s are not of the same version" % (
333                                 ip, ips[-1]))
334            ips.append(ip)
335        elif ip._prefixlen == ip._max_prefixlen:
336            if ips and ips[-1]._version != ip._version:
337                raise TypeError("%s and %s are not of the same version" % (
338                                 ip, ips[-1]))
339            try:
340                ips.append(ip.ip)
341            except AttributeError:
342                ips.append(ip.network_address)
343        else:
344            if nets and nets[-1]._version != ip._version:
345                raise TypeError("%s and %s are not of the same version" % (
346                                 ip, nets[-1]))
347            nets.append(ip)
348
349    # sort and dedup
350    ips = sorted(set(ips))
351
352    # find consecutive address ranges in the sorted sequence and summarize them
353    if ips:
354        for first, last in _find_address_range(ips):
355            addrs.extend(summarize_address_range(first, last))
356
357    return _collapse_addresses_internal(addrs + nets)
358
359
360def get_mixed_type_key(obj):
361    """Return a key suitable for sorting between networks and addresses.
362
363    Address and Network objects are not sortable by default; they're
364    fundamentally different so the expression
365
366        IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
367
368    doesn't make any sense.  There are some times however, where you may wish
369    to have ipaddress sort these for you anyway. If you need to do this, you
370    can use this function as the key= argument to sorted().
371
372    Args:
373      obj: either a Network or Address object.
374    Returns:
375      appropriate key.
376
377    """
378    if isinstance(obj, _BaseNetwork):
379        return obj._get_networks_key()
380    elif isinstance(obj, _BaseAddress):
381        return obj._get_address_key()
382    return NotImplemented
383
384
385class _IPAddressBase:
386
387    """The mother class."""
388
389    __slots__ = ()
390
391    @property
392    def exploded(self):
393        """Return the longhand version of the IP address as a string."""
394        return self._explode_shorthand_ip_string()
395
396    @property
397    def compressed(self):
398        """Return the shorthand version of the IP address as a string."""
399        return str(self)
400
401    @property
402    def reverse_pointer(self):
403        """The name of the reverse DNS pointer for the IP address, e.g.:
404            >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
405            '1.0.0.127.in-addr.arpa'
406            >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
407            '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
408
409        """
410        return self._reverse_pointer()
411
412    @property
413    def version(self):
414        msg = '%200s has no version specified' % (type(self),)
415        raise NotImplementedError(msg)
416
417    def _check_int_address(self, address):
418        if address < 0:
419            msg = "%d (< 0) is not permitted as an IPv%d address"
420            raise AddressValueError(msg % (address, self._version))
421        if address > self._ALL_ONES:
422            msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
423            raise AddressValueError(msg % (address, self._max_prefixlen,
424                                           self._version))
425
426    def _check_packed_address(self, address, expected_len):
427        address_len = len(address)
428        if address_len != expected_len:
429            msg = "%r (len %d != %d) is not permitted as an IPv%d address"
430            raise AddressValueError(msg % (address, address_len,
431                                           expected_len, self._version))
432
433    @classmethod
434    def _ip_int_from_prefix(cls, prefixlen):
435        """Turn the prefix length into a bitwise netmask
436
437        Args:
438            prefixlen: An integer, the prefix length.
439
440        Returns:
441            An integer.
442
443        """
444        return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen)
445
446    @classmethod
447    def _prefix_from_ip_int(cls, ip_int):
448        """Return prefix length from the bitwise netmask.
449
450        Args:
451            ip_int: An integer, the netmask in expanded bitwise format
452
453        Returns:
454            An integer, the prefix length.
455
456        Raises:
457            ValueError: If the input intermingles zeroes & ones
458        """
459        trailing_zeroes = _count_righthand_zero_bits(ip_int,
460                                                     cls._max_prefixlen)
461        prefixlen = cls._max_prefixlen - trailing_zeroes
462        leading_ones = ip_int >> trailing_zeroes
463        all_ones = (1 << prefixlen) - 1
464        if leading_ones != all_ones:
465            byteslen = cls._max_prefixlen // 8
466            details = ip_int.to_bytes(byteslen, 'big')
467            msg = 'Netmask pattern %r mixes zeroes & ones'
468            raise ValueError(msg % details)
469        return prefixlen
470
471    @classmethod
472    def _report_invalid_netmask(cls, netmask_str):
473        msg = '%r is not a valid netmask' % netmask_str
474        raise NetmaskValueError(msg) from None
475
476    @classmethod
477    def _prefix_from_prefix_string(cls, prefixlen_str):
478        """Return prefix length from a numeric string
479
480        Args:
481            prefixlen_str: The string to be converted
482
483        Returns:
484            An integer, the prefix length.
485
486        Raises:
487            NetmaskValueError: If the input is not a valid netmask
488        """
489        # int allows a leading +/- as well as surrounding whitespace,
490        # so we ensure that isn't the case
491        if not (prefixlen_str.isascii() and prefixlen_str.isdigit()):
492            cls._report_invalid_netmask(prefixlen_str)
493        try:
494            prefixlen = int(prefixlen_str)
495        except ValueError:
496            cls._report_invalid_netmask(prefixlen_str)
497        if not (0 <= prefixlen <= cls._max_prefixlen):
498            cls._report_invalid_netmask(prefixlen_str)
499        return prefixlen
500
501    @classmethod
502    def _prefix_from_ip_string(cls, ip_str):
503        """Turn a netmask/hostmask string into a prefix length
504
505        Args:
506            ip_str: The netmask/hostmask to be converted
507
508        Returns:
509            An integer, the prefix length.
510
511        Raises:
512            NetmaskValueError: If the input is not a valid netmask/hostmask
513        """
514        # Parse the netmask/hostmask like an IP address.
515        try:
516            ip_int = cls._ip_int_from_string(ip_str)
517        except AddressValueError:
518            cls._report_invalid_netmask(ip_str)
519
520        # Try matching a netmask (this would be /1*0*/ as a bitwise regexp).
521        # Note that the two ambiguous cases (all-ones and all-zeroes) are
522        # treated as netmasks.
523        try:
524            return cls._prefix_from_ip_int(ip_int)
525        except ValueError:
526            pass
527
528        # Invert the bits, and try matching a /0+1+/ hostmask instead.
529        ip_int ^= cls._ALL_ONES
530        try:
531            return cls._prefix_from_ip_int(ip_int)
532        except ValueError:
533            cls._report_invalid_netmask(ip_str)
534
535    @classmethod
536    def _split_addr_prefix(cls, address):
537        """Helper function to parse address of Network/Interface.
538
539        Arg:
540            address: Argument of Network/Interface.
541
542        Returns:
543            (addr, prefix) tuple.
544        """
545        # a packed address or integer
546        if isinstance(address, (bytes, int)):
547            return address, cls._max_prefixlen
548
549        if not isinstance(address, tuple):
550            # Assume input argument to be string or any object representation
551            # which converts into a formatted IP prefix string.
552            address = _split_optional_netmask(address)
553
554        # Constructing from a tuple (addr, [mask])
555        if len(address) > 1:
556            return address
557        return address[0], cls._max_prefixlen
558
559    def __reduce__(self):
560        return self.__class__, (str(self),)
561
562
563_address_fmt_re = None
564
565@functools.total_ordering
566class _BaseAddress(_IPAddressBase):
567
568    """A generic IP object.
569
570    This IP class contains the version independent methods which are
571    used by single IP addresses.
572    """
573
574    __slots__ = ()
575
576    def __int__(self):
577        return self._ip
578
579    def __eq__(self, other):
580        try:
581            return (self._ip == other._ip
582                    and self._version == other._version)
583        except AttributeError:
584            return NotImplemented
585
586    def __lt__(self, other):
587        if not isinstance(other, _BaseAddress):
588            return NotImplemented
589        if self._version != other._version:
590            raise TypeError('%s and %s are not of the same version' % (
591                             self, other))
592        if self._ip != other._ip:
593            return self._ip < other._ip
594        return False
595
596    # Shorthand for Integer addition and subtraction. This is not
597    # meant to ever support addition/subtraction of addresses.
598    def __add__(self, other):
599        if not isinstance(other, int):
600            return NotImplemented
601        return self.__class__(int(self) + other)
602
603    def __sub__(self, other):
604        if not isinstance(other, int):
605            return NotImplemented
606        return self.__class__(int(self) - other)
607
608    def __repr__(self):
609        return '%s(%r)' % (self.__class__.__name__, str(self))
610
611    def __str__(self):
612        return str(self._string_from_ip_int(self._ip))
613
614    def __hash__(self):
615        return hash(hex(int(self._ip)))
616
617    def _get_address_key(self):
618        return (self._version, self)
619
620    def __reduce__(self):
621        return self.__class__, (self._ip,)
622
623    def __format__(self, fmt):
624        """Returns an IP address as a formatted string.
625
626        Supported presentation types are:
627        's': returns the IP address as a string (default)
628        'b': converts to binary and returns a zero-padded string
629        'X' or 'x': converts to upper- or lower-case hex and returns a zero-padded string
630        'n': the same as 'b' for IPv4 and 'x' for IPv6
631
632        For binary and hex presentation types, the alternate form specifier
633        '#' and the grouping option '_' are supported.
634        """
635
636        # Support string formatting
637        if not fmt or fmt[-1] == 's':
638            return format(str(self), fmt)
639
640        # From here on down, support for 'bnXx'
641        global _address_fmt_re
642        if _address_fmt_re is None:
643            import re
644            _address_fmt_re = re.compile('(#?)(_?)([xbnX])')
645
646        m = _address_fmt_re.fullmatch(fmt)
647        if not m:
648            return super().__format__(fmt)
649
650        alternate, grouping, fmt_base = m.groups()
651
652        # Set some defaults
653        if fmt_base == 'n':
654            if self._version == 4:
655                fmt_base = 'b'  # Binary is default for ipv4
656            else:
657                fmt_base = 'x'  # Hex is default for ipv6
658
659        if fmt_base == 'b':
660            padlen = self._max_prefixlen
661        else:
662            padlen = self._max_prefixlen // 4
663
664        if grouping:
665            padlen += padlen // 4 - 1
666
667        if alternate:
668            padlen += 2  # 0b or 0x
669
670        return format(int(self), f'{alternate}0{padlen}{grouping}{fmt_base}')
671
672
673@functools.total_ordering
674class _BaseNetwork(_IPAddressBase):
675    """A generic IP network object.
676
677    This IP class contains the version independent methods which are
678    used by networks.
679    """
680
681    def __repr__(self):
682        return '%s(%r)' % (self.__class__.__name__, str(self))
683
684    def __str__(self):
685        return '%s/%d' % (self.network_address, self.prefixlen)
686
687    def hosts(self):
688        """Generate Iterator over usable hosts in a network.
689
690        This is like __iter__ except it doesn't return the network
691        or broadcast addresses.
692
693        """
694        network = int(self.network_address)
695        broadcast = int(self.broadcast_address)
696        for x in range(network + 1, broadcast):
697            yield self._address_class(x)
698
699    def __iter__(self):
700        network = int(self.network_address)
701        broadcast = int(self.broadcast_address)
702        for x in range(network, broadcast + 1):
703            yield self._address_class(x)
704
705    def __getitem__(self, n):
706        network = int(self.network_address)
707        broadcast = int(self.broadcast_address)
708        if n >= 0:
709            if network + n > broadcast:
710                raise IndexError('address out of range')
711            return self._address_class(network + n)
712        else:
713            n += 1
714            if broadcast + n < network:
715                raise IndexError('address out of range')
716            return self._address_class(broadcast + n)
717
718    def __lt__(self, other):
719        if not isinstance(other, _BaseNetwork):
720            return NotImplemented
721        if self._version != other._version:
722            raise TypeError('%s and %s are not of the same version' % (
723                             self, other))
724        if self.network_address != other.network_address:
725            return self.network_address < other.network_address
726        if self.netmask != other.netmask:
727            return self.netmask < other.netmask
728        return False
729
730    def __eq__(self, other):
731        try:
732            return (self._version == other._version and
733                    self.network_address == other.network_address and
734                    int(self.netmask) == int(other.netmask))
735        except AttributeError:
736            return NotImplemented
737
738    def __hash__(self):
739        return hash(int(self.network_address) ^ int(self.netmask))
740
741    def __contains__(self, other):
742        # always false if one is v4 and the other is v6.
743        if self._version != other._version:
744            return False
745        # dealing with another network.
746        if isinstance(other, _BaseNetwork):
747            return False
748        # dealing with another address
749        else:
750            # address
751            return other._ip & self.netmask._ip == self.network_address._ip
752
753    def overlaps(self, other):
754        """Tell if self is partly contained in other."""
755        return self.network_address in other or (
756            self.broadcast_address in other or (
757                other.network_address in self or (
758                    other.broadcast_address in self)))
759
760    @functools.cached_property
761    def broadcast_address(self):
762        return self._address_class(int(self.network_address) |
763                                   int(self.hostmask))
764
765    @functools.cached_property
766    def hostmask(self):
767        return self._address_class(int(self.netmask) ^ self._ALL_ONES)
768
769    @property
770    def with_prefixlen(self):
771        return '%s/%d' % (self.network_address, self._prefixlen)
772
773    @property
774    def with_netmask(self):
775        return '%s/%s' % (self.network_address, self.netmask)
776
777    @property
778    def with_hostmask(self):
779        return '%s/%s' % (self.network_address, self.hostmask)
780
781    @property
782    def num_addresses(self):
783        """Number of hosts in the current subnet."""
784        return int(self.broadcast_address) - int(self.network_address) + 1
785
786    @property
787    def _address_class(self):
788        # Returning bare address objects (rather than interfaces) allows for
789        # more consistent behaviour across the network address, broadcast
790        # address and individual host addresses.
791        msg = '%200s has no associated address class' % (type(self),)
792        raise NotImplementedError(msg)
793
794    @property
795    def prefixlen(self):
796        return self._prefixlen
797
798    def address_exclude(self, other):
799        """Remove an address from a larger block.
800
801        For example:
802
803            addr1 = ip_network('192.0.2.0/28')
804            addr2 = ip_network('192.0.2.1/32')
805            list(addr1.address_exclude(addr2)) =
806                [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
807                 IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
808
809        or IPv6:
810
811            addr1 = ip_network('2001:db8::1/32')
812            addr2 = ip_network('2001:db8::1/128')
813            list(addr1.address_exclude(addr2)) =
814                [ip_network('2001:db8::1/128'),
815                 ip_network('2001:db8::2/127'),
816                 ip_network('2001:db8::4/126'),
817                 ip_network('2001:db8::8/125'),
818                 ...
819                 ip_network('2001:db8:8000::/33')]
820
821        Args:
822            other: An IPv4Network or IPv6Network object of the same type.
823
824        Returns:
825            An iterator of the IPv(4|6)Network objects which is self
826            minus other.
827
828        Raises:
829            TypeError: If self and other are of differing address
830              versions, or if other is not a network object.
831            ValueError: If other is not completely contained by self.
832
833        """
834        if not self._version == other._version:
835            raise TypeError("%s and %s are not of the same version" % (
836                             self, other))
837
838        if not isinstance(other, _BaseNetwork):
839            raise TypeError("%s is not a network object" % other)
840
841        if not other.subnet_of(self):
842            raise ValueError('%s not contained in %s' % (other, self))
843        if other == self:
844            return
845
846        # Make sure we're comparing the network of other.
847        other = other.__class__('%s/%s' % (other.network_address,
848                                           other.prefixlen))
849
850        s1, s2 = self.subnets()
851        while s1 != other and s2 != other:
852            if other.subnet_of(s1):
853                yield s2
854                s1, s2 = s1.subnets()
855            elif other.subnet_of(s2):
856                yield s1
857                s1, s2 = s2.subnets()
858            else:
859                # If we got here, there's a bug somewhere.
860                raise AssertionError('Error performing exclusion: '
861                                     's1: %s s2: %s other: %s' %
862                                     (s1, s2, other))
863        if s1 == other:
864            yield s2
865        elif s2 == other:
866            yield s1
867        else:
868            # If we got here, there's a bug somewhere.
869            raise AssertionError('Error performing exclusion: '
870                                 's1: %s s2: %s other: %s' %
871                                 (s1, s2, other))
872
873    def compare_networks(self, other):
874        """Compare two IP objects.
875
876        This is only concerned about the comparison of the integer
877        representation of the network addresses.  This means that the
878        host bits aren't considered at all in this method.  If you want
879        to compare host bits, you can easily enough do a
880        'HostA._ip < HostB._ip'
881
882        Args:
883            other: An IP object.
884
885        Returns:
886            If the IP versions of self and other are the same, returns:
887
888            -1 if self < other:
889              eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25')
890              IPv6Network('2001:db8::1000/124') <
891                  IPv6Network('2001:db8::2000/124')
892            0 if self == other
893              eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24')
894              IPv6Network('2001:db8::1000/124') ==
895                  IPv6Network('2001:db8::1000/124')
896            1 if self > other
897              eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25')
898                  IPv6Network('2001:db8::2000/124') >
899                      IPv6Network('2001:db8::1000/124')
900
901          Raises:
902              TypeError if the IP versions are different.
903
904        """
905        # does this need to raise a ValueError?
906        if self._version != other._version:
907            raise TypeError('%s and %s are not of the same type' % (
908                             self, other))
909        # self._version == other._version below here:
910        if self.network_address < other.network_address:
911            return -1
912        if self.network_address > other.network_address:
913            return 1
914        # self.network_address == other.network_address below here:
915        if self.netmask < other.netmask:
916            return -1
917        if self.netmask > other.netmask:
918            return 1
919        return 0
920
921    def _get_networks_key(self):
922        """Network-only key function.
923
924        Returns an object that identifies this address' network and
925        netmask. This function is a suitable "key" argument for sorted()
926        and list.sort().
927
928        """
929        return (self._version, self.network_address, self.netmask)
930
931    def subnets(self, prefixlen_diff=1, new_prefix=None):
932        """The subnets which join to make the current subnet.
933
934        In the case that self contains only one IP
935        (self._prefixlen == 32 for IPv4 or self._prefixlen == 128
936        for IPv6), yield an iterator with just ourself.
937
938        Args:
939            prefixlen_diff: An integer, the amount the prefix length
940              should be increased by. This should not be set if
941              new_prefix is also set.
942            new_prefix: The desired new prefix length. This must be a
943              larger number (smaller prefix) than the existing prefix.
944              This should not be set if prefixlen_diff is also set.
945
946        Returns:
947            An iterator of IPv(4|6) objects.
948
949        Raises:
950            ValueError: The prefixlen_diff is too small or too large.
951                OR
952            prefixlen_diff and new_prefix are both set or new_prefix
953              is a smaller number than the current prefix (smaller
954              number means a larger network)
955
956        """
957        if self._prefixlen == self._max_prefixlen:
958            yield self
959            return
960
961        if new_prefix is not None:
962            if new_prefix < self._prefixlen:
963                raise ValueError('new prefix must be longer')
964            if prefixlen_diff != 1:
965                raise ValueError('cannot set prefixlen_diff and new_prefix')
966            prefixlen_diff = new_prefix - self._prefixlen
967
968        if prefixlen_diff < 0:
969            raise ValueError('prefix length diff must be > 0')
970        new_prefixlen = self._prefixlen + prefixlen_diff
971
972        if new_prefixlen > self._max_prefixlen:
973            raise ValueError(
974                'prefix length diff %d is invalid for netblock %s' % (
975                    new_prefixlen, self))
976
977        start = int(self.network_address)
978        end = int(self.broadcast_address) + 1
979        step = (int(self.hostmask) + 1) >> prefixlen_diff
980        for new_addr in range(start, end, step):
981            current = self.__class__((new_addr, new_prefixlen))
982            yield current
983
984    def supernet(self, prefixlen_diff=1, new_prefix=None):
985        """The supernet containing the current network.
986
987        Args:
988            prefixlen_diff: An integer, the amount the prefix length of
989              the network should be decreased by.  For example, given a
990              /24 network and a prefixlen_diff of 3, a supernet with a
991              /21 netmask is returned.
992
993        Returns:
994            An IPv4 network object.
995
996        Raises:
997            ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have
998              a negative prefix length.
999                OR
1000            If prefixlen_diff and new_prefix are both set or new_prefix is a
1001              larger number than the current prefix (larger number means a
1002              smaller network)
1003
1004        """
1005        if self._prefixlen == 0:
1006            return self
1007
1008        if new_prefix is not None:
1009            if new_prefix > self._prefixlen:
1010                raise ValueError('new prefix must be shorter')
1011            if prefixlen_diff != 1:
1012                raise ValueError('cannot set prefixlen_diff and new_prefix')
1013            prefixlen_diff = self._prefixlen - new_prefix
1014
1015        new_prefixlen = self.prefixlen - prefixlen_diff
1016        if new_prefixlen < 0:
1017            raise ValueError(
1018                'current prefixlen is %d, cannot have a prefixlen_diff of %d' %
1019                (self.prefixlen, prefixlen_diff))
1020        return self.__class__((
1021            int(self.network_address) & (int(self.netmask) << prefixlen_diff),
1022            new_prefixlen
1023            ))
1024
1025    @property
1026    def is_multicast(self):
1027        """Test if the address is reserved for multicast use.
1028
1029        Returns:
1030            A boolean, True if the address is a multicast address.
1031            See RFC 2373 2.7 for details.
1032
1033        """
1034        return (self.network_address.is_multicast and
1035                self.broadcast_address.is_multicast)
1036
1037    @staticmethod
1038    def _is_subnet_of(a, b):
1039        try:
1040            # Always false if one is v4 and the other is v6.
1041            if a._version != b._version:
1042                raise TypeError(f"{a} and {b} are not of the same version")
1043            return (b.network_address <= a.network_address and
1044                    b.broadcast_address >= a.broadcast_address)
1045        except AttributeError:
1046            raise TypeError(f"Unable to test subnet containment "
1047                            f"between {a} and {b}")
1048
1049    def subnet_of(self, other):
1050        """Return True if this network is a subnet of other."""
1051        return self._is_subnet_of(self, other)
1052
1053    def supernet_of(self, other):
1054        """Return True if this network is a supernet of other."""
1055        return self._is_subnet_of(other, self)
1056
1057    @property
1058    def is_reserved(self):
1059        """Test if the address is otherwise IETF reserved.
1060
1061        Returns:
1062            A boolean, True if the address is within one of the
1063            reserved IPv6 Network ranges.
1064
1065        """
1066        return (self.network_address.is_reserved and
1067                self.broadcast_address.is_reserved)
1068
1069    @property
1070    def is_link_local(self):
1071        """Test if the address is reserved for link-local.
1072
1073        Returns:
1074            A boolean, True if the address is reserved per RFC 4291.
1075
1076        """
1077        return (self.network_address.is_link_local and
1078                self.broadcast_address.is_link_local)
1079
1080    @property
1081    def is_private(self):
1082        """Test if this address is allocated for private networks.
1083
1084        Returns:
1085            A boolean, True if the address is reserved per
1086            iana-ipv4-special-registry or iana-ipv6-special-registry.
1087
1088        """
1089        return (self.network_address.is_private and
1090                self.broadcast_address.is_private)
1091
1092    @property
1093    def is_global(self):
1094        """Test if this address is allocated for public networks.
1095
1096        Returns:
1097            A boolean, True if the address is not reserved per
1098            iana-ipv4-special-registry or iana-ipv6-special-registry.
1099
1100        """
1101        return not self.is_private
1102
1103    @property
1104    def is_unspecified(self):
1105        """Test if the address is unspecified.
1106
1107        Returns:
1108            A boolean, True if this is the unspecified address as defined in
1109            RFC 2373 2.5.2.
1110
1111        """
1112        return (self.network_address.is_unspecified and
1113                self.broadcast_address.is_unspecified)
1114
1115    @property
1116    def is_loopback(self):
1117        """Test if the address is a loopback address.
1118
1119        Returns:
1120            A boolean, True if the address is a loopback address as defined in
1121            RFC 2373 2.5.3.
1122
1123        """
1124        return (self.network_address.is_loopback and
1125                self.broadcast_address.is_loopback)
1126
1127class _BaseV4:
1128
1129    """Base IPv4 object.
1130
1131    The following methods are used by IPv4 objects in both single IP
1132    addresses and networks.
1133
1134    """
1135
1136    __slots__ = ()
1137    _version = 4
1138    # Equivalent to 255.255.255.255 or 32 bits of 1's.
1139    _ALL_ONES = (2**IPV4LENGTH) - 1
1140
1141    _max_prefixlen = IPV4LENGTH
1142    # There are only a handful of valid v4 netmasks, so we cache them all
1143    # when constructed (see _make_netmask()).
1144    _netmask_cache = {}
1145
1146    def _explode_shorthand_ip_string(self):
1147        return str(self)
1148
1149    @classmethod
1150    def _make_netmask(cls, arg):
1151        """Make a (netmask, prefix_len) tuple from the given argument.
1152
1153        Argument can be:
1154        - an integer (the prefix length)
1155        - a string representing the prefix length (e.g. "24")
1156        - a string representing the prefix netmask (e.g. "255.255.255.0")
1157        """
1158        if arg not in cls._netmask_cache:
1159            if isinstance(arg, int):
1160                prefixlen = arg
1161                if not (0 <= prefixlen <= cls._max_prefixlen):
1162                    cls._report_invalid_netmask(prefixlen)
1163            else:
1164                try:
1165                    # Check for a netmask in prefix length form
1166                    prefixlen = cls._prefix_from_prefix_string(arg)
1167                except NetmaskValueError:
1168                    # Check for a netmask or hostmask in dotted-quad form.
1169                    # This may raise NetmaskValueError.
1170                    prefixlen = cls._prefix_from_ip_string(arg)
1171            netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen))
1172            cls._netmask_cache[arg] = netmask, prefixlen
1173        return cls._netmask_cache[arg]
1174
1175    @classmethod
1176    def _ip_int_from_string(cls, ip_str):
1177        """Turn the given IP string into an integer for comparison.
1178
1179        Args:
1180            ip_str: A string, the IP ip_str.
1181
1182        Returns:
1183            The IP ip_str as an integer.
1184
1185        Raises:
1186            AddressValueError: if ip_str isn't a valid IPv4 Address.
1187
1188        """
1189        if not ip_str:
1190            raise AddressValueError('Address cannot be empty')
1191
1192        octets = ip_str.split('.')
1193        if len(octets) != 4:
1194            raise AddressValueError("Expected 4 octets in %r" % ip_str)
1195
1196        try:
1197            return int.from_bytes(map(cls._parse_octet, octets), 'big')
1198        except ValueError as exc:
1199            raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1200
1201    @classmethod
1202    def _parse_octet(cls, octet_str):
1203        """Convert a decimal octet into an integer.
1204
1205        Args:
1206            octet_str: A string, the number to parse.
1207
1208        Returns:
1209            The octet as an integer.
1210
1211        Raises:
1212            ValueError: if the octet isn't strictly a decimal from [0..255].
1213
1214        """
1215        if not octet_str:
1216            raise ValueError("Empty octet not permitted")
1217        # Whitelist the characters, since int() allows a lot of bizarre stuff.
1218        if not (octet_str.isascii() and octet_str.isdigit()):
1219            msg = "Only decimal digits permitted in %r"
1220            raise ValueError(msg % octet_str)
1221        # We do the length check second, since the invalid character error
1222        # is likely to be more informative for the user
1223        if len(octet_str) > 3:
1224            msg = "At most 3 characters permitted in %r"
1225            raise ValueError(msg % octet_str)
1226        # Convert to integer (we know digits are legal)
1227        octet_int = int(octet_str, 10)
1228        if octet_int > 255:
1229            raise ValueError("Octet %d (> 255) not permitted" % octet_int)
1230        return octet_int
1231
1232    @classmethod
1233    def _string_from_ip_int(cls, ip_int):
1234        """Turns a 32-bit integer into dotted decimal notation.
1235
1236        Args:
1237            ip_int: An integer, the IP address.
1238
1239        Returns:
1240            The IP address as a string in dotted decimal notation.
1241
1242        """
1243        return '.'.join(map(str, ip_int.to_bytes(4, 'big')))
1244
1245    def _reverse_pointer(self):
1246        """Return the reverse DNS pointer name for the IPv4 address.
1247
1248        This implements the method described in RFC1035 3.5.
1249
1250        """
1251        reverse_octets = str(self).split('.')[::-1]
1252        return '.'.join(reverse_octets) + '.in-addr.arpa'
1253
1254    @property
1255    def max_prefixlen(self):
1256        return self._max_prefixlen
1257
1258    @property
1259    def version(self):
1260        return self._version
1261
1262
1263class IPv4Address(_BaseV4, _BaseAddress):
1264
1265    """Represent and manipulate single IPv4 Addresses."""
1266
1267    __slots__ = ('_ip', '__weakref__')
1268
1269    def __init__(self, address):
1270
1271        """
1272        Args:
1273            address: A string or integer representing the IP
1274
1275              Additionally, an integer can be passed, so
1276              IPv4Address('192.0.2.1') == IPv4Address(3221225985).
1277              or, more generally
1278              IPv4Address(int(IPv4Address('192.0.2.1'))) ==
1279                IPv4Address('192.0.2.1')
1280
1281        Raises:
1282            AddressValueError: If ipaddress isn't a valid IPv4 address.
1283
1284        """
1285        # Efficient constructor from integer.
1286        if isinstance(address, int):
1287            self._check_int_address(address)
1288            self._ip = address
1289            return
1290
1291        # Constructing from a packed address
1292        if isinstance(address, bytes):
1293            self._check_packed_address(address, 4)
1294            self._ip = int.from_bytes(address, 'big')
1295            return
1296
1297        # Assume input argument to be string or any object representation
1298        # which converts into a formatted IP string.
1299        addr_str = str(address)
1300        if '/' in addr_str:
1301            raise AddressValueError("Unexpected '/' in %r" % address)
1302        self._ip = self._ip_int_from_string(addr_str)
1303
1304    @property
1305    def packed(self):
1306        """The binary representation of this address."""
1307        return v4_int_to_packed(self._ip)
1308
1309    @property
1310    def is_reserved(self):
1311        """Test if the address is otherwise IETF reserved.
1312
1313         Returns:
1314             A boolean, True if the address is within the
1315             reserved IPv4 Network range.
1316
1317        """
1318        return self in self._constants._reserved_network
1319
1320    @property
1321    @functools.lru_cache()
1322    def is_private(self):
1323        """Test if this address is allocated for private networks.
1324
1325        Returns:
1326            A boolean, True if the address is reserved per
1327            iana-ipv4-special-registry.
1328
1329        """
1330        return any(self in net for net in self._constants._private_networks)
1331
1332    @property
1333    @functools.lru_cache()
1334    def is_global(self):
1335        return self not in self._constants._public_network and not self.is_private
1336
1337    @property
1338    def is_multicast(self):
1339        """Test if the address is reserved for multicast use.
1340
1341        Returns:
1342            A boolean, True if the address is multicast.
1343            See RFC 3171 for details.
1344
1345        """
1346        return self in self._constants._multicast_network
1347
1348    @property
1349    def is_unspecified(self):
1350        """Test if the address is unspecified.
1351
1352        Returns:
1353            A boolean, True if this is the unspecified address as defined in
1354            RFC 5735 3.
1355
1356        """
1357        return self == self._constants._unspecified_address
1358
1359    @property
1360    def is_loopback(self):
1361        """Test if the address is a loopback address.
1362
1363        Returns:
1364            A boolean, True if the address is a loopback per RFC 3330.
1365
1366        """
1367        return self in self._constants._loopback_network
1368
1369    @property
1370    def is_link_local(self):
1371        """Test if the address is reserved for link-local.
1372
1373        Returns:
1374            A boolean, True if the address is link-local per RFC 3927.
1375
1376        """
1377        return self in self._constants._linklocal_network
1378
1379
1380class IPv4Interface(IPv4Address):
1381
1382    def __init__(self, address):
1383        addr, mask = self._split_addr_prefix(address)
1384
1385        IPv4Address.__init__(self, addr)
1386        self.network = IPv4Network((addr, mask), strict=False)
1387        self.netmask = self.network.netmask
1388        self._prefixlen = self.network._prefixlen
1389
1390    @functools.cached_property
1391    def hostmask(self):
1392        return self.network.hostmask
1393
1394    def __str__(self):
1395        return '%s/%d' % (self._string_from_ip_int(self._ip),
1396                          self._prefixlen)
1397
1398    def __eq__(self, other):
1399        address_equal = IPv4Address.__eq__(self, other)
1400        if address_equal is NotImplemented or not address_equal:
1401            return address_equal
1402        try:
1403            return self.network == other.network
1404        except AttributeError:
1405            # An interface with an associated network is NOT the
1406            # same as an unassociated address. That's why the hash
1407            # takes the extra info into account.
1408            return False
1409
1410    def __lt__(self, other):
1411        address_less = IPv4Address.__lt__(self, other)
1412        if address_less is NotImplemented:
1413            return NotImplemented
1414        try:
1415            return (self.network < other.network or
1416                    self.network == other.network and address_less)
1417        except AttributeError:
1418            # We *do* allow addresses and interfaces to be sorted. The
1419            # unassociated address is considered less than all interfaces.
1420            return False
1421
1422    def __hash__(self):
1423        return hash((self._ip, self._prefixlen, int(self.network.network_address)))
1424
1425    __reduce__ = _IPAddressBase.__reduce__
1426
1427    @property
1428    def ip(self):
1429        return IPv4Address(self._ip)
1430
1431    @property
1432    def with_prefixlen(self):
1433        return '%s/%s' % (self._string_from_ip_int(self._ip),
1434                          self._prefixlen)
1435
1436    @property
1437    def with_netmask(self):
1438        return '%s/%s' % (self._string_from_ip_int(self._ip),
1439                          self.netmask)
1440
1441    @property
1442    def with_hostmask(self):
1443        return '%s/%s' % (self._string_from_ip_int(self._ip),
1444                          self.hostmask)
1445
1446
1447class IPv4Network(_BaseV4, _BaseNetwork):
1448
1449    """This class represents and manipulates 32-bit IPv4 network + addresses..
1450
1451    Attributes: [examples for IPv4Network('192.0.2.0/27')]
1452        .network_address: IPv4Address('192.0.2.0')
1453        .hostmask: IPv4Address('0.0.0.31')
1454        .broadcast_address: IPv4Address('192.0.2.32')
1455        .netmask: IPv4Address('255.255.255.224')
1456        .prefixlen: 27
1457
1458    """
1459    # Class to use when creating address objects
1460    _address_class = IPv4Address
1461
1462    def __init__(self, address, strict=True):
1463        """Instantiate a new IPv4 network object.
1464
1465        Args:
1466            address: A string or integer representing the IP [& network].
1467              '192.0.2.0/24'
1468              '192.0.2.0/255.255.255.0'
1469              '192.0.2.0/0.0.0.255'
1470              are all functionally the same in IPv4. Similarly,
1471              '192.0.2.1'
1472              '192.0.2.1/255.255.255.255'
1473              '192.0.2.1/32'
1474              are also functionally equivalent. That is to say, failing to
1475              provide a subnetmask will create an object with a mask of /32.
1476
1477              If the mask (portion after the / in the argument) is given in
1478              dotted quad form, it is treated as a netmask if it starts with a
1479              non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it
1480              starts with a zero field (e.g. 0.255.255.255 == /8), with the
1481              single exception of an all-zero mask which is treated as a
1482              netmask == /0. If no mask is given, a default of /32 is used.
1483
1484              Additionally, an integer can be passed, so
1485              IPv4Network('192.0.2.1') == IPv4Network(3221225985)
1486              or, more generally
1487              IPv4Interface(int(IPv4Interface('192.0.2.1'))) ==
1488                IPv4Interface('192.0.2.1')
1489
1490        Raises:
1491            AddressValueError: If ipaddress isn't a valid IPv4 address.
1492            NetmaskValueError: If the netmask isn't valid for
1493              an IPv4 address.
1494            ValueError: If strict is True and a network address is not
1495              supplied.
1496        """
1497        addr, mask = self._split_addr_prefix(address)
1498
1499        self.network_address = IPv4Address(addr)
1500        self.netmask, self._prefixlen = self._make_netmask(mask)
1501        packed = int(self.network_address)
1502        if packed & int(self.netmask) != packed:
1503            if strict:
1504                raise ValueError('%s has host bits set' % self)
1505            else:
1506                self.network_address = IPv4Address(packed &
1507                                                   int(self.netmask))
1508
1509        if self._prefixlen == (self._max_prefixlen - 1):
1510            self.hosts = self.__iter__
1511        elif self._prefixlen == (self._max_prefixlen):
1512            self.hosts = lambda: [IPv4Address(addr)]
1513
1514    @property
1515    @functools.lru_cache()
1516    def is_global(self):
1517        """Test if this address is allocated for public networks.
1518
1519        Returns:
1520            A boolean, True if the address is not reserved per
1521            iana-ipv4-special-registry.
1522
1523        """
1524        return (not (self.network_address in IPv4Network('100.64.0.0/10') and
1525                    self.broadcast_address in IPv4Network('100.64.0.0/10')) and
1526                not self.is_private)
1527
1528
1529class _IPv4Constants:
1530    _linklocal_network = IPv4Network('169.254.0.0/16')
1531
1532    _loopback_network = IPv4Network('127.0.0.0/8')
1533
1534    _multicast_network = IPv4Network('224.0.0.0/4')
1535
1536    _public_network = IPv4Network('100.64.0.0/10')
1537
1538    _private_networks = [
1539        IPv4Network('0.0.0.0/8'),
1540        IPv4Network('10.0.0.0/8'),
1541        IPv4Network('127.0.0.0/8'),
1542        IPv4Network('169.254.0.0/16'),
1543        IPv4Network('172.16.0.0/12'),
1544        IPv4Network('192.0.0.0/29'),
1545        IPv4Network('192.0.0.170/31'),
1546        IPv4Network('192.0.2.0/24'),
1547        IPv4Network('192.168.0.0/16'),
1548        IPv4Network('198.18.0.0/15'),
1549        IPv4Network('198.51.100.0/24'),
1550        IPv4Network('203.0.113.0/24'),
1551        IPv4Network('240.0.0.0/4'),
1552        IPv4Network('255.255.255.255/32'),
1553        ]
1554
1555    _reserved_network = IPv4Network('240.0.0.0/4')
1556
1557    _unspecified_address = IPv4Address('0.0.0.0')
1558
1559
1560IPv4Address._constants = _IPv4Constants
1561
1562
1563class _BaseV6:
1564
1565    """Base IPv6 object.
1566
1567    The following methods are used by IPv6 objects in both single IP
1568    addresses and networks.
1569
1570    """
1571
1572    __slots__ = ()
1573    _version = 6
1574    _ALL_ONES = (2**IPV6LENGTH) - 1
1575    _HEXTET_COUNT = 8
1576    _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef')
1577    _max_prefixlen = IPV6LENGTH
1578
1579    # There are only a bunch of valid v6 netmasks, so we cache them all
1580    # when constructed (see _make_netmask()).
1581    _netmask_cache = {}
1582
1583    @classmethod
1584    def _make_netmask(cls, arg):
1585        """Make a (netmask, prefix_len) tuple from the given argument.
1586
1587        Argument can be:
1588        - an integer (the prefix length)
1589        - a string representing the prefix length (e.g. "24")
1590        - a string representing the prefix netmask (e.g. "255.255.255.0")
1591        """
1592        if arg not in cls._netmask_cache:
1593            if isinstance(arg, int):
1594                prefixlen = arg
1595                if not (0 <= prefixlen <= cls._max_prefixlen):
1596                    cls._report_invalid_netmask(prefixlen)
1597            else:
1598                prefixlen = cls._prefix_from_prefix_string(arg)
1599            netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
1600            cls._netmask_cache[arg] = netmask, prefixlen
1601        return cls._netmask_cache[arg]
1602
1603    @classmethod
1604    def _ip_int_from_string(cls, ip_str):
1605        """Turn an IPv6 ip_str into an integer.
1606
1607        Args:
1608            ip_str: A string, the IPv6 ip_str.
1609
1610        Returns:
1611            An int, the IPv6 address
1612
1613        Raises:
1614            AddressValueError: if ip_str isn't a valid IPv6 Address.
1615
1616        """
1617        if not ip_str:
1618            raise AddressValueError('Address cannot be empty')
1619
1620        parts = ip_str.split(':')
1621
1622        # An IPv6 address needs at least 2 colons (3 parts).
1623        _min_parts = 3
1624        if len(parts) < _min_parts:
1625            msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
1626            raise AddressValueError(msg)
1627
1628        # If the address has an IPv4-style suffix, convert it to hexadecimal.
1629        if '.' in parts[-1]:
1630            try:
1631                ipv4_int = IPv4Address(parts.pop())._ip
1632            except AddressValueError as exc:
1633                raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1634            parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
1635            parts.append('%x' % (ipv4_int & 0xFFFF))
1636
1637        # An IPv6 address can't have more than 8 colons (9 parts).
1638        # The extra colon comes from using the "::" notation for a single
1639        # leading or trailing zero part.
1640        _max_parts = cls._HEXTET_COUNT + 1
1641        if len(parts) > _max_parts:
1642            msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
1643            raise AddressValueError(msg)
1644
1645        # Disregarding the endpoints, find '::' with nothing in between.
1646        # This indicates that a run of zeroes has been skipped.
1647        skip_index = None
1648        for i in range(1, len(parts) - 1):
1649            if not parts[i]:
1650                if skip_index is not None:
1651                    # Can't have more than one '::'
1652                    msg = "At most one '::' permitted in %r" % ip_str
1653                    raise AddressValueError(msg)
1654                skip_index = i
1655
1656        # parts_hi is the number of parts to copy from above/before the '::'
1657        # parts_lo is the number of parts to copy from below/after the '::'
1658        if skip_index is not None:
1659            # If we found a '::', then check if it also covers the endpoints.
1660            parts_hi = skip_index
1661            parts_lo = len(parts) - skip_index - 1
1662            if not parts[0]:
1663                parts_hi -= 1
1664                if parts_hi:
1665                    msg = "Leading ':' only permitted as part of '::' in %r"
1666                    raise AddressValueError(msg % ip_str)  # ^: requires ^::
1667            if not parts[-1]:
1668                parts_lo -= 1
1669                if parts_lo:
1670                    msg = "Trailing ':' only permitted as part of '::' in %r"
1671                    raise AddressValueError(msg % ip_str)  # :$ requires ::$
1672            parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
1673            if parts_skipped < 1:
1674                msg = "Expected at most %d other parts with '::' in %r"
1675                raise AddressValueError(msg % (cls._HEXTET_COUNT-1, ip_str))
1676        else:
1677            # Otherwise, allocate the entire address to parts_hi.  The
1678            # endpoints could still be empty, but _parse_hextet() will check
1679            # for that.
1680            if len(parts) != cls._HEXTET_COUNT:
1681                msg = "Exactly %d parts expected without '::' in %r"
1682                raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
1683            if not parts[0]:
1684                msg = "Leading ':' only permitted as part of '::' in %r"
1685                raise AddressValueError(msg % ip_str)  # ^: requires ^::
1686            if not parts[-1]:
1687                msg = "Trailing ':' only permitted as part of '::' in %r"
1688                raise AddressValueError(msg % ip_str)  # :$ requires ::$
1689            parts_hi = len(parts)
1690            parts_lo = 0
1691            parts_skipped = 0
1692
1693        try:
1694            # Now, parse the hextets into a 128-bit integer.
1695            ip_int = 0
1696            for i in range(parts_hi):
1697                ip_int <<= 16
1698                ip_int |= cls._parse_hextet(parts[i])
1699            ip_int <<= 16 * parts_skipped
1700            for i in range(-parts_lo, 0):
1701                ip_int <<= 16
1702                ip_int |= cls._parse_hextet(parts[i])
1703            return ip_int
1704        except ValueError as exc:
1705            raise AddressValueError("%s in %r" % (exc, ip_str)) from None
1706
1707    @classmethod
1708    def _parse_hextet(cls, hextet_str):
1709        """Convert an IPv6 hextet string into an integer.
1710
1711        Args:
1712            hextet_str: A string, the number to parse.
1713
1714        Returns:
1715            The hextet as an integer.
1716
1717        Raises:
1718            ValueError: if the input isn't strictly a hex number from
1719              [0..FFFF].
1720
1721        """
1722        # Whitelist the characters, since int() allows a lot of bizarre stuff.
1723        if not cls._HEX_DIGITS.issuperset(hextet_str):
1724            raise ValueError("Only hex digits permitted in %r" % hextet_str)
1725        # We do the length check second, since the invalid character error
1726        # is likely to be more informative for the user
1727        if len(hextet_str) > 4:
1728            msg = "At most 4 characters permitted in %r"
1729            raise ValueError(msg % hextet_str)
1730        # Length check means we can skip checking the integer value
1731        return int(hextet_str, 16)
1732
1733    @classmethod
1734    def _compress_hextets(cls, hextets):
1735        """Compresses a list of hextets.
1736
1737        Compresses a list of strings, replacing the longest continuous
1738        sequence of "0" in the list with "" and adding empty strings at
1739        the beginning or at the end of the string such that subsequently
1740        calling ":".join(hextets) will produce the compressed version of
1741        the IPv6 address.
1742
1743        Args:
1744            hextets: A list of strings, the hextets to compress.
1745
1746        Returns:
1747            A list of strings.
1748
1749        """
1750        best_doublecolon_start = -1
1751        best_doublecolon_len = 0
1752        doublecolon_start = -1
1753        doublecolon_len = 0
1754        for index, hextet in enumerate(hextets):
1755            if hextet == '0':
1756                doublecolon_len += 1
1757                if doublecolon_start == -1:
1758                    # Start of a sequence of zeros.
1759                    doublecolon_start = index
1760                if doublecolon_len > best_doublecolon_len:
1761                    # This is the longest sequence of zeros so far.
1762                    best_doublecolon_len = doublecolon_len
1763                    best_doublecolon_start = doublecolon_start
1764            else:
1765                doublecolon_len = 0
1766                doublecolon_start = -1
1767
1768        if best_doublecolon_len > 1:
1769            best_doublecolon_end = (best_doublecolon_start +
1770                                    best_doublecolon_len)
1771            # For zeros at the end of the address.
1772            if best_doublecolon_end == len(hextets):
1773                hextets += ['']
1774            hextets[best_doublecolon_start:best_doublecolon_end] = ['']
1775            # For zeros at the beginning of the address.
1776            if best_doublecolon_start == 0:
1777                hextets = [''] + hextets
1778
1779        return hextets
1780
1781    @classmethod
1782    def _string_from_ip_int(cls, ip_int=None):
1783        """Turns a 128-bit integer into hexadecimal notation.
1784
1785        Args:
1786            ip_int: An integer, the IP address.
1787
1788        Returns:
1789            A string, the hexadecimal representation of the address.
1790
1791        Raises:
1792            ValueError: The address is bigger than 128 bits of all ones.
1793
1794        """
1795        if ip_int is None:
1796            ip_int = int(cls._ip)
1797
1798        if ip_int > cls._ALL_ONES:
1799            raise ValueError('IPv6 address is too large')
1800
1801        hex_str = '%032x' % ip_int
1802        hextets = ['%x' % int(hex_str[x:x+4], 16) for x in range(0, 32, 4)]
1803
1804        hextets = cls._compress_hextets(hextets)
1805        return ':'.join(hextets)
1806
1807    def _explode_shorthand_ip_string(self):
1808        """Expand a shortened IPv6 address.
1809
1810        Args:
1811            ip_str: A string, the IPv6 address.
1812
1813        Returns:
1814            A string, the expanded IPv6 address.
1815
1816        """
1817        if isinstance(self, IPv6Network):
1818            ip_str = str(self.network_address)
1819        elif isinstance(self, IPv6Interface):
1820            ip_str = str(self.ip)
1821        else:
1822            ip_str = str(self)
1823
1824        ip_int = self._ip_int_from_string(ip_str)
1825        hex_str = '%032x' % ip_int
1826        parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
1827        if isinstance(self, (_BaseNetwork, IPv6Interface)):
1828            return '%s/%d' % (':'.join(parts), self._prefixlen)
1829        return ':'.join(parts)
1830
1831    def _reverse_pointer(self):
1832        """Return the reverse DNS pointer name for the IPv6 address.
1833
1834        This implements the method described in RFC3596 2.5.
1835
1836        """
1837        reverse_chars = self.exploded[::-1].replace(':', '')
1838        return '.'.join(reverse_chars) + '.ip6.arpa'
1839
1840    @staticmethod
1841    def _split_scope_id(ip_str):
1842        """Helper function to parse IPv6 string address with scope id.
1843
1844        See RFC 4007 for details.
1845
1846        Args:
1847            ip_str: A string, the IPv6 address.
1848
1849        Returns:
1850            (addr, scope_id) tuple.
1851
1852        """
1853        addr, sep, scope_id = ip_str.partition('%')
1854        if not sep:
1855            scope_id = None
1856        elif not scope_id or '%' in scope_id:
1857            raise AddressValueError('Invalid IPv6 address: "%r"' % ip_str)
1858        return addr, scope_id
1859
1860    @property
1861    def max_prefixlen(self):
1862        return self._max_prefixlen
1863
1864    @property
1865    def version(self):
1866        return self._version
1867
1868
1869class IPv6Address(_BaseV6, _BaseAddress):
1870
1871    """Represent and manipulate single IPv6 Addresses."""
1872
1873    __slots__ = ('_ip', '_scope_id', '__weakref__')
1874
1875    def __init__(self, address):
1876        """Instantiate a new IPv6 address object.
1877
1878        Args:
1879            address: A string or integer representing the IP
1880
1881              Additionally, an integer can be passed, so
1882              IPv6Address('2001:db8::') ==
1883                IPv6Address(42540766411282592856903984951653826560)
1884              or, more generally
1885              IPv6Address(int(IPv6Address('2001:db8::'))) ==
1886                IPv6Address('2001:db8::')
1887
1888        Raises:
1889            AddressValueError: If address isn't a valid IPv6 address.
1890
1891        """
1892        # Efficient constructor from integer.
1893        if isinstance(address, int):
1894            self._check_int_address(address)
1895            self._ip = address
1896            self._scope_id = None
1897            return
1898
1899        # Constructing from a packed address
1900        if isinstance(address, bytes):
1901            self._check_packed_address(address, 16)
1902            self._ip = int.from_bytes(address, 'big')
1903            self._scope_id = None
1904            return
1905
1906        # Assume input argument to be string or any object representation
1907        # which converts into a formatted IP string.
1908        addr_str = str(address)
1909        if '/' in addr_str:
1910            raise AddressValueError("Unexpected '/' in %r" % address)
1911        addr_str, self._scope_id = self._split_scope_id(addr_str)
1912
1913        self._ip = self._ip_int_from_string(addr_str)
1914
1915    def __str__(self):
1916        ip_str = super().__str__()
1917        return ip_str + '%' + self._scope_id if self._scope_id else ip_str
1918
1919    def __hash__(self):
1920        return hash((self._ip, self._scope_id))
1921
1922    def __eq__(self, other):
1923        address_equal = super().__eq__(other)
1924        if address_equal is NotImplemented:
1925            return NotImplemented
1926        if not address_equal:
1927            return False
1928        return self._scope_id == getattr(other, '_scope_id', None)
1929
1930    @property
1931    def scope_id(self):
1932        """Identifier of a particular zone of the address's scope.
1933
1934        See RFC 4007 for details.
1935
1936        Returns:
1937            A string identifying the zone of the address if specified, else None.
1938
1939        """
1940        return self._scope_id
1941
1942    @property
1943    def packed(self):
1944        """The binary representation of this address."""
1945        return v6_int_to_packed(self._ip)
1946
1947    @property
1948    def is_multicast(self):
1949        """Test if the address is reserved for multicast use.
1950
1951        Returns:
1952            A boolean, True if the address is a multicast address.
1953            See RFC 2373 2.7 for details.
1954
1955        """
1956        return self in self._constants._multicast_network
1957
1958    @property
1959    def is_reserved(self):
1960        """Test if the address is otherwise IETF reserved.
1961
1962        Returns:
1963            A boolean, True if the address is within one of the
1964            reserved IPv6 Network ranges.
1965
1966        """
1967        return any(self in x for x in self._constants._reserved_networks)
1968
1969    @property
1970    def is_link_local(self):
1971        """Test if the address is reserved for link-local.
1972
1973        Returns:
1974            A boolean, True if the address is reserved per RFC 4291.
1975
1976        """
1977        return self in self._constants._linklocal_network
1978
1979    @property
1980    def is_site_local(self):
1981        """Test if the address is reserved for site-local.
1982
1983        Note that the site-local address space has been deprecated by RFC 3879.
1984        Use is_private to test if this address is in the space of unique local
1985        addresses as defined by RFC 4193.
1986
1987        Returns:
1988            A boolean, True if the address is reserved per RFC 3513 2.5.6.
1989
1990        """
1991        return self in self._constants._sitelocal_network
1992
1993    @property
1994    @functools.lru_cache()
1995    def is_private(self):
1996        """Test if this address is allocated for private networks.
1997
1998        Returns:
1999            A boolean, True if the address is reserved per
2000            iana-ipv6-special-registry.
2001
2002        """
2003        return any(self in net for net in self._constants._private_networks)
2004
2005    @property
2006    def is_global(self):
2007        """Test if this address is allocated for public networks.
2008
2009        Returns:
2010            A boolean, true if the address is not reserved per
2011            iana-ipv6-special-registry.
2012
2013        """
2014        return not self.is_private
2015
2016    @property
2017    def is_unspecified(self):
2018        """Test if the address is unspecified.
2019
2020        Returns:
2021            A boolean, True if this is the unspecified address as defined in
2022            RFC 2373 2.5.2.
2023
2024        """
2025        return self._ip == 0
2026
2027    @property
2028    def is_loopback(self):
2029        """Test if the address is a loopback address.
2030
2031        Returns:
2032            A boolean, True if the address is a loopback address as defined in
2033            RFC 2373 2.5.3.
2034
2035        """
2036        return self._ip == 1
2037
2038    @property
2039    def ipv4_mapped(self):
2040        """Return the IPv4 mapped address.
2041
2042        Returns:
2043            If the IPv6 address is a v4 mapped address, return the
2044            IPv4 mapped address. Return None otherwise.
2045
2046        """
2047        if (self._ip >> 32) != 0xFFFF:
2048            return None
2049        return IPv4Address(self._ip & 0xFFFFFFFF)
2050
2051    @property
2052    def teredo(self):
2053        """Tuple of embedded teredo IPs.
2054
2055        Returns:
2056            Tuple of the (server, client) IPs or None if the address
2057            doesn't appear to be a teredo address (doesn't start with
2058            2001::/32)
2059
2060        """
2061        if (self._ip >> 96) != 0x20010000:
2062            return None
2063        return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF),
2064                IPv4Address(~self._ip & 0xFFFFFFFF))
2065
2066    @property
2067    def sixtofour(self):
2068        """Return the IPv4 6to4 embedded address.
2069
2070        Returns:
2071            The IPv4 6to4-embedded address if present or None if the
2072            address doesn't appear to contain a 6to4 embedded address.
2073
2074        """
2075        if (self._ip >> 112) != 0x2002:
2076            return None
2077        return IPv4Address((self._ip >> 80) & 0xFFFFFFFF)
2078
2079
2080class IPv6Interface(IPv6Address):
2081
2082    def __init__(self, address):
2083        addr, mask = self._split_addr_prefix(address)
2084
2085        IPv6Address.__init__(self, addr)
2086        self.network = IPv6Network((addr, mask), strict=False)
2087        self.netmask = self.network.netmask
2088        self._prefixlen = self.network._prefixlen
2089
2090    @functools.cached_property
2091    def hostmask(self):
2092        return self.network.hostmask
2093
2094    def __str__(self):
2095        return '%s/%d' % (super().__str__(),
2096                          self._prefixlen)
2097
2098    def __eq__(self, other):
2099        address_equal = IPv6Address.__eq__(self, other)
2100        if address_equal is NotImplemented or not address_equal:
2101            return address_equal
2102        try:
2103            return self.network == other.network
2104        except AttributeError:
2105            # An interface with an associated network is NOT the
2106            # same as an unassociated address. That's why the hash
2107            # takes the extra info into account.
2108            return False
2109
2110    def __lt__(self, other):
2111        address_less = IPv6Address.__lt__(self, other)
2112        if address_less is NotImplemented:
2113            return address_less
2114        try:
2115            return (self.network < other.network or
2116                    self.network == other.network and address_less)
2117        except AttributeError:
2118            # We *do* allow addresses and interfaces to be sorted. The
2119            # unassociated address is considered less than all interfaces.
2120            return False
2121
2122    def __hash__(self):
2123        return hash((self._ip, self._prefixlen, int(self.network.network_address)))
2124
2125    __reduce__ = _IPAddressBase.__reduce__
2126
2127    @property
2128    def ip(self):
2129        return IPv6Address(self._ip)
2130
2131    @property
2132    def with_prefixlen(self):
2133        return '%s/%s' % (self._string_from_ip_int(self._ip),
2134                          self._prefixlen)
2135
2136    @property
2137    def with_netmask(self):
2138        return '%s/%s' % (self._string_from_ip_int(self._ip),
2139                          self.netmask)
2140
2141    @property
2142    def with_hostmask(self):
2143        return '%s/%s' % (self._string_from_ip_int(self._ip),
2144                          self.hostmask)
2145
2146    @property
2147    def is_unspecified(self):
2148        return self._ip == 0 and self.network.is_unspecified
2149
2150    @property
2151    def is_loopback(self):
2152        return self._ip == 1 and self.network.is_loopback
2153
2154
2155class IPv6Network(_BaseV6, _BaseNetwork):
2156
2157    """This class represents and manipulates 128-bit IPv6 networks.
2158
2159    Attributes: [examples for IPv6('2001:db8::1000/124')]
2160        .network_address: IPv6Address('2001:db8::1000')
2161        .hostmask: IPv6Address('::f')
2162        .broadcast_address: IPv6Address('2001:db8::100f')
2163        .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0')
2164        .prefixlen: 124
2165
2166    """
2167
2168    # Class to use when creating address objects
2169    _address_class = IPv6Address
2170
2171    def __init__(self, address, strict=True):
2172        """Instantiate a new IPv6 Network object.
2173
2174        Args:
2175            address: A string or integer representing the IPv6 network or the
2176              IP and prefix/netmask.
2177              '2001:db8::/128'
2178              '2001:db8:0000:0000:0000:0000:0000:0000/128'
2179              '2001:db8::'
2180              are all functionally the same in IPv6.  That is to say,
2181              failing to provide a subnetmask will create an object with
2182              a mask of /128.
2183
2184              Additionally, an integer can be passed, so
2185              IPv6Network('2001:db8::') ==
2186                IPv6Network(42540766411282592856903984951653826560)
2187              or, more generally
2188              IPv6Network(int(IPv6Network('2001:db8::'))) ==
2189                IPv6Network('2001:db8::')
2190
2191            strict: A boolean. If true, ensure that we have been passed
2192              A true network address, eg, 2001:db8::1000/124 and not an
2193              IP address on a network, eg, 2001:db8::1/124.
2194
2195        Raises:
2196            AddressValueError: If address isn't a valid IPv6 address.
2197            NetmaskValueError: If the netmask isn't valid for
2198              an IPv6 address.
2199            ValueError: If strict was True and a network address was not
2200              supplied.
2201        """
2202        addr, mask = self._split_addr_prefix(address)
2203
2204        self.network_address = IPv6Address(addr)
2205        self.netmask, self._prefixlen = self._make_netmask(mask)
2206        packed = int(self.network_address)
2207        if packed & int(self.netmask) != packed:
2208            if strict:
2209                raise ValueError('%s has host bits set' % self)
2210            else:
2211                self.network_address = IPv6Address(packed &
2212                                                   int(self.netmask))
2213
2214        if self._prefixlen == (self._max_prefixlen - 1):
2215            self.hosts = self.__iter__
2216        elif self._prefixlen == self._max_prefixlen:
2217            self.hosts = lambda: [IPv6Address(addr)]
2218
2219    def hosts(self):
2220        """Generate Iterator over usable hosts in a network.
2221
2222          This is like __iter__ except it doesn't return the
2223          Subnet-Router anycast address.
2224
2225        """
2226        network = int(self.network_address)
2227        broadcast = int(self.broadcast_address)
2228        for x in range(network + 1, broadcast + 1):
2229            yield self._address_class(x)
2230
2231    @property
2232    def is_site_local(self):
2233        """Test if the address is reserved for site-local.
2234
2235        Note that the site-local address space has been deprecated by RFC 3879.
2236        Use is_private to test if this address is in the space of unique local
2237        addresses as defined by RFC 4193.
2238
2239        Returns:
2240            A boolean, True if the address is reserved per RFC 3513 2.5.6.
2241
2242        """
2243        return (self.network_address.is_site_local and
2244                self.broadcast_address.is_site_local)
2245
2246
2247class _IPv6Constants:
2248
2249    _linklocal_network = IPv6Network('fe80::/10')
2250
2251    _multicast_network = IPv6Network('ff00::/8')
2252
2253    _private_networks = [
2254        IPv6Network('::1/128'),
2255        IPv6Network('::/128'),
2256        IPv6Network('::ffff:0:0/96'),
2257        IPv6Network('100::/64'),
2258        IPv6Network('2001::/23'),
2259        IPv6Network('2001:2::/48'),
2260        IPv6Network('2001:db8::/32'),
2261        IPv6Network('2001:10::/28'),
2262        IPv6Network('fc00::/7'),
2263        IPv6Network('fe80::/10'),
2264        ]
2265
2266    _reserved_networks = [
2267        IPv6Network('::/8'), IPv6Network('100::/8'),
2268        IPv6Network('200::/7'), IPv6Network('400::/6'),
2269        IPv6Network('800::/5'), IPv6Network('1000::/4'),
2270        IPv6Network('4000::/3'), IPv6Network('6000::/3'),
2271        IPv6Network('8000::/3'), IPv6Network('A000::/3'),
2272        IPv6Network('C000::/3'), IPv6Network('E000::/4'),
2273        IPv6Network('F000::/5'), IPv6Network('F800::/6'),
2274        IPv6Network('FE00::/9'),
2275    ]
2276
2277    _sitelocal_network = IPv6Network('fec0::/10')
2278
2279
2280IPv6Address._constants = _IPv6Constants
2281