rtnetlink/
handle.rs

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