@@ -309,7 +309,7 @@ def collapse_addresses(addresses):
309
309
[IPv4Network('192.0.2.0/24')]
310
310
311
311
Args:
312
- addresses: An iterator of IPv4Network or IPv6Network objects.
312
+ addresses: An iterable of IPv4Network or IPv6Network objects.
313
313
314
314
Returns:
315
315
An iterator of the collapsed IPv(4|6)Network objects.
@@ -1839,9 +1839,6 @@ def _string_from_ip_int(cls, ip_int=None):
1839
1839
def _explode_shorthand_ip_string (self ):
1840
1840
"""Expand a shortened IPv6 address.
1841
1841
1842
- Args:
1843
- ip_str: A string, the IPv6 address.
1844
-
1845
1842
Returns:
1846
1843
A string, the expanded IPv6 address.
1847
1844
@@ -1985,6 +1982,9 @@ def is_multicast(self):
1985
1982
See RFC 2373 2.7 for details.
1986
1983
1987
1984
"""
1985
+ ipv4_mapped = self .ipv4_mapped
1986
+ if ipv4_mapped is not None :
1987
+ return ipv4_mapped .is_multicast
1988
1988
return self in self ._constants ._multicast_network
1989
1989
1990
1990
@property
@@ -1996,6 +1996,9 @@ def is_reserved(self):
1996
1996
reserved IPv6 Network ranges.
1997
1997
1998
1998
"""
1999
+ ipv4_mapped = self .ipv4_mapped
2000
+ if ipv4_mapped is not None :
2001
+ return ipv4_mapped .is_reserved
1999
2002
return any (self in x for x in self ._constants ._reserved_networks )
2000
2003
2001
2004
@property
@@ -2006,6 +2009,9 @@ def is_link_local(self):
2006
2009
A boolean, True if the address is reserved per RFC 4291.
2007
2010
2008
2011
"""
2012
+ ipv4_mapped = self .ipv4_mapped
2013
+ if ipv4_mapped is not None :
2014
+ return ipv4_mapped .is_link_local
2009
2015
return self in self ._constants ._linklocal_network
2010
2016
2011
2017
@property
@@ -2062,6 +2068,9 @@ def is_global(self):
2062
2068
``is_global`` has value opposite to :attr:`is_private`, except for the ``100.64.0.0/10``
2063
2069
IPv4 range where they are both ``False``.
2064
2070
"""
2071
+ ipv4_mapped = self .ipv4_mapped
2072
+ if ipv4_mapped is not None :
2073
+ return ipv4_mapped .is_global
2065
2074
return not self .is_private
2066
2075
2067
2076
@property
@@ -2073,6 +2082,9 @@ def is_unspecified(self):
2073
2082
RFC 2373 2.5.2.
2074
2083
2075
2084
"""
2085
+ ipv4_mapped = self .ipv4_mapped
2086
+ if ipv4_mapped is not None :
2087
+ return ipv4_mapped .is_unspecified
2076
2088
return self ._ip == 0
2077
2089
2078
2090
@property
@@ -2084,6 +2096,9 @@ def is_loopback(self):
2084
2096
RFC 2373 2.5.3.
2085
2097
2086
2098
"""
2099
+ ipv4_mapped = self .ipv4_mapped
2100
+ if ipv4_mapped is not None :
2101
+ return ipv4_mapped .is_loopback
2087
2102
return self ._ip == 1
2088
2103
2089
2104
@property
@@ -2200,7 +2215,7 @@ def is_unspecified(self):
2200
2215
2201
2216
@property
2202
2217
def is_loopback (self ):
2203
- return self . _ip == 1 and self .network .is_loopback
2218
+ return super (). is_loopback and self .network .is_loopback
2204
2219
2205
2220
2206
2221
class IPv6Network (_BaseV6 , _BaseNetwork ):
@@ -2313,6 +2328,8 @@ class _IPv6Constants:
2313
2328
IPv6Network ('2001:db8::/32' ),
2314
2329
# IANA says N/A, let's consider it not globally reachable to be safe
2315
2330
IPv6Network ('2002::/16' ),
2331
+ # RFC 9637: https://www.rfc-editor.org/rfc/rfc9637.html#section-6-2.2
2332
+ IPv6Network ('3fff::/20' ),
2316
2333
IPv6Network ('fc00::/7' ),
2317
2334
IPv6Network ('fe80::/10' ),
2318
2335
]
0 commit comments