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