smoke.rs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. use procfs::KernelVersion;
  2. use aya::{
  3. include_bytes_aligned,
  4. programs::{Extension, Xdp, XdpFlags},
  5. Bpf, BpfLoader,
  6. };
  7. #[test]
  8. fn xdp() {
  9. let kernel_version = KernelVersion::current().unwrap();
  10. if kernel_version < KernelVersion::new(5, 18, 0) {
  11. eprintln!("skipping test on kernel {kernel_version:?}, support for BPF_F_XDP_HAS_FRAGS was added in 5.18.0; see https://github.com/torvalds/linux/commit/c2f2cdb");
  12. return;
  13. }
  14. let bytes = include_bytes_aligned!("../../../target/bpfel-unknown-none/release/pass");
  15. let mut bpf = Bpf::load(bytes).unwrap();
  16. let dispatcher: &mut Xdp = bpf.program_mut("pass").unwrap().try_into().unwrap();
  17. dispatcher.load().unwrap();
  18. dispatcher.attach("lo", XdpFlags::default()).unwrap();
  19. }
  20. #[test]
  21. fn extension() {
  22. let kernel_version = KernelVersion::current().unwrap();
  23. if kernel_version < KernelVersion::new(5, 9, 0) {
  24. eprintln!("skipping test on kernel {kernel_version:?}, XDP uses netlink");
  25. return;
  26. }
  27. let main_bytes =
  28. include_bytes_aligned!("../../../target/bpfel-unknown-none/release/main.bpf.o");
  29. let mut bpf = Bpf::load(main_bytes).unwrap();
  30. let pass: &mut Xdp = bpf.program_mut("pass").unwrap().try_into().unwrap();
  31. pass.load().unwrap();
  32. pass.attach("lo", XdpFlags::default()).unwrap();
  33. let ext_bytes = include_bytes_aligned!("../../../target/bpfel-unknown-none/release/ext.bpf.o");
  34. let mut bpf = BpfLoader::new().extension("drop").load(ext_bytes).unwrap();
  35. let drop_: &mut Extension = bpf.program_mut("drop").unwrap().try_into().unwrap();
  36. drop_.load(pass.fd().unwrap(), "xdp_pass").unwrap();
  37. }