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:
Matthias Krüger 2024-01-11 03:02:40 +01:00 committed by GitHub
commit 0f2d12ebc1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 4 deletions

View File

@ -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())

View File

@ -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!(