@@ -310,7 +310,7 @@ def collapse_addresses(addresses):
310
310
[IPv4Network('192.0.2.0/24')]
311
311
312
312
Args:
313
- addresses: An iterator of IPv4Network or IPv6Network objects.
313
+ addresses: An iterable of IPv4Network or IPv6Network objects.
314
314
315
315
Returns:
316
316
An iterator of the collapsed IPv(4|6)Network objects.
@@ -1855,9 +1855,6 @@ def _string_from_ip_int(cls, ip_int=None):
1855
1855
def _explode_shorthand_ip_string (self ):
1856
1856
"""Expand a shortened IPv6 address.
1857
1857
1858
- Args:
1859
- ip_str: A string, the IPv6 address.
1860
-
1861
1858
Returns:
1862
1859
A string, the expanded IPv6 address.
1863
1860
@@ -2004,6 +2001,9 @@ def is_multicast(self):
2004
2001
See RFC 2373 2.7 for details.
2005
2002
2006
2003
"""
2004
+ ipv4_mapped = self .ipv4_mapped
2005
+ if ipv4_mapped is not None :
2006
+ return ipv4_mapped .is_multicast
2007
2007
return self in self ._constants ._multicast_network
2008
2008
2009
2009
@property
@@ -2015,6 +2015,9 @@ def is_reserved(self):
2015
2015
reserved IPv6 Network ranges.
2016
2016
2017
2017
"""
2018
+ ipv4_mapped = self .ipv4_mapped
2019
+ if ipv4_mapped is not None :
2020
+ return ipv4_mapped .is_reserved
2018
2021
return any (self in x for x in self ._constants ._reserved_networks )
2019
2022
2020
2023
@property
@@ -2025,6 +2028,9 @@ def is_link_local(self):
2025
2028
A boolean, True if the address is reserved per RFC 4291.
2026
2029
2027
2030
"""
2031
+ ipv4_mapped = self .ipv4_mapped
2032
+ if ipv4_mapped is not None :
2033
+ return ipv4_mapped .is_link_local
2028
2034
return self in self ._constants ._linklocal_network
2029
2035
2030
2036
@property
@@ -2081,6 +2087,9 @@ def is_global(self):
2081
2087
``is_global`` has value opposite to :attr:`is_private`, except for the ``100.64.0.0/10``
2082
2088
IPv4 range where they are both ``False``.
2083
2089
"""
2090
+ ipv4_mapped = self .ipv4_mapped
2091
+ if ipv4_mapped is not None :
2092
+ return ipv4_mapped .is_global
2084
2093
return not self .is_private
2085
2094
2086
2095
@property
@@ -2092,6 +2101,9 @@ def is_unspecified(self):
2092
2101
RFC 2373 2.5.2.
2093
2102
2094
2103
"""
2104
+ ipv4_mapped = self .ipv4_mapped
2105
+ if ipv4_mapped is not None :
2106
+ return ipv4_mapped .is_unspecified
2095
2107
return self ._ip == 0
2096
2108
2097
2109
@property
@@ -2103,6 +2115,9 @@ def is_loopback(self):
2103
2115
RFC 2373 2.5.3.
2104
2116
2105
2117
"""
2118
+ ipv4_mapped = self .ipv4_mapped
2119
+ if ipv4_mapped is not None :
2120
+ return ipv4_mapped .is_loopback
2106
2121
return self ._ip == 1
2107
2122
2108
2123
@property
@@ -2219,7 +2234,7 @@ def is_unspecified(self):
2219
2234
2220
2235
@property
2221
2236
def is_loopback (self ):
2222
- return self . _ip == 1 and self .network .is_loopback
2237
+ return super (). is_loopback and self .network .is_loopback
2223
2238
2224
2239
2225
2240
class IPv6Network (_BaseV6 , _BaseNetwork ):
@@ -2332,6 +2347,8 @@ class _IPv6Constants:
2332
2347
IPv6Network ('2001:db8::/32' ),
2333
2348
# IANA says N/A, let's consider it not globally reachable to be safe
2334
2349
IPv6Network ('2002::/16' ),
2350
+ # RFC 9637: https://www.rfc-editor.org/rfc/rfc9637.html#section-6-2.2
2351
+ IPv6Network ('3fff::/20' ),
2335
2352
IPv6Network ('fc00::/7' ),
2336
2353
IPv6Network ('fe80::/10' ),
2337
2354
]
0 commit comments