Only used by the spare tracker logic, which works better as a stack.
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 \
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 \
#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"
static DefragTracker *DefragTrackerGetUsedDefragTracker(void);
/** queue with spare tracker */
-static DefragTrackerQueue defragtracker_spare_q;
+static DefragTrackerStack defragtracker_spare_q;
/**
* \brief Update memcap value
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();
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
*/
#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;
*
* \param q the tracker queue to destroy
*/
-void DefragTrackerQueueDestroy (DefragTrackerQueue *q)
+void DefragTrackerStackDestroy(DefragTrackerStack *q)
{
DQLOCK_DESTROY(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)
*
* \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;
}
#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;
#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 */
#include "defrag.h"
#include "defrag-hash.h"
-#include "defrag-queue.h"
#include "defrag-config.h"
#include "tmqh-packetpool.h"
/** 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);