Skip to content

Commit 1accc9c

Browse files
committed
rust/ffi: use Packet wrapper in eve callback signature
1 parent 84b2915 commit 1accc9c

3 files changed

Lines changed: 26 additions & 14 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
@@ -55,7 +55,7 @@ function pointer plus ``user`` pointer.
5555
The closure receives:
5656

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

examples/plugins/rust/src/mod.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ use std::ptr::null_mut;
33
use suricata_ffi::eve::{self, SCJsonBuilder};
44
use suricata_ffi::flow;
55
use suricata_ffi::jsonbuilder::JsonBuilder;
6+
use suricata_ffi::packet::Packet;
67
use suricata_ffi::{SCLogError, SCLogNotice};
7-
use suricata_sys::sys::{Flow, Packet, SCEveRegisterCallback, SCPlugin, ThreadVars};
8+
use suricata_sys::sys::{
9+
Flow, Packet as RawPacket, SCEveRegisterCallback, SCPlugin, ThreadVars,
10+
};
811

912
unsafe extern "C" fn init() {
1013
suricata_ffi::plugin::init();
@@ -40,7 +43,7 @@ pub fn register_flow_callbacks() -> Result<(), &'static str> {
4043

4144
unsafe extern "C" fn log_eve_raw(
4245
_tv: *mut ThreadVars,
43-
_p: *const Packet,
46+
_p: *const RawPacket,
4447
_f: *mut Flow,
4548
jb: *mut SCJsonBuilder,
4649
_user: *mut std::os::raw::c_void,
@@ -53,22 +56,23 @@ unsafe extern "C" fn log_eve_raw(
5356

5457
fn log_eve_wrapped(
5558
_tv: *mut ThreadVars,
56-
_p: *const Packet,
59+
p: Option<Packet<'_>>,
5760
f: *mut Flow,
5861
jb: &mut JsonBuilder,
5962
) -> Result<(), suricata_ffi::jsonbuilder::Error> {
6063
jb.open_object("rust_wrapped")?;
6164
jb.set_string("example", "eve-callback")?;
65+
jb.set_string("has_packet", if p.is_some() { "true" } else { "false" })?;
6266
jb.set_string("has_flow", if f.is_null() { "false" } else { "true" })?;
6367
jb.close()?;
6468
Ok(())
6569
}
6670

67-
fn log_flow_init(_tv: *mut ThreadVars, _f: *mut Flow, _p: *const Packet) {
71+
fn log_flow_init(_tv: *mut ThreadVars, _f: *mut Flow, _p: *const RawPacket) {
6872
SCLogNotice!("rust example flow init callback: flow={:p}", _f);
6973
}
7074

71-
fn log_flow_update(_tv: *mut ThreadVars, _f: *mut Flow, _p: *mut Packet) {
75+
fn log_flow_update(_tv: *mut ThreadVars, _f: *mut Flow, _p: *mut RawPacket) {
7276
SCLogNotice!(
7377
"rust example flow update callback: flow={:p}, packet={:p}",
7478
_f,

rust/ffi/src/eve.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
use std::ffi::CString;
1919
use std::os::raw::c_void;
2020

21-
pub use suricata_sys::sys::{Flow, Packet, SCEveUserCallbackFn, SCJsonBuilder, ThreadVars};
21+
pub use suricata_sys::sys::{
22+
Flow, Packet as RawPacket, SCEveUserCallbackFn, SCJsonBuilder, ThreadVars,
23+
};
2224
use suricata_sys::sys::{
2325
SCEveFileType, SCEveFileTypeDeinitFunc, SCEveFileTypeInitFunc, SCEveFileTypeThreadDeinitFunc,
2426
SCEveFileTypeThreadInitFunc, SCEveFileTypeWriteFunc, SCEveRegisterCallback,
@@ -79,7 +81,7 @@ impl EveFileType {
7981
///
8082
/// The callback receives:
8183
/// - `tv`: the `ThreadVars` for the thread performing the logging
82-
/// - `p`: the `Packet`, if available
84+
/// - `p`: the `Packet`, or `None` if not available
8385
/// - `f`: the `Flow`, if available
8486
/// - `jb`: the JSON builder for the current EVE record
8587
///
@@ -110,9 +112,9 @@ impl EveFileType {
110112
/// The callback must not panic.
111113
pub fn register_callback<F>(callback: F) -> Result<(), &'static str>
112114
where
113-
F: Fn(
115+
F: for<'a> Fn(
114116
*mut ThreadVars,
115-
*const Packet,
117+
Option<crate::packet::Packet<'a>>,
116118
*mut Flow,
117119
&mut crate::jsonbuilder::JsonBuilder,
118120
) -> Result<(), crate::jsonbuilder::Error>
@@ -134,11 +136,12 @@ where
134136
/// Internal wrapper used to adapt the C EVE callback to a Rust
135137
/// closure callback.
136138
unsafe extern "C" fn callback_wrapper<F>(
137-
tv: *mut ThreadVars, p: *const Packet, f: *mut Flow, jb: *mut SCJsonBuilder, user: *mut c_void,
139+
tv: *mut ThreadVars, p: *const RawPacket, f: *mut Flow, jb: *mut SCJsonBuilder,
140+
user: *mut c_void,
138141
) where
139-
F: Fn(
142+
F: for<'a> Fn(
140143
*mut ThreadVars,
141-
*const Packet,
144+
Option<crate::packet::Packet<'a>>,
142145
*mut Flow,
143146
&mut crate::jsonbuilder::JsonBuilder,
144147
) -> Result<(), crate::jsonbuilder::Error>
@@ -149,7 +152,12 @@ unsafe extern "C" fn callback_wrapper<F>(
149152
let callback = &*(user as *const F);
150153
let mut jb = crate::jsonbuilder::JsonBuilder::from_raw(jb);
151154
let mark = jb.get_mark();
152-
if callback(tv, p, f, &mut jb).is_err() {
155+
let packet = if p.is_null() {
156+
None
157+
} else {
158+
Some(crate::packet::Packet::from_ptr(p))
159+
};
160+
if callback(tv, packet, f, &mut jb).is_err() {
153161
let _ = jb.restore_mark(&mark);
154162
}
155163
}

0 commit comments

Comments
 (0)