1717
1818use std:: os:: raw:: c_void;
1919
20- use suricata_sys:: sys:: { Flow , Packet , ThreadVars } ;
20+ use suricata_sys:: sys:: { Flow , Packet as RawPacket , ThreadVars } ;
2121use suricata_sys:: sys:: {
2222 SCFlowRegisterFinishCallback , SCFlowRegisterInitCallback , SCFlowRegisterUpdateCallback ,
2323} ;
@@ -37,7 +37,10 @@ use suricata_sys::sys::{
3737/// The callback must not panic.
3838pub fn register_init_callback < F > ( callback : F ) -> Result < ( ) , & ' static str >
3939where
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) } {
6669/// The callback must not panic.
6770pub fn register_update_callback < F > ( callback : F ) -> Result < ( ) , & ' static str >
6871where
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
109115unsafe 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
118132unsafe 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
127149unsafe extern "C" fn finish_callback_wrapper < F > (
0 commit comments