@ -6,7 +6,8 @@ use core::{
use aya_bpf_bindings ::helpers ::{
bpf_clone_redirect , bpf_get_socket_uid , bpf_l3_csum_replace , bpf_l4_csum_replace ,
bpf_skb_adjust_room , bpf_skb_change_type , bpf_skb_load_bytes , bpf_skb_store_bytes ,
bpf_skb_adjust_room , bpf_skb_change_type , bpf_skb_load_bytes , bpf_skb_pull_data ,
bpf_skb_store_bytes ,
} ;
use aya_bpf_cty ::c_long ;
@ -224,6 +225,40 @@ impl SkBuffContext {
Err ( ret )
}
}
/// Pulls in non-linear data in case the skb is non-linear.
///
/// Make len bytes from skb readable and writable. If a zero value is passed for
/// `len`, then the whole length of the skb is pulled. This helper is only needed
/// for reading and writing with direct packet access.
///
/// # Examples
///
/// ```no_run
/// mod bindings;
/// use bindings::{ethhdr, iphdr, udphdr};
///
/// const ETH_HLEN: usize = core::mem::size_of::<ethhdr>();
/// const IP_HLEN: usize = core::mem::size_of::<iphdr>();
/// const UDP_HLEN: usize = core::mem::size_of::<udphdr>();
///
/// fn try_classifier(ctx: SkBuffContext) -> Result<i32, i32> {
/// let len = ETH_HLEN + IP_HLEN + UDP_HLEN;
/// match ctx.pull_data(len as u32) {
/// Ok(_) => return Ok(0),
/// Err(ret) => return Err(ret as i32),
/// }
/// }
/// ```
#[ inline(always) ]
pub fn pull_data ( & self , len : u32 ) -> Result < ( ) , c_long > {
let ret = unsafe { bpf_skb_pull_data ( self . as_ptr ( ) as * mut _ , len ) } ;
if ret = = 0 {
Ok ( ( ) )
} else {
Err ( ret )
}
}
}
impl BpfContext for SkBuffContext {