Rollup merge of #119006 - jstasiak:fix-special-ip-ranges, r=cuviper
Fix is_global special address handling IANA explicitly documents 192.0.0.9/32, 192.0.0.9/32 and 2001:30::/28 as globally reachable[1][2] and the is_global implementations declare following IANA so let's make this happen. In case of 2002::/16 IANA says N/A so I think it's safe to say we shouldn't return true from is_global for addresses in that block. [1] https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml [2] https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml
This commit is contained in:
commit
0f2d12ebc1
@ -771,7 +771,11 @@ pub const fn is_global(&self) -> bool {
|
|||||||
|| self.is_loopback()
|
|| self.is_loopback()
|
||||||
|| self.is_link_local()
|
|| self.is_link_local()
|
||||||
// addresses reserved for future protocols (`192.0.0.0/24`)
|
// addresses reserved for future protocols (`192.0.0.0/24`)
|
||||||
||(self.octets()[0] == 192 && self.octets()[1] == 0 && self.octets()[2] == 0)
|
// .9 and .10 are documented as globally reachable so they're excluded
|
||||||
|
|| (
|
||||||
|
self.octets()[0] == 192 && self.octets()[1] == 0 && self.octets()[2] == 0
|
||||||
|
&& self.octets()[3] != 9 && self.octets()[3] != 10
|
||||||
|
)
|
||||||
|| self.is_documentation()
|
|| self.is_documentation()
|
||||||
|| self.is_benchmarking()
|
|| self.is_benchmarking()
|
||||||
|| self.is_reserved()
|
|| self.is_reserved()
|
||||||
@ -1515,8 +1519,12 @@ pub const fn is_global(&self) -> bool {
|
|||||||
// AS112-v6 (`2001:4:112::/48`)
|
// AS112-v6 (`2001:4:112::/48`)
|
||||||
|| matches!(self.segments(), [0x2001, 4, 0x112, _, _, _, _, _])
|
|| matches!(self.segments(), [0x2001, 4, 0x112, _, _, _, _, _])
|
||||||
// ORCHIDv2 (`2001:20::/28`)
|
// ORCHIDv2 (`2001:20::/28`)
|
||||||
|| matches!(self.segments(), [0x2001, b, _, _, _, _, _, _] if b >= 0x20 && b <= 0x2F)
|
// Drone Remote ID Protocol Entity Tags (DETs) Prefix (`2001:30::/28`)`
|
||||||
|
|| matches!(self.segments(), [0x2001, b, _, _, _, _, _, _] if b >= 0x20 && b <= 0x3F)
|
||||||
))
|
))
|
||||||
|
// 6to4 (`2002::/16`) – it's not explicitly documented as globally reachable,
|
||||||
|
// IANA says N/A.
|
||||||
|
|| matches!(self.segments(), [0x2002, _, _, _, _, _, _, _])
|
||||||
|| self.is_documentation()
|
|| self.is_documentation()
|
||||||
|| self.is_unique_local()
|
|| self.is_unique_local()
|
||||||
|| self.is_unicast_link_local())
|
|| self.is_unicast_link_local())
|
||||||
|
@ -461,6 +461,10 @@ macro_rules! check {
|
|||||||
check!("198.18.54.2", benchmarking);
|
check!("198.18.54.2", benchmarking);
|
||||||
check!("198.19.255.255", benchmarking);
|
check!("198.19.255.255", benchmarking);
|
||||||
check!("192.0.0.0");
|
check!("192.0.0.0");
|
||||||
|
check!("192.0.0.8");
|
||||||
|
check!("192.0.0.9", global);
|
||||||
|
check!("192.0.0.10", global);
|
||||||
|
check!("192.0.0.11");
|
||||||
check!("192.0.0.255");
|
check!("192.0.0.255");
|
||||||
check!("192.0.0.100");
|
check!("192.0.0.100");
|
||||||
check!("240.0.0.0", reserved);
|
check!("240.0.0.0", reserved);
|
||||||
@ -480,6 +484,10 @@ macro_rules! ip {
|
|||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! check {
|
macro_rules! check {
|
||||||
|
($s:expr, &[$($octet:expr),*]) => {
|
||||||
|
check!($s, &[$($octet),*], 0);
|
||||||
|
};
|
||||||
|
|
||||||
($s:expr, &[$($octet:expr),*], $mask:expr) => {
|
($s:expr, &[$($octet:expr),*], $mask:expr) => {
|
||||||
assert_eq!($s, ip!($s).to_string());
|
assert_eq!($s, ip!($s).to_string());
|
||||||
let octets = &[$($octet),*];
|
let octets = &[$($octet),*];
|
||||||
@ -656,8 +664,8 @@ macro_rules! check {
|
|||||||
&[0x20, 1, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
&[0x20, 1, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
global | unicast_global
|
global | unicast_global
|
||||||
);
|
);
|
||||||
|
check!("2001:30::", &[0x20, 1, 0, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], global | unicast_global);
|
||||||
check!("2001:30::", &[0x20, 1, 0, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], unicast_global);
|
check!("2001:40::", &[0x20, 1, 0, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], unicast_global);
|
||||||
|
|
||||||
check!(
|
check!(
|
||||||
"2001:200::",
|
"2001:200::",
|
||||||
@ -665,6 +673,8 @@ macro_rules! check {
|
|||||||
global | unicast_global
|
global | unicast_global
|
||||||
);
|
);
|
||||||
|
|
||||||
|
check!("2002::", &[0x20, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], unicast_global);
|
||||||
|
|
||||||
check!("fc00::", &[0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], unique_local);
|
check!("fc00::", &[0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], unique_local);
|
||||||
|
|
||||||
check!(
|
check!(
|
||||||
|
Loading…
Reference in New Issue
Block a user