rtnetlink/link/
handle.rs

1// SPDX-License-Identifier: MIT
2
3use super::{
4    LinkAddRequest, LinkDelPropRequest, LinkDelRequest, LinkGetRequest,
5    LinkNewPropRequest, LinkSetRequest,
6};
7use crate::{
8    packet_core::{NLM_F_ACK, NLM_F_REQUEST},
9    packet_route::link::LinkMessage,
10    Handle,
11};
12
13pub struct LinkHandle(Handle);
14
15impl LinkHandle {
16    pub fn new(handle: Handle) -> Self {
17        LinkHandle(handle)
18    }
19
20    /// Using `RTM_SETLINK`. Currently this is only used for bridge commands
21    /// like `bridge vlan` and `bridge vlan`.
22    /// For changing existing network interface, please use
23    /// [LinkHandle::add()]
24    pub fn set(&self, message: LinkMessage) -> LinkSetRequest {
25        LinkSetRequest::new(self.0.clone(), message)
26    }
27
28    pub fn add(&self, message: LinkMessage) -> LinkAddRequest {
29        LinkAddRequest::new(self.0.clone(), message)
30    }
31
32    /// Equal to `ip link set` command.
33    pub fn change(&self, message: LinkMessage) -> LinkAddRequest {
34        LinkAddRequest::new(self.0.clone(), message)
35            .set_flags(NLM_F_REQUEST | NLM_F_ACK)
36    }
37
38    pub fn property_add(&self, index: u32) -> LinkNewPropRequest {
39        LinkNewPropRequest::new(self.0.clone(), index)
40    }
41
42    pub fn property_del(&self, index: u32) -> LinkDelPropRequest {
43        LinkDelPropRequest::new(self.0.clone(), index)
44    }
45
46    pub fn del(&self, index: u32) -> LinkDelRequest {
47        LinkDelRequest::new(self.0.clone(), index)
48    }
49
50    /// Delete specified information from interface.
51    /// For example: To delete bridge VLANs, it is required to include
52    /// LinkMessage of VLAN information to delete.
53    pub fn del_with_message(&self, message: LinkMessage) -> LinkDelRequest {
54        LinkDelRequest::new_with_message(self.0.clone(), message)
55    }
56
57    /// Retrieve the list of links (equivalent to `ip link show`)
58    pub fn get(&self) -> LinkGetRequest {
59        LinkGetRequest::new(self.0.clone())
60    }
61
62    /// The `LinkHandle::set()` cannot be used for setting bond or bridge port
63    /// configuration, `RTM_NEWLINK` and `NLM_F_REQUEST|NLM_F_ACK` are required,
64    /// Equal to `LinkAddRequest::new().set_flags(NLM_F_REQUEST | NLM_F_ACK)`
65    pub fn set_port(&self, message: LinkMessage) -> LinkAddRequest {
66        LinkAddRequest::new(self.0.clone(), message)
67            .set_flags(NLM_F_REQUEST | NLM_F_ACK)
68    }
69}