mirror of
https://github.com/achanda/ipnetwork.git
synced 2025-06-18 09:47:11 +00:00
Add ip_mask_to_prefix, ipv4_mask_to_prefix and ipv6_mask_to_prefix
This commit is contained in:
26
src/ipv4.rs
26
src/ipv4.rs
@ -222,6 +222,18 @@ impl Iterator for Ipv4NetworkIterator {
|
||||
}
|
||||
}
|
||||
|
||||
/// Converts a `Ipv4Addr` network mask into a prefix.
|
||||
/// If the mask is invalid this will return an `IpNetworkError::InvalidPrefix`.
|
||||
pub fn ipv4_mask_to_prefix(mask: Ipv4Addr) -> Result<u8, IpNetworkError> {
|
||||
let mask = u32::from(mask);
|
||||
|
||||
let prefix = (!mask).leading_zeros() as u8;
|
||||
if ((mask as u64) << prefix) & 0xffffffff != 0 {
|
||||
Err(IpNetworkError::InvalidPrefix)
|
||||
} else {
|
||||
Ok(prefix)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
@ -415,4 +427,18 @@ mod test {
|
||||
}
|
||||
assert_eq!(None, iter.next());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn v4_mask_to_prefix() {
|
||||
let mask = Ipv4Addr::new(255, 255, 255, 128);
|
||||
let prefix = ipv4_mask_to_prefix(mask).unwrap();
|
||||
assert_eq!(prefix, 25);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_v4_mask_to_prefix() {
|
||||
let mask = Ipv4Addr::new(255, 0, 255, 0);
|
||||
let prefix = ipv4_mask_to_prefix(mask);
|
||||
assert!(prefix.is_err());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user