flow_dissector.rs 952 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use aya_ebpf_cty::{c_long, c_void};
  2. use crate::{
  3. EbpfContext,
  4. bindings::{__sk_buff, bpf_flow_keys},
  5. programs::sk_buff::SkBuff,
  6. };
  7. pub struct FlowDissectorContext {
  8. skb: SkBuff,
  9. }
  10. impl FlowDissectorContext {
  11. pub fn new(skb: *mut __sk_buff) -> FlowDissectorContext {
  12. let skb = SkBuff { skb };
  13. FlowDissectorContext { skb }
  14. }
  15. #[inline]
  16. pub fn data(&self) -> usize {
  17. self.skb.data()
  18. }
  19. #[inline]
  20. pub fn data_end(&self) -> usize {
  21. self.skb.data_end()
  22. }
  23. #[inline]
  24. pub fn flow_keys(&mut self) -> &mut bpf_flow_keys {
  25. unsafe { &mut *(*self.skb.skb).__bindgen_anon_1.flow_keys }
  26. }
  27. #[inline(always)]
  28. pub fn load_bytes(&self, offset: usize, dst: &mut [u8]) -> Result<usize, c_long> {
  29. self.skb.load_bytes(offset, dst)
  30. }
  31. }
  32. impl EbpfContext for FlowDissectorContext {
  33. fn as_ptr(&self) -> *mut c_void {
  34. self.skb.as_ptr()
  35. }
  36. }