1use 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 pub fn link(&self) -> LinkHandle {
44 LinkHandle::new(self.clone())
45 }
46
47 pub fn address(&self) -> AddressHandle {
50 AddressHandle::new(self.clone())
51 }
52
53 pub fn route(&self) -> RouteHandle {
56 RouteHandle::new(self.clone())
57 }
58
59 pub fn rule(&self) -> RuleHandle {
62 RuleHandle::new(self.clone())
63 }
64
65 pub fn neighbours(&self) -> NeighbourHandle {
68 NeighbourHandle::new(self.clone())
69 }
70
71 pub fn qdisc(&self) -> QDiscHandle {
74 QDiscHandle::new(self.clone())
75 }
76
77 pub fn traffic_class(&self, ifindex: i32) -> TrafficClassHandle {
80 TrafficClassHandle::new(self.clone(), ifindex)
81 }
82
83 pub fn traffic_filter(&self, ifindex: i32) -> TrafficFilterHandle {
86 TrafficFilterHandle::new(self.clone(), ifindex)
87 }
88
89 pub fn traffic_chain(&self, ifindex: i32) -> TrafficChainHandle {
92 TrafficChainHandle::new(self.clone(), ifindex)
93 }
94}