diff --git a/Cargo.lock b/Cargo.lock index ef68001..276f7cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1032,7 +1032,8 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "self_cell" version = "1.0.4" -source = "git+https://github.com/Voultapher/self_cell.git#e58b85fb2364486495bc91e25404eed298ac609f" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" [[package]] name = "semver" diff --git a/Cargo.toml b/Cargo.toml index 182a611..7d03c90 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ opt-level = "z" strip = true [features] -default = ["aya", "pkg-config"] +default = ["aya", "libbpf-skel", "pkg-config"] # Enable IPv6 NAPT ipv6 = [] # Enable Aya BPF loader, requires Rust>=1.80.0 @@ -66,7 +66,7 @@ netlink-packet-route = "0.19.0" netlink-sys = "0.8.6" prefix-trie = "0.5.1" rtnetlink = "0.14.1" -self_cell = { version = "1.0.4", git = "https://github.com/Voultapher/self_cell.git", optional = true } +self_cell = { version = "1.0.4", optional = true } serde = { version = "1.0.215", features = ["derive"] } tokio = { version = "1.41.1", features = ["macros", "rt", "signal", "sync"] } toml = { version = "0.8.19", default-features = false, features = ["parse"] } diff --git a/src/skel/einat/libbpf_skel.rs b/src/skel/einat/libbpf_skel.rs index 1709d2e..995c4b6 100644 --- a/src/skel/einat/libbpf_skel.rs +++ b/src/skel/einat/libbpf_skel.rs @@ -7,6 +7,7 @@ mod skel_build { use skel_build::types as einat_types; use skel_build::*; +use std::cell::UnsafeCell; use std::mem; use std::net::Ipv4Addr; #[cfg(feature = "ipv6")] @@ -18,7 +19,7 @@ use ipnet::Ipv4Net; use ipnet::Ipv6Net; use libbpf_rs::skel::{OpenSkel, SkelBuilder}; use libbpf_rs::{MapHandle, OpenObject}; -use self_cell::{self_cell, MutBorrow}; +use self_cell::self_cell; use super::super::libbpf::LibbpfMap; use super::{EinatConstConfig, EinatEbpf, EinatEbpfInet, EinatRoData}; @@ -28,7 +29,7 @@ use super::libbpf_common::{attach, detach, EinatLibbpfLinks}; self_cell!( struct OwnedSkel { - owner: MutBorrow>, + owner: UnsafeCell>, #[covariant] dependent: EinatSkel, @@ -60,10 +61,14 @@ impl EinatEbpf for EinatLibbpfSkel { type Links = EinatLibbpfLinks; fn load(config: EinatConstConfig) -> Result { - let obj = MutBorrow::new(mem::MaybeUninit::zeroed()); + let obj = UnsafeCell::new(mem::MaybeUninit::zeroed()); let skel = OwnedSkel::try_new(obj, |obj| -> Result<_> { - let mut open_skel = EinatSkelBuilder::default().open(obj.borrow_mut())?; + // #Safety + // obj is only used here for construction of the skeleton + let obj = unsafe { &mut *obj.get() }; + + let mut open_skel = EinatSkelBuilder::default().open(obj)?; *open_skel.maps.rodata_data = unsafe { mem::transmute::(config.ro_data) };