xref: /webrtc/util/src/vnet/interface.rs (revision ffe74184)
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