]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
dnp3: optimized tx iterator
authorPhilippe Antoine <pantoine@oisf.net>
Thu, 23 Mar 2023 07:57:53 +0000 (08:57 +0100)
committerVictor Julien <vjulien@oisf.net>
Sat, 1 Apr 2023 05:14:08 +0000 (07:14 +0200)
As for SMTP, having a linked list.

Ticket: #5927
(cherry picked from commit e15daf6a4ba00baa09c97ab61ca0b4909708d637)

src/app-layer-dnp3.c

index 2507a226a8e6570e7a4cc48aa18305c371e077b0..d0ad0a025824184769ee33b1be628bf72cdb7765 100644 (file)
@@ -1586,6 +1586,40 @@ int DNP3PrefixIsSize(uint8_t prefix_code)
     }
 }
 
+static AppLayerGetTxIterTuple DNP3GetTxIterator(const uint8_t ipproto, const AppProto alproto,
+        void *alstate, uint64_t min_tx_id, uint64_t max_tx_id, AppLayerGetTxIterState *state)
+{
+    DNP3State *dnp_state = (DNP3State *)alstate;
+    AppLayerGetTxIterTuple no_tuple = { NULL, 0, false };
+    if (dnp_state) {
+        DNP3Transaction *tx_ptr;
+        if (state->un.ptr == NULL) {
+            tx_ptr = TAILQ_FIRST(&dnp_state->tx_list);
+        } else {
+            tx_ptr = (DNP3Transaction *)state->un.ptr;
+        }
+        if (tx_ptr) {
+            while (tx_ptr->tx_num < min_tx_id + 1) {
+                tx_ptr = TAILQ_NEXT(tx_ptr, next);
+                if (!tx_ptr) {
+                    return no_tuple;
+                }
+            }
+            if (tx_ptr->tx_num >= max_tx_id + 1) {
+                return no_tuple;
+            }
+            state->un.ptr = TAILQ_NEXT(tx_ptr, next);
+            AppLayerGetTxIterTuple tuple = {
+                .tx_ptr = tx_ptr,
+                .tx_id = tx_ptr->tx_num - 1,
+                .has_next = (state->un.ptr != NULL),
+            };
+            return tuple;
+        }
+    }
+    return no_tuple;
+}
+
 /**
  * \brief Register the DNP3 application protocol parser.
  */
@@ -1636,6 +1670,7 @@ void RegisterDNP3Parsers(void)
             DNP3GetTxDetectState, DNP3SetTxDetectState);
 
         AppLayerParserRegisterGetTx(IPPROTO_TCP, ALPROTO_DNP3, DNP3GetTx);
+        AppLayerParserRegisterGetTxIterator(IPPROTO_TCP, ALPROTO_DNP3, DNP3GetTxIterator);
         AppLayerParserRegisterGetTxCnt(IPPROTO_TCP, ALPROTO_DNP3, DNP3GetTxCnt);
         AppLayerParserRegisterTxFreeFunc(IPPROTO_TCP, ALPROTO_DNP3,
             DNP3StateTxFree);