let state = cast_pointer!(state, S);
state.get_transaction_iterator(min_tx_id, istate)
}
+
+/// AppLayerFrameType trait.
+///
+/// This is the behavior expected from an enum of frame types. For most instances
+/// this behavior can be derived.
+///
+/// Example:
+///
+/// #[derive(AppLayerFrameType)]
+/// enum SomeProtoFrameType {
+/// PDU,
+/// Data,
+/// }
+pub trait AppLayerFrameType {
+ /// Create a frame type variant from a u8.
+ ///
+ /// None will be returned if there is no matching enum variant.
+ fn from_u8(value: u8) -> Option<Self> where Self: std::marker::Sized;
+
+ /// Return the u8 value of the enum where the first entry has the value of 0.
+ fn as_u8(&self) -> u8;
+
+ /// Create a frame type variant from a &str.
+ ///
+ /// None will be returned if there is no matching enum variant.
+ fn from_str(s: &str) -> Option<Self> where Self: std::marker::Sized;
+
+ /// Return a pointer to a C string of the enum variant suitable as-is for
+ /// FFI.
+ fn to_cstring(&self) -> *const std::os::raw::c_char;
+
+ /// Converts a C string formatted name to a frame type ID.
+ extern "C" fn ffi_id_from_name(name: *const std::os::raw::c_char) -> i32 where Self: Sized {
+ if name.is_null() {
+ return -1;
+ }
+ unsafe {
+ let frame_id = if let Ok(s) = std::ffi::CStr::from_ptr(name).to_str() {
+ Self::from_str(s).map(|t| t.as_u8() as i32).unwrap_or(-1)
+ } else {
+ -1
+ };
+ frame_id
+ }
+ }
+
+ /// Converts a variant ID to an FFI safe name.
+ extern "C" fn ffi_name_from_id(id: u8) -> *const std::os::raw::c_char where Self: Sized {
+ Self::from_u8(id).map(|s| s.to_cstring()).unwrap_or_else(|| std::ptr::null())
+ }
+}