@@ -434,6 +434,13 @@ impl Ipv6Addr {
434434 _ => None
435435 }
436436 }
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+ }
437444}
438445
439446#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -560,6 +567,15 @@ impl FromInner<c::in6_addr> for Ipv6Addr {
560567 }
561568}
562569
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+
563579// Tests for this module
564580#[ cfg( test) ]
565581mod tests {
@@ -746,7 +762,7 @@ mod tests {
746762 // address unspec loopbk privt linloc global multicast brdcast doc
747763 check ( & [ 0 , 0 , 0 , 0 ] , true , false , false , false , false , false , false , false ) ;
748764 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 ) ;
750766 check ( & [ 10 , 9 , 8 , 7 ] , false , false , true , false , false , false , false , false ) ;
751767 check ( & [ 127 , 1 , 2 , 3 ] , false , true , false , false , false , false , false , false ) ;
752768 check ( & [ 172 , 31 , 254 , 253 ] , false , false , true , false , false , false , false , false ) ;
@@ -764,12 +780,14 @@ mod tests {
764780
765781 #[ test]
766782 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 ,
768784 unique_local : bool , global : bool ,
769785 u_link_local : bool , u_site_local : bool , u_global : bool , u_doc : bool ,
770786 m_scope : Option < Ipv6MulticastScope > ) {
771787 let ip: Ipv6Addr = str_addr. parse ( ) . unwrap ( ) ;
772788 assert_eq ! ( str_addr, ip. to_string( ) ) ;
789+ assert_eq ! ( & ip. octets( ) , octets) ;
790+ assert_eq ! ( Ipv6Addr :: from( * octets) , ip) ;
773791
774792 assert_eq ! ( ip. is_unspecified( ) , unspec) ;
775793 assert_eq ! ( ip. is_loopback( ) , loopback) ;
@@ -783,41 +801,45 @@ mod tests {
783801 assert_eq ! ( ip. is_multicast( ) , m_scope. is_some( ) ) ;
784802 }
785803
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 ] ,
792810 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 ] ,
794812 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 ] ,
796814 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 ] ,
798816 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 ] ,
800818 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 ] ,
802820 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 ] ,
804822 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 ] ,
806824 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 ] ,
808826 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 ] ,
810828 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 ] ,
812830 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 ] ,
814832 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 ] ,
816834 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 ] ,
818836 false , false , false , true , false , false , false , false , Some ( Global ) ) ;
819837 check ( "2001:db8:85a3::8a2e:370:7334" ,
838+ & [ 0x20 , 1 , 0xd , 0xb8 , 0x85 , 0xa3 , 0 , 0 , 0 , 0 , 0x8a , 0x2e , 3 , 0x70 , 0x73 , 0x34 ] ,
820839 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 ) ;
821843 }
822844
823845 #[ test]
0 commit comments