-/* 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
}
pub trait State<Tx: Transaction> {
- 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;
}
impl State<TemplateTransaction> 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)
}
}
}
impl State<DHCPTransaction> 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)
}
}
}
impl State<DNSTransaction> 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)
}
}
}
impl State<HTTP2Transaction> 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)
}
}
}
impl State<IKETransaction> 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)
}
}
}
impl State<KRB5Transaction> 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)
}
}
}
impl State<ModbusTransaction> 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)
}
}
}
impl State<MQTTTransaction> 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)
}
}
}
impl State<NFSTransaction> 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)
}
}
}
impl State<NTPTransaction> 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)
}
}
}
impl State<PgsqlTransaction> 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)
}
}
}
impl State<RdpTransaction> 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)
}
}
}
impl State<RFBTransaction> 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 {
}
impl State<SIPTransaction> 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)
}
}
}
impl State<SMBTransaction> 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)
}
}
}
impl<'a> State<SNMPTransaction<'a>> 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)
}
}
}
impl State<TelnetTransaction> 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)
}
}