Skip to main content

ip_nlroute/addr/
get_response.rs

1use super::AddressFlags;
2use crate::error::Error;
3use std::collections::BTreeMap;
4use std::net::Ipv4Addr;
5
6#[derive(Debug)]
7pub struct AddrGetResponse {
8    pub interfaces: BTreeMap<u32, AddrGetInterface>,
9}
10
11impl AddrGetResponse {
12    pub fn get_only(&self) -> Result<&AddrGetInterface, Error> {
13        if let Some((_, iface)) = self.interfaces.first_key_value()
14            && self.interfaces.len() == 1
15        {
16            Ok(iface)
17        } else {
18            Err(Error::ExpectedExactlyOne {
19                what: "interface",
20                len: self.interfaces.len(),
21            })
22        }
23    }
24
25    pub fn interfaces_iter(&self) -> impl Iterator<Item = &AddrGetInterface> {
26        self.interfaces.values()
27    }
28}
29
30#[derive(Debug)]
31pub struct AddrGetInterface {
32    pub if_name: Option<String>,
33    pub(crate) addresses: Vec<AddrGetInterfaceAddressV4>,
34}
35
36impl AddrGetInterface {
37    pub fn addresses_v4(&self) -> &[AddrGetInterfaceAddressV4] {
38        self.addresses.as_slice()
39    }
40}
41
42#[derive(Debug, Default)]
43pub struct AddrGetInterfaceAddressV4 {
44    // these are named here for what netlink calls them.
45    pub(crate) local: Option<Ipv4Addr>,
46    pub(crate) address: Option<Ipv4Addr>,
47
48    pub prefix_len: u8,
49    pub flags: AddressFlags,
50    pub broadcast: Option<Ipv4Addr>,
51    pub label: Option<String>,
52}
53
54impl AddrGetInterfaceAddressV4 {
55    pub fn ip(&self) -> Option<Ipv4Addr> {
56        if let Some(ip) = self.local {
57            Some(ip)
58        } else {
59            self.address
60        }
61    }
62
63    pub fn peer_ip(&self) -> Option<Ipv4Addr> {
64        if let (Some(local), Some(address)) = (self.local, self.address)
65            && local != address
66        {
67            Some(address)
68        } else {
69            None
70        }
71    }
72}