rtnetlink/
handle.rs

1// SPDX-License-Identifier: MIT
2
3use futures::Stream;
4
5use crate::{
6    packet::{NetlinkMessage, RtnlMessage},
7    AddressHandle,
8    Error,
9    LinkHandle,
10    NeighbourHandle,
11    QDiscHandle,
12    RouteHandle,
13    RuleHandle,
14    TrafficChainHandle,
15    TrafficClassHandle,
16    TrafficFilterHandle,
17};
18use netlink_proto::{sys::SocketAddr, ConnectionHandle};
19
20#[derive(Clone, Debug)]
21pub struct Handle(ConnectionHandle<RtnlMessage>);
22
23impl Handle {
24    pub(crate) fn new(conn: ConnectionHandle<RtnlMessage>) -> Self {
25        Handle(conn)
26    }
27
28    pub fn request(
29        &mut self,
30        message: NetlinkMessage<RtnlMessage>,
31    ) -> Result<impl Stream<Item = NetlinkMessage<RtnlMessage>>, Error> {
32        self.0
33            .request(message, SocketAddr::new(0, 0))
34            .map_err(|_| Error::RequestFailed)
35    }
36
37    pub fn notify(&mut self, msg: NetlinkMessage<RtnlMessage>) -> Result<(), Error> {
38        self.0
39            .notify(msg, SocketAddr::new(0, 0))
40            .map_err(|_| Error::RequestFailed)?;
41        Ok(())
42    }
43
44    /// Create a new handle, specifically for link requests (equivalent to `ip link` commands)
45    pub fn link(&self) -> LinkHandle {
46        LinkHandle::new(self.clone())
47    }
48
49    /// Create a new handle, specifically for address requests (equivalent to `ip addr` commands)
50    pub fn address(&self) -> AddressHandle {
51        AddressHandle::new(self.clone())
52    }
53
54    /// Create a new handle, specifically for routing table requests (equivalent to `ip route` commands)
55    pub fn route(&self) -> RouteHandle {
56        RouteHandle::new(self.clone())
57    }
58
59    /// Create a new handle, specifically for routing rule requests (equivalent to `ip rule` commands)
60    pub fn rule(&self) -> RuleHandle {
61        RuleHandle::new(self.clone())
62    }
63
64    /// Create a new handle, specifically for routing neighbours requests (equivalent to `ip neighbour` commands)
65    pub fn neighbours(&self) -> NeighbourHandle {
66        NeighbourHandle::new(self.clone())
67    }
68
69    /// Create a new handle, specifically for traffic control qdisc requests
70    /// (equivalent to `tc qdisc show` commands)
71    pub fn qdisc(&self) -> QDiscHandle {
72        QDiscHandle::new(self.clone())
73    }
74
75    /// Create a new handle, specifically for traffic control class requests
76    /// (equivalent to `tc class show dev <interface_name>` commands)
77    pub fn traffic_class(&self, ifindex: i32) -> TrafficClassHandle {
78        TrafficClassHandle::new(self.clone(), ifindex)
79    }
80
81    /// Create a new handle, specifically for traffic control filter requests
82    /// (equivalent to `tc filter show dev <interface_name>` commands)
83    pub fn traffic_filter(&self, ifindex: i32) -> TrafficFilterHandle {
84        TrafficFilterHandle::new(self.clone(), ifindex)
85    }
86
87    /// Create a new handle, specifically for traffic control chain requests
88    /// (equivalent to `tc chain show dev <interface_name>` commands)
89    pub fn traffic_chain(&self, ifindex: i32) -> TrafficChainHandle {
90        TrafficChainHandle::new(self.clone(), ifindex)
91    }
92}