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 =
35            unsafe { ffi::network_interface::sc_bond_interface_copy_all(preferences.as_ptr()) };
36        bridge::take_handle_array(raw, Self::from_owned_handle)
37    }
38
39    pub fn copy_available_member_interfaces(preferences: &Preferences) -> Vec<NetworkInterface> {
40        let raw = unsafe {
41            ffi::network_interface::sc_bond_interface_copy_available_member_interfaces(
42                preferences.as_ptr(),
43            )
44        };
45        bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
46    }
47
48    pub fn create(preferences: &Preferences) -> Result<Self> {
49        let raw = unsafe { ffi::network_interface::sc_bond_interface_create(preferences.as_ptr()) };
50        let raw = bridge::owned_handle_or_last("sc_bond_interface_create", raw)?;
51        Ok(Self { raw })
52    }
53
54    pub fn member_interfaces(&self) -> Vec<NetworkInterface> {
55        let raw = unsafe {
56            ffi::network_interface::sc_bond_interface_copy_member_interfaces(self.raw.as_ptr())
57        };
58        bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
59    }
60
61    pub fn options(&self) -> Option<PropertyList> {
62        unsafe {
63            bridge::OwnedHandle::from_raw(ffi::network_interface::sc_bond_interface_copy_options(
64                self.raw.as_ptr(),
65            ))
66        }
67        .map(PropertyList::from_owned_handle)
68    }
69
70    pub fn remove(&self) -> Result<()> {
71        let ok = unsafe { ffi::network_interface::sc_bond_interface_remove(self.raw.as_ptr()) };
72        bridge::bool_result("sc_bond_interface_remove", ok)
73    }
74
75    pub fn set_localized_display_name(&self, name: &str) -> Result<()> {
76        let name = bridge::cstring(name, "sc_bond_interface_set_localized_display_name")?;
77        let ok = unsafe {
78            ffi::network_interface::sc_bond_interface_set_localized_display_name(
79                self.raw.as_ptr(),
80                name.as_ptr(),
81            )
82        };
83        bridge::bool_result("sc_bond_interface_set_localized_display_name", ok)
84    }
85
86    pub fn set_member_interfaces(&self, members: &[NetworkInterface]) -> Result<()> {
87        let members = HandleArray::new(members, NetworkInterface::as_ptr);
88        let ok = unsafe {
89            ffi::network_interface::sc_bond_interface_set_member_interfaces(
90                self.raw.as_ptr(),
91                members.as_ptr(),
92                members.count(),
93            )
94        };
95        bridge::bool_result("sc_bond_interface_set_member_interfaces", ok)
96    }
97
98    pub fn set_options(&self, options: &PropertyList) -> Result<()> {
99        let ok = unsafe {
100            ffi::network_interface::sc_bond_interface_set_options(
101                self.raw.as_ptr(),
102                options.as_ptr(),
103            )
104        };
105        bridge::bool_result("sc_bond_interface_set_options", ok)
106    }
107
108    pub fn status(&self) -> Option<BondStatus> {
109        unsafe {
110            bridge::OwnedHandle::from_raw(ffi::network_interface::sc_bond_interface_copy_status(
111                self.raw.as_ptr(),
112            ))
113        }
114        .map(BondStatus::from_owned_handle)
115    }
116
117    pub fn as_network_interface(&self) -> NetworkInterface {
118        NetworkInterface::from_owned_handle(self.raw.clone())
119    }
120
121    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
122        Self { raw }
123    }
124}
125
126impl BondStatus {
127    pub fn type_id() -> u64 {
128        unsafe { ffi::network_interface::sc_bond_status_get_type_id() }
129    }
130
131    pub fn device_aggregation_status_key() -> Result<String> {
132        bridge::take_optional_string(unsafe {
133            ffi::network_interface::sc_bond_status_copy_device_aggregation_status_key()
134        })
135        .ok_or_else(|| {
136            SystemConfigurationError::null(
137                "sc_bond_status_copy_device_aggregation_status_key",
138                "bridge returned null bond aggregation-status key",
139            )
140        })
141    }
142
143    pub fn device_collecting_key() -> Result<String> {
144        bridge::take_optional_string(unsafe {
145            ffi::network_interface::sc_bond_status_copy_device_collecting_key()
146        })
147        .ok_or_else(|| {
148            SystemConfigurationError::null(
149                "sc_bond_status_copy_device_collecting_key",
150                "bridge returned null bond collecting-status key",
151            )
152        })
153    }
154
155    pub fn device_distributing_key() -> Result<String> {
156        bridge::take_optional_string(unsafe {
157            ffi::network_interface::sc_bond_status_copy_device_distributing_key()
158        })
159        .ok_or_else(|| {
160            SystemConfigurationError::null(
161                "sc_bond_status_copy_device_distributing_key",
162                "bridge returned null bond distributing-status key",
163            )
164        })
165    }
166
167    pub fn member_interfaces(&self) -> Vec<NetworkInterface> {
168        let raw = unsafe {
169            ffi::network_interface::sc_bond_status_copy_member_interfaces(self.raw.as_ptr())
170        };
171        bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
172    }
173
174    pub fn interface_status(&self, interface: Option<&NetworkInterface>) -> Option<PropertyList> {
175        let raw = unsafe {
176            ffi::network_interface::sc_bond_status_copy_interface_status(
177                self.raw.as_ptr(),
178                interface.map_or(std::ptr::null_mut(), NetworkInterface::as_ptr),
179            )
180        };
181        unsafe { bridge::OwnedHandle::from_raw(raw) }.map(PropertyList::from_owned_handle)
182    }
183
184    pub fn bond_status(&self) -> Result<PropertyList> {
185        self.interface_status(None).ok_or_else(|| {
186            SystemConfigurationError::null(
187                "sc_bond_status_copy_interface_status",
188                "bridge returned null bond status dictionary",
189            )
190        })
191    }
192
193    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
194        Self { raw }
195    }
196}