Add ip_mask_to_prefix, ipv4_mask_to_prefix and ipv6_mask_to_prefix

This commit is contained in:
Edward Barnard
2016-07-14 21:37:39 +02:00
parent e9aeab4cb4
commit 8463a3fc5e
3 changed files with 86 additions and 2 deletions

View File

@ -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());
}
}