Skip to content

Commit 64f45c6

Browse files
committed
rust/ffi: use Flow wrapper in eve callback signature
1 parent fa65fef commit 64f45c6

3 files changed

Lines changed: 20 additions & 15 deletions

File tree

doc/userguide/devguide/extending/output/eve-hooks.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ The closure receives:
5656

5757
- ``tv``: the ``ThreadVars`` for the thread performing the logging
5858
- ``p``: the ``Packet``, or ``None`` if not available
59-
- ``f``: the ``Flow``, if available
59+
- ``f``: the ``Flow``, or ``None`` if not available
6060
- ``jb``: a Rust ``JsonBuilder`` wrapper for the current EVE record
6161

6262
Unlike the C API, the Rust callback returns ``Result<(), Error>``. If it

examples/plugins/rust/src/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use std::ptr::null_mut;
22

33
use suricata_ffi::eve::{self, SCJsonBuilder};
4-
use suricata_ffi::flow;
4+
use suricata_ffi::flow::{self, Flow};
55
use suricata_ffi::jsonbuilder::JsonBuilder;
66
use suricata_ffi::packet::Packet;
77
use suricata_ffi::{SCLogError, SCLogNotice};
88
use suricata_sys::sys::{
9-
Flow, Packet as RawPacket, SCEveRegisterCallback, SCPlugin, ThreadVars,
9+
Flow as RawFlow, Packet as RawPacket, SCEveRegisterCallback, SCPlugin, ThreadVars,
1010
};
1111

1212
unsafe extern "C" fn init() {
@@ -44,7 +44,7 @@ pub fn register_flow_callbacks() -> Result<(), &'static str> {
4444
unsafe extern "C" fn log_eve_raw(
4545
_tv: *mut ThreadVars,
4646
_p: *const RawPacket,
47-
_f: *mut Flow,
47+
_f: *mut RawFlow,
4848
jb: *mut SCJsonBuilder,
4949
_user: *mut std::os::raw::c_void,
5050
) {
@@ -57,34 +57,34 @@ unsafe extern "C" fn log_eve_raw(
5757
fn log_eve_wrapped(
5858
_tv: *mut ThreadVars,
5959
p: Option<Packet<'_>>,
60-
f: *mut Flow,
60+
f: Option<Flow<'_>>,
6161
jb: &mut JsonBuilder,
6262
) -> Result<(), suricata_ffi::jsonbuilder::Error> {
6363
jb.open_object("rust_wrapped")?;
6464
jb.set_string("example", "eve-callback")?;
6565
jb.set_string("has_packet", if p.is_some() { "true" } else { "false" })?;
66-
jb.set_string("has_flow", if f.is_null() { "false" } else { "true" })?;
66+
jb.set_string("has_flow", if f.is_some() { "true" } else { "false" })?;
6767
jb.close()?;
6868
Ok(())
6969
}
7070

71-
fn log_flow_init(_tv: *mut ThreadVars, f: *mut Flow, p: Option<Packet<'_>>) {
71+
fn log_flow_init(_tv: *mut ThreadVars, f: *mut RawFlow, p: Option<Packet<'_>>) {
7272
SCLogNotice!(
7373
"rust example flow init callback: flow={:p}, has_packet={}",
7474
f,
7575
p.is_some()
7676
);
7777
}
7878

79-
fn log_flow_update(_tv: *mut ThreadVars, f: *mut Flow, p: Option<Packet<'_>>) {
79+
fn log_flow_update(_tv: *mut ThreadVars, f: *mut RawFlow, p: Option<Packet<'_>>) {
8080
SCLogNotice!(
8181
"rust example flow update callback: flow={:p}, has_packet={}",
8282
f,
8383
p.is_some()
8484
);
8585
}
8686

87-
fn log_flow_finish(_tv: *mut ThreadVars, f: *mut Flow) {
87+
fn log_flow_finish(_tv: *mut ThreadVars, f: *mut RawFlow) {
8888
SCLogNotice!("rust example flow finish callback: flow={:p}", f);
8989
}
9090

rust/ffi/src/eve.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use std::ffi::CString;
1919
use std::os::raw::c_void;
2020

2121
pub use suricata_sys::sys::{
22-
Flow, Packet as RawPacket, SCEveUserCallbackFn, SCJsonBuilder, ThreadVars,
22+
Flow as RawFlow, Packet as RawPacket, SCEveUserCallbackFn, SCJsonBuilder, ThreadVars,
2323
};
2424
use suricata_sys::sys::{
2525
SCEveFileType, SCEveFileTypeDeinitFunc, SCEveFileTypeInitFunc, SCEveFileTypeThreadDeinitFunc,
@@ -82,7 +82,7 @@ impl EveFileType {
8282
/// The callback receives:
8383
/// - `tv`: the `ThreadVars` for the thread performing the logging
8484
/// - `p`: the `Packet`, or `None` if not available
85-
/// - `f`: the `Flow`, if available
85+
/// - `f`: the `Flow`, or `None` if not available
8686
/// - `jb`: the JSON builder for the current EVE record
8787
///
8888
/// This API is intended for plugin and library users.
@@ -115,7 +115,7 @@ where
115115
F: for<'a> Fn(
116116
*mut ThreadVars,
117117
Option<crate::packet::Packet<'a>>,
118-
*mut Flow,
118+
Option<crate::flow::Flow<'a>>,
119119
&mut crate::jsonbuilder::JsonBuilder,
120120
) -> Result<(), crate::jsonbuilder::Error>
121121
+ Send
@@ -136,13 +136,13 @@ where
136136
/// Internal wrapper used to adapt the C EVE callback to a Rust
137137
/// closure callback.
138138
unsafe extern "C" fn callback_wrapper<F>(
139-
tv: *mut ThreadVars, p: *const RawPacket, f: *mut Flow, jb: *mut SCJsonBuilder,
139+
tv: *mut ThreadVars, p: *const RawPacket, f: *mut RawFlow, jb: *mut SCJsonBuilder,
140140
user: *mut c_void,
141141
) where
142142
F: for<'a> Fn(
143143
*mut ThreadVars,
144144
Option<crate::packet::Packet<'a>>,
145-
*mut Flow,
145+
Option<crate::flow::Flow<'a>>,
146146
&mut crate::jsonbuilder::JsonBuilder,
147147
) -> Result<(), crate::jsonbuilder::Error>
148148
+ Send
@@ -157,7 +157,12 @@ unsafe extern "C" fn callback_wrapper<F>(
157157
} else {
158158
Some(crate::packet::Packet::from_ptr(p))
159159
};
160-
if callback(tv, packet, f, &mut jb).is_err() {
160+
let flow = if f.is_null() {
161+
None
162+
} else {
163+
Some(crate::flow::Flow::from_ptr(f))
164+
};
165+
if callback(tv, packet, flow, &mut jb).is_err() {
161166
let _ = jb.restore_mark(&mark);
162167
}
163168
}

0 commit comments

Comments
 (0)