runtime-rs: Upgrade crates from rust-netlink

Bump `netlink-sys` to v0.8, `netlink-packet-route` to v0.22 and
`rtnetlink` to v0.16 to reach a consistent state of `rust-netlink`
dependencies.

`bitflags` is bumped to v2.9.0 since those crates requires it.

Signed-off-by: Ruoqing He <heruoqing@iscas.ac.cn>
This commit is contained in:
Ruoqing He 2025-04-28 08:37:20 +00:00
parent 09700478eb
commit 2d0f32ff96
9 changed files with 92 additions and 70 deletions

View File

@ -442,6 +442,12 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]]
name = "cgroups-rs"
version = "0.3.4"
@ -1655,7 +1661,7 @@ dependencies = [
"httpdate",
"itoa",
"pin-project-lite",
"socket2 0.4.9",
"socket2 0.5.7",
"tokio",
"tower-service",
"tracing",
@ -2212,11 +2218,12 @@ dependencies = [
[[package]]
name = "netlink-packet-route"
version = "0.19.0"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74c171cd77b4ee8c7708da746ce392440cb7bcf618d122ec9ecc607b12938bf4"
checksum = "fc0e7987b28514adf555dc1f9a5c30dfc3e50750bbaffb1aec41ca7b23dcd8e4"
dependencies = [
"anyhow",
"bitflags 2.9.0",
"byteorder",
"libc",
"log",
@ -2339,6 +2346,18 @@ dependencies = [
"memoffset 0.9.0",
]
[[package]]
name = "nix"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
dependencies = [
"bitflags 2.9.0",
"cfg-if 1.0.0",
"cfg_aliases",
"libc",
]
[[package]]
name = "nom"
version = "7.1.3"
@ -2950,7 +2969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "059a34f111a9dee2ce1ac2826a68b24601c4298cfeb1a587c3cb493d5ab46f52"
dependencies = [
"libc",
"nix 0.25.1",
"nix 0.27.1",
]
[[package]]
@ -3453,7 +3472,7 @@ dependencies = [
"agent",
"anyhow",
"async-trait",
"bitflags 1.3.2",
"bitflags 2.9.0",
"byte-unit 4.0.19",
"cgroups-rs",
"futures 0.3.28",
@ -3495,9 +3514,9 @@ dependencies = [
[[package]]
name = "rtnetlink"
version = "0.14.1"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b684475344d8df1859ddb2d395dd3dac4f8f3422a1aa0725993cb375fc5caba5"
checksum = "3cb5850b5aa2c9c0ae44f157694bbe85107a2e13d76eb3178d0e3ee96c410f57"
dependencies = [
"futures 0.3.28",
"log",
@ -3506,7 +3525,7 @@ dependencies = [
"netlink-packet-utils",
"netlink-proto",
"netlink-sys",
"nix 0.27.1",
"nix 0.29.0",
"thiserror 1.0.69",
"tokio",
]

View File

@ -15,7 +15,7 @@ test-utils = { workspace = true }
actix-rt = { workspace = true }
anyhow = { workspace = true }
async-trait = { workspace = true }
bitflags = "1.2.1"
bitflags = "2.9.0"
byte-unit = "4.0.14"
cgroups-rs = "0.3.2"
futures = "0.3.11"
@ -35,9 +35,9 @@ uuid = { version = "0.4", features = ["v4"] }
oci-spec = { workspace = true }
## Dependencies from `rust-netlink`
netlink-packet-route = "0.19.0"
netlink-sys = "0.8.3"
rtnetlink = "0.14.0"
netlink-packet-route = "0.22"
netlink-sys = "0.8"
rtnetlink = "0.16"
# Local dependencies
agent = { workspace = true }

View File

@ -10,6 +10,8 @@ mod tests {
use anyhow::{anyhow, Context, Result};
use kata_types::config::hypervisor::TopologyConfigInfo;
use netlink_packet_route::link::MacVlanMode;
use rtnetlink::{LinkDummy, LinkMacVlan, LinkVeth, LinkVlan};
use scopeguard::defer;
use tests_utils::load_test_config;
use tokio::sync::RwLock;
@ -71,10 +73,11 @@ mod tests {
thread_handler.abort();
});
let dummy = LinkDummy::new(&dummy_name).build();
if let Ok(()) = handle
.link()
.add()
.dummy(dummy_name.clone())
.add(dummy)
.execute()
.await
.context("failed to create dummy link")
@ -83,12 +86,13 @@ mod tests {
.await
.expect("failed to get the index of dummy link");
let vlan = LinkVlan::new(&manual_vlan_iface_name, dummy_index, vlanid).build();
// since IPVlanEndpoint::new() needs an EXISTING virt_iface (which is created
// by containerd normally), we have to manually create a virt_iface.
if let Ok(()) = handle
.link()
.add()
.vlan(manual_vlan_iface_name.clone(), dummy_index, vlanid)
.add(vlan)
.execute()
.await
.context("failed to create manual veth pair")
@ -187,10 +191,11 @@ mod tests {
thread_handler.abort();
});
let dummy = LinkDummy::new(&dummy_name).build();
if let Ok(()) = handle
.link()
.add()
.dummy(dummy_name.clone())
.add(dummy)
.execute()
.await
.context("failed to create dummy link")
@ -199,18 +204,17 @@ mod tests {
.await
.expect("failed to get the index of dummy link");
// Available MACVLAN MODES
let macvlan_mode_private: u32 = 1;
let macvlan = LinkMacVlan::new(
&manual_macvlan_iface_name,
dummy_index,
MacVlanMode::Private,
)
.build();
// the mode here does not matter, could be any of available modes
if let Ok(()) = handle
.link()
.add()
.macvlan(
manual_macvlan_iface_name.clone(),
dummy_index,
macvlan_mode_private,
)
.add(macvlan)
.execute()
.await
.context("failed to create manual macvlan pair")
@ -318,12 +322,13 @@ mod tests {
thread_handler.abort();
});
let veth = LinkVeth::new("foo", &manual_virt_iface_name).build();
// since IPVlanEndpoint::new() needs an EXISTING virt_iface (which is created
// by containerd normally), we have to manually create a virt_iface.
if let Ok(()) = handle
.link()
.add()
.veth("foo".to_string(), manual_virt_iface_name.clone())
.add(veth)
.execute()
.await
.context("failed to create manual veth pair")

View File

@ -7,7 +7,7 @@
use agent::{ARPNeighbor, IPAddress, Interface, Route};
use anyhow::Result;
use async_trait::async_trait;
use netlink_packet_route::link::LinkFlag::Noarp;
use netlink_packet_route::link::LinkFlags;
use super::NetworkInfo;
use crate::network::dan::DanDevice;
@ -55,7 +55,7 @@ impl NetworkInfoFromDan {
hw_addr: dan_device.guest_mac.clone(),
device_path: String::default(),
field_type: dan_device.network_info.interface.ntype.clone(),
raw_flags: dan_device.network_info.interface.flags & u32::from(Noarp),
raw_flags: dan_device.network_info.interface.flags & LinkFlags::Noarp.bits(),
};
let routes = dan_device

View File

@ -4,7 +4,10 @@
// SPDX-License-Identifier: Apache-2.0
//
use std::{convert::TryFrom, net::IpAddr};
use std::{
convert::TryFrom,
net::{IpAddr, Ipv4Addr, Ipv6Addr},
};
use agent::{ARPNeighbor, IPAddress, IPFamily, Interface, Route};
use anyhow::{anyhow, Context, Result};
@ -15,6 +18,7 @@ use netlink_packet_route::{
neighbour::{NeighbourAddress, NeighbourAttribute, NeighbourMessage},
route::{RouteAddress, RouteAttribute, RouteMessage},
};
use rtnetlink::{IpVersion, RouteMessageBuilder};
use super::NetworkInfo;
use crate::network::utils::{
@ -168,11 +172,6 @@ fn generate_route(name: &str, route_msg: &RouteMessage) -> Result<Option<Route>>
return Ok(None);
}
let mut flags: u32 = 0;
for flag in &route_msg.header.flags {
flags |= u32::from(*flag);
}
let mut route = Route {
scope: u8::from(route_msg.header.scope) as u32,
device: name.to_string(),
@ -181,7 +180,7 @@ fn generate_route(name: &str, route_msg: &RouteMessage) -> Result<Option<Route>>
} else {
IPFamily::V6
},
flags,
flags: route_msg.header.flags.bits(),
..Default::default()
};
@ -212,10 +211,14 @@ async fn get_route_from_msg(
routes: &mut Vec<Route>,
handle: &rtnetlink::Handle,
attrs: &LinkAttrs,
ip_version: rtnetlink::IpVersion,
ip_version: IpVersion,
) -> Result<()> {
let name = &attrs.name;
let mut route_msg_list = handle.route().get(ip_version).execute();
let route_message = match ip_version {
IpVersion::V4 => RouteMessageBuilder::<Ipv4Addr>::new().build(),
IpVersion::V6 => RouteMessageBuilder::<Ipv6Addr>::new().build(),
};
let mut route_msg_list = handle.route().get(route_message).execute();
while let Some(route_msg) = route_msg_list.try_next().await? {
// get route filter with index
for attr in &route_msg.attributes {

View File

@ -11,6 +11,7 @@ mod tests {
network_pair::NetworkPair,
};
use anyhow::Context;
use rtnetlink::LinkVeth;
use scopeguard::defer;
#[actix_rt::test]
async fn test_tc_redirect_network() {
@ -20,10 +21,9 @@ mod tests {
thread_handler.abort();
});
handle
.link()
.add()
.veth("foo".to_string(), "bar".to_string());
let veth = LinkVeth::new("foo", "bar").build();
handle.link().add(veth);
if let Ok(net_pair) =
NetworkPair::new(&handle, 1, "bar", TC_FILTER_NET_MODEL_STR, 2).await

View File

@ -8,6 +8,7 @@ use std::{convert::TryFrom, sync::Arc};
use anyhow::{anyhow, Context, Result};
use futures::stream::TryStreamExt;
use rtnetlink::LinkUnspec;
use super::{
network_model,
@ -88,16 +89,22 @@ impl NetworkPair {
handle
.link()
.set(tap_link.attrs().index)
.mtu(virt_link.attrs().mtu)
.set(
LinkUnspec::new_with_index(tap_link.attrs().index)
.mtu(virt_link.attrs().mtu)
.build(),
)
.execute()
.await
.context("set link mtu")?;
handle
.link()
.set(tap_link.attrs().index)
.up()
.set(
LinkUnspec::new_with_index(tap_link.attrs().index)
.up()
.build(),
)
.execute()
.await
.context("set link up")?;
@ -156,8 +163,11 @@ pub async fn create_link(
if base.master_index != 0 {
handle
.link()
.set(base.index)
.controller(base.master_index)
.set(
LinkUnspec::new_with_index(base.index)
.controller(base.master_index)
.build(),
)
.execute()
.await
.context("set index")?;

View File

@ -58,11 +58,7 @@ impl TryFrom<AddressMessage> for Address {
AddressAttribute::Flags(f) => {
//since the AddressAttribute::Flags(f) didn't implemented the u32 from trait,
//thus here just implemeted a simple transformer.
let mut d: u32 = 0;
for flag in &f {
d |= u32::from(*flag);
}
addr.flags = d;
addr.flags = f.bits();
}
AddressAttribute::CacheInfo(_c) => {}
_ => {}

View File

@ -5,26 +5,15 @@
//
use netlink_packet_route::link::{
InfoBridge, InfoData, InfoKind, LinkAttribute, LinkFlag, LinkInfo, LinkMessage,
InfoBridge, InfoData, InfoKind, LinkAttribute, LinkInfo, LinkMessage,
};
use super::{Link, LinkAttrs};
pub(crate) struct VecLinkFlag(pub Vec<LinkFlag>);
impl From<&VecLinkFlag> for u32 {
fn from(v: &VecLinkFlag) -> u32 {
let mut d: u32 = 0;
for flag in &v.0 {
d |= u32::from(*flag);
}
d
}
}
#[allow(clippy::box_default)]
pub fn get_link_from_message(mut msg: LinkMessage) -> Box<dyn Link> {
let flags = u32::from(&VecLinkFlag(msg.header.flags));
let flags = msg.header.flags.bits();
let mut base = LinkAttrs {
index: msg.header.index,
flags,
@ -65,7 +54,7 @@ pub fn get_link_from_message(mut msg: LinkMessage) -> Box<dyn Link> {
LinkAttribute::Stats64(_s) => {}
LinkAttribute::Xdp(_x) => {}
LinkAttribute::OperState(_) => {}
LinkAttribute::NetnsId(n) => {
LinkAttribute::LinkNetNsId(n) => {
base.net_ns_id = n;
}
LinkAttribute::GsoMaxSize(i) => {
@ -187,7 +176,7 @@ fn parse_bridge(mut ibs: Vec<InfoBridge>) -> Bridge {
bridge.multicast_snooping = m == 1;
}
InfoBridge::VlanFiltering(v) => {
bridge.vlan_filtering = v == 1;
bridge.vlan_filtering = v;
}
_ => {}
}