Skip to content

Commit 82111ab

Browse files
committed
rust/ffi: use Packet wrapper in flow callback signatures
1 parent 1accc9c commit 82111ab

3 files changed

Lines changed: 46 additions & 18 deletions

File tree

doc/userguide/devguide/extending/flow-lifecycle-callbacks.rst

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,17 @@ The Rust wrappers register closures or function items and return
104104

105105
.. code-block:: rust
106106
107-
use suricata_ffi::flow::{self, Flow, Packet, ThreadVars};
107+
use suricata_ffi::flow;
108+
use suricata_ffi::packet::Packet;
108109
use suricata_ffi::SCLogNotice;
110+
use suricata_sys::sys::{Flow, ThreadVars};
109111
110-
fn flow_init(_tv: *mut ThreadVars, f: *mut Flow, _p: *const Packet) {
112+
fn flow_init(_tv: *mut ThreadVars, f: *mut Flow, _p: Option<Packet<'_>>) {
111113
SCLogNotice!("flow initialized: {:p}", f);
112114
}
113115
114-
fn flow_update(_tv: *mut ThreadVars, f: *mut Flow, p: *mut Packet) {
115-
SCLogNotice!("flow updated: {:p} packet: {:p}", f, p);
116+
fn flow_update(_tv: *mut ThreadVars, f: *mut Flow, p: Option<Packet<'_>>) {
117+
SCLogNotice!("flow updated: {:p} has_packet: {}", f, p.is_some());
116118
}
117119
118120
fn flow_finish(_tv: *mut ThreadVars, f: *mut Flow) {

examples/plugins/rust/src/mod.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,19 @@ fn log_eve_wrapped(
6868
Ok(())
6969
}
7070

71-
fn log_flow_init(_tv: *mut ThreadVars, _f: *mut Flow, _p: *const RawPacket) {
72-
SCLogNotice!("rust example flow init callback: flow={:p}", _f);
71+
fn log_flow_init(_tv: *mut ThreadVars, _f: *mut Flow, _p: Option<Packet<'_>>) {
72+
SCLogNotice!(
73+
"rust example flow init callback: flow={:p}, has_packet={}",
74+
_f,
75+
_p.is_some()
76+
);
7377
}
7478

75-
fn log_flow_update(_tv: *mut ThreadVars, _f: *mut Flow, _p: *mut RawPacket) {
79+
fn log_flow_update(_tv: *mut ThreadVars, _f: *mut Flow, _p: Option<Packet<'_>>) {
7680
SCLogNotice!(
77-
"rust example flow update callback: flow={:p}, packet={:p}",
81+
"rust example flow update callback: flow={:p}, has_packet={}",
7882
_f,
79-
_p
83+
_p.is_some()
8084
);
8185
}
8286

rust/ffi/src/flow.rs

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
use std::os::raw::c_void;
1919

20-
use suricata_sys::sys::{Flow, Packet, ThreadVars};
20+
use suricata_sys::sys::{Flow, Packet as RawPacket, ThreadVars};
2121
use suricata_sys::sys::{
2222
SCFlowRegisterFinishCallback, SCFlowRegisterInitCallback, SCFlowRegisterUpdateCallback,
2323
};
@@ -37,7 +37,10 @@ use suricata_sys::sys::{
3737
/// The callback must not panic.
3838
pub fn register_init_callback<F>(callback: F) -> Result<(), &'static str>
3939
where
40-
F: Fn(*mut ThreadVars, *mut Flow, *const Packet) + Send + Sync + 'static,
40+
F: for<'a> Fn(*mut ThreadVars, *mut Flow, Option<crate::packet::Packet<'a>>)
41+
+ Send
42+
+ Sync
43+
+ 'static,
4144
{
4245
let user = Box::into_raw(Box::new(callback)) as *mut c_void;
4346
if unsafe { SCFlowRegisterInitCallback(Some(init_callback_wrapper::<F>), user) } {
@@ -66,7 +69,10 @@ where
6669
/// The callback must not panic.
6770
pub fn register_update_callback<F>(callback: F) -> Result<(), &'static str>
6871
where
69-
F: Fn(*mut ThreadVars, *mut Flow, *mut Packet) + Send + Sync + 'static,
72+
F: for<'a> Fn(*mut ThreadVars, *mut Flow, Option<crate::packet::Packet<'a>>)
73+
+ Send
74+
+ Sync
75+
+ 'static,
7076
{
7177
let user = Box::into_raw(Box::new(callback)) as *mut c_void;
7278
if unsafe { SCFlowRegisterUpdateCallback(Some(update_callback_wrapper::<F>), user) } {
@@ -107,21 +113,37 @@ where
107113
}
108114

109115
unsafe extern "C" fn init_callback_wrapper<F>(
110-
tv: *mut ThreadVars, f: *mut Flow, p: *const Packet, user: *mut c_void,
116+
tv: *mut ThreadVars, f: *mut Flow, p: *const RawPacket, user: *mut c_void,
111117
) where
112-
F: Fn(*mut ThreadVars, *mut Flow, *const Packet) + Send + Sync + 'static,
118+
F: for<'a> Fn(*mut ThreadVars, *mut Flow, Option<crate::packet::Packet<'a>>)
119+
+ Send
120+
+ Sync
121+
+ 'static,
113122
{
114123
let callback = &*(user as *const F);
115-
callback(tv, f, p);
124+
let packet = if p.is_null() {
125+
None
126+
} else {
127+
Some(crate::packet::Packet::from_ptr(p))
128+
};
129+
callback(tv, f, packet);
116130
}
117131

118132
unsafe extern "C" fn update_callback_wrapper<F>(
119-
tv: *mut ThreadVars, f: *mut Flow, p: *mut Packet, user: *mut c_void,
133+
tv: *mut ThreadVars, f: *mut Flow, p: *mut RawPacket, user: *mut c_void,
120134
) where
121-
F: Fn(*mut ThreadVars, *mut Flow, *mut Packet) + Send + Sync + 'static,
135+
F: for<'a> Fn(*mut ThreadVars, *mut Flow, Option<crate::packet::Packet<'a>>)
136+
+ Send
137+
+ Sync
138+
+ 'static,
122139
{
123140
let callback = &*(user as *const F);
124-
callback(tv, f, p);
141+
let packet = if p.is_null() {
142+
None
143+
} else {
144+
Some(crate::packet::Packet::from_ptr(p))
145+
};
146+
callback(tv, f, packet);
125147
}
126148

127149
unsafe extern "C" fn finish_callback_wrapper<F>(

0 commit comments

Comments
 (0)