Start cleanup
Some checks failed
Rust / build (push) Has been cancelled

This commit is contained in:
Rayhaan Jaufeerally
2025-01-01 13:03:02 +01:00
parent b0f2995ed8
commit 3b41e64650
4 changed files with 25 additions and 4 deletions

View File

@ -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"

View File

@ -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
}

View File

@ -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

View File

@ -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));