rtnetlink/neighbour/
get.rs1use futures::{
4 future::{self, Either},
5 stream::{StreamExt, TryStream},
6 FutureExt,
7};
8
9use netlink_packet_route::{
10 constants::*,
11 neighbour::NeighbourMessage,
12 NetlinkPayload,
13 RtnlMessage,
14};
15
16use netlink_proto::packet::NetlinkMessage;
17
18use crate::{Error, Handle, IpVersion};
19
20pub struct NeighbourGetRequest {
21 handle: Handle,
22 message: NeighbourMessage,
23}
24
25impl NeighbourGetRequest {
26 pub(crate) fn new(handle: Handle) -> Self {
27 let message = NeighbourMessage::default();
28 NeighbourGetRequest { handle, message }
29 }
30
31 pub fn proxies(mut self) -> Self {
33 self.message.header.flags |= NTF_PROXY;
34 self
35 }
36
37 pub fn set_family(mut self, ip_version: IpVersion) -> Self {
38 self.message.header.family = ip_version.family();
39 self
40 }
41
42 pub fn execute(self) -> impl TryStream<Ok = NeighbourMessage, Error = Error> {
44 let NeighbourGetRequest {
45 mut handle,
46 message,
47 } = self;
48
49 let mut req = NetlinkMessage::from(RtnlMessage::GetNeighbour(message));
50 req.header.flags = NLM_F_REQUEST | NLM_F_DUMP;
51
52 match handle.request(req) {
53 Ok(response) => Either::Left(response.map(move |msg| {
54 let (header, payload) = msg.into_parts();
55 match payload {
56 NetlinkPayload::InnerMessage(RtnlMessage::NewNeighbour(msg)) => Ok(msg),
57 NetlinkPayload::Error(err) => Err(Error::NetlinkError(err)),
58 _ => Err(Error::UnexpectedMessage(NetlinkMessage::new(
59 header, payload,
60 ))),
61 }
62 })),
63 Err(e) => Either::Right(future::err::<NeighbourMessage, Error>(e).into_stream()),
64 }
65 }
66
67 pub fn message_mut(&mut self) -> &mut NeighbourMessage {
69 &mut self.message
70 }
71}