From ed5a194402ba7b82d0427cc4d4e5a00e68446bd5 Mon Sep 17 00:00:00 2001 From: Eric Long Date: Sun, 10 Nov 2024 11:22:55 +0800 Subject: [PATCH 1/2] Replace `impl TryStream` with `impl Stream` The problem with `impl TryStream` is that the opaque type cannot be used as `Stream` (thus `StreamExt`) anymore, only `TryStream`, because types implementing the latter does not necessarily implement the former. This also causes problems with dynamic dispatch. By making this change we can use methods from both traits and should not break users' current usage. --- src/addr/get.rs | 4 ++-- src/link/get.rs | 4 ++-- src/neighbour/get.rs | 4 ++-- src/route/get.rs | 4 ++-- src/rule/get.rs | 4 ++-- src/traffic_control/get.rs | 10 +++++----- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/addr/get.rs b/src/addr/get.rs index c64d86d..35f78c8 100644 --- a/src/addr/get.rs +++ b/src/addr/get.rs @@ -2,7 +2,7 @@ use futures::{ future::{self, Either}, - stream::{StreamExt, TryStream, TryStreamExt}, + stream::{Stream, StreamExt, TryStreamExt}, FutureExt, }; use std::net::IpAddr; @@ -34,7 +34,7 @@ impl AddressGetRequest { &mut self.message } - pub fn execute(self) -> impl TryStream { + pub fn execute(self) -> impl Stream> { let AddressGetRequest { mut handle, message, diff --git a/src/link/get.rs b/src/link/get.rs index 8ab9c0f..ec76ef4 100644 --- a/src/link/get.rs +++ b/src/link/get.rs @@ -2,7 +2,7 @@ use futures::{ future::{self, Either}, - stream::{StreamExt, TryStream}, + stream::{Stream, StreamExt}, FutureExt, }; use netlink_packet_core::{NetlinkMessage, NLM_F_DUMP, NLM_F_REQUEST}; @@ -48,7 +48,7 @@ impl LinkGetRequest { } /// Execute the request - pub fn execute(self) -> impl TryStream { + pub fn execute(self) -> impl Stream> { let LinkGetRequest { mut handle, message, diff --git a/src/neighbour/get.rs b/src/neighbour/get.rs index 3966cb2..ff5a1cb 100644 --- a/src/neighbour/get.rs +++ b/src/neighbour/get.rs @@ -2,7 +2,7 @@ use futures::{ future::{self, Either}, - stream::{StreamExt, TryStream}, + stream::{Stream, StreamExt}, FutureExt, }; use netlink_packet_core::{ @@ -41,7 +41,7 @@ impl NeighbourGetRequest { /// Execute the request pub fn execute( self, - ) -> impl TryStream { + ) -> impl Stream> { let NeighbourGetRequest { mut handle, message, diff --git a/src/route/get.rs b/src/route/get.rs index 579c140..b242072 100644 --- a/src/route/get.rs +++ b/src/route/get.rs @@ -2,7 +2,7 @@ use futures::{ future::{self, Either}, - stream::{StreamExt, TryStream}, + stream::{Stream, StreamExt}, FutureExt, }; @@ -46,7 +46,7 @@ impl RouteGetRequest { &mut self.message } - pub fn execute(self) -> impl TryStream { + pub fn execute(self) -> impl Stream> { let RouteGetRequest { mut handle, message, diff --git a/src/rule/get.rs b/src/rule/get.rs index fabc1c8..44f05ea 100644 --- a/src/rule/get.rs +++ b/src/rule/get.rs @@ -2,7 +2,7 @@ use futures::{ future::{self, Either}, - stream::{StreamExt, TryStream}, + stream::{Stream, StreamExt}, FutureExt, }; use netlink_packet_core::{NetlinkMessage, NLM_F_DUMP, NLM_F_REQUEST}; @@ -38,7 +38,7 @@ impl RuleGetRequest { &mut self.message } - pub fn execute(self) -> impl TryStream { + pub fn execute(self) -> impl Stream> { let RuleGetRequest { mut handle, message, diff --git a/src/traffic_control/get.rs b/src/traffic_control/get.rs index 9f9a608..469ddeb 100644 --- a/src/traffic_control/get.rs +++ b/src/traffic_control/get.rs @@ -2,7 +2,7 @@ use futures::{ future::{self, Either}, - stream::{StreamExt, TryStream}, + stream::{Stream, StreamExt}, FutureExt, }; use netlink_packet_core::{NetlinkMessage, NLM_F_DUMP, NLM_F_REQUEST}; @@ -28,7 +28,7 @@ impl QDiscGetRequest { } /// Execute the request - pub fn execute(self) -> impl TryStream { + pub fn execute(self) -> impl Stream> { let QDiscGetRequest { mut handle, message, @@ -75,7 +75,7 @@ impl TrafficClassGetRequest { } /// Execute the request - pub fn execute(self) -> impl TryStream { + pub fn execute(self) -> impl Stream> { let TrafficClassGetRequest { mut handle, message, @@ -110,7 +110,7 @@ impl TrafficFilterGetRequest { } /// Execute the request - pub fn execute(self) -> impl TryStream { + pub fn execute(self) -> impl Stream> { let TrafficFilterGetRequest { mut handle, message, @@ -152,7 +152,7 @@ impl TrafficChainGetRequest { } /// Execute the request - pub fn execute(self) -> impl TryStream { + pub fn execute(self) -> impl Stream> { let TrafficChainGetRequest { mut handle, message, From 8b5faa01fefef0e152f5f5703c22e0f7a3ea09c7 Mon Sep 17 00:00:00 2001 From: Eric Long Date: Sun, 10 Nov 2024 11:18:45 +0800 Subject: [PATCH 2/2] RouteGetRequest: specify NLM_F_DUMP only when no destination address specified We can have the behaviour of `ip route get` now. Co-Developed-By: Nevo Hed --- src/route/get.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/route/get.rs b/src/route/get.rs index b242072..da64725 100644 --- a/src/route/get.rs +++ b/src/route/get.rs @@ -8,7 +8,8 @@ use futures::{ use netlink_packet_core::{NetlinkMessage, NLM_F_DUMP, NLM_F_REQUEST}; use netlink_packet_route::{ - route::RouteMessage, AddressFamily, RouteNetlinkMessage, + route::{RouteAttribute, RouteMessage}, + AddressFamily, RouteNetlinkMessage, }; use crate::{try_rtnl, Error, Handle}; @@ -52,9 +53,18 @@ impl RouteGetRequest { message, } = self; + let has_dest = message + .attributes + .iter() + .any(|attr| matches!(attr, RouteAttribute::Destination(_))); + let mut req = NetlinkMessage::from(RouteNetlinkMessage::GetRoute(message)); - req.header.flags = NLM_F_REQUEST | NLM_F_DUMP; + req.header.flags = NLM_F_REQUEST; + + if !has_dest { + req.header.flags |= NLM_F_DUMP; + } match handle.request(req) { Ok(response) => Either::Left(response.map(move |msg| {