Skip to content

Commit

Permalink
Add IpAddr common methods
Browse files Browse the repository at this point in the history
  • Loading branch information
mathphreak committed Jul 6, 2016
1 parent 4114b68 commit b814104
Showing 1 changed file with 103 additions and 0 deletions.
103 changes: 103 additions & 0 deletions src/libstd/net/ip.rs
Expand Up @@ -59,6 +59,48 @@ pub enum Ipv6MulticastScope {
Global
}

impl IpAddr {
/// Returns true for the special 'unspecified' address (0.0.0.0 in IPv4, :: in IPv6).
pub fn is_unspecified(&self) -> bool {
match *self {
IpAddr::V4(ref a) => a.is_unspecified(),
IpAddr::V6(ref a) => a.is_unspecified(),
}
}

/// Returns true if this is a loopback address (127.0.0.0/8 in IPv4, ::1 in IPv6).
pub fn is_loopback(&self) -> bool {
match *self {
IpAddr::V4(ref a) => a.is_loopback(),
IpAddr::V6(ref a) => a.is_loopback(),
}
}

/// Returns true if the address appears to be globally routable.
pub fn is_global(&self) -> bool {
match *self {
IpAddr::V4(ref a) => a.is_global(),
IpAddr::V6(ref a) => a.is_global(),
}
}

/// Returns true if this is a multicast address (224.0.0.0/4 in IPv4, ff00::/8 in IPv6)
pub fn is_multicast(&self) -> bool {
match *self {
IpAddr::V4(ref a) => a.is_multicast(),
IpAddr::V6(ref a) => a.is_multicast(),
}
}

/// Returns true if this address is in a range designated for documentation.
pub fn is_documentation(&self) -> bool {
match *self {
IpAddr::V4(ref a) => a.is_documentation(),
IpAddr::V6(ref a) => a.is_documentation(),
}
}
}

impl Ipv4Addr {
/// Creates a new IPv4 address from four eight-bit octets.
///
Expand Down Expand Up @@ -756,6 +798,67 @@ mod tests {
None);
}

#[test]
fn ip_properties() {
fn check4(octets: &[u8; 4], unspec: bool, loopback: bool,
global: bool, multicast: bool, documentation: bool) {
let ip = IpAddr::V4(Ipv4Addr::new(octets[0], octets[1], octets[2], octets[3]));
assert_eq!(ip.is_unspecified(), unspec);
assert_eq!(ip.is_loopback(), loopback);
assert_eq!(ip.is_global(), global);
assert_eq!(ip.is_multicast(), multicast);
assert_eq!(ip.is_documentation(), documentation);
}

fn check6(str_addr: &str, unspec: bool, loopback: bool,
global: bool, u_doc: bool, mcast: bool) {
let ip = IpAddr::V6(str_addr.parse().unwrap());
assert_eq!(ip.is_unspecified(), unspec);
assert_eq!(ip.is_loopback(), loopback);
assert_eq!(ip.is_global(), global);
assert_eq!(ip.is_documentation(), u_doc);
assert_eq!(ip.is_multicast(), mcast);
}

// address unspec loopbk global multicast doc
check4(&[0, 0, 0, 0], true, false, false, false, false);
check4(&[0, 0, 0, 1], false, false, true, false, false);
check4(&[0, 1, 0, 0], false, false, true, false, false);
check4(&[10, 9, 8, 7], false, false, false, false, false);
check4(&[127, 1, 2, 3], false, true, false, false, false);
check4(&[172, 31, 254, 253], false, false, false, false, false);
check4(&[169, 254, 253, 242], false, false, false, false, false);
check4(&[192, 0, 2, 183], false, false, false, false, true);
check4(&[192, 1, 2, 183], false, false, true, false, false);
check4(&[192, 168, 254, 253], false, false, false, false, false);
check4(&[198, 51, 100, 0], false, false, false, false, true);
check4(&[203, 0, 113, 0], false, false, false, false, true);
check4(&[203, 2, 113, 0], false, false, true, false, false);
check4(&[224, 0, 0, 0], false, false, true, true, false);
check4(&[239, 255, 255, 255], false, false, true, true, false);
check4(&[255, 255, 255, 255], false, false, false, false, false);

// address unspec loopbk global doc mcast
check6("::", true, false, false, false, false);
check6("::1", false, true, false, false, false);
check6("::0.0.0.2", false, false, true, false, false);
check6("1::", false, false, true, false, false);
check6("fc00::", false, false, false, false, false);
check6("fdff:ffff::", false, false, false, false, false);
check6("fe80:ffff::", false, false, false, false, false);
check6("febf:ffff::", false, false, false, false, false);
check6("fec0::", false, false, false, false, false);
check6("ff01::", false, false, false, false, true);
check6("ff02::", false, false, false, false, true);
check6("ff03::", false, false, false, false, true);
check6("ff04::", false, false, false, false, true);
check6("ff05::", false, false, false, false, true);
check6("ff08::", false, false, false, false, true);
check6("ff0e::", false, false, true, false, true);
check6("2001:db8:85a3::8a2e:370:7334", false, false, false, true, false);
check6("102:304:506:708:90a:b0c:d0e:f10", false, false, true, false, false);
}

#[test]
fn ipv4_properties() {
fn check(octets: &[u8; 4], unspec: bool, loopback: bool,
Expand Down

0 comments on commit b814104

Please sign in to comment.