@@ -434,6 +434,13 @@ impl Ipv6Addr {
434
434
_ => None
435
435
}
436
436
}
437
+
438
+ /// Returns the sixteen eight-bit integers the IPv6 address consists of.
439
+ #[ unstable( feature = "ipv6_to_octets" , reason = "needs some testing" ,
440
+ issue = "32313" ) ]
441
+ pub fn octets ( & self ) -> [ u8 ; 16 ] {
442
+ self . inner . s6_addr
443
+ }
437
444
}
438
445
439
446
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -560,6 +567,15 @@ impl FromInner<c::in6_addr> for Ipv6Addr {
560
567
}
561
568
}
562
569
570
+ #[ stable( feature = "ipv6_from_octets" , since = "1.9.0" ) ]
571
+ impl From < [ u8 ; 16 ] > for Ipv6Addr {
572
+ fn from ( octets : [ u8 ; 16 ] ) -> Ipv6Addr {
573
+ let mut inner: c:: in6_addr = unsafe { mem:: zeroed ( ) } ;
574
+ inner. s6_addr = octets;
575
+ Ipv6Addr :: from_inner ( inner)
576
+ }
577
+ }
578
+
563
579
// Tests for this module
564
580
#[ cfg( test) ]
565
581
mod tests {
@@ -746,7 +762,7 @@ mod tests {
746
762
// address unspec loopbk privt linloc global multicast brdcast doc
747
763
check ( & [ 0 , 0 , 0 , 0 ] , true , false , false , false , false , false , false , false ) ;
748
764
check ( & [ 0 , 0 , 0 , 1 ] , false , false , false , false , true , false , false , false ) ;
749
- check ( & [ 1 , 0 , 0 , 0 ] , false , false , false , false , true , false , false , false ) ;
765
+ check ( & [ 0 , 1 , 0 , 0 ] , false , false , false , false , true , false , false , false ) ;
750
766
check ( & [ 10 , 9 , 8 , 7 ] , false , false , true , false , false , false , false , false ) ;
751
767
check ( & [ 127 , 1 , 2 , 3 ] , false , true , false , false , false , false , false , false ) ;
752
768
check ( & [ 172 , 31 , 254 , 253 ] , false , false , true , false , false , false , false , false ) ;
@@ -764,12 +780,14 @@ mod tests {
764
780
765
781
#[ test]
766
782
fn ipv6_properties ( ) {
767
- fn check ( str_addr : & str , unspec : bool , loopback : bool ,
783
+ fn check ( str_addr : & str , octets : & [ u8 ; 16 ] , unspec : bool , loopback : bool ,
768
784
unique_local : bool , global : bool ,
769
785
u_link_local : bool , u_site_local : bool , u_global : bool , u_doc : bool ,
770
786
m_scope : Option < Ipv6MulticastScope > ) {
771
787
let ip: Ipv6Addr = str_addr. parse ( ) . unwrap ( ) ;
772
788
assert_eq ! ( str_addr, ip. to_string( ) ) ;
789
+ assert_eq ! ( & ip. octets( ) , octets) ;
790
+ assert_eq ! ( Ipv6Addr :: from( * octets) , ip) ;
773
791
774
792
assert_eq ! ( ip. is_unspecified( ) , unspec) ;
775
793
assert_eq ! ( ip. is_loopback( ) , loopback) ;
@@ -783,41 +801,45 @@ mod tests {
783
801
assert_eq ! ( ip. is_multicast( ) , m_scope. is_some( ) ) ;
784
802
}
785
803
786
- // unspec loopbk uniqlo global unill unisl uniglo doc mscope
787
- check ( "::" ,
788
- true , false , false , false , false , false , false , false , None ) ;
789
- check ( "::1" ,
790
- false , true , false , false , false , false , false , false , None ) ;
791
- check ( "::0.0.0.2" ,
804
+ // unspec loopbk uniqlo global unill unisl uniglo doc mscope
805
+ check ( "::" , & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
806
+ true , false , false , false , false , false , false , false , None ) ;
807
+ check ( "::1" , & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ,
808
+ false , true , false , false , false , false , false , false , None ) ;
809
+ check ( "::0.0.0.2" , & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ] ,
792
810
false , false , false , true , false , false , true , false , None ) ;
793
- check ( "1::" ,
811
+ check ( "1::" , & [ 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
794
812
false , false , false , true , false , false , true , false , None ) ;
795
- check ( "fc00::" ,
813
+ check ( "fc00::" , & [ 0xfc , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
796
814
false , false , true , false , false , false , false , false , None ) ;
797
- check ( "fdff:ffff::" ,
815
+ check ( "fdff:ffff::" , & [ 0xfd , 0xff , 0xff , 0xff , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
798
816
false , false , true , false , false , false , false , false , None ) ;
799
- check ( "fe80:ffff::" ,
817
+ check ( "fe80:ffff::" , & [ 0xfe , 0x80 , 0xff , 0xff , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
800
818
false , false , false , false , true , false , false , false , None ) ;
801
- check ( "febf:ffff::" ,
819
+ check ( "febf:ffff::" , & [ 0xfe , 0xbf , 0xff , 0xff , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
802
820
false , false , false , false , true , false , false , false , None ) ;
803
- check ( "fec0::" ,
821
+ check ( "fec0::" , & [ 0xfe , 0xc0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
804
822
false , false , false , false , false , true , false , false , None ) ;
805
- check ( "ff01::" ,
823
+ check ( "ff01::" , & [ 0xff , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
806
824
false , false , false , false , false , false , false , false , Some ( InterfaceLocal ) ) ;
807
- check ( "ff02::" ,
825
+ check ( "ff02::" , & [ 0xff , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
808
826
false , false , false , false , false , false , false , false , Some ( LinkLocal ) ) ;
809
- check ( "ff03::" ,
827
+ check ( "ff03::" , & [ 0xff , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
810
828
false , false , false , false , false , false , false , false , Some ( RealmLocal ) ) ;
811
- check ( "ff04::" ,
829
+ check ( "ff04::" , & [ 0xff , 4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
812
830
false , false , false , false , false , false , false , false , Some ( AdminLocal ) ) ;
813
- check ( "ff05::" ,
831
+ check ( "ff05::" , & [ 0xff , 5 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
814
832
false , false , false , false , false , false , false , false , Some ( SiteLocal ) ) ;
815
- check ( "ff08::" ,
833
+ check ( "ff08::" , & [ 0xff , 8 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
816
834
false , false , false , false , false , false , false , false , Some ( OrganizationLocal ) ) ;
817
- check ( "ff0e::" ,
835
+ check ( "ff0e::" , & [ 0xff , 0xe , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
818
836
false , false , false , true , false , false , false , false , Some ( Global ) ) ;
819
837
check ( "2001:db8:85a3::8a2e:370:7334" ,
838
+ & [ 0x20 , 1 , 0xd , 0xb8 , 0x85 , 0xa3 , 0 , 0 , 0 , 0 , 0x8a , 0x2e , 3 , 0x70 , 0x73 , 0x34 ] ,
820
839
false , false , false , false , false , false , false , true , None ) ;
840
+ check ( "102:304:506:708:90a:b0c:d0e:f10" ,
841
+ & [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ] ,
842
+ false , false , false , true , false , false , true , false , None ) ;
821
843
}
822
844
823
845
#[ test]
0 commit comments