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