Browse Source

aya-bpf: Add multibuffer support for XDP

Signed-off-by: Dave Tucker <[email protected]>
Dave Tucker 2 years ago
parent
commit
376c486400

+ 18 - 5
aya-bpf-macros/src/expand.rs

@@ -200,20 +200,33 @@ impl SkMsg {
 pub struct Xdp {
     item: ItemFn,
     name: Option<String>,
+    frags: bool,
 }
 
 impl Xdp {
     pub fn from_syn(mut args: Args, item: ItemFn) -> Result<Xdp> {
-        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<TokenStream> {
+        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;

+ 12 - 3
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,
+                    ..
+                },
                 ..
             })
         );

+ 1 - 1
test/integration-ebpf/src/map_test.rs

@@ -14,7 +14,7 @@ static FOO: Array<u32> = Array::<u32>::with_max_entries(10, 0);
 #[map(name = "BAR")]
 static BAZ: Array<u32> = Array::<u32>::with_max_entries(10, 0);
 
-#[xdp]
+#[xdp(frags = "true")]
 pub fn pass(ctx: XdpContext) -> u32 {
     match unsafe { try_pass(ctx) } {
         Ok(ret) => ret,

+ 1 - 1
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,