From 4f28c3c02be771a542df4a10a00f51a409010fe4 Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 9 Feb 2022 11:31:01 -0500 Subject: [PATCH] Add `AddressData` to `Ipv4Config` and `Ipv6Config` --- networkmanager/Cargo.toml | 3 +-- networkmanager/src/config/ip4.rs | 27 ++++++++++++++++++++++++++- networkmanager/src/config/ip6.rs | 26 +++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/networkmanager/Cargo.toml b/networkmanager/Cargo.toml index bb1fef5..cef3091 100644 --- a/networkmanager/Cargo.toml +++ b/networkmanager/Cargo.toml @@ -10,5 +10,4 @@ derive_builder = "0.10.2" procfs = { version = "0.12.0", default-features = false } time = "0.3.7" zbus = "2.0.1" - -[features] +zvariant = "3.1.2" diff --git a/networkmanager/src/config/ip4.rs b/networkmanager/src/config/ip4.rs index 6dde76e..404949f 100644 --- a/networkmanager/src/config/ip4.rs +++ b/networkmanager/src/config/ip4.rs @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MPL-2.0 use crate::interface::config::ip4::Ipv4ConfigProxy; -use std::{net::Ipv4Addr, ops::Deref}; +use std::{net::Ipv4Addr, ops::Deref, str::FromStr}; use zbus::Result; +use zvariant::DeserializeDict; #[derive(Debug)] pub struct Ipv4Config<'a>(Ipv4ConfigProxy<'a>); @@ -20,6 +21,24 @@ impl<'a> Ipv4Config<'a> { }) .collect()) } + + pub async fn address_data(&self) -> Result> { + Ok(self + .0 + .address_data() + .await? + .into_iter() + .filter_map(|mut map| { + let address = { + let address_str = map.remove("address")?; + let address_str = address_str.downcast_ref::()?; + Ipv4Addr::from_str(address_str).ok()? + }; + let prefix = u64::try_from(map.remove("prefix")?).ok()? as usize; + Some(AddressData { address, prefix }) + }) + .collect()) + } } impl<'a> Deref for Ipv4Config<'a> { @@ -35,3 +54,9 @@ impl<'a> From> for Ipv4Config<'a> { Ipv4Config(config) } } + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub struct AddressData { + pub address: Ipv4Addr, + pub prefix: usize, +} diff --git a/networkmanager/src/config/ip6.rs b/networkmanager/src/config/ip6.rs index 2a3662f..480c92a 100644 --- a/networkmanager/src/config/ip6.rs +++ b/networkmanager/src/config/ip6.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MPL-2.0 use crate::interface::config::ip6::Ipv6ConfigProxy; -use std::{net::Ipv6Addr, ops::Deref}; +use std::{net::Ipv6Addr, ops::Deref, str::FromStr}; use zbus::Result; #[derive(Debug)] @@ -19,6 +19,24 @@ impl<'a> Ipv6Config<'a> { }) .collect()) } + + pub async fn address_data(&self) -> Result> { + Ok(self + .0 + .address_data() + .await? + .into_iter() + .filter_map(|mut map| { + let address = { + let address_str = map.remove("address")?; + let address_str = address_str.downcast_ref::()?; + Ipv6Addr::from_str(address_str).ok()? + }; + let prefix = u64::try_from(map.remove("prefix")?).ok()? as usize; + Some(AddressData { address, prefix }) + }) + .collect()) + } } impl<'a> Deref for Ipv6Config<'a> { @@ -34,3 +52,9 @@ impl<'a> From> for Ipv6Config<'a> { Ipv6Config(config) } } + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub struct AddressData { + pub address: Ipv6Addr, + pub prefix: usize, +}