agent: add the route flags support when adding routes

Get the route entry's flags passed from host and
set it in the add route request.

Fixes: #7934

Signed-off-by: Fupan Li <fupan.lfp@antgroup.com>
This commit is contained in:
Fupan Li 2025-01-20 16:10:47 +08:00
parent d929bc0224
commit 9a4c0a5c5c

View File

@ -9,7 +9,7 @@ use ipnetwork::{IpNetwork, Ipv4Network, Ipv6Network};
use netlink_packet_route::address::{AddressAttribute, AddressMessage};
use netlink_packet_route::link::{LinkAttribute, LinkMessage};
use netlink_packet_route::neighbour::{self, NeighbourFlag};
use netlink_packet_route::route::{RouteHeader, RouteProtocol, RouteScope, RouteType};
use netlink_packet_route::route::{RouteFlag, RouteHeader, RouteProtocol, RouteScope, RouteType};
use netlink_packet_route::{
neighbour::{NeighbourAddress, NeighbourAttribute, NeighbourState},
route::{RouteAddress, RouteAttribute, RouteMessage},
@ -55,6 +55,25 @@ const ALL_RULE_FLAGS: [NeighbourFlag; 8] = [
NeighbourFlag::Router,
];
const ALL_ROUTE_FLAGS: [RouteFlag; 16] = [
RouteFlag::Dead,
RouteFlag::Pervasive,
RouteFlag::Onlink,
RouteFlag::Offload,
RouteFlag::Linkdown,
RouteFlag::Unresolved,
RouteFlag::Trap,
RouteFlag::Notify,
RouteFlag::Cloned,
RouteFlag::Equalize,
RouteFlag::Prefix,
RouteFlag::LookupTable,
RouteFlag::FibMatch,
RouteFlag::RtOffload,
RouteFlag::RtTrap,
RouteFlag::OffloadFailed,
];
/// A filter to query addresses.
pub enum AddressFilter {
/// Return addresses that belong to the given interface.
@ -389,7 +408,7 @@ impl Handle {
use RouteAttribute as Nla;
// Build a common indeterminate ip request
let request = self
let mut request = self
.handle
.route()
.add()
@ -398,6 +417,23 @@ impl Handle {
.protocol(boot_prot)
.scope(scope);
let message = request.message_mut();
// calculate the Flag vec from the u32 flags
let mut got: u32 = 0;
let mut flags = Vec::new();
for flag in ALL_ROUTE_FLAGS {
if (route.flags & (u32::from(flag))) > 0 {
flags.push(flag);
got += u32::from(flag);
}
}
if got != route.flags {
flags.push(RouteFlag::Other(route.flags - got));
}
message.header.flags = flags;
// `rtnetlink` offers a separate request builders for different IP versions (IP v4 and v6).
// This if branch is a bit clumsy because it does almost the same.
if route.family() == IPFamily::v6 {