Skip to main content

systemconfiguration/
vlan_interface.rs

1use 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}