Skip to content

Commit 211c35a

Browse files
committed
Auto merge of #32334 - tbu-:pr_ipv6_octets, r=aturon
Add functions to convert IPv6 addresses from and to octets See also #32313.
2 parents 18172d1 + e3146d7 commit 211c35a

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
@@ -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)]
565581
mod 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

Comments
 (0)