aya_ebpf/programs/
sk_msg.rs

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