systemconfiguration/
bond_interface.rs1use 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}