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