|  |  | @ -1,16 +1,16 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | use std::path::{Path, PathBuf}; |  |  |  | use std::path::{Path, PathBuf}; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | use anyhow::anyhow; |  |  |  | use anyhow::{Context as _, Result}; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | use aya_tool::{bindgen, write_to_file}; |  |  |  | use aya_tool::{bindgen, write_to_file}; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | use crate::codegen::{Architecture, SysrootOptions}; |  |  |  | use crate::codegen::{Architecture, SysrootOptions}; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | pub fn codegen(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<(), anyhow::Error> { |  |  |  | pub fn codegen(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<()> { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     codegen_internal_btf_bindings(libbpf_dir)?; |  |  |  |     codegen_internal_btf_bindings(libbpf_dir)?; | 
			
		
	
		
		
			
				
					
					|  |  |  |     codegen_bindings(opts, libbpf_dir) |  |  |  |     codegen_bindings(opts, libbpf_dir) | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | fn codegen_internal_btf_bindings(libbpf_dir: &Path) -> Result<(), anyhow::Error> { |  |  |  | fn codegen_internal_btf_bindings(libbpf_dir: &Path) -> Result<()> { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     let dir = PathBuf::from("aya-obj"); |  |  |  |     let dir = PathBuf::from("aya-obj"); | 
			
		
	
		
		
			
				
					
					|  |  |  |     let generated = dir.join("src/generated"); |  |  |  |     let generated = dir.join("src/generated"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -26,10 +26,7 @@ fn codegen_internal_btf_bindings(libbpf_dir: &Path) -> Result<(), anyhow::Error> | 
			
		
	
		
		
			
				
					
					|  |  |  |         bindgen = bindgen.allowlist_type(x); |  |  |  |         bindgen = bindgen.allowlist_type(x); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     let bindings = bindgen |  |  |  |     let bindings = bindgen.generate().context("bindgen failed")?.to_string(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         .generate() |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         .map_err(|op| anyhow!("bindgen failed - {op}"))? |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         .to_string(); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     // write the bindings, with the original helpers removed
 |  |  |  |     // write the bindings, with the original helpers removed
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     write_to_file(generated.join("btf_internal_bindings.rs"), &bindings)?; |  |  |  |     write_to_file(generated.join("btf_internal_bindings.rs"), &bindings)?; | 
			
		
	
	
		
		
			
				
					|  |  | @ -37,7 +34,7 @@ fn codegen_internal_btf_bindings(libbpf_dir: &Path) -> Result<(), anyhow::Error> | 
			
		
	
		
		
			
				
					
					|  |  |  |     Ok(()) |  |  |  |     Ok(()) | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | fn codegen_bindings(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<(), anyhow::Error> { |  |  |  | fn codegen_bindings(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<()> { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     let SysrootOptions { |  |  |  |     let SysrootOptions { | 
			
		
	
		
		
			
				
					
					|  |  |  |         x86_64_sysroot, |  |  |  |         x86_64_sysroot, | 
			
		
	
		
		
			
				
					
					|  |  |  |         aarch64_sysroot, |  |  |  |         aarch64_sysroot, | 
			
		
	
	
		
		
			
				
					|  |  | @ -47,9 +44,29 @@ fn codegen_bindings(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<(), anyh | 
			
		
	
		
		
			
				
					
					|  |  |  |         s390x_sysroot, |  |  |  |         s390x_sysroot, | 
			
		
	
		
		
			
				
					
					|  |  |  |         mips_sysroot, |  |  |  |         mips_sysroot, | 
			
		
	
		
		
			
				
					
					|  |  |  |     } = opts; |  |  |  |     } = opts; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     let dir = PathBuf::from("aya-obj"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     let generated = dir.join("src/generated"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     let builder = || { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         let mut bindgen = bindgen::user_builder() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .header(dir.join("include/linux_wrapper.h").to_str().unwrap()) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .clang_args(["-I", libbpf_dir.join("include/uapi").to_str().unwrap()]) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .clang_args(["-I", libbpf_dir.join("include").to_str().unwrap()]) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             // BPF_F_LINK is defined twice. Once in an anonymous enum
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             // which bindgen will constify, and once via #define macro
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             // which generates a duplicate const.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .blocklist_var("BPF_F_LINK") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .constified_enum("BPF_F_.*") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .constified_enum("BTF_KIND_.*") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .constified_enum("BTF_VAR_.*") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .constified_enum("IFLA_.*") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .constified_enum("TCA_.*") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .constified_enum("BPF_RINGBUF_.*") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             // NETFILTER
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             .constified_enum("NFPROTO_.*"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         let types = [ |  |  |  |         let types = [ | 
			
		
	
		
		
			
				
					
					|  |  |  |             // BPF
 |  |  |  |             // BPF
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         "BPF_TYPES", |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             "bpf_cmd", |  |  |  |             "bpf_cmd", | 
			
		
	
		
		
			
				
					
					|  |  |  |             "bpf_insn", |  |  |  |             "bpf_insn", | 
			
		
	
		
		
			
				
					
					|  |  |  |             "bpf_attr", |  |  |  |             "bpf_attr", | 
			
		
	
	
		
		
			
				
					|  |  | @ -163,14 +180,15 @@ fn codegen_bindings(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<(), anyh | 
			
		
	
		
		
			
				
					
					|  |  |  |             "NFPROTO_.*", |  |  |  |             "NFPROTO_.*", | 
			
		
	
		
		
			
				
					
					|  |  |  |         ]; |  |  |  |         ]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     let dir = PathBuf::from("aya-obj"); |  |  |  |         for x in &types { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     let generated = dir.join("src/generated"); |  |  |  |             bindgen = bindgen.allowlist_type(x); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     let builder = || { |  |  |  |         for x in &vars { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         bindgen::user_builder() |  |  |  |             bindgen = bindgen.allowlist_var(x); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             .header(dir.join("include/linux_wrapper.h").to_str().unwrap()) |  |  |  |         } | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             .clang_args(["-I", libbpf_dir.join("include/uapi").to_str().unwrap()]) |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             .clang_args(["-I", libbpf_dir.join("include").to_str().unwrap()]) |  |  |  |         bindgen | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     }; |  |  |  |     }; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     for arch in Architecture::supported() { |  |  |  |     for arch in Architecture::supported() { | 
			
		
	
	
		
		
			
				
					|  |  | @ -202,38 +220,7 @@ fn codegen_bindings(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<(), anyh | 
			
		
	
		
		
			
				
					
					|  |  |  |         }; |  |  |  |         }; | 
			
		
	
		
		
			
				
					
					|  |  |  |         bindgen = bindgen.clang_args(["-I", sysroot.to_str().unwrap()]); |  |  |  |         bindgen = bindgen.clang_args(["-I", sysroot.to_str().unwrap()]); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         for x in &types { |  |  |  |         let bindings = bindgen.generate().context("bindgen failed")?.to_string(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             bindgen = bindgen.allowlist_type(x); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         for x in &vars { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             bindgen = bindgen |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .allowlist_var(x) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // BPF_F_LINK is defined twice. Once in an anonymous enum
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // which bindgen will constify, and once via #define macro
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // which generates a duplicate const.
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .blocklist_var("BPF_F_LINK") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .constified_enum("BPF_F_.*") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .constified_enum("BTF_KIND_.*") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .constified_enum("BTF_VAR_.*") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .constified_enum("IFLA_.*") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .constified_enum("TCA_.*") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .constified_enum("BPF_RINGBUF_.*") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // NETFILTER
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 .constified_enum("NFPROTO_.*"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         for x in &types { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             bindgen = bindgen.allowlist_type(x); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         for x in &vars { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             bindgen = bindgen.allowlist_var(x); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         let bindings = bindgen |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             .generate() |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             .map_err(|op| anyhow!("bindgen failed - {op}"))? |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             .to_string(); |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // write the bindings, with the original helpers removed
 |  |  |  |         // write the bindings, with the original helpers removed
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         write_to_file( |  |  |  |         write_to_file( | 
			
		
	
	
		
		
			
				
					|  |  | 
 |