diff --git a/src/runtime-rs/Cargo.lock b/src/runtime-rs/Cargo.lock
index 9230783ad..c204aa930 100644
--- a/src/runtime-rs/Cargo.lock
+++ b/src/runtime-rs/Cargo.lock
@@ -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",
]
diff --git a/src/runtime-rs/crates/resource/Cargo.toml b/src/runtime-rs/crates/resource/Cargo.toml
index fd2dbccbc..a96887752 100644
--- a/src/runtime-rs/crates/resource/Cargo.toml
+++ b/src/runtime-rs/crates/resource/Cargo.toml
@@ -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 }
diff --git a/src/runtime-rs/crates/resource/src/network/endpoint/endpoints_test.rs b/src/runtime-rs/crates/resource/src/network/endpoint/endpoints_test.rs
index f7200a8a7..bae916893 100644
--- a/src/runtime-rs/crates/resource/src/network/endpoint/endpoints_test.rs
+++ b/src/runtime-rs/crates/resource/src/network/endpoint/endpoints_test.rs
@@ -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")
diff --git a/src/runtime-rs/crates/resource/src/network/network_info/network_info_from_dan.rs b/src/runtime-rs/crates/resource/src/network/network_info/network_info_from_dan.rs
index 9d2adfed0..3f68f46f2 100644
--- a/src/runtime-rs/crates/resource/src/network/network_info/network_info_from_dan.rs
+++ b/src/runtime-rs/crates/resource/src/network/network_info/network_info_from_dan.rs
@@ -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
diff --git a/src/runtime-rs/crates/resource/src/network/network_info/network_info_from_link.rs b/src/runtime-rs/crates/resource/src/network/network_info/network_info_from_link.rs
index f1a17cc24..284f04293 100644
--- a/src/runtime-rs/crates/resource/src/network/network_info/network_info_from_link.rs
+++ b/src/runtime-rs/crates/resource/src/network/network_info/network_info_from_link.rs
@@ -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