From: Victor Julien Date: Fri, 17 Jan 2025 11:10:01 +0000 (+0100) Subject: app-layer: API for mapping progress name vs id X-Git-Tag: suricata-8.0.0-beta1~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=add7d3fcf55d5b7eed62c13a123969632bb14d65;p=thirdparty%2Fsuricata.git app-layer: API for mapping progress name vs id --- diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index 1a1e1f92dc..0f0fcd7c2c 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -438,6 +438,9 @@ pub struct RustParser { pub get_frame_id_by_name: Option, pub get_frame_name_by_id: Option, + + pub get_state_id_by_name: Option, + pub get_state_name_by_id: Option, } /// Create a slice, given a buffer and a length @@ -490,6 +493,8 @@ pub type GetStateDataFn = unsafe extern "C" fn(*mut c_void) -> *mut AppLayerStat pub type ApplyTxConfigFn = unsafe extern "C" fn (*mut c_void, *mut c_void, c_int, AppLayerTxConfig); pub type GetFrameIdByName = unsafe extern "C" fn(*const c_char) -> c_int; pub type GetFrameNameById = unsafe extern "C" fn(u8) -> *const c_char; +pub type GetStateIdByName = unsafe extern "C" fn(*const c_char, u8) -> c_int; +pub type GetStateNameById = unsafe extern "C" fn(c_int, u8) -> *const c_char; // Defined in app-layer-register.h /// cbindgen:ignore diff --git a/rust/src/applayertemplate/template.rs b/rust/src/applayertemplate/template.rs index d6ee9c6999..6748fa0702 100644 --- a/rust/src/applayertemplate/template.rs +++ b/rust/src/applayertemplate/template.rs @@ -398,6 +398,8 @@ pub unsafe extern "C" fn rs_template_register_parser() { flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/bittorrent_dht/bittorrent_dht.rs b/rust/src/bittorrent_dht/bittorrent_dht.rs index 474405500f..77c2c5c90e 100644 --- a/rust/src/bittorrent_dht/bittorrent_dht.rs +++ b/rust/src/bittorrent_dht/bittorrent_dht.rs @@ -278,6 +278,8 @@ pub unsafe extern "C" fn SCRegisterBittorrentDhtUdpParser() { flags: 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/dcerpc/dcerpc.rs b/rust/src/dcerpc/dcerpc.rs index acc1f10d06..bca18f82cb 100644 --- a/rust/src/dcerpc/dcerpc.rs +++ b/rust/src/dcerpc/dcerpc.rs @@ -1233,6 +1233,8 @@ pub unsafe extern "C" fn SCRegisterDcerpcParser() { flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, get_frame_id_by_name: Some(DCERPCFrameType::ffi_id_from_name), get_frame_name_by_id: Some(DCERPCFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/dcerpc/dcerpc_udp.rs b/rust/src/dcerpc/dcerpc_udp.rs index ed6cc688f3..249bd95445 100644 --- a/rust/src/dcerpc/dcerpc_udp.rs +++ b/rust/src/dcerpc/dcerpc_udp.rs @@ -377,6 +377,8 @@ pub unsafe extern "C" fn SCRegisterDcerpcUdpParser() { flags: 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/dhcp/dhcp.rs b/rust/src/dhcp/dhcp.rs index 42d0a57824..c9bcb7a32a 100644 --- a/rust/src/dhcp/dhcp.rs +++ b/rust/src/dhcp/dhcp.rs @@ -290,6 +290,8 @@ pub unsafe extern "C" fn SCRegisterDhcpParser() { flags: 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/dns/dns.rs b/rust/src/dns/dns.rs index 85226b292c..48698ab1e8 100644 --- a/rust/src/dns/dns.rs +++ b/rust/src/dns/dns.rs @@ -1244,6 +1244,8 @@ pub unsafe extern "C" fn SCRegisterDnsUdpParser() { flags: 0, get_frame_id_by_name: Some(DnsFrameType::ffi_id_from_name), get_frame_name_by_id: Some(DnsFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); @@ -1289,6 +1291,8 @@ pub unsafe extern "C" fn SCRegisterDnsTcpParser() { flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, get_frame_id_by_name: Some(DnsFrameType::ffi_id_from_name), get_frame_name_by_id: Some(DnsFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/enip/enip.rs b/rust/src/enip/enip.rs index 2c3dc16e62..ce7610bca3 100644 --- a/rust/src/enip/enip.rs +++ b/rust/src/enip/enip.rs @@ -620,6 +620,8 @@ pub unsafe extern "C" fn SCEnipRegisterParsers() { flags: 0, get_frame_id_by_name: Some(EnipFrameType::ffi_id_from_name), get_frame_name_by_id: Some(EnipFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/http2/http2.rs b/rust/src/http2/http2.rs index ddc93940dc..f541ea0a97 100644 --- a/rust/src/http2/http2.rs +++ b/rust/src/http2/http2.rs @@ -1571,6 +1571,8 @@ pub unsafe extern "C" fn rs_http2_register_parser() { flags: 0, get_frame_id_by_name: Some(Http2FrameType::ffi_id_from_name), get_frame_name_by_id: Some(Http2FrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/ike/ike.rs b/rust/src/ike/ike.rs index c62499d6e6..94a37afc9c 100644 --- a/rust/src/ike/ike.rs +++ b/rust/src/ike/ike.rs @@ -429,6 +429,8 @@ pub unsafe extern "C" fn rs_ike_register_parser() { flags: 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/krb/krb5.rs b/rust/src/krb/krb5.rs index 4a07ea45a8..81a257eda3 100644 --- a/rust/src/krb/krb5.rs +++ b/rust/src/krb/krb5.rs @@ -614,6 +614,8 @@ pub unsafe extern "C" fn rs_register_krb5_parser() { flags : 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; // register UDP parser let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/ldap/ldap.rs b/rust/src/ldap/ldap.rs index c6d638b6e3..dcbaa36814 100644 --- a/rust/src/ldap/ldap.rs +++ b/rust/src/ldap/ldap.rs @@ -679,6 +679,8 @@ pub unsafe extern "C" fn SCRegisterLdapTcpParser() { flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, get_frame_id_by_name: Some(LdapFrameType::ffi_id_from_name), get_frame_name_by_id: Some(LdapFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); @@ -736,6 +738,8 @@ pub unsafe extern "C" fn SCRegisterLdapUdpParser() { flags: 0, get_frame_id_by_name: Some(LdapFrameType::ffi_id_from_name), get_frame_name_by_id: Some(LdapFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/modbus/modbus.rs b/rust/src/modbus/modbus.rs index 52486b5b22..5e5bc92939 100644 --- a/rust/src/modbus/modbus.rs +++ b/rust/src/modbus/modbus.rs @@ -419,6 +419,8 @@ pub unsafe extern "C" fn rs_modbus_register_parser() { flags: 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/mqtt/mqtt.rs b/rust/src/mqtt/mqtt.rs index 0c06ce3d6b..63829e838d 100644 --- a/rust/src/mqtt/mqtt.rs +++ b/rust/src/mqtt/mqtt.rs @@ -771,6 +771,8 @@ pub unsafe extern "C" fn SCMqttRegisterParser() { flags: 0, get_frame_id_by_name: Some(MQTTFrameType::ffi_id_from_name), get_frame_name_by_id: Some(MQTTFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/nfs/nfs.rs b/rust/src/nfs/nfs.rs index 699021f38d..7b8291668b 100644 --- a/rust/src/nfs/nfs.rs +++ b/rust/src/nfs/nfs.rs @@ -2001,6 +2001,8 @@ pub unsafe extern "C" fn rs_nfs_register_parser() { flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, get_frame_id_by_name: Some(NFSFrameType::ffi_id_from_name), get_frame_name_by_id: Some(NFSFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); @@ -2078,6 +2080,8 @@ pub unsafe extern "C" fn rs_nfs_udp_register_parser() { flags: 0, get_frame_id_by_name: Some(NFSFrameType::ffi_id_from_name), get_frame_name_by_id: Some(NFSFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/ntp/ntp.rs b/rust/src/ntp/ntp.rs index e6f1dd6562..468eb68e7d 100644 --- a/rust/src/ntp/ntp.rs +++ b/rust/src/ntp/ntp.rs @@ -286,6 +286,8 @@ pub unsafe extern "C" fn rs_register_ntp_parser() { flags: 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/pgsql/pgsql.rs b/rust/src/pgsql/pgsql.rs index aca283a5f9..6c3f3fd225 100644 --- a/rust/src/pgsql/pgsql.rs +++ b/rust/src/pgsql/pgsql.rs @@ -896,6 +896,8 @@ pub unsafe extern "C" fn SCRegisterPgsqlParser() { flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/quic/quic.rs b/rust/src/quic/quic.rs index 03407dbae0..7c1f25efd0 100644 --- a/rust/src/quic/quic.rs +++ b/rust/src/quic/quic.rs @@ -585,6 +585,8 @@ pub unsafe extern "C" fn rs_quic_register_parser() { flags: 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/rdp/rdp.rs b/rust/src/rdp/rdp.rs index 9f681e0235..6ac26e85f2 100644 --- a/rust/src/rdp/rdp.rs +++ b/rust/src/rdp/rdp.rs @@ -488,6 +488,8 @@ pub unsafe extern "C" fn SCRegisterRdpParser() { flags: 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = std::ffi::CString::new("tcp").unwrap(); diff --git a/rust/src/rfb/rfb.rs b/rust/src/rfb/rfb.rs index 3c34196171..c931e55b5a 100644 --- a/rust/src/rfb/rfb.rs +++ b/rust/src/rfb/rfb.rs @@ -872,6 +872,8 @@ pub unsafe extern "C" fn SCRfbRegisterParser() { flags: 0, get_frame_id_by_name: Some(RFBFrameType::ffi_id_from_name), get_frame_name_by_id: Some(RFBFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/sip/sip.rs b/rust/src/sip/sip.rs index d0549685fa..e85bdd7ad8 100755 --- a/rust/src/sip/sip.rs +++ b/rust/src/sip/sip.rs @@ -584,6 +584,8 @@ pub unsafe extern "C" fn rs_sip_register_parser() { flags: 0, get_frame_id_by_name: Some(SIPFrameType::ffi_id_from_name), get_frame_name_by_id: Some(SIPFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); diff --git a/rust/src/smb/smb.rs b/rust/src/smb/smb.rs index 6311fdea62..ea12e29dde 100644 --- a/rust/src/smb/smb.rs +++ b/rust/src/smb/smb.rs @@ -2360,6 +2360,8 @@ pub unsafe extern "C" fn SCRegisterSmbParser() { flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, get_frame_id_by_name: Some(SMBFrameType::ffi_id_from_name), get_frame_name_by_id: Some(SMBFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/snmp/snmp.rs b/rust/src/snmp/snmp.rs index 2271a93142..2db8644b78 100644 --- a/rust/src/snmp/snmp.rs +++ b/rust/src/snmp/snmp.rs @@ -407,6 +407,8 @@ pub unsafe extern "C" fn SCRegisterSnmpParser() { flags : 0, get_frame_id_by_name: None, get_frame_name_by_id: None, + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("udp").unwrap(); ALPROTO_SNMP = AppProtoNewProtoFromString(PARSER_NAME.as_ptr() as *const std::os::raw::c_char); diff --git a/rust/src/ssh/ssh.rs b/rust/src/ssh/ssh.rs index 649bea74db..a4b7b22463 100644 --- a/rust/src/ssh/ssh.rs +++ b/rust/src/ssh/ssh.rs @@ -552,6 +552,8 @@ pub unsafe extern "C" fn SCRegisterSshParser() { flags: 0, get_frame_id_by_name: Some(SshFrameType::ffi_id_from_name), get_frame_name_by_id: Some(SshFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/rust/src/telnet/telnet.rs b/rust/src/telnet/telnet.rs index 88dcd3638e..05e4cfc70b 100644 --- a/rust/src/telnet/telnet.rs +++ b/rust/src/telnet/telnet.rs @@ -541,6 +541,8 @@ pub unsafe extern "C" fn rs_telnet_register_parser() { flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, get_frame_id_by_name: Some(TelnetFrameType::ffi_id_from_name), get_frame_name_by_id: Some(TelnetFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; diff --git a/rust/src/websocket/websocket.rs b/rust/src/websocket/websocket.rs index 516065ebfb..d4046c97ae 100644 --- a/rust/src/websocket/websocket.rs +++ b/rust/src/websocket/websocket.rs @@ -370,6 +370,8 @@ pub unsafe extern "C" fn rs_websocket_register_parser() { flags: 0, // do not accept gaps as there is no good way to resync get_frame_id_by_name: Some(WebSocketFrameType::ffi_id_from_name), get_frame_name_by_id: Some(WebSocketFrameType::ffi_name_from_id), + get_state_id_by_name: None, + get_state_name_by_id: None, }; let ip_proto_str = CString::new("tcp").unwrap(); diff --git a/src/app-layer-parser.c b/src/app-layer-parser.c index 6f36def8fe..088dd1f0f5 100644 --- a/src/app-layer-parser.c +++ b/src/app-layer-parser.c @@ -107,6 +107,9 @@ typedef struct AppLayerParserProtoCtx_ AppLayerParserGetFrameIdByNameFn GetFrameIdByName; AppLayerParserGetFrameNameByIdFn GetFrameNameById; + AppLayerParserGetStateIdByNameFn GetStateIdByName; + AppLayerParserGetStateNameByIdFn GetStateNameById; + /* each app-layer has its own value */ uint32_t stream_depth; @@ -568,6 +571,16 @@ void AppLayerParserRegisterGetEventInfoById(uint8_t ipproto, AppProto alproto, SCReturn; } +void AppLayerParserRegisterGetStateFuncs(uint8_t ipproto, AppProto alproto, + AppLayerParserGetStateIdByNameFn GetIdByNameFunc, + AppLayerParserGetStateNameByIdFn GetNameByIdFunc) +{ + SCEnter(); + alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateIdByName = GetIdByNameFunc; + alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateNameById = GetNameByIdFunc; + SCReturn; +} + void AppLayerParserRegisterGetFrameFuncs(uint8_t ipproto, AppProto alproto, AppLayerParserGetFrameIdByNameFn GetIdByNameFunc, AppLayerParserGetFrameNameByIdFn GetNameByIdFunc) @@ -1591,6 +1604,35 @@ void AppLayerParserSetStreamDepthFlag(uint8_t ipproto, AppProto alproto, void *s SCReturn; } +/** + * \param id progress value id to get the name for + * \param direction STREAM_TOSERVER/STREAM_TOCLIENT + */ +int AppLayerParserGetStateIdByName( + uint8_t ipproto, AppProto alproto, const char *name, const uint8_t direction) +{ + if (alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateIdByName != NULL) { + return alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateIdByName( + name, direction); + } else { + return -1; + } +} + +/** + * \param id progress value id to get the name for + * \param direction STREAM_TOSERVER/STREAM_TOCLIENT + */ +const char *AppLayerParserGetStateNameById( + uint8_t ipproto, AppProto alproto, const int id, const uint8_t direction) +{ + if (alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateNameById != NULL) { + return alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateNameById(id, direction); + } else { + return NULL; + } +} + int AppLayerParserGetFrameIdByName(uint8_t ipproto, AppProto alproto, const char *name) { if (alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetFrameIdByName != NULL) { diff --git a/src/app-layer-parser.h b/src/app-layer-parser.h index dfcc8f28fc..421a9778ca 100644 --- a/src/app-layer-parser.h +++ b/src/app-layer-parser.h @@ -131,6 +131,17 @@ typedef AppLayerGetTxIterTuple (*AppLayerGetTxIteratorFunc) /***** Parser related registration *****/ +/** + * \param name progress name to get the id for + * \param direction STREAM_TOSERVER/STREAM_TOCLIENT + */ +typedef int (*AppLayerParserGetStateIdByNameFn)(const char *name, const uint8_t direction); +/** + * \param id progress value id to get the name for + * \param direction STREAM_TOSERVER/STREAM_TOCLIENT + */ +typedef const char *(*AppLayerParserGetStateNameByIdFn)(const int id, const uint8_t direction); + typedef int (*AppLayerParserGetFrameIdByNameFn)(const char *frame_name); typedef const char *(*AppLayerParserGetFrameNameByIdFn)(const uint8_t id); @@ -182,6 +193,9 @@ void AppLayerParserRegisterGetFrameFuncs(uint8_t ipproto, AppProto alproto, AppLayerParserGetFrameNameByIdFn GetFrameNameById); void AppLayerParserRegisterSetStreamDepthFlag(uint8_t ipproto, AppProto alproto, void (*SetStreamDepthFlag)(void *tx, uint8_t flags)); +void AppLayerParserRegisterGetStateFuncs(uint8_t ipproto, AppProto alproto, + AppLayerParserGetStateIdByNameFn GetStateIdByName, + AppLayerParserGetStateNameByIdFn GetStateNameById); void AppLayerParserRegisterTxDataFunc(uint8_t ipproto, AppProto alproto, AppLayerTxData *(*GetTxData)(void *tx)); @@ -269,6 +283,18 @@ void AppLayerParserSetStreamDepthFlag(uint8_t ipproto, AppProto alproto, void *s int AppLayerParserIsEnabled(AppProto alproto); int AppLayerParserGetFrameIdByName(uint8_t ipproto, AppProto alproto, const char *name); const char *AppLayerParserGetFrameNameById(uint8_t ipproto, AppProto alproto, const uint8_t id); +/** + * \param name progress name to get the id for + * \param direction STREAM_TOSERVER/STREAM_TOCLIENT + */ +int AppLayerParserGetStateIdByName( + uint8_t ipproto, AppProto alproto, const char *name, uint8_t direction); +/** + * \param id progress value id to get the name for + * \param direction STREAM_TOSERVER/STREAM_TOCLIENT + */ +const char *AppLayerParserGetStateNameById( + uint8_t ipproto, AppProto alproto, const int id, uint8_t direction); /***** Cleanup *****/ diff --git a/src/app-layer-register.c b/src/app-layer-register.c index 9a33a38eea..109804dc1e 100644 --- a/src/app-layer-register.c +++ b/src/app-layer-register.c @@ -188,6 +188,11 @@ int AppLayerRegisterParser(const struct AppLayerParser *p, AppProto alproto) p->ip_proto, alproto, p->GetFrameIdByName, p->GetFrameNameById); } + if (p->GetStateIdByName && p->GetStateNameById) { + AppLayerParserRegisterGetStateFuncs( + p->ip_proto, alproto, p->GetStateIdByName, p->GetStateNameById); + } + return 0; } diff --git a/src/app-layer-register.h b/src/app-layer-register.h index 6f489c73e2..a6528b76b1 100644 --- a/src/app-layer-register.h +++ b/src/app-layer-register.h @@ -74,6 +74,8 @@ typedef struct AppLayerParser { AppLayerParserGetFrameIdByNameFn GetFrameIdByName; AppLayerParserGetFrameNameByIdFn GetFrameNameById; + AppLayerParserGetStateIdByNameFn GetStateIdByName; + AppLayerParserGetStateNameByIdFn GetStateNameById; } AppLayerParser; /**