sk_msg.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. use core::ffi::c_void;
  2. use crate::{
  3. bindings::sk_msg_md,
  4. helpers::{bpf_msg_pop_data, bpf_msg_push_data},
  5. BpfContext,
  6. };
  7. pub struct SkMsgContext {
  8. pub msg: *mut sk_msg_md,
  9. }
  10. impl SkMsgContext {
  11. pub fn new(msg: *mut sk_msg_md) -> SkMsgContext {
  12. SkMsgContext { msg }
  13. }
  14. pub fn size(&self) -> u32 {
  15. unsafe { (*self.msg).size }
  16. }
  17. pub fn data(&self) -> usize {
  18. unsafe { (*self.msg).__bindgen_anon_1.data as usize }
  19. }
  20. pub fn data_end(&self) -> usize {
  21. unsafe { (*self.msg).__bindgen_anon_2.data_end as usize }
  22. }
  23. pub fn push_data(&self, start: u32, len: u32, flags: u64) -> Result<(), i64> {
  24. let ret = unsafe { bpf_msg_push_data(self.msg, start, len, flags) };
  25. if ret == 0 {
  26. Ok(())
  27. } else {
  28. Err(ret)
  29. }
  30. }
  31. pub fn pop_data(&self, start: u32, len: u32, flags: u64) -> Result<(), i64> {
  32. let ret = unsafe { bpf_msg_pop_data(self.msg, start, len, flags) };
  33. if ret == 0 {
  34. Ok(())
  35. } else {
  36. Err(ret)
  37. }
  38. }
  39. }
  40. impl BpfContext for SkMsgContext {
  41. fn as_ptr(&self) -> *mut c_void {
  42. self.msg as *mut _
  43. }
  44. }