smoke.rs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. use aya::{
  2. programs::{Extension, TracePoint, Xdp, XdpFlags},
  3. util::KernelVersion,
  4. Ebpf, EbpfLoader,
  5. };
  6. use test_log::test;
  7. use crate::utils::NetNsGuard;
  8. #[test]
  9. fn xdp() {
  10. let kernel_version = KernelVersion::current().unwrap();
  11. if kernel_version < KernelVersion::new(5, 18, 0) {
  12. 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");
  13. return;
  14. }
  15. let _netns = NetNsGuard::new();
  16. let mut bpf = Ebpf::load(crate::PASS).unwrap();
  17. let dispatcher: &mut Xdp = bpf.program_mut("pass").unwrap().try_into().unwrap();
  18. dispatcher.load().unwrap();
  19. dispatcher.attach("lo", XdpFlags::default()).unwrap();
  20. }
  21. #[test]
  22. fn two_progs() {
  23. let mut bpf = Ebpf::load(crate::TWO_PROGS).unwrap();
  24. let prog_one: &mut TracePoint = bpf
  25. .program_mut("test_tracepoint_one")
  26. .unwrap()
  27. .try_into()
  28. .unwrap();
  29. prog_one.load().unwrap();
  30. prog_one.attach("sched", "sched_switch").unwrap();
  31. let prog_two: &mut TracePoint = bpf
  32. .program_mut("test_tracepoint_two")
  33. .unwrap()
  34. .try_into()
  35. .unwrap();
  36. prog_two.load().unwrap();
  37. prog_two.attach("sched", "sched_switch").unwrap();
  38. }
  39. #[test]
  40. fn extension() {
  41. let kernel_version = KernelVersion::current().unwrap();
  42. if kernel_version < KernelVersion::new(5, 9, 0) {
  43. eprintln!("skipping test on kernel {kernel_version:?}, XDP uses netlink");
  44. return;
  45. }
  46. let _netns = NetNsGuard::new();
  47. let mut bpf = Ebpf::load(crate::MAIN).unwrap();
  48. let pass: &mut Xdp = bpf.program_mut("xdp_pass").unwrap().try_into().unwrap();
  49. pass.load().unwrap();
  50. pass.attach("lo", XdpFlags::default()).unwrap();
  51. let mut bpf = EbpfLoader::new()
  52. .extension("xdp_drop")
  53. .load(crate::EXT)
  54. .unwrap();
  55. let drop_: &mut Extension = bpf.program_mut("xdp_drop").unwrap().try_into().unwrap();
  56. drop_
  57. .load(pass.fd().unwrap().try_clone().unwrap(), "xdp_pass")
  58. .unwrap();
  59. }