Enum if_watch::IpNet[][src]

pub enum IpNet {
    V4(Ipv4Net),
    V6(Ipv6Net),
}

An IP network address, either IPv4 or IPv6.

This enum can contain either an Ipv4Net or an Ipv6Net. A From implementation is provided to convert these into an IpNet.

Textual representation

IpNet provides a FromStr implementation for parsing network addresses represented in CIDR notation. See IETF RFC 4632 for the CIDR notation.

Examples

use std::net::IpAddr;
use ipnet::IpNet;

let net: IpNet = "10.1.1.0/24".parse().unwrap();
assert_eq!(Ok(net.network()), "10.1.1.0".parse());

let net: IpNet = "fd00::/32".parse().unwrap();
assert_eq!(Ok(net.network()), "fd00::".parse());

Variants

Implementations

impl IpNet[src]

pub fn trunc(&self) -> IpNet[src]

Returns a copy of the network with the address truncated to the prefix length.

Examples

assert_eq!(
    "192.168.12.34/16".parse::<IpNet>().unwrap().trunc(),
    "192.168.0.0/16".parse().unwrap()
);

assert_eq!(
    "fd00::1:2:3:4/16".parse::<IpNet>().unwrap().trunc(),
    "fd00::/16".parse().unwrap()
);

pub fn addr(&self) -> IpAddr[src]

Returns the address.

pub fn prefix_len(&self) -> u8[src]

Returns the prefix length.

pub fn max_prefix_len(&self) -> u8[src]

Returns the maximum valid prefix length.

pub fn netmask(&self) -> IpAddr[src]

Returns the network mask.

Examples

let net: IpNet = "10.1.0.0/20".parse().unwrap();
assert_eq!(Ok(net.netmask()), "255.255.240.0".parse());

let net: IpNet = "fd00::/24".parse().unwrap();
assert_eq!(Ok(net.netmask()), "ffff:ff00::".parse());

pub fn hostmask(&self) -> IpAddr[src]

Returns the host mask.

Examples

let net: IpNet = "10.1.0.0/20".parse().unwrap();
assert_eq!(Ok(net.hostmask()), "0.0.15.255".parse());

let net: IpNet = "fd00::/24".parse().unwrap();
assert_eq!(Ok(net.hostmask()), "::ff:ffff:ffff:ffff:ffff:ffff:ffff".parse());

pub fn network(&self) -> IpAddr[src]

Returns the network address.

Examples

let net: IpNet = "172.16.123.123/16".parse().unwrap();
assert_eq!(Ok(net.network()), "172.16.0.0".parse());

let net: IpNet = "fd00:1234:5678::/24".parse().unwrap();
assert_eq!(Ok(net.network()), "fd00:1200::".parse());

pub fn broadcast(&self) -> IpAddr[src]

Returns the broadcast address.

Examples

let net: IpNet = "172.16.0.0/22".parse().unwrap();
assert_eq!(Ok(net.broadcast()), "172.16.3.255".parse());

let net: IpNet = "fd00:1234:5678::/24".parse().unwrap();
assert_eq!(Ok(net.broadcast()), "fd00:12ff:ffff:ffff:ffff:ffff:ffff:ffff".parse());

pub fn supernet(&self) -> Option<IpNet>[src]

Returns the IpNet that contains this one.

Examples

let n1: IpNet = "172.16.1.0/24".parse().unwrap();
let n2: IpNet = "172.16.0.0/23".parse().unwrap();
let n3: IpNet = "172.16.0.0/0".parse().unwrap();

assert_eq!(n1.supernet().unwrap(), n2);
assert_eq!(n3.supernet(), None);

let n1: IpNet = "fd00:ff00::/24".parse().unwrap();
let n2: IpNet = "fd00:fe00::/23".parse().unwrap();
let n3: IpNet = "fd00:fe00::/0".parse().unwrap();

assert_eq!(n1.supernet().unwrap(), n2);
assert_eq!(n3.supernet(), None);

pub fn is_sibling(&self, other: &IpNet) -> bool[src]

Returns true if this network and the given network are children of the same supernet.

Examples

let n4_1: IpNet = "10.1.0.0/24".parse().unwrap();
let n4_2: IpNet = "10.1.1.0/24".parse().unwrap();
let n4_3: IpNet = "10.1.2.0/24".parse().unwrap();
let n6_1: IpNet = "fd00::/18".parse().unwrap();
let n6_2: IpNet = "fd00:4000::/18".parse().unwrap();
let n6_3: IpNet = "fd00:8000::/18".parse().unwrap();

assert!( n4_1.is_sibling(&n4_2));
assert!(!n4_2.is_sibling(&n4_3));
assert!( n6_1.is_sibling(&n6_2));
assert!(!n6_2.is_sibling(&n6_3));
assert!(!n4_1.is_sibling(&n6_2));

pub fn hosts(&self) -> IpAddrRange[src]

Return an Iterator over the host addresses in this network.

Examples

let net: IpNet = "10.0.0.0/30".parse().unwrap();
assert_eq!(net.hosts().collect::<Vec<IpAddr>>(), vec![
    "10.0.0.1".parse::<IpAddr>().unwrap(),
    "10.0.0.2".parse().unwrap(),
]);

let net: IpNet = "10.0.0.0/31".parse().unwrap();
assert_eq!(net.hosts().collect::<Vec<IpAddr>>(), vec![
    "10.0.0.0".parse::<IpAddr>().unwrap(),
    "10.0.0.1".parse().unwrap(),
]);

let net: IpNet = "fd00::/126".parse().unwrap();
assert_eq!(net.hosts().collect::<Vec<IpAddr>>(), vec![
    "fd00::".parse::<IpAddr>().unwrap(),
    "fd00::1".parse().unwrap(),
    "fd00::2".parse().unwrap(),
    "fd00::3".parse().unwrap(),
]);

pub fn subnets(&self, new_prefix_len: u8) -> Result<IpSubnets, PrefixLenError>[src]

Returns an Iterator over the subnets of this network with the given prefix length.

Examples

let net: IpNet = "10.0.0.0/24".parse().unwrap();
assert_eq!(net.subnets(26).unwrap().collect::<Vec<IpNet>>(), vec![
    "10.0.0.0/26".parse::<IpNet>().unwrap(),
    "10.0.0.64/26".parse().unwrap(),
    "10.0.0.128/26".parse().unwrap(),
    "10.0.0.192/26".parse().unwrap(),
]);

let net: IpNet = "fd00::/16".parse().unwrap();
assert_eq!(net.subnets(18).unwrap().collect::<Vec<IpNet>>(), vec![
    "fd00::/18".parse::<IpNet>().unwrap(),
    "fd00:4000::/18".parse().unwrap(),
    "fd00:8000::/18".parse().unwrap(),
    "fd00:c000::/18".parse().unwrap(),
]);

let net: IpNet = "10.0.0.0/24".parse().unwrap();
assert_eq!(net.subnets(23), Err(PrefixLenError));

let net: IpNet = "10.0.0.0/24".parse().unwrap();
assert_eq!(net.subnets(33), Err(PrefixLenError));

let net: IpNet = "fd00::/16".parse().unwrap();
assert_eq!(net.subnets(15), Err(PrefixLenError));

let net: IpNet = "fd00::/16".parse().unwrap();
assert_eq!(net.subnets(129), Err(PrefixLenError));

pub fn contains<T>(&self, other: T) -> bool where
    IpNet: Contains<T>, 
[src]

Test if a network address contains either another network address or an IP address.

Examples

let net4: IpNet = "192.168.0.0/24".parse().unwrap();
let net4_yes: IpNet = "192.168.0.0/25".parse().unwrap();
let net4_no: IpNet = "192.168.0.0/23".parse().unwrap();
let ip4_yes: IpAddr = "192.168.0.1".parse().unwrap();
let ip4_no: IpAddr = "192.168.1.0".parse().unwrap();

assert!(net4.contains(&net4));
assert!(net4.contains(&net4_yes));
assert!(!net4.contains(&net4_no));
assert!(net4.contains(&ip4_yes));
assert!(!net4.contains(&ip4_no));


let net6: IpNet = "fd00::/16".parse().unwrap();
let net6_yes: IpNet = "fd00::/17".parse().unwrap();
let net6_no: IpNet = "fd00::/15".parse().unwrap();
let ip6_yes: IpAddr = "fd00::1".parse().unwrap();
let ip6_no: IpAddr = "fd01::".parse().unwrap();

assert!(net6.contains(&net6));
assert!(net6.contains(&net6_yes));
assert!(!net6.contains(&net6_no));
assert!(net6.contains(&ip6_yes));
assert!(!net6.contains(&ip6_no));

assert!(!net4.contains(&net6));
assert!(!net6.contains(&net4));
assert!(!net4.contains(&ip6_no));
assert!(!net6.contains(&ip4_no));

pub fn aggregate(networks: &Vec<IpNet, Global>) -> Vec<IpNet, Global>[src]

Aggregate a Vec of IpNets and return the result as a new Vec.

Examples

let nets = vec![
    "10.0.0.0/24".parse::<IpNet>().unwrap(),
    "10.0.1.0/24".parse().unwrap(),
    "10.0.2.0/24".parse().unwrap(),
    "fd00::/18".parse().unwrap(),
    "fd00:4000::/18".parse().unwrap(),
    "fd00:8000::/18".parse().unwrap(),
];

assert_eq!(IpNet::aggregate(&nets), vec![
    "10.0.0.0/23".parse::<IpNet>().unwrap(),
    "10.0.2.0/24".parse().unwrap(),
    "fd00::/17".parse().unwrap(),
    "fd00:8000::/18".parse().unwrap(),
]);

Trait Implementations

impl Clone for IpNet[src]

impl Copy for IpNet[src]

impl Debug for IpNet[src]

impl Default for IpNet[src]

impl Display for IpNet[src]

impl Eq for IpNet[src]

impl From<IpAddr> for IpNet[src]

impl From<Ipv4Net> for IpNet[src]

impl From<Ipv6Net> for IpNet[src]

impl FromStr for IpNet[src]

type Err = AddrParseError

The associated error which can be returned from parsing.

impl Hash for IpNet[src]

impl Ord for IpNet[src]

impl PartialEq<IpNet> for IpNet[src]

impl PartialOrd<IpNet> for IpNet[src]

impl StructuralEq for IpNet[src]

impl StructuralPartialEq for IpNet[src]

Auto Trait Implementations

impl RefUnwindSafe for IpNet

impl Send for IpNet

impl Sync for IpNet

impl Unpin for IpNet

impl UnwindSafe for IpNet

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.