@@ -6,7 +6,7 @@ use clap::Args;
66use futures:: channel:: mpsc:: UnboundedReceiver ;
77use futures:: { StreamExt , try_join} ;
88use libc:: { EHOSTUNREACH , ENETUNREACH } ;
9- use log:: { debug, trace, warn } ;
9+ use log:: { debug, trace} ;
1010use rtnetlink:: Error :: NetlinkError ;
1111use rtnetlink:: packet_core:: { NetlinkMessage , NetlinkPayload } ;
1212use rtnetlink:: packet_route:: route:: { RouteAddress , RouteAttribute , RouteMessage , RouteType , RouteVia } ;
@@ -24,7 +24,7 @@ use tokio::time::{Interval, interval};
2424// We allow redirecting to any address by resolving its next hop using `ip route
2525// get`. This aligns with the RFC draft v4.
2626//
27- // Not handling with ECMP for now.
27+ // Not handling ECMP for now.
2828
2929#[ derive( Debug ) ]
3030pub struct RtNetlink < K : Kernel > {
@@ -42,7 +42,7 @@ impl<K: Kernel> RtNetlink<K> {
4242 let ( conn, handle, msgs) = rtnetlink:: new_multicast_connection ( & [ Ipv4Route , Ipv6Route , Ipv4Rule , Ipv6Rule ] ) ?;
4343 let scan_time = args. route_scan_time ;
4444 tokio:: spawn ( conn) ;
45- warn ! ( "rtnetlink spawned" ) ;
45+ trace ! ( "rtnetlink: spawned" ) ;
4646 Ok ( Self {
4747 args,
4848 handle,
@@ -179,6 +179,7 @@ impl<K: Kernel> RtNetlink<K> {
179179 pub async fn process ( & mut self ) -> Result < ( ) > {
180180 use NetlinkPayload :: * ;
181181 use RouteNetlinkMessage :: * ;
182+ use RouteType :: * ;
182183
183184 fn af_to_wildcard ( f : AddressFamily ) -> IpPrefix {
184185 if f == AddressFamily :: Inet {
@@ -207,16 +208,26 @@ impl<K: Kernel> RtNetlink<K> {
207208 }
208209
209210 select ! {
210- _ = self . timer. tick( ) => { warn!( "timer tick" ) ; self . process_all( ) . await }
211+ _ = self . timer. tick( ) => {
212+ trace!( "rtnetlink: timer tick" ) ;
213+ self . process_all( ) . await
214+ }
211215 Some ( ( msg, _) ) = self . msgs. next( ) => {
212- trace!( "new rtnetlink msg: {msg:?}" ) ;
213216 match msg. payload {
214- InnerMessage ( msg) => match msg {
215- // TODO: filter out multicast routes
216- NewRoute ( msg) | DelRoute ( msg) => self . process_prefix( route_msg_dst_prefix( msg) ) . await ,
217- NewRule ( msg) | DelRule ( msg) => self . process_prefix( af_to_wildcard( msg. header. family) ) . await ,
218- _ => Ok ( ( ) ) ,
219- } ,
217+ InnerMessage ( msg) => {
218+ match msg {
219+ NewRoute ( msg) | DelRoute ( msg) if !matches!( msg. header. kind, Local | Broadcast | Anycast | Multicast ) => {
220+ let prefix = route_msg_dst_prefix( msg) ;
221+ trace!( "rtnetlink: route to {prefix:?} changed" ) ;
222+ self . process_prefix( prefix) . await
223+ }
224+ NewRule ( msg) | DelRule ( msg) => {
225+ trace!( "rtnetlink: rule changed: {msg:?}" ) ;
226+ self . process_prefix( af_to_wildcard( msg. header. family) ) . await
227+ }
228+ _ => Ok ( ( ) ) ,
229+ }
230+ }
220231 _ => Ok ( ( ) ) ,
221232 }
222233 }
0 commit comments