@ -119,12 +119,13 @@ impl Probe {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "{}/{}" , self . kind , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> u32 {
let _ = #fn_name ( ::aya_bpf ::programs ::ProbeContext ::new ( ctx ) ) ;
return 0 ;
@ -152,12 +153,13 @@ impl SockOps {
} else {
"sockops" . to_owned ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sock_ops ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sock_ops ) -> u32 {
return #fn_name ( ::aya_bpf ::programs ::SockOpsContext ::new ( ctx ) ) ;
#item
@ -180,12 +182,13 @@ impl SkMsg {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "sk_msg/{}" , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::sk_msg_md ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::sk_msg_md ) -> u32 {
return #fn_name ( ::aya_bpf ::programs ::SkMsgContext ::new ( ctx ) ) ;
#item
@ -212,12 +215,13 @@ impl Xdp {
} else {
"xdp" . to_owned ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::xdp_md ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::xdp_md ) -> u32 {
return #fn_name ( ::aya_bpf ::programs ::XdpContext ::new ( ctx ) ) ;
#item
@ -244,12 +248,13 @@ impl SchedClassifier {
} else {
"classifier" . to_owned ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::__sk_buff ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::__sk_buff ) -> i32 {
return #fn_name ( ::aya_bpf ::programs ::TcContext ::new ( ctx ) ) ;
#item
@ -276,12 +281,13 @@ impl CgroupSysctl {
} else {
( "cgroup/sysctl" ) . to_owned ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sysctl ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sysctl ) -> i32 {
return #fn_name ( ::aya_bpf ::programs ::SysctlContext ::new ( ctx ) ) ;
#item
@ -313,12 +319,13 @@ impl CgroupSockopt {
} else {
format! ( "cgroup/{}" , self . attach_type )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sockopt ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sockopt ) -> i32 {
return #fn_name ( ::aya_bpf ::programs ::SockoptContext ::new ( ctx ) ) ;
#item
@ -358,12 +365,13 @@ impl CgroupSkb {
} else {
( "cgroup/skb" ) . to_owned ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::__sk_buff ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::__sk_buff ) -> i32 {
return #fn_name ( ::aya_bpf ::programs ::SkBuffContext ::new ( ctx ) ) ;
#item
@ -396,12 +404,13 @@ impl CgroupSockAddr {
} else {
format! ( "cgroup/{}" , self . attach_type )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sock_addr ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sock_addr ) -> i32 {
return #fn_name ( ::aya_bpf ::programs ::SockAddrContext ::new ( ctx ) ) ;
#item
@ -441,12 +450,13 @@ impl CgroupSock {
} else {
"cgroup/sock" . to_string ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sock ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sock ) -> i32 {
return #fn_name ( ::aya_bpf ::programs ::SockContext ::new ( ctx ) ) ;
#item
@ -512,12 +522,13 @@ impl TracePoint {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "tp/{}" , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> u32 {
let _ = #fn_name ( ::aya_bpf ::programs ::TracePointContext ::new ( ctx ) ) ;
return 0 ;
@ -541,12 +552,13 @@ impl PerfEvent {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "perf_event/{}" , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> u32 {
let _ = #fn_name ( ::aya_bpf ::programs ::PerfEventContext ::new ( ctx ) ) ;
return 0 ;
@ -570,12 +582,13 @@ impl RawTracePoint {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "raw_tp/{}" , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> u32 {
let _ = #fn_name ( ::aya_bpf ::programs ::RawTracePointContext ::new ( ctx ) ) ;
return 0 ;
@ -599,6 +612,7 @@ impl Lsm {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "lsm/{}" , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
// LSM probes need to return an integer corresponding to the correct
@ -607,7 +621,7 @@ impl Lsm {
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> i32 {
return #fn_name ( ::aya_bpf ::programs ::LsmContext ::new ( ctx ) ) ;
#item
@ -630,12 +644,13 @@ impl BtfTracePoint {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "tp_btf/{}" , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> i32 {
let _ = #fn_name ( ::aya_bpf ::programs ::BtfTracePointContext ::new ( ctx ) ) ;
return 0 ;
@ -683,12 +698,13 @@ impl SkSkb {
} else {
format! ( "sk_skb/{kind}" )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::__sk_buff ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::__sk_buff ) -> u32 {
return #fn_name ( ::aya_bpf ::programs ::SkBuffContext ::new ( ctx ) ) ;
#item
@ -716,12 +732,13 @@ impl SocketFilter {
} else {
"socket" . to_owned ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::__sk_buff ) -> i64 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::__sk_buff ) -> i64 {
return #fn_name ( ::aya_bpf ::programs ::SkBuffContext ::new ( ctx ) ) ;
#item
@ -744,12 +761,13 @@ impl FEntry {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "fentry/{}" , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> i32 {
let _ = #fn_name ( ::aya_bpf ::programs ::FEntryContext ::new ( ctx ) ) ;
return 0 ;
@ -773,12 +791,13 @@ impl FExit {
pub fn expand ( & self ) -> Result < TokenStream > {
let section_name = format! ( "fexit/{}" , self . name ) ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::core ::ffi ::c_void ) -> i32 {
let _ = #fn_name ( ::aya_bpf ::programs ::FExitContext ::new ( ctx ) ) ;
return 0 ;
@ -806,12 +825,13 @@ impl SkLookup {
} else {
"sk_lookup" . to_owned ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sk_lookup ) -> u32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_sk_lookup ) -> u32 {
return #fn_name ( ::aya_bpf ::programs ::SkLookupContext ::new ( ctx ) ) ;
#item
@ -838,12 +858,13 @@ impl CgroupDevice {
} else {
( "cgroup/dev" ) . to_owned ( )
} ;
let fn_vis = & self . item . vis ;
let fn_name = & self . item . sig . ident ;
let item = & self . item ;
Ok ( quote ! {
#[ no_mangle ]
#[ link_section = #section_name ]
fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_cgroup_dev_ctx ) -> i32 {
#fn_vis fn #fn_name ( ctx : * mut ::aya_bpf ::bindings ::bpf_cgroup_dev_ctx ) -> i32 {
return #fn_name ( ::aya_bpf ::programs ::DeviceContext ::new ( ctx ) ) ;
#item
@ -941,4 +962,49 @@ mod tests {
. to_string ( )
. contains ( "[link_section = \"cgroup/dev\"]" ) ) ;
}
#[ test ]
fn priv_function ( ) {
let prog = CgroupSkb ::from_syn (
parse_quote ! ( attach = "egress" ) ,
parse_quote ! (
fn foo ( ctx : SkBuffContext ) -> i32 {
0
}
) ,
)
. unwrap ( ) ;
let stream = prog . expand ( ) . unwrap ( ) ;
assert! ( stream . to_string ( ) . contains ( "] fn foo (" ) ) ;
}
#[ test ]
fn pub_function ( ) {
let prog = CgroupSkb ::from_syn (
parse_quote ! ( attach = "egress" ) ,
parse_quote ! (
pub fn foo ( ctx : SkBuffContext ) -> i32 {
0
}
) ,
)
. unwrap ( ) ;
let stream = prog . expand ( ) . unwrap ( ) ;
assert! ( stream . to_string ( ) . contains ( "] pub fn foo (" ) ) ;
}
#[ test ]
fn pub_crate_function ( ) {
let prog = CgroupSkb ::from_syn (
parse_quote ! ( attach = "egress" ) ,
parse_quote ! (
pub ( crate ) fn foo ( ctx : SkBuffContext ) -> i32 {
0
}
) ,
)
. unwrap ( ) ;
let stream = prog . expand ( ) . unwrap ( ) ;
assert! ( stream . to_string ( ) . contains ( "] pub (crate) fn foo (" ) ) ;
}
}