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 =
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}