defrag: turn queue into stack

Only used by the spare tracker logic, which works better as a stack.
pull/11227/head
Victor Julien 1 year ago committed by Victor Julien
parent 475c40f9c2
commit fc93a3875e

@ -86,7 +86,7 @@ noinst_HEADERS = \
defrag-config.h \ defrag-config.h \
defrag.h \ defrag.h \
defrag-hash.h \ defrag-hash.h \
defrag-queue.h \ defrag-stack.h \
defrag-timeout.h \ defrag-timeout.h \
detect-app-layer-event.h \ detect-app-layer-event.h \
detect-app-layer-protocol.h \ detect-app-layer-protocol.h \
@ -698,7 +698,7 @@ libsuricata_c_a_SOURCES = \
defrag.c \ defrag.c \
defrag-config.c \ defrag-config.c \
defrag-hash.c \ defrag-hash.c \
defrag-queue.c \ defrag-stack.c \
defrag-timeout.c \ defrag-timeout.c \
detect-app-layer-event.c \ detect-app-layer-event.c \
detect-app-layer-protocol.c \ detect-app-layer-protocol.c \

@ -18,7 +18,7 @@
#include "suricata-common.h" #include "suricata-common.h"
#include "conf.h" #include "conf.h"
#include "defrag-hash.h" #include "defrag-hash.h"
#include "defrag-queue.h" #include "defrag-stack.h"
#include "defrag-config.h" #include "defrag-config.h"
#include "util-random.h" #include "util-random.h"
#include "util-byte.h" #include "util-byte.h"
@ -36,7 +36,7 @@ SC_ATOMIC_DECLARE(unsigned int,defragtracker_prune_idx);
static DefragTracker *DefragTrackerGetUsedDefragTracker(void); static DefragTracker *DefragTrackerGetUsedDefragTracker(void);
/** queue with spare tracker */ /** queue with spare tracker */
static DefragTrackerQueue defragtracker_spare_q; static DefragTrackerStack defragtracker_spare_q;
/** /**
* \brief Update memcap value * \brief Update memcap value
@ -173,7 +173,7 @@ void DefragInitConfig(bool quiet)
SC_ATOMIC_INIT(defrag_memuse); SC_ATOMIC_INIT(defrag_memuse);
SC_ATOMIC_INIT(defragtracker_prune_idx); SC_ATOMIC_INIT(defragtracker_prune_idx);
SC_ATOMIC_INIT(defrag_config.memcap); SC_ATOMIC_INIT(defrag_config.memcap);
DefragTrackerQueueInit(&defragtracker_spare_q); DefragTrackerStackInit(&defragtracker_spare_q);
/* set defaults */ /* set defaults */
defrag_config.hash_rand = (uint32_t)RandomGet(); defrag_config.hash_rand = (uint32_t)RandomGet();
@ -318,7 +318,7 @@ void DefragHashShutdown(void)
defragtracker_hash = NULL; defragtracker_hash = NULL;
} }
(void) SC_ATOMIC_SUB(defrag_memuse, defrag_config.hash_size * sizeof(DefragTrackerHashRow)); (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 /** \brief compare two raw ipv6 addrs

@ -24,15 +24,15 @@
*/ */
#include "suricata-common.h" #include "suricata-common.h"
#include "defrag-queue.h" #include "defrag-stack.h"
#include "util-error.h" #include "util-error.h"
#include "util-debug.h" #include "util-debug.h"
#include "util-print.h" #include "util-print.h"
DefragTrackerQueue *DefragTrackerQueueInit (DefragTrackerQueue *q) DefragTrackerStack *DefragTrackerStackInit(DefragTrackerStack *q)
{ {
if (q != NULL) { if (q != NULL) {
memset(q, 0, sizeof(DefragTrackerQueue)); memset(q, 0, sizeof(DefragTrackerStack));
DQLOCK_INIT(q); DQLOCK_INIT(q);
} }
return q; return q;
@ -43,7 +43,7 @@ DefragTrackerQueue *DefragTrackerQueueInit (DefragTrackerQueue *q)
* *
* \param q the tracker queue to destroy * \param q the tracker queue to destroy
*/ */
void DefragTrackerQueueDestroy (DefragTrackerQueue *q) void DefragTrackerStackDestroy(DefragTrackerStack *q)
{ {
DQLOCK_DESTROY(q); DQLOCK_DESTROY(q);
} }
@ -54,24 +54,15 @@ void DefragTrackerQueueDestroy (DefragTrackerQueue *q)
* \param q queue * \param q queue
* \param dt tracker * \param dt tracker
*/ */
void DefragTrackerEnqueue (DefragTrackerQueue *q, DefragTracker *dt) void DefragTrackerEnqueue(DefragTrackerStack *q, DefragTracker *dt)
{ {
#ifdef DEBUG #ifdef DEBUG
BUG_ON(q == NULL || dt == NULL); BUG_ON(q == NULL || dt == NULL);
#endif #endif
DQLOCK_LOCK(q); DQLOCK_LOCK(q);
dt->lnext = q->s;
/* more trackers in queue */ q->s = dt;
if (q->top != NULL) {
dt->lnext = q->top;
q->top->lprev = dt;
q->top = dt;
/* only tracker */
} else {
q->top = dt;
q->bot = dt;
}
q->len++; q->len++;
#ifdef DBG_PERF #ifdef DBG_PERF
if (q->len > q->dbg_maxlen) if (q->len > q->dbg_maxlen)
@ -87,35 +78,23 @@ void DefragTrackerEnqueue (DefragTrackerQueue *q, DefragTracker *dt)
* *
* \retval dt tracker or NULL if empty list. * \retval dt tracker or NULL if empty list.
*/ */
DefragTracker *DefragTrackerDequeue (DefragTrackerQueue *q) DefragTracker *DefragTrackerDequeue(DefragTrackerStack *q)
{ {
DQLOCK_LOCK(q); DQLOCK_LOCK(q);
DefragTracker *dt = q->bot; DefragTracker *dt = q->s;
if (dt == NULL) { if (dt == NULL) {
DQLOCK_UNLOCK(q); DQLOCK_UNLOCK(q);
return NULL; return NULL;
} }
q->s = dt->lnext;
/* more packets in queue */ dt->lnext = NULL;
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;
}
#ifdef DEBUG #ifdef DEBUG
BUG_ON(q->len == 0); BUG_ON(q->len == 0);
#endif #endif
if (q->len > 0) if (q->len > 0)
q->len--; q->len--;
dt->lnext = NULL;
dt->lprev = NULL;
DQLOCK_UNLOCK(q); DQLOCK_UNLOCK(q);
return dt; return dt;
} }

@ -32,16 +32,14 @@
#define DQLOCK_MUTEX #define DQLOCK_MUTEX
#ifdef DQLOCK_SPIN #ifdef DQLOCK_SPIN
#ifdef DQLOCK_MUTEX #ifdef DQLOCK_MUTEX
#error Cannot enable both DQLOCK_SPIN and DQLOCK_MUTEX #error Cannot enable both DQLOCK_SPIN and DQLOCK_MUTEX
#endif #endif
#endif #endif
/* Define a queue for storing defrag trackers */ /* Define a queue for storing defrag trackers */
typedef struct DefragTrackerQueue_ typedef struct DefragTrackerStack_ {
{ DefragTracker *s;
DefragTracker *top;
DefragTracker *bot;
uint32_t len; uint32_t len;
#ifdef DBG_PERF #ifdef DBG_PERF
uint32_t dbg_maxlen; uint32_t dbg_maxlen;
@ -51,31 +49,31 @@ typedef struct DefragTrackerQueue_
#elif defined DQLOCK_SPIN #elif defined DQLOCK_SPIN
SCSpinlock s; SCSpinlock s;
#else #else
#error Enable DQLOCK_SPIN or DQLOCK_MUTEX #error Enable DQLOCK_SPIN or DQLOCK_MUTEX
#endif #endif
} DefragTrackerQueue; } DefragTrackerStack;
#ifdef DQLOCK_SPIN #ifdef DQLOCK_SPIN
#define DQLOCK_INIT(q) SCSpinInit(&(q)->s, 0) #define DQLOCK_INIT(q) SCSpinInit(&(q)->s, 0)
#define DQLOCK_DESTROY(q) SCSpinDestroy(&(q)->s) #define DQLOCK_DESTROY(q) SCSpinDestroy(&(q)->s)
#define DQLOCK_LOCK(q) SCSpinLock(&(q)->s) #define DQLOCK_LOCK(q) SCSpinLock(&(q)->s)
#define DQLOCK_TRYLOCK(q) SCSpinTrylock(&(q)->s) #define DQLOCK_TRYLOCK(q) SCSpinTrylock(&(q)->s)
#define DQLOCK_UNLOCK(q) SCSpinUnlock(&(q)->s) #define DQLOCK_UNLOCK(q) SCSpinUnlock(&(q)->s)
#elif defined DQLOCK_MUTEX #elif defined DQLOCK_MUTEX
#define DQLOCK_INIT(q) SCMutexInit(&(q)->m, NULL) #define DQLOCK_INIT(q) SCMutexInit(&(q)->m, NULL)
#define DQLOCK_DESTROY(q) SCMutexDestroy(&(q)->m) #define DQLOCK_DESTROY(q) SCMutexDestroy(&(q)->m)
#define DQLOCK_LOCK(q) SCMutexLock(&(q)->m) #define DQLOCK_LOCK(q) SCMutexLock(&(q)->m)
#define DQLOCK_TRYLOCK(q) SCMutexTrylock(&(q)->m) #define DQLOCK_TRYLOCK(q) SCMutexTrylock(&(q)->m)
#define DQLOCK_UNLOCK(q) SCMutexUnlock(&(q)->m) #define DQLOCK_UNLOCK(q) SCMutexUnlock(&(q)->m)
#else #else
#error Enable DQLOCK_SPIN or DQLOCK_MUTEX #error Enable DQLOCK_SPIN or DQLOCK_MUTEX
#endif #endif
/* prototypes */ /* prototypes */
DefragTrackerQueue *DefragTrackerQueueInit(DefragTrackerQueue *); DefragTrackerStack *DefragTrackerStackInit(DefragTrackerStack *);
void DefragTrackerQueueDestroy (DefragTrackerQueue *); void DefragTrackerStackDestroy(DefragTrackerStack *);
void DefragTrackerEnqueue (DefragTrackerQueue *, DefragTracker *); void DefragTrackerEnqueue(DefragTrackerStack *, DefragTracker *);
DefragTracker *DefragTrackerDequeue(DefragTrackerQueue *); DefragTracker *DefragTrackerDequeue(DefragTrackerStack *);
#endif /* SURICATA_DEFRAG_QUEUE_H */ #endif /* SURICATA_DEFRAG_QUEUE_H */

@ -53,7 +53,6 @@
#include "defrag.h" #include "defrag.h"
#include "defrag-hash.h" #include "defrag-hash.h"
#include "defrag-queue.h"
#include "defrag-config.h" #include "defrag-config.h"
#include "tmqh-packetpool.h" #include "tmqh-packetpool.h"

@ -118,9 +118,8 @@ typedef struct DefragTracker_ {
/** hash pointer, protected by hash row mutex/spin */ /** hash pointer, protected by hash row mutex/spin */
struct DefragTracker_ *hnext; struct DefragTracker_ *hnext;
/** list pointers, protected by tracker-queue mutex/spin */ /** stack pointer, protected by tracker-queue mutex/spin */
struct DefragTracker_ *lnext; struct DefragTracker_ *lnext;
struct DefragTracker_ *lprev;
} DefragTracker; } DefragTracker;
void DefragInit(void); void DefragInit(void);

Loading…
Cancel
Save