rtnetlink/link/
mac_vtap.rs

1// SPDX-License-Identifier: MIT
2
3use crate::{
4    link::LinkMessageBuilder,
5    packet_route::link::{InfoData, InfoKind, InfoMacVtap, MacVtapMode},
6};
7
8/// Represent MAC VTAP interface.
9/// Example code on creating a MAC VTAP interface
10/// ```no_run
11/// use rtnetlink::{new_connection, packet_route::link::MacVtapMode,
12///                 LinkMacVtap};
13///
14/// #[tokio::main]
15/// async fn main() -> Result<(), String> {
16///     let (connection, handle, _) = new_connection().unwrap();
17///     tokio::spawn(connection);
18///
19///     handle
20///         .link()
21///         .add(
22///             LinkMacVtap::new("macvtap100", 10, MacVtapMode::Bridge)
23///                 .up()
24///                 .build(),
25///         )
26///         .execute()
27///         .await
28///         .map_err(|e| format!("{e}"))
29/// }
30/// ```
31///
32/// Please check LinkMessageBuilder::<LinkMacVtap> for more detail.
33#[derive(Debug)]
34pub struct LinkMacVtap;
35
36impl LinkMacVtap {
37    /// Wrapper of `LinkMessageBuilder::<LinkMacVtap>::new().link().mode()`
38    pub fn new(
39        name: &str,
40        base_iface_index: u32,
41        mode: MacVtapMode,
42    ) -> LinkMessageBuilder<Self> {
43        LinkMessageBuilder::<LinkMacVtap>::new(name)
44            .link(base_iface_index)
45            .mode(mode)
46    }
47}
48
49impl LinkMessageBuilder<LinkMacVtap> {
50    /// Create [LinkMessageBuilder] for Mac VTAP interface
51    pub fn new(name: &str) -> Self {
52        LinkMessageBuilder::<LinkMacVtap>::new_with_info_kind(InfoKind::MacVtap)
53            .name(name.to_string())
54    }
55
56    pub fn append_info_data(mut self, info: InfoMacVtap) -> Self {
57        if let InfoData::MacVtap(infos) = self
58            .info_data
59            .get_or_insert_with(|| InfoData::MacVtap(Vec::new()))
60        {
61            infos.push(info);
62        }
63        self
64    }
65
66    pub fn mode(self, mode: MacVtapMode) -> Self {
67        self.append_info_data(InfoMacVtap::Mode(mode))
68    }
69}