1 use crate::error::*; 2 use ipnet::*; 3 use std::net::SocketAddr; 4 use std::str::FromStr; 5 6 #[derive(Debug, Clone, Default)] 7 pub struct Interface { 8 pub(crate) name: String, 9 pub(crate) addrs: Vec<IpNet>, 10 } 11 12 impl Interface { new(name: String, addrs: Vec<IpNet>) -> Self13 pub fn new(name: String, addrs: Vec<IpNet>) -> Self { 14 Interface { name, addrs } 15 } 16 add_addr(&mut self, addr: IpNet)17 pub fn add_addr(&mut self, addr: IpNet) { 18 self.addrs.push(addr); 19 } 20 name(&self) -> &str21 pub fn name(&self) -> &str { 22 &self.name 23 } addrs(&self) -> &[IpNet]24 pub fn addrs(&self) -> &[IpNet] { 25 &self.addrs 26 } 27 convert(addr: SocketAddr, mask: Option<SocketAddr>) -> Result<IpNet>28 pub fn convert(addr: SocketAddr, mask: Option<SocketAddr>) -> Result<IpNet> { 29 let prefix = if let Some(mask) = mask { 30 match (addr, mask) { 31 (SocketAddr::V4(_), SocketAddr::V4(mask)) => { 32 let octets = mask.ip().octets(); 33 let mut prefix = 0; 34 for octet in &octets { 35 for i in 0..8 { 36 prefix += (*octet >> (7 - i)) & 0x1; 37 } 38 } 39 prefix 40 } 41 (SocketAddr::V6(_), SocketAddr::V6(mask)) => { 42 let octets = mask.ip().octets(); 43 let mut prefix = 0; 44 for octet in &octets { 45 for i in 0..8 { 46 prefix += (*octet >> (7 - i)) & 0x1; 47 } 48 } 49 prefix 50 } 51 _ => return Err(Error::ErrInvalidMask), 52 } 53 } else { 54 32 55 }; 56 let s = format!("{}/{}", addr.ip(), prefix); 57 58 Ok(IpNet::from_str(&s)?) 59 } 60 } 61