From: Jason Ish Date: Tue, 26 Apr 2022 19:21:40 +0000 (-0600) Subject: app-layer: more generic state trait X-Git-Tag: suricata-7.0.0-beta1~669 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b11b4d3a1b4787992279dfa0d4583f3fb94add2;p=thirdparty%2Fsuricata.git app-layer: more generic state trait Instead of a method that is required to return a slice of transactions, use 2 methods, one to return the number of transactions in the collection, and another to get a transaction by its index in the collection. This allows for the transaction collection to not be a contiguous array and instead can be a VecDeque, or possibly another collection type that supports retrieval by index. Ticket #5278 --- diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index d5700268fe..e0df43298f 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -1,4 +1,4 @@ -/* Copyright (C) 2017-2021 Open Information Security Foundation +/* Copyright (C) 2017-2022 Open Information Security Foundation * * You can copy, redistribute or modify this Program under the terms of * the GNU General Public License version 2 as published by the Free @@ -535,14 +535,17 @@ pub trait Transaction { } pub trait State { - fn get_transactions(&self) -> &[Tx]; + /// Return the number of transactions in the state's transaction collection. + fn get_transaction_count(&self) -> usize; + + /// Return a transaction by its index in the container. + fn get_transaction_by_index(&self, index: usize) -> Option<&Tx>; fn get_transaction_iterator(&self, min_tx_id: u64, state: &mut u64) -> AppLayerGetTxIterTuple { let mut index = *state as usize; - let transactions = self.get_transactions(); - let len = transactions.len(); + let len = self.get_transaction_count(); while index < len { - let tx = &transactions[index]; + let tx = self.get_transaction_by_index(index).unwrap(); if tx.id() < min_tx_id + 1 { index += 1; continue; diff --git a/rust/src/applayertemplate/template.rs b/rust/src/applayertemplate/template.rs index 7551cbf9eb..2e7234c76f 100644 --- a/rust/src/applayertemplate/template.rs +++ b/rust/src/applayertemplate/template.rs @@ -60,8 +60,12 @@ pub struct TemplateState { } impl State for TemplateState { - fn get_transactions(&self) -> &[TemplateTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&TemplateTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/dhcp/dhcp.rs b/rust/src/dhcp/dhcp.rs index 9dad3d2b71..063f981f7e 100644 --- a/rust/src/dhcp/dhcp.rs +++ b/rust/src/dhcp/dhcp.rs @@ -109,8 +109,12 @@ pub struct DHCPState { } impl State for DHCPState { - fn get_transactions(&self) -> &[DHCPTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&DHCPTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/dns/dns.rs b/rust/src/dns/dns.rs index 485127e04e..4f5cfa8539 100644 --- a/rust/src/dns/dns.rs +++ b/rust/src/dns/dns.rs @@ -321,8 +321,12 @@ pub struct DNSState { } impl State for DNSState { - fn get_transactions(&self) -> &[DNSTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&DNSTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/http2/http2.rs b/rust/src/http2/http2.rs index 0d18a2f455..135bad0849 100644 --- a/rust/src/http2/http2.rs +++ b/rust/src/http2/http2.rs @@ -403,8 +403,12 @@ pub struct HTTP2State { } impl State for HTTP2State { - fn get_transactions(&self) -> &[HTTP2Transaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&HTTP2Transaction> { + self.transactions.get(index) } } diff --git a/rust/src/ike/ike.rs b/rust/src/ike/ike.rs index cb7677ad36..c359138477 100644 --- a/rust/src/ike/ike.rs +++ b/rust/src/ike/ike.rs @@ -144,8 +144,12 @@ pub struct IKEState { } impl State for IKEState { - fn get_transactions(&self) -> &[IKETransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&IKETransaction> { + self.transactions.get(index) } } diff --git a/rust/src/krb/krb5.rs b/rust/src/krb/krb5.rs index b1c10fef06..99ad00089a 100644 --- a/rust/src/krb/krb5.rs +++ b/rust/src/krb/krb5.rs @@ -52,8 +52,12 @@ pub struct KRB5State { } impl State for KRB5State { - fn get_transactions(&self) -> &[KRB5Transaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&KRB5Transaction> { + self.transactions.get(index) } } diff --git a/rust/src/modbus/modbus.rs b/rust/src/modbus/modbus.rs index 37c584d505..ac08703c64 100644 --- a/rust/src/modbus/modbus.rs +++ b/rust/src/modbus/modbus.rs @@ -96,8 +96,12 @@ pub struct ModbusState { } impl State for ModbusState { - fn get_transactions(&self) -> &[ModbusTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&ModbusTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/mqtt/mqtt.rs b/rust/src/mqtt/mqtt.rs index 2644612800..1071957b48 100644 --- a/rust/src/mqtt/mqtt.rs +++ b/rust/src/mqtt/mqtt.rs @@ -106,8 +106,12 @@ pub struct MQTTState { } impl State for MQTTState { - fn get_transactions(&self) -> &[MQTTTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&MQTTTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/nfs/nfs.rs b/rust/src/nfs/nfs.rs index 9a669680be..67a1d4e9c4 100644 --- a/rust/src/nfs/nfs.rs +++ b/rust/src/nfs/nfs.rs @@ -325,8 +325,12 @@ pub struct NFSState { } impl State for NFSState { - fn get_transactions(&self) -> &[NFSTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&NFSTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/ntp/ntp.rs b/rust/src/ntp/ntp.rs index ee28ac6ce5..12ec8c40a3 100644 --- a/rust/src/ntp/ntp.rs +++ b/rust/src/ntp/ntp.rs @@ -74,8 +74,12 @@ impl NTPState { } impl State for NTPState { - fn get_transactions(&self) -> &[NTPTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&NTPTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/pgsql/pgsql.rs b/rust/src/pgsql/pgsql.rs index a0bea1e596..ced155aef5 100644 --- a/rust/src/pgsql/pgsql.rs +++ b/rust/src/pgsql/pgsql.rs @@ -125,8 +125,12 @@ pub struct PgsqlState { } impl State for PgsqlState { - fn get_transactions(&self) -> &[PgsqlTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&PgsqlTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/rdp/rdp.rs b/rust/src/rdp/rdp.rs index b6d266f220..383fa66fd1 100644 --- a/rust/src/rdp/rdp.rs +++ b/rust/src/rdp/rdp.rs @@ -113,8 +113,12 @@ pub struct RdpState { } impl State for RdpState { - fn get_transactions(&self) -> &[RdpTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&RdpTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/rfb/rfb.rs b/rust/src/rfb/rfb.rs index e0e3cefa0a..f0e3a25c86 100644 --- a/rust/src/rfb/rfb.rs +++ b/rust/src/rfb/rfb.rs @@ -84,9 +84,14 @@ pub struct RFBState { } impl State for RFBState { - fn get_transactions(&self) -> &[RFBTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() } + + fn get_transaction_by_index(&self, index: usize) -> Option<&RFBTransaction> { + self.transactions.get(index) + } + } impl RFBState { diff --git a/rust/src/sip/sip.rs b/rust/src/sip/sip.rs index c775e6536c..442a358d4d 100755 --- a/rust/src/sip/sip.rs +++ b/rust/src/sip/sip.rs @@ -51,8 +51,12 @@ pub struct SIPState { } impl State for SIPState { - fn get_transactions(&self) -> &[SIPTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&SIPTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/smb/smb.rs b/rust/src/smb/smb.rs index 6cdc5163b9..ffccf6fafb 100644 --- a/rust/src/smb/smb.rs +++ b/rust/src/smb/smb.rs @@ -795,8 +795,12 @@ pub struct SMBState<> { } impl State for SMBState { - fn get_transactions(&self) -> &[SMBTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&SMBTransaction> { + self.transactions.get(index) } } diff --git a/rust/src/snmp/snmp.rs b/rust/src/snmp/snmp.rs index c12140db4e..9e05c3d4ca 100644 --- a/rust/src/snmp/snmp.rs +++ b/rust/src/snmp/snmp.rs @@ -108,8 +108,12 @@ impl<'a> Default for SNMPPduInfo<'a> { } impl<'a> State> for SNMPState<'a> { - fn get_transactions(&self) -> &[SNMPTransaction<'a>] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&SNMPTransaction<'a>> { + self.transactions.get(index) } } diff --git a/rust/src/telnet/telnet.rs b/rust/src/telnet/telnet.rs index bada4a3b20..3b5c7c511f 100644 --- a/rust/src/telnet/telnet.rs +++ b/rust/src/telnet/telnet.rs @@ -82,8 +82,12 @@ pub struct TelnetState { } impl State for TelnetState { - fn get_transactions(&self) -> &[TelnetTransaction] { - &self.transactions + fn get_transaction_count(&self) -> usize { + self.transactions.len() + } + + fn get_transaction_by_index(&self, index: usize) -> Option<&TelnetTransaction> { + self.transactions.get(index) } }