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