1use 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 pub fn link(&self) -> LinkHandle {
46 LinkHandle::new(self.clone())
47 }
48
49 pub fn address(&self) -> AddressHandle {
51 AddressHandle::new(self.clone())
52 }
53
54 pub fn route(&self) -> RouteHandle {
56 RouteHandle::new(self.clone())
57 }
58
59 pub fn rule(&self) -> RuleHandle {
61 RuleHandle::new(self.clone())
62 }
63
64 pub fn neighbours(&self) -> NeighbourHandle {
66 NeighbourHandle::new(self.clone())
67 }
68
69 pub fn qdisc(&self) -> QDiscHandle {
72 QDiscHandle::new(self.clone())
73 }
74
75 pub fn traffic_class(&self, ifindex: i32) -> TrafficClassHandle {
78 TrafficClassHandle::new(self.clone(), ifindex)
79 }
80
81 pub fn traffic_filter(&self, ifindex: i32) -> TrafficFilterHandle {
84 TrafficFilterHandle::new(self.clone(), ifindex)
85 }
86
87 pub fn traffic_chain(&self, ifindex: i32) -> TrafficChainHandle {
90 TrafficChainHandle::new(self.clone(), ifindex)
91 }
92}