@@ -363,6 +363,12 @@ impl Ipv6Addr {
363
363
( self . segments ( ) [ 0 ] & 0xffc0 ) == 0xfec0
364
364
}
365
365
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
+
366
372
/// Returns true if the address is a globally routable unicast address.
367
373
///
368
374
/// The following return false:
@@ -372,11 +378,12 @@ impl Ipv6Addr {
372
378
/// - the (deprecated) site-local addresses
373
379
/// - unique local addresses
374
380
/// - the unspecified address
381
+ /// - the address range reserved for documentation
375
382
pub fn is_unicast_global ( & self ) -> bool {
376
383
!self . is_multicast ( )
377
384
&& !self . is_loopback ( ) && !self . is_unicast_link_local ( )
378
385
&& !self . is_unicast_site_local ( ) && !self . is_unique_local ( )
379
- && !self . is_unspecified ( )
386
+ && !self . is_unspecified ( ) && ! self . is_documentation ( )
380
387
}
381
388
382
389
/// Returns the address's multicast scope if the address is multicast.
@@ -752,7 +759,7 @@ mod tests {
752
759
fn ipv6_properties ( ) {
753
760
fn check ( str_addr : & str , unspec : bool , loopback : bool ,
754
761
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 ,
756
763
m_scope : Option < Ipv6MulticastScope > ) {
757
764
let ip: Ipv6Addr = str_addr. parse ( ) . unwrap ( ) ;
758
765
assert_eq ! ( str_addr, ip. to_string( ) ) ;
@@ -764,43 +771,46 @@ mod tests {
764
771
assert_eq ! ( ip. is_unicast_link_local( ) , u_link_local) ;
765
772
assert_eq ! ( ip. is_unicast_site_local( ) , u_site_local) ;
766
773
assert_eq ! ( ip. is_unicast_global( ) , u_global) ;
774
+ assert_eq ! ( ip. is_documentation( ) , u_doc) ;
767
775
assert_eq ! ( ip. multicast_scope( ) , m_scope) ;
768
776
assert_eq ! ( ip. is_multicast( ) , m_scope. is_some( ) ) ;
769
777
}
770
778
771
- // unspec loopbk uniqlo global unill unisl uniglo mscope
779
+ // unspec loopbk uniqlo global unill unisl uniglo doc mscope
772
780
check ( "::" ,
773
- true , false , false , false , false , false , false , None ) ;
781
+ true , false , false , false , false , false , false , false , None ) ;
774
782
check ( "::1" ,
775
- false , true , false , false , false , false , false , None ) ;
783
+ false , true , false , false , false , false , false , false , None ) ;
776
784
check ( "::0.0.0.2" ,
777
- false , false , false , true , false , false , true , None ) ;
785
+ false , false , false , true , false , false , true , false , None ) ;
778
786
check ( "1::" ,
779
- false , false , false , true , false , false , true , None ) ;
787
+ false , false , false , true , false , false , true , false , None ) ;
780
788
check ( "fc00::" ,
781
- false , false , true , false , false , false , false , None ) ;
789
+ false , false , true , false , false , false , false , false , None ) ;
782
790
check ( "fdff:ffff::" ,
783
- false , false , true , false , false , false , false , None ) ;
791
+ false , false , true , false , false , false , false , false , None ) ;
784
792
check ( "fe80:ffff::" ,
785
- false , false , false , false , true , false , false , None ) ;
793
+ false , false , false , false , true , false , false , false , None ) ;
786
794
check ( "febf:ffff::" ,
787
- false , false , false , false , true , false , false , None ) ;
795
+ false , false , false , false , true , false , false , false , None ) ;
788
796
check ( "fec0::" ,
789
- false , false , false , false , false , true , false , None ) ;
797
+ false , false , false , false , false , true , false , false , None ) ;
790
798
check ( "ff01::" ,
791
- false , false , false , false , false , false , false , Some ( InterfaceLocal ) ) ;
799
+ false , false , false , false , false , false , false , false , Some ( InterfaceLocal ) ) ;
792
800
check ( "ff02::" ,
793
- false , false , false , false , false , false , false , Some ( LinkLocal ) ) ;
801
+ false , false , false , false , false , false , false , false , Some ( LinkLocal ) ) ;
794
802
check ( "ff03::" ,
795
- false , false , false , false , false , false , false , Some ( RealmLocal ) ) ;
803
+ false , false , false , false , false , false , false , false , Some ( RealmLocal ) ) ;
796
804
check ( "ff04::" ,
797
- false , false , false , false , false , false , false , Some ( AdminLocal ) ) ;
805
+ false , false , false , false , false , false , false , false , Some ( AdminLocal ) ) ;
798
806
check ( "ff05::" ,
799
- false , false , false , false , false , false , false , Some ( SiteLocal ) ) ;
807
+ false , false , false , false , false , false , false , false , Some ( SiteLocal ) ) ;
800
808
check ( "ff08::" ,
801
- false , false , false , false , false , false , false , Some ( OrganizationLocal ) ) ;
809
+ false , false , false , false , false , false , false , false , Some ( OrganizationLocal ) ) ;
802
810
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 ) ;
804
814
}
805
815
806
816
#[ test]
0 commit comments