]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
defrag: turn queue into stack
authorVictor Julien <vjulien@oisf.net>
Thu, 23 May 2024 04:37:33 +0000 (06:37 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 4 Jun 2024 04:28:26 +0000 (06:28 +0200)
Only used by the spare tracker logic, which works better as a stack.

src/Makefile.am
src/defrag-hash.c
src/defrag-stack.c [moved from src/defrag-queue.c with 67% similarity]
src/defrag-stack.h [moved from src/defrag-queue.h with 57% similarity]
src/defrag.c
src/defrag.h

index 878138539f46a66a3711c099542465e7fc1b7d82..2f4aa22d6a1d133d0f50f72a44f983d4cc01172d 100755 (executable)
@@ -86,7 +86,7 @@ noinst_HEADERS = \
        defrag-config.h \
        defrag.h \
        defrag-hash.h \
-       defrag-queue.h \
+       defrag-stack.h \
        defrag-timeout.h \
        detect-app-layer-event.h \
        detect-app-layer-protocol.h \
@@ -698,7 +698,7 @@ libsuricata_c_a_SOURCES = \
        defrag.c \
        defrag-config.c \
        defrag-hash.c \
-       defrag-queue.c \
+       defrag-stack.c \
        defrag-timeout.c \
        detect-app-layer-event.c \
        detect-app-layer-protocol.c \
index 693ff4fc5f87e2afcd3e1d7105b29927234e7653..9fd6619f5114aad82e53ac9079cf5c88fe47baef 100644 (file)
@@ -18,7 +18,7 @@
 #include "suricata-common.h"
 #include "conf.h"
 #include "defrag-hash.h"
-#include "defrag-queue.h"
+#include "defrag-stack.h"
 #include "defrag-config.h"
 #include "util-random.h"
 #include "util-byte.h"
@@ -36,7 +36,7 @@ SC_ATOMIC_DECLARE(unsigned int,defragtracker_prune_idx);
 static DefragTracker *DefragTrackerGetUsedDefragTracker(void);
 
 /** queue with spare tracker */
-static DefragTrackerQueue defragtracker_spare_q;
+static DefragTrackerStack defragtracker_spare_q;
 
 /**
  *  \brief Update memcap value
@@ -173,7 +173,7 @@ void DefragInitConfig(bool quiet)
     SC_ATOMIC_INIT(defrag_memuse);
     SC_ATOMIC_INIT(defragtracker_prune_idx);
     SC_ATOMIC_INIT(defrag_config.memcap);
-    DefragTrackerQueueInit(&defragtracker_spare_q);
+    DefragTrackerStackInit(&defragtracker_spare_q);
 
     /* set defaults */
     defrag_config.hash_rand   = (uint32_t)RandomGet();
@@ -318,7 +318,7 @@ void DefragHashShutdown(void)
         defragtracker_hash = NULL;
     }
     (void) SC_ATOMIC_SUB(defrag_memuse, defrag_config.hash_size * sizeof(DefragTrackerHashRow));
-    DefragTrackerQueueDestroy(&defragtracker_spare_q);
+    DefragTrackerStackDestroy(&defragtracker_spare_q);
 }
 
 /** \brief compare two raw ipv6 addrs
similarity index 67%
rename from src/defrag-queue.c
rename to src/defrag-stack.c
index 76ab25de98c2c4b5c04c55a8c7da31467d0438d3..22d5776df960cd9933b048317c3e74908306c0a4 100644 (file)
  */
 
 #include "suricata-common.h"
-#include "defrag-queue.h"
+#include "defrag-stack.h"
 #include "util-error.h"
 #include "util-debug.h"
 #include "util-print.h"
 
-DefragTrackerQueue *DefragTrackerQueueInit (DefragTrackerQueue *q)
+DefragTrackerStack *DefragTrackerStackInit(DefragTrackerStack *q)
 {
     if (q != NULL) {
-        memset(q, 0, sizeof(DefragTrackerQueue));
+        memset(q, 0, sizeof(DefragTrackerStack));
         DQLOCK_INIT(q);
     }
     return q;
@@ -43,7 +43,7 @@ DefragTrackerQueue *DefragTrackerQueueInit (DefragTrackerQueue *q)
  *
  *  \param q the tracker queue to destroy
  */
-void DefragTrackerQueueDestroy (DefragTrackerQueue *q)
+void DefragTrackerStackDestroy(DefragTrackerStack *q)
 {
     DQLOCK_DESTROY(q);
 }
@@ -54,24 +54,15 @@ void DefragTrackerQueueDestroy (DefragTrackerQueue *q)
  *  \param q queue
  *  \param dt tracker
  */
-void DefragTrackerEnqueue (DefragTrackerQueue *q, DefragTracker *dt)
+void DefragTrackerEnqueue(DefragTrackerStack *q, DefragTracker *dt)
 {
 #ifdef DEBUG
     BUG_ON(q == NULL || dt == NULL);
 #endif
 
     DQLOCK_LOCK(q);
-
-    /* more trackers in queue */
-    if (q->top != NULL) {
-        dt->lnext = q->top;
-        q->top->lprev = dt;
-        q->top = dt;
-    /* only tracker */
-    } else {
-        q->top = dt;
-        q->bot = dt;
-    }
+    dt->lnext = q->s;
+    q->s = dt;
     q->len++;
 #ifdef DBG_PERF
     if (q->len > q->dbg_maxlen)
@@ -87,35 +78,23 @@ void DefragTrackerEnqueue (DefragTrackerQueue *q, DefragTracker *dt)
  *
  *  \retval dt tracker or NULL if empty list.
  */
-DefragTracker *DefragTrackerDequeue (DefragTrackerQueue *q)
+DefragTracker *DefragTrackerDequeue(DefragTrackerStack *q)
 {
     DQLOCK_LOCK(q);
 
-    DefragTracker *dt = q->bot;
+    DefragTracker *dt = q->s;
     if (dt == NULL) {
         DQLOCK_UNLOCK(q);
         return NULL;
     }
-
-    /* more packets in queue */
-    if (q->bot->lprev != NULL) {
-        q->bot = q->bot->lprev;
-        q->bot->lnext = NULL;
-    /* just the one we remove, so now empty */
-    } else {
-        q->top = NULL;
-        q->bot = NULL;
-    }
+    q->s = dt->lnext;
+    dt->lnext = NULL;
 
 #ifdef DEBUG
     BUG_ON(q->len == 0);
 #endif
     if (q->len > 0)
         q->len--;
-
-    dt->lnext = NULL;
-    dt->lprev = NULL;
-
     DQLOCK_UNLOCK(q);
     return dt;
 }
similarity index 57%
rename from src/defrag-queue.h
rename to src/defrag-stack.h
index 014c78360422cb53316854f8953d92bfc857d9af..99bb1268148833faebdb3808e2f6c27f3fd1a3e6 100644 (file)
 #define DQLOCK_MUTEX
 
 #ifdef DQLOCK_SPIN
-    #ifdef DQLOCK_MUTEX
-        #error Cannot enable both DQLOCK_SPIN and DQLOCK_MUTEX
-    #endif
+#ifdef DQLOCK_MUTEX
+#error Cannot enable both DQLOCK_SPIN and DQLOCK_MUTEX
+#endif
 #endif
 
 /* Define a queue for storing defrag trackers */
-typedef struct DefragTrackerQueue_
-{
-    DefragTracker *top;
-    DefragTracker *bot;
+typedef struct DefragTrackerStack_ {
+    DefragTracker *s;
     uint32_t len;
 #ifdef DBG_PERF
     uint32_t dbg_maxlen;
@@ -51,31 +49,31 @@ typedef struct DefragTrackerQueue_
 #elif defined DQLOCK_SPIN
     SCSpinlock s;
 #else
-    #error Enable DQLOCK_SPIN or DQLOCK_MUTEX
+#error Enable DQLOCK_SPIN or DQLOCK_MUTEX
 #endif
-} DefragTrackerQueue;
+} DefragTrackerStack;
 
 #ifdef DQLOCK_SPIN
-    #define DQLOCK_INIT(q) SCSpinInit(&(q)->s, 0)
-    #define DQLOCK_DESTROY(q) SCSpinDestroy(&(q)->s)
-    #define DQLOCK_LOCK(q) SCSpinLock(&(q)->s)
-    #define DQLOCK_TRYLOCK(q) SCSpinTrylock(&(q)->s)
-    #define DQLOCK_UNLOCK(q) SCSpinUnlock(&(q)->s)
+#define DQLOCK_INIT(q)    SCSpinInit(&(q)->s, 0)
+#define DQLOCK_DESTROY(q) SCSpinDestroy(&(q)->s)
+#define DQLOCK_LOCK(q)    SCSpinLock(&(q)->s)
+#define DQLOCK_TRYLOCK(q) SCSpinTrylock(&(q)->s)
+#define DQLOCK_UNLOCK(q)  SCSpinUnlock(&(q)->s)
 #elif defined DQLOCK_MUTEX
-    #define DQLOCK_INIT(q) SCMutexInit(&(q)->m, NULL)
-    #define DQLOCK_DESTROY(q) SCMutexDestroy(&(q)->m)
-    #define DQLOCK_LOCK(q) SCMutexLock(&(q)->m)
-    #define DQLOCK_TRYLOCK(q) SCMutexTrylock(&(q)->m)
-    #define DQLOCK_UNLOCK(q) SCMutexUnlock(&(q)->m)
+#define DQLOCK_INIT(q)    SCMutexInit(&(q)->m, NULL)
+#define DQLOCK_DESTROY(q) SCMutexDestroy(&(q)->m)
+#define DQLOCK_LOCK(q)    SCMutexLock(&(q)->m)
+#define DQLOCK_TRYLOCK(q) SCMutexTrylock(&(q)->m)
+#define DQLOCK_UNLOCK(q)  SCMutexUnlock(&(q)->m)
 #else
-    #error Enable DQLOCK_SPIN or DQLOCK_MUTEX
+#error Enable DQLOCK_SPIN or DQLOCK_MUTEX
 #endif
 
 /* prototypes */
-DefragTrackerQueue *DefragTrackerQueueInit(DefragTrackerQueue *);
-void DefragTrackerQueueDestroy (DefragTrackerQueue *);
+DefragTrackerStack *DefragTrackerStackInit(DefragTrackerStack *);
+void DefragTrackerStackDestroy(DefragTrackerStack *);
 
-void DefragTrackerEnqueue (DefragTrackerQueue *, DefragTracker *);
-DefragTracker *DefragTrackerDequeue(DefragTrackerQueue *);
+void DefragTrackerEnqueue(DefragTrackerStack *, DefragTracker *);
+DefragTracker *DefragTrackerDequeue(DefragTrackerStack *);
 
 #endif /* SURICATA_DEFRAG_QUEUE_H */
index 1e0213d1279ac67ee7584fb5c6478f74b665d472..d850ccf394f99df17177a0ef0f2597fa33e46e5e 100644 (file)
@@ -53,7 +53,6 @@
 
 #include "defrag.h"
 #include "defrag-hash.h"
-#include "defrag-queue.h"
 #include "defrag-config.h"
 
 #include "tmqh-packetpool.h"
index 3fb65aeed80eea65f44f2722afd196b055d93105..696b917cde8a1c28524ffb750fff371e85dfddfa 100644 (file)
@@ -118,9 +118,8 @@ typedef struct DefragTracker_ {
     /** hash pointer, protected by hash row mutex/spin */
     struct DefragTracker_ *hnext;
 
-    /** list pointers, protected by tracker-queue mutex/spin */
+    /** stack pointer, protected by tracker-queue mutex/spin */
     struct DefragTracker_ *lnext;
-    struct DefragTracker_ *lprev;
 } DefragTracker;
 
 void DefragInit(void);