systemconfiguration/
vlan_interface.rs1use crate::{
2 bridge, error::Result, ffi, network_interface::NetworkInterface, preferences::Preferences,
3 PropertyList,
4};
5
6#[derive(Clone)]
7pub struct VlanInterface {
9 raw: bridge::OwnedHandle,
10}
11
12impl std::fmt::Debug for VlanInterface {
13 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14 f.debug_struct("VlanInterface").finish_non_exhaustive()
15 }
16}
17
18impl VlanInterface {
19 pub fn copy_all(preferences: &Preferences) -> Vec<Self> {
21 let raw =
22 unsafe { ffi::network_interface::sc_vlan_interface_copy_all(preferences.as_ptr()) };
23 bridge::take_handle_array(raw, Self::from_owned_handle)
24 }
25
26 pub fn copy_available_physical_interfaces() -> Vec<NetworkInterface> {
28 let raw = unsafe {
29 ffi::network_interface::sc_vlan_interface_copy_available_physical_interfaces()
30 };
31 bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
32 }
33
34 pub fn create(
36 preferences: &Preferences,
37 physical: &NetworkInterface,
38 tag: i32,
39 ) -> Result<Self> {
40 let raw = unsafe {
41 ffi::network_interface::sc_vlan_interface_create(
42 preferences.as_ptr(),
43 physical.as_ptr(),
44 tag,
45 )
46 };
47 let raw = bridge::owned_handle_or_last("sc_vlan_interface_create", raw)?;
48 Ok(Self { raw })
49 }
50
51 pub fn options(&self) -> Option<PropertyList> {
53 unsafe {
54 bridge::OwnedHandle::from_raw(ffi::network_interface::sc_vlan_interface_copy_options(
55 self.raw.as_ptr(),
56 ))
57 }
58 .map(PropertyList::from_owned_handle)
59 }
60
61 pub fn physical_interface(&self) -> Option<NetworkInterface> {
63 unsafe {
64 bridge::OwnedHandle::from_raw(
65 ffi::network_interface::sc_vlan_interface_copy_physical_interface(
66 self.raw.as_ptr(),
67 ),
68 )
69 }
70 .map(NetworkInterface::from_owned_handle)
71 }
72
73 pub fn tag(&self) -> Result<Option<i32>> {
75 let mut tag = 0_i32;
76 let ok = unsafe {
77 ffi::network_interface::sc_vlan_interface_get_tag(self.raw.as_ptr(), &mut tag)
78 };
79 if ok == 0 {
80 return Ok(None);
81 }
82 Ok(Some(tag))
83 }
84
85 pub fn remove(&self) -> Result<()> {
87 let ok = unsafe { ffi::network_interface::sc_vlan_interface_remove(self.raw.as_ptr()) };
88 bridge::bool_result("sc_vlan_interface_remove", ok)
89 }
90
91 pub fn set_localized_display_name(&self, name: &str) -> Result<()> {
93 let name = bridge::cstring(name, "sc_vlan_interface_set_localized_display_name")?;
94 let ok = unsafe {
95 ffi::network_interface::sc_vlan_interface_set_localized_display_name(
96 self.raw.as_ptr(),
97 name.as_ptr(),
98 )
99 };
100 bridge::bool_result("sc_vlan_interface_set_localized_display_name", ok)
101 }
102
103 pub fn set_options(&self, options: &PropertyList) -> Result<()> {
105 let ok = unsafe {
106 ffi::network_interface::sc_vlan_interface_set_options(
107 self.raw.as_ptr(),
108 options.as_ptr(),
109 )
110 };
111 bridge::bool_result("sc_vlan_interface_set_options", ok)
112 }
113
114 pub fn set_physical_interface_and_tag(
116 &self,
117 physical: &NetworkInterface,
118 tag: i32,
119 ) -> Result<()> {
120 let ok = unsafe {
121 ffi::network_interface::sc_vlan_interface_set_physical_interface_and_tag(
122 self.raw.as_ptr(),
123 physical.as_ptr(),
124 tag,
125 )
126 };
127 bridge::bool_result("sc_vlan_interface_set_physical_interface_and_tag", ok)
128 }
129
130 pub fn as_network_interface(&self) -> NetworkInterface {
132 NetworkInterface::from_owned_handle(self.raw.clone())
133 }
134
135 pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
136 Self { raw }
137 }
138}