Skip to content

Commit e3146d7

Browse files
committed
Add functions to convert IPv6 addresses from and to octets
See also rust-lang#32313.
1 parent 2de6ddd commit e3146d7

File tree

1 file changed

+43
-21
lines changed

1 file changed

+43
-21
lines changed

src/libstd/net/ip.rs

+43-21
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,13 @@ impl Ipv6Addr {
427427
_ => None
428428
}
429429
}
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+
}
430437
}
431438

432439
#[stable(feature = "rust1", since = "1.0.0")]
@@ -553,6 +560,15 @@ impl FromInner<c::in6_addr> for Ipv6Addr {
553560
}
554561
}
555562

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+
556572
// Tests for this module
557573
#[cfg(test)]
558574
mod tests {
@@ -739,7 +755,7 @@ mod tests {
739755
// address unspec loopbk privt linloc global multicast brdcast doc
740756
check(&[0, 0, 0, 0], true, false, false, false, false, false, false, false);
741757
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);
743759
check(&[10, 9, 8, 7], false, false, true, false, false, false, false, false);
744760
check(&[127, 1, 2, 3], false, true, false, false, false, false, false, false);
745761
check(&[172, 31, 254, 253], false, false, true, false, false, false, false, false);
@@ -757,12 +773,14 @@ mod tests {
757773

758774
#[test]
759775
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,
761777
unique_local: bool, global: bool,
762778
u_link_local: bool, u_site_local: bool, u_global: bool, u_doc: bool,
763779
m_scope: Option<Ipv6MulticastScope>) {
764780
let ip: Ipv6Addr = str_addr.parse().unwrap();
765781
assert_eq!(str_addr, ip.to_string());
782+
assert_eq!(&ip.octets(), octets);
783+
assert_eq!(Ipv6Addr::from(*octets), ip);
766784

767785
assert_eq!(ip.is_unspecified(), unspec);
768786
assert_eq!(ip.is_loopback(), loopback);
@@ -776,41 +794,45 @@ mod tests {
776794
assert_eq!(ip.is_multicast(), m_scope.is_some());
777795
}
778796

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],
785803
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],
787805
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],
789807
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],
791809
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],
793811
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],
795813
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],
797815
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],
799817
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],
801819
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],
803821
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],
805823
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],
807825
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],
809827
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],
811829
false, false, false, true, false, false, false, false, Some(Global));
812830
check("2001:db8:85a3::8a2e:370:7334",
831+
&[0x20, 1, 0xd, 0xb8, 0x85, 0xa3, 0, 0, 0, 0, 0x8a, 0x2e, 3, 0x70, 0x73, 0x34],
813832
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);
814836
}
815837

816838
#[test]

0 commit comments

Comments
 (0)