]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
threads: cleanup decode_pq handling
authorVictor Julien <vjulien@oisf.net>
Tue, 16 May 2023 20:24:02 +0000 (22:24 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 17 Oct 2023 15:50:44 +0000 (17:50 +0200)
(cherry picked from commit 25396dcd096ac36a45ccc162b8dfb01cdf34523d)

src/tm-threads.c
src/tm-threads.h

index deabe7333b1cc6dd5f35a6e550a6ea162c932d08..f0b2f823b25325e8ee45e5889541a0e1f2f8fa0b 100644 (file)
@@ -42,6 +42,7 @@
 #include "util-profiling.h"
 #include "util-signal.h"
 #include "queue.h"
+#include "util-validate.h"
 
 #ifdef PROFILE_LOCKING
 thread_local uint64_t mutex_lock_contention;
@@ -107,6 +108,22 @@ void TmThreadsUnsetFlag(ThreadVars *tv, uint32_t flag)
     SC_ATOMIC_AND(tv->flags, ~flag);
 }
 
+TmEcode TmThreadsProcessDecodePseudoPackets(
+        ThreadVars *tv, PacketQueueNoLock *decode_pq, TmSlot *slot)
+{
+    while (decode_pq->top != NULL) {
+        Packet *extra_p = PacketDequeueNoLock(decode_pq);
+        if (unlikely(extra_p == NULL))
+            continue;
+        DEBUG_VALIDATE_BUG_ON(extra_p->flow != NULL);
+
+        if (TmThreadsSlotProcessPkt(tv, slot, extra_p) != TM_ECODE_OK) {
+            SCReturnInt(TM_ECODE_FAILED);
+        }
+    }
+    SCReturnInt(TM_ECODE_OK);
+}
+
 /**
  * \brief Separate run function so we can call it recursively.
  */
@@ -124,21 +141,8 @@ TmEcode TmThreadsSlotVarRun(ThreadVars *tv, Packet *p, TmSlot *slot)
             return TM_ECODE_FAILED;
         }
 
-        /* handle new packets */
-        while (tv->decode_pq.top != NULL) {
-            Packet *extra_p = PacketDequeueNoLock(&tv->decode_pq);
-            if (unlikely(extra_p == NULL))
-                continue;
-
-            /* see if we need to process the packet */
-            if (s->slot_next != NULL) {
-                r = TmThreadsSlotVarRun(tv, extra_p, s->slot_next);
-                if (unlikely(r == TM_ECODE_FAILED)) {
-                    TmThreadsSlotProcessPktFail(tv, s, extra_p);
-                    return TM_ECODE_FAILED;
-                }
-            }
-            tv->tmqh_out(tv, extra_p);
+        if (TmThreadsProcessDecodePseudoPackets(tv, &tv->decode_pq, s->slot_next) != TM_ECODE_OK) {
+            return TM_ECODE_FAILED;
         }
     }
 
index 207a0fb7ff721e31c6a471a8563cfce7016d83f5..d68c9230a372f93dbd84ad2bb5aabc6a034b0e76 100644 (file)
@@ -129,6 +129,9 @@ TmSlot *TmThreadGetFirstTmSlotForPartialPattern(const char *);
 
 uint32_t TmThreadCountThreadsByTmmFlags(uint8_t flags);
 
+TmEcode TmThreadsProcessDecodePseudoPackets(
+        ThreadVars *tv, PacketQueueNoLock *decode_pq, TmSlot *slot);
+
 static inline void TmThreadsCleanDecodePQ(PacketQueueNoLock *pq)
 {
     while (1) {