From 856109e220781d3365644f8bbae695dff21f93fd Mon Sep 17 00:00:00 2001 From: ivmarkov Date: Thu, 12 Jun 2025 19:36:29 +0000 Subject: [PATCH] Add the netif BSD sockets index (necessary for running mDNS on the ESP-IDF) --- rs-matter/src/data_model/networks/unix.rs | 14 +++++++++++--- rs-matter/src/data_model/sdm/gen_diag.rs | 3 +++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/rs-matter/src/data_model/networks/unix.rs b/rs-matter/src/data_model/networks/unix.rs index ef0e1efa..348e3f4d 100644 --- a/rs-matter/src/data_model/networks/unix.rs +++ b/rs-matter/src/data_model/networks/unix.rs @@ -43,11 +43,14 @@ impl UnixNetifs { let mut netifs: Vec = Vec::new(); for ia in nix::ifaddrs::getifaddrs().map_err(|_| ErrorCode::NoNetworkInterface)? { + let netif_index = + nix::net::if_::if_nametoindex(ia.interface_name.as_str()).unwrap_or(0); + if let Some(netif) = netifs .iter_mut() .find(|netif| netif.name == ia.interface_name) { - netif.load(&ia)?; + netif.load(&ia, netif_index)?; } else { let mut netif = UnixNetif { name: String::new(), @@ -55,9 +58,10 @@ impl UnixNetifs { ipv4addrs: Vec::new(), ipv6addrs: Vec::new(), operational: false, + netif_index: 0, }; - netif.load(&ia)?; + netif.load(&ia, netif_index)?; netifs.push(netif); } @@ -97,6 +101,8 @@ pub struct UnixNetif { pub ipv6addrs: Vec, /// Operational status pub operational: bool, + /// Interface index + pub netif_index: u32, } impl UnixNetif { @@ -111,14 +117,16 @@ impl UnixNetif { ipv4_addrs: &self.ipv4addrs, ipv6_addrs: &self.ipv6addrs, netif_type: InterfaceTypeEnum::Unspecified, // TODO + netif_index: self.netif_index, } } /// Augment the information of the network interface with /// the provided `InterfaceAddress`. - fn load(&mut self, ia: &InterfaceAddress) -> Result<(), Error> { + fn load(&mut self, ia: &InterfaceAddress, index: u32) -> Result<(), Error> { self.name = ia.interface_name.clone(); self.operational |= ia.flags.contains(InterfaceFlags::IFF_RUNNING); + self.netif_index = index; if let Some(address) = ia.address.as_ref() { if let Some(link_addr) = address.as_link_addr() { diff --git a/rs-matter/src/data_model/sdm/gen_diag.rs b/rs-matter/src/data_model/sdm/gen_diag.rs index 465dc68e..4d0a5b7b 100644 --- a/rs-matter/src/data_model/sdm/gen_diag.rs +++ b/rs-matter/src/data_model/sdm/gen_diag.rs @@ -52,6 +52,9 @@ pub struct NetifInfo<'a> { pub ipv6_addrs: &'a [Ipv6Addr], /// The type of the network interface. pub netif_type: InterfaceTypeEnum, + /// The index of the network interface. + /// Might not be available on all platforms. + pub netif_index: u32, } impl NetifInfo<'_> {