Skip to main content

systemconfiguration/
bond_interface.rs

1use crate::{
2    bridge::{self, HandleArray},
3    error::Result,
4    ffi,
5    network_interface::NetworkInterface,
6    preferences::Preferences,
7    PropertyList, SystemConfigurationError,
8};
9
10#[derive(Clone)]
11pub struct BondInterface {
12    raw: bridge::OwnedHandle,
13}
14
15impl std::fmt::Debug for BondInterface {
16    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17        f.debug_struct("BondInterface").finish_non_exhaustive()
18    }
19}
20
21#[derive(Clone)]
22pub struct BondStatus {
23    raw: bridge::OwnedHandle,
24}
25
26impl std::fmt::Debug for BondStatus {
27    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28        f.debug_struct("BondStatus").finish_non_exhaustive()
29    }
30}
31
32impl BondInterface {
33    pub fn copy_all(preferences: &Preferences) -> Vec<Self> {
34        let raw = unsafe { ffi::network_interface::sc_bond_interface_copy_all(preferences.as_ptr()) };
35        bridge::take_handle_array(raw, Self::from_owned_handle)
36    }
37
38    pub fn copy_available_member_interfaces(preferences: &Preferences) -> Vec<NetworkInterface> {
39        let raw = unsafe {
40            ffi::network_interface::sc_bond_interface_copy_available_member_interfaces(preferences.as_ptr())
41        };
42        bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
43    }
44
45    pub fn create(preferences: &Preferences) -> Result<Self> {
46        let raw = unsafe { ffi::network_interface::sc_bond_interface_create(preferences.as_ptr()) };
47        let raw = bridge::owned_handle_or_last("sc_bond_interface_create", raw)?;
48        Ok(Self { raw })
49    }
50
51    pub fn member_interfaces(&self) -> Vec<NetworkInterface> {
52        let raw = unsafe { ffi::network_interface::sc_bond_interface_copy_member_interfaces(self.raw.as_ptr()) };
53        bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
54    }
55
56    pub fn options(&self) -> Option<PropertyList> {
57        unsafe { bridge::OwnedHandle::from_raw(ffi::network_interface::sc_bond_interface_copy_options(self.raw.as_ptr())) }
58            .map(PropertyList::from_owned_handle)
59    }
60
61    pub fn remove(&self) -> Result<()> {
62        let ok = unsafe { ffi::network_interface::sc_bond_interface_remove(self.raw.as_ptr()) };
63        bridge::bool_result("sc_bond_interface_remove", ok)
64    }
65
66    pub fn set_localized_display_name(&self, name: &str) -> Result<()> {
67        let name = bridge::cstring(name, "sc_bond_interface_set_localized_display_name")?;
68        let ok = unsafe {
69            ffi::network_interface::sc_bond_interface_set_localized_display_name(self.raw.as_ptr(), name.as_ptr())
70        };
71        bridge::bool_result("sc_bond_interface_set_localized_display_name", ok)
72    }
73
74    pub fn set_member_interfaces(&self, members: &[NetworkInterface]) -> Result<()> {
75        let members = HandleArray::new(members, NetworkInterface::as_ptr);
76        let ok = unsafe {
77            ffi::network_interface::sc_bond_interface_set_member_interfaces(
78                self.raw.as_ptr(),
79                members.as_ptr(),
80                members.count(),
81            )
82        };
83        bridge::bool_result("sc_bond_interface_set_member_interfaces", ok)
84    }
85
86    pub fn set_options(&self, options: &PropertyList) -> Result<()> {
87        let ok = unsafe {
88            ffi::network_interface::sc_bond_interface_set_options(self.raw.as_ptr(), options.as_ptr())
89        };
90        bridge::bool_result("sc_bond_interface_set_options", ok)
91    }
92
93    pub fn status(&self) -> Option<BondStatus> {
94        unsafe { bridge::OwnedHandle::from_raw(ffi::network_interface::sc_bond_interface_copy_status(self.raw.as_ptr())) }
95            .map(BondStatus::from_owned_handle)
96    }
97
98    pub fn as_network_interface(&self) -> NetworkInterface {
99        NetworkInterface::from_owned_handle(self.raw.clone())
100    }
101
102    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
103        Self { raw }
104    }
105
106}
107
108impl BondStatus {
109    pub fn type_id() -> u64 {
110        unsafe { ffi::network_interface::sc_bond_status_get_type_id() }
111    }
112
113    pub fn device_aggregation_status_key() -> Result<String> {
114        bridge::take_optional_string(unsafe {
115            ffi::network_interface::sc_bond_status_copy_device_aggregation_status_key()
116        })
117        .ok_or_else(|| {
118            SystemConfigurationError::null(
119                "sc_bond_status_copy_device_aggregation_status_key",
120                "bridge returned null bond aggregation-status key",
121            )
122        })
123    }
124
125    pub fn device_collecting_key() -> Result<String> {
126        bridge::take_optional_string(unsafe {
127            ffi::network_interface::sc_bond_status_copy_device_collecting_key()
128        })
129        .ok_or_else(|| {
130            SystemConfigurationError::null(
131                "sc_bond_status_copy_device_collecting_key",
132                "bridge returned null bond collecting-status key",
133            )
134        })
135    }
136
137    pub fn device_distributing_key() -> Result<String> {
138        bridge::take_optional_string(unsafe {
139            ffi::network_interface::sc_bond_status_copy_device_distributing_key()
140        })
141        .ok_or_else(|| {
142            SystemConfigurationError::null(
143                "sc_bond_status_copy_device_distributing_key",
144                "bridge returned null bond distributing-status key",
145            )
146        })
147    }
148
149    pub fn member_interfaces(&self) -> Vec<NetworkInterface> {
150        let raw = unsafe { ffi::network_interface::sc_bond_status_copy_member_interfaces(self.raw.as_ptr()) };
151        bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
152    }
153
154    pub fn interface_status(&self, interface: Option<&NetworkInterface>) -> Option<PropertyList> {
155        let raw = unsafe {
156            ffi::network_interface::sc_bond_status_copy_interface_status(
157                self.raw.as_ptr(),
158                interface.map_or(std::ptr::null_mut(), NetworkInterface::as_ptr),
159            )
160        };
161        unsafe { bridge::OwnedHandle::from_raw(raw) }.map(PropertyList::from_owned_handle)
162    }
163
164    pub fn bond_status(&self) -> Result<PropertyList> {
165        self.interface_status(None).ok_or_else(|| {
166            SystemConfigurationError::null(
167                "sc_bond_status_copy_interface_status",
168                "bridge returned null bond status dictionary",
169            )
170        })
171    }
172
173    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
174        Self { raw }
175    }
176}