This commit is contained in:
@ -47,7 +47,7 @@ ipnet = "2.3.0"
|
|||||||
libc = "0.2.126"
|
libc = "0.2.126"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
netlink = "0.1.1"
|
netlink = "0.1.1"
|
||||||
netlink-packet-route = "0.19.0"
|
netlink-packet-route = "0.21.0"
|
||||||
netlink-packet-utils = "0.5.2"
|
netlink-packet-utils = "0.5.2"
|
||||||
nom = "7.1"
|
nom = "7.1"
|
||||||
prost = "0.8"
|
prost = "0.8"
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
|
|
||||||
|
use bgp_packet::constants::AddressFamilyIdentifier;
|
||||||
use bgp_packet::nlri::NLRI;
|
use bgp_packet::nlri::NLRI;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
use eyre::{bail, Result};
|
use eyre::{bail, Result};
|
||||||
@ -44,6 +45,12 @@ enum Commands {
|
|||||||
#[arg(default_value_t = 201)]
|
#[arg(default_value_t = 201)]
|
||||||
rt_table: u32,
|
rt_table: u32,
|
||||||
},
|
},
|
||||||
|
/// DumpRoutes prints all routes from the given routing table ID.
|
||||||
|
DumpRoutes {
|
||||||
|
/// Selects which table to print routes from.
|
||||||
|
#[arg(default_value_t = 201)]
|
||||||
|
rt_table: u32,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
@ -78,8 +85,23 @@ async fn main() -> Result<()> {
|
|||||||
let nexthop: IpAddr = nexthop.parse()?;
|
let nexthop: IpAddr = nexthop.parse()?;
|
||||||
handle.route_del(prefix, nexthop).await?;
|
handle.route_del(prefix, nexthop).await?;
|
||||||
}
|
}
|
||||||
|
Some(Commands::DumpRoutes { rt_table }) => {}
|
||||||
None => bail!("A subcommand must be specified."),
|
None => bail!("A subcommand must be specified."),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Implements the route dump CLI functionality.
|
||||||
|
async fn dump_routes(table: u16) -> Result<()> {
|
||||||
|
let connector = NetlinkConnector::new(Some(table)).await?;
|
||||||
|
let routes = connector.dump_routes(AddressFamilyIdentifier::Ipv6).await?;
|
||||||
|
|
||||||
|
for route in routes {
|
||||||
|
print_route_message(route);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_route_message(msg: RouteMessage) {
|
||||||
|
// Parse the prefix out
|
||||||
|
}
|
||||||
|
|||||||
@ -88,7 +88,7 @@ where
|
|||||||
/// route_add requests updating the nexthop to a particular path if it is not already
|
/// route_add requests updating the nexthop to a particular path if it is not already
|
||||||
/// the best path.
|
/// the best path.
|
||||||
pub async fn route_add(&mut self, nlri: &NLRI, nexthop: IpAddr) -> Result<()> {
|
pub async fn route_add(&mut self, nlri: &NLRI, nexthop: IpAddr) -> Result<()> {
|
||||||
info!(af = ?self.af, %nlri, %nexthop);
|
trace!(af = ?self.af, %nlri, %nexthop);
|
||||||
// Lookup the path in the Fib, there are three possible outcomes:
|
// Lookup the path in the Fib, there are three possible outcomes:
|
||||||
// 1. The route is not yet known, we add it to the FibState and inject it into the kernel,
|
// 1. The route is not yet known, we add it to the FibState and inject it into the kernel,
|
||||||
// 2. The route is known and has a prior nexthop that needs to be updated
|
// 2. The route is known and has a prior nexthop that needs to be updated
|
||||||
|
|||||||
@ -139,13 +139,12 @@ impl NetlinkConnector {
|
|||||||
pub async fn dump_routes(
|
pub async fn dump_routes(
|
||||||
&mut self,
|
&mut self,
|
||||||
address_family: AddressFamilyIdentifier,
|
address_family: AddressFamilyIdentifier,
|
||||||
table: Option<u32>,
|
|
||||||
) -> Result<Vec<RouteMessage>, rtnetlink::Error> {
|
) -> Result<Vec<RouteMessage>, rtnetlink::Error> {
|
||||||
let mut req = self.handle.route().get(match address_family {
|
let mut req = self.handle.route().get(match address_family {
|
||||||
AddressFamilyIdentifier::Ipv4 => IpVersion::V4,
|
AddressFamilyIdentifier::Ipv4 => IpVersion::V4,
|
||||||
AddressFamilyIdentifier::Ipv6 => IpVersion::V6,
|
AddressFamilyIdentifier::Ipv6 => IpVersion::V6,
|
||||||
});
|
});
|
||||||
if let Some(table_id) = table {
|
if let Some(table_id) = self.table {
|
||||||
req.message_mut()
|
req.message_mut()
|
||||||
.attributes
|
.attributes
|
||||||
.push(RouteAttribute::Table(table_id));
|
.push(RouteAttribute::Table(table_id));
|
||||||
|
|||||||
Reference in New Issue
Block a user