4
0

smoke.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. use aya::{
  2. maps::loaded_maps,
  3. programs::{loaded_programs, Extension, TracePoint, Xdp, XdpFlags},
  4. util::KernelVersion,
  5. Ebpf, EbpfLoader,
  6. };
  7. use test_log::test;
  8. use crate::utils::NetNsGuard;
  9. #[test]
  10. fn xdp() {
  11. let kernel_version = KernelVersion::current().unwrap();
  12. if kernel_version < KernelVersion::new(5, 18, 0) {
  13. 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");
  14. return;
  15. }
  16. let _netns = NetNsGuard::new();
  17. let mut bpf = Ebpf::load(crate::PASS).unwrap();
  18. let dispatcher: &mut Xdp = bpf.program_mut("pass").unwrap().try_into().unwrap();
  19. dispatcher.load().unwrap();
  20. dispatcher.attach("lo", XdpFlags::default()).unwrap();
  21. }
  22. #[test]
  23. fn two_progs() {
  24. let mut bpf = Ebpf::load(crate::TWO_PROGS).unwrap();
  25. let prog_one: &mut TracePoint = bpf
  26. .program_mut("test_tracepoint_one")
  27. .unwrap()
  28. .try_into()
  29. .unwrap();
  30. prog_one.load().unwrap();
  31. prog_one.attach("sched", "sched_switch").unwrap();
  32. let prog_two: &mut TracePoint = bpf
  33. .program_mut("test_tracepoint_two")
  34. .unwrap()
  35. .try_into()
  36. .unwrap();
  37. prog_two.load().unwrap();
  38. prog_two.attach("sched", "sched_switch").unwrap();
  39. }
  40. #[test]
  41. fn extension() {
  42. let kernel_version = KernelVersion::current().unwrap();
  43. if kernel_version < KernelVersion::new(5, 9, 0) {
  44. eprintln!("skipping test on kernel {kernel_version:?}, XDP uses netlink");
  45. return;
  46. }
  47. let _netns = NetNsGuard::new();
  48. let mut bpf = Ebpf::load(crate::MAIN).unwrap();
  49. let pass: &mut Xdp = bpf.program_mut("xdp_pass").unwrap().try_into().unwrap();
  50. pass.load().unwrap();
  51. pass.attach("lo", XdpFlags::default()).unwrap();
  52. let mut bpf = EbpfLoader::new()
  53. .extension("xdp_drop")
  54. .load(crate::EXT)
  55. .unwrap();
  56. let drop_: &mut Extension = bpf.program_mut("xdp_drop").unwrap().try_into().unwrap();
  57. drop_
  58. .load(pass.fd().unwrap().try_clone().unwrap(), "xdp_pass")
  59. .unwrap();
  60. }
  61. #[test]
  62. fn list_loaded_programs() {
  63. // Load a program.
  64. let mut bpf = Ebpf::load(crate::PASS).unwrap();
  65. let dispatcher: &mut Xdp = bpf.program_mut("pass").unwrap().try_into().unwrap();
  66. dispatcher.load().unwrap();
  67. dispatcher.attach("lo", XdpFlags::default()).unwrap();
  68. // Ensure the loaded_programs() api doesn't panic.
  69. let prog = loaded_programs()
  70. .map(|p| p.unwrap())
  71. .find(|p| p.name_as_str().unwrap() == "pass")
  72. .unwrap();
  73. // Ensure all relevant helper functions don't panic.
  74. prog.name();
  75. prog.id();
  76. prog.tag();
  77. prog.program_type();
  78. prog.gpl_compatible();
  79. prog.map_ids().unwrap();
  80. prog.btf_id();
  81. prog.size_translated();
  82. prog.memory_locked().unwrap();
  83. prog.verified_instruction_count();
  84. prog.loaded_at();
  85. prog.fd().unwrap();
  86. }
  87. #[test]
  88. fn list_loaded_maps() {
  89. // Load a program with maps.
  90. let mut bpf = Ebpf::load(crate::MAP_TEST).unwrap();
  91. let dispatcher: &mut Xdp = bpf.program_mut("pass").unwrap().try_into().unwrap();
  92. dispatcher.load().unwrap();
  93. dispatcher.attach("lo", XdpFlags::default()).unwrap();
  94. // Ensure the loaded_maps() api doesn't panic and retrieve a map.
  95. let map = loaded_maps()
  96. .map(|m| m.unwrap())
  97. .find(|m| m.name_as_str().unwrap() == "FOO")
  98. .unwrap();
  99. // Ensure all relevant helper functions don't panic.
  100. map.name();
  101. map.id();
  102. map.map_type();
  103. map.key_size();
  104. map.value_size();
  105. map.max_entries();
  106. map.map_flags();
  107. map.fd().unwrap();
  108. }