diff --git a/aya-bpf-macros/src/expand.rs b/aya-bpf-macros/src/expand.rs index 7c47e579..506cfa89 100644 --- a/aya-bpf-macros/src/expand.rs +++ b/aya-bpf-macros/src/expand.rs @@ -200,20 +200,33 @@ impl SkMsg { pub struct Xdp { item: ItemFn, name: Option, + frags: bool, } impl Xdp { pub fn from_syn(mut args: Args, item: ItemFn) -> Result { - let name = name_arg(&mut args)?; - - Ok(Xdp { item, name }) + let name = pop_arg(&mut args, "name"); + let mut frags = false; + if let Some(s) = pop_arg(&mut args, "frags") { + if let Ok(m) = s.parse() { + frags = m + } else { + return Err(Error::new_spanned( + "mutlibuffer", + "invalid value. should be 'true' or 'false'", + )); + } + } + err_on_unknown_args(&args)?; + Ok(Xdp { item, name, frags }) } pub fn expand(&self) -> Result { + let section_prefix = if self.frags { "xdp.frags" } else { "xdp" }; let section_name = if let Some(name) = &self.name { - format!("xdp/{name}") + format!("{section_prefix}/{name}") } else { - "xdp".to_owned() + section_prefix.to_string() }; let fn_vis = &self.item.vis; let fn_name = &self.item.sig.ident; diff --git a/aya-obj/src/obj.rs b/aya-obj/src/obj.rs index b0668c27..8491709b 100644 --- a/aya-obj/src/obj.rs +++ b/aya-obj/src/obj.rs @@ -313,8 +313,14 @@ impl FromStr for ProgramSection { "kretprobe" => KRetProbe { name }, "uprobe" => UProbe { name }, "uretprobe" => URetProbe { name }, - "xdp" => Xdp { name, frags_supported: false}, - "xdp.frags" => Xdp { name, frags_supported: true}, + "xdp" => Xdp { + name, + frags_supported: false, + }, + "xdp.frags" => Xdp { + name, + frags_supported: true, + }, "tp_btf" => BtfTracePoint { name }, _ if kind.starts_with("tracepoint") || kind.starts_with("tp") => { // tracepoint sections are named `tracepoint/category/event_name`, @@ -1853,7 +1859,10 @@ mod tests { assert_matches!( obj.programs.get("foo"), Some(Program { - section: ProgramSection::Xdp { frags_supported: true, .. }, + section: ProgramSection::Xdp { + frags_supported: true, + .. + }, .. }) ); diff --git a/test/integration-ebpf/src/map_test.rs b/test/integration-ebpf/src/map_test.rs index fc17d1f9..87c07557 100644 --- a/test/integration-ebpf/src/map_test.rs +++ b/test/integration-ebpf/src/map_test.rs @@ -14,7 +14,7 @@ static FOO: Array = Array::::with_max_entries(10, 0); #[map(name = "BAR")] static BAZ: Array = Array::::with_max_entries(10, 0); -#[xdp] +#[xdp(frags = "true")] pub fn pass(ctx: XdpContext) -> u32 { match unsafe { try_pass(ctx) } { Ok(ret) => ret, diff --git a/test/integration-ebpf/src/pass.rs b/test/integration-ebpf/src/pass.rs index 0979d557..b1bdde99 100644 --- a/test/integration-ebpf/src/pass.rs +++ b/test/integration-ebpf/src/pass.rs @@ -3,7 +3,7 @@ use aya_bpf::{bindings::xdp_action, macros::xdp, programs::XdpContext}; -#[xdp(name = "pass")] +#[xdp(name = "pass", frags = "true")] pub fn pass(ctx: XdpContext) -> u32 { match unsafe { try_pass(ctx) } { Ok(ret) => ret,