pub enum IpNet {
V4(Ipv4Net),
V6(Ipv6Net),
}
Expand description
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§
Source§impl IpNet
impl IpNet
Sourcepub fn new(ip: IpAddr, prefix_len: u8) -> Result<IpNet, PrefixLenError>
pub fn new(ip: IpAddr, prefix_len: u8) -> Result<IpNet, PrefixLenError>
Creates a new IP network address from an IpAddr
and prefix
length.
§Examples
use std::net::Ipv6Addr;
use ipnet::{IpNet, PrefixLenError};
let net = IpNet::new(Ipv6Addr::LOCALHOST.into(), 48);
assert!(net.is_ok());
let bad_prefix_len = IpNet::new(Ipv6Addr::LOCALHOST.into(), 129);
assert_eq!(bad_prefix_len, Err(PrefixLenError));
Sourcepub const fn new_assert(ip: IpAddr, prefix_len: u8) -> IpNet
pub const fn new_assert(ip: IpAddr, prefix_len: u8) -> IpNet
Creates a new IP network address from an IpAddr
and prefix
length. If called from a const context it will verify prefix length
at compile time. Otherwise it will panic at runtime if prefix length
is incorrect for a given IpAddr type.
§Examples
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use ipnet::{IpNet};
// This code is verified at compile time:
const NET: IpNet = IpNet::new_assert(IpAddr::V4(Ipv4Addr::new(10, 1, 1, 0)), 24);
assert_eq!(NET.prefix_len(), 24);
// This code is verified at runtime:
let net = IpNet::new_assert(Ipv6Addr::LOCALHOST.into(), 24);
assert_eq!(net.prefix_len(), 24);
// This code does not compile:
// const BAD_PREFIX_LEN: IpNet = IpNet::new_assert(IpAddr::V4(Ipv4Addr::new(10, 1, 1, 0)), 33);
// This code panics at runtime:
// let bad_prefix_len = IpNet::new_assert(Ipv6Addr::LOCALHOST.into(), 129);
Sourcepub fn with_netmask(
ip: IpAddr,
netmask: IpAddr,
) -> Result<IpNet, PrefixLenError>
pub fn with_netmask( ip: IpAddr, netmask: IpAddr, ) -> Result<IpNet, PrefixLenError>
Creates a new IP network address from an IpAddr
and netmask.
§Examples
use std::net::Ipv6Addr;
use ipnet::{IpNet, PrefixLenError};
let net = IpNet::with_netmask(Ipv6Addr::LOCALHOST.into(), Ipv6Addr::from(0xffff_ffff_ffff_0000_0000_0000_0000_0000).into());
assert!(net.is_ok());
let bad_prefix_len = IpNet::with_netmask(Ipv6Addr::LOCALHOST.into(), Ipv6Addr::from(0xffff_ffff_ffff_0000_0001_0000_0000_0000).into());
assert_eq!(bad_prefix_len, Err(PrefixLenError));
Sourcepub fn trunc(&self) -> IpNet
pub fn trunc(&self) -> IpNet
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()
);
Sourcepub fn prefix_len(&self) -> u8
pub fn prefix_len(&self) -> u8
Returns the prefix length.
Sourcepub fn max_prefix_len(&self) -> u8
pub fn max_prefix_len(&self) -> u8
Returns the maximum valid prefix length.
Sourcepub fn netmask(&self) -> IpAddr
pub fn netmask(&self) -> IpAddr
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());
Sourcepub fn hostmask(&self) -> IpAddr
pub fn hostmask(&self) -> IpAddr
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());
Sourcepub fn network(&self) -> IpAddr
pub fn network(&self) -> IpAddr
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());
Sourcepub fn broadcast(&self) -> IpAddr
pub fn broadcast(&self) -> IpAddr
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());
Sourcepub fn supernet(&self) -> Option<IpNet>
pub fn supernet(&self) -> Option<IpNet>
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);
Sourcepub fn is_sibling(&self, other: &IpNet) -> bool
pub fn is_sibling(&self, other: &IpNet) -> bool
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));
Sourcepub fn hosts(&self) -> IpAddrRange
pub fn hosts(&self) -> IpAddrRange
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(),
]);
Sourcepub fn subnets(&self, new_prefix_len: u8) -> Result<IpSubnets, PrefixLenError>
pub fn subnets(&self, new_prefix_len: u8) -> Result<IpSubnets, PrefixLenError>
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));
Sourcepub fn contains<T>(&self, other: T) -> boolwhere
IpNet: Contains<T>,
pub fn contains<T>(&self, other: T) -> boolwhere
IpNet: Contains<T>,
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));
Sourcepub fn aggregate(networks: &Vec<IpNet>) -> Vec<IpNet>
pub fn aggregate(networks: &Vec<IpNet>) -> Vec<IpNet>
Aggregate a Vec
of IpNet
s 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(),
]);