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}