aya_ebpf/programs/
sk_msg.rs1use 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}