Skip to content

Commit a77d7bd

Browse files
committed
Auto merge of rust-lang#32207 - achanda:ipv6-doc, r=alexcrichton
Add is_documentation for IPv6 This function returns true if the given IPv6 is reserved for documentation. Also, reject this block in the is_global check
2 parents b12b4e4 + aa22b4e commit a77d7bd

File tree

1 file changed

+29
-19
lines changed

1 file changed

+29
-19
lines changed

src/libstd/net/ip.rs

+29-19
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,12 @@ impl Ipv6Addr {
363363
(self.segments()[0] & 0xffc0) == 0xfec0
364364
}
365365

366+
/// Returns true if this is an address reserved for documentation
367+
/// This is defined to be 2001:db8::/32 in RFC RFC 3849
368+
pub fn is_documentation(&self) -> bool {
369+
(self.segments()[0] == 0x2001) && (self.segments()[1] == 0xdb8)
370+
}
371+
366372
/// Returns true if the address is a globally routable unicast address.
367373
///
368374
/// The following return false:
@@ -372,11 +378,12 @@ impl Ipv6Addr {
372378
/// - the (deprecated) site-local addresses
373379
/// - unique local addresses
374380
/// - the unspecified address
381+
/// - the address range reserved for documentation
375382
pub fn is_unicast_global(&self) -> bool {
376383
!self.is_multicast()
377384
&& !self.is_loopback() && !self.is_unicast_link_local()
378385
&& !self.is_unicast_site_local() && !self.is_unique_local()
379-
&& !self.is_unspecified()
386+
&& !self.is_unspecified() && !self.is_documentation()
380387
}
381388

382389
/// Returns the address's multicast scope if the address is multicast.
@@ -752,7 +759,7 @@ mod tests {
752759
fn ipv6_properties() {
753760
fn check(str_addr: &str, unspec: bool, loopback: bool,
754761
unique_local: bool, global: bool,
755-
u_link_local: bool, u_site_local: bool, u_global: bool,
762+
u_link_local: bool, u_site_local: bool, u_global: bool, u_doc: bool,
756763
m_scope: Option<Ipv6MulticastScope>) {
757764
let ip: Ipv6Addr = str_addr.parse().unwrap();
758765
assert_eq!(str_addr, ip.to_string());
@@ -764,43 +771,46 @@ mod tests {
764771
assert_eq!(ip.is_unicast_link_local(), u_link_local);
765772
assert_eq!(ip.is_unicast_site_local(), u_site_local);
766773
assert_eq!(ip.is_unicast_global(), u_global);
774+
assert_eq!(ip.is_documentation(), u_doc);
767775
assert_eq!(ip.multicast_scope(), m_scope);
768776
assert_eq!(ip.is_multicast(), m_scope.is_some());
769777
}
770778

771-
// unspec loopbk uniqlo global unill unisl uniglo mscope
779+
// unspec loopbk uniqlo global unill unisl uniglo doc mscope
772780
check("::",
773-
true, false, false, false, false, false, false, None);
781+
true, false, false, false, false, false, false, false, None);
774782
check("::1",
775-
false, true, false, false, false, false, false, None);
783+
false, true, false, false, false, false, false, false, None);
776784
check("::0.0.0.2",
777-
false, false, false, true, false, false, true, None);
785+
false, false, false, true, false, false, true, false, None);
778786
check("1::",
779-
false, false, false, true, false, false, true, None);
787+
false, false, false, true, false, false, true, false, None);
780788
check("fc00::",
781-
false, false, true, false, false, false, false, None);
789+
false, false, true, false, false, false, false, false, None);
782790
check("fdff:ffff::",
783-
false, false, true, false, false, false, false, None);
791+
false, false, true, false, false, false, false, false, None);
784792
check("fe80:ffff::",
785-
false, false, false, false, true, false, false, None);
793+
false, false, false, false, true, false, false, false, None);
786794
check("febf:ffff::",
787-
false, false, false, false, true, false, false, None);
795+
false, false, false, false, true, false, false, false, None);
788796
check("fec0::",
789-
false, false, false, false, false, true, false, None);
797+
false, false, false, false, false, true, false, false, None);
790798
check("ff01::",
791-
false, false, false, false, false, false, false, Some(InterfaceLocal));
799+
false, false, false, false, false, false, false, false, Some(InterfaceLocal));
792800
check("ff02::",
793-
false, false, false, false, false, false, false, Some(LinkLocal));
801+
false, false, false, false, false, false, false, false, Some(LinkLocal));
794802
check("ff03::",
795-
false, false, false, false, false, false, false, Some(RealmLocal));
803+
false, false, false, false, false, false, false, false, Some(RealmLocal));
796804
check("ff04::",
797-
false, false, false, false, false, false, false, Some(AdminLocal));
805+
false, false, false, false, false, false, false, false, Some(AdminLocal));
798806
check("ff05::",
799-
false, false, false, false, false, false, false, Some(SiteLocal));
807+
false, false, false, false, false, false, false, false, Some(SiteLocal));
800808
check("ff08::",
801-
false, false, false, false, false, false, false, Some(OrganizationLocal));
809+
false, false, false, false, false, false, false, false, Some(OrganizationLocal));
802810
check("ff0e::",
803-
false, false, false, true, false, false, false, Some(Global));
811+
false, false, false, true, false, false, false, false, Some(Global));
812+
check("2001:db8:85a3::8a2e:370:7334",
813+
false, false, false, false, false, false, false, true, None);
804814
}
805815

806816
#[test]

0 commit comments

Comments
 (0)