suricata
util-thash.h
Go to the documentation of this file.
1/* Copyright (C) 2007-2024 Open Information Security Foundation
2 *
3 * You can copy, redistribute or modify this Program under the terms of
4 * the GNU General Public License version 2 as published by the Free
5 * Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * version 2 along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15 * 02110-1301, USA.
16 */
17
18/**
19 * \file
20 *
21 * \author Victor Julien <victor@inliniac.net>
22 *
23 * thash -> thread hash. Hash table with locking handling.
24 */
25
26#ifndef SURICATA_THASH_H
27#define SURICATA_THASH_H
28
29#include "threads.h"
30
31/** Spinlocks or Mutex for the buckets. */
32//#define HRLOCK_SPIN
33#define HRLOCK_MUTEX
34
35#ifdef HRLOCK_SPIN
36 #ifdef HRLOCK_MUTEX
37 #error Cannot enable both HRLOCK_SPIN and HRLOCK_MUTEX
38 #endif
39#endif
40
41#ifdef HRLOCK_SPIN
42 #define HRLOCK_TYPE SCSpinlock
43 #define HRLOCK_INIT(fb) SCSpinInit(&(fb)->lock, 0)
44 #define HRLOCK_DESTROY(fb) SCSpinDestroy(&(fb)->lock)
45 #define HRLOCK_LOCK(fb) SCSpinLock(&(fb)->lock)
46 #define HRLOCK_TRYLOCK(fb) SCSpinTrylock(&(fb)->lock)
47 #define HRLOCK_UNLOCK(fb) SCSpinUnlock(&(fb)->lock)
48#elif defined HRLOCK_MUTEX
49 #define HRLOCK_TYPE SCMutex
50 #define HRLOCK_INIT(fb) SCMutexInit(&(fb)->lock, NULL)
51 #define HRLOCK_DESTROY(fb) SCMutexDestroy(&(fb)->lock)
52 #define HRLOCK_LOCK(fb) SCMutexLock(&(fb)->lock)
53 #define HRLOCK_TRYLOCK(fb) SCMutexTrylock(&(fb)->lock)
54 #define HRLOCK_UNLOCK(fb) SCMutexUnlock(&(fb)->lock)
55#else
56 #error Enable HRLOCK_SPIN or HRLOCK_MUTEX
57#endif
58
59/** Spinlocks or Mutex for the queues. */
60//#define HQLOCK_SPIN
61#define HQLOCK_MUTEX
62
63#ifdef HQLOCK_SPIN
64 #ifdef HQLOCK_MUTEX
65 #error Cannot enable both HQLOCK_SPIN and HQLOCK_MUTEX
66 #endif
67#endif
68
69#ifdef HQLOCK_SPIN
70 #define HQLOCK_INIT(q) SCSpinInit(&(q)->s, 0)
71 #define HQLOCK_DESTROY(q) SCSpinDestroy(&(q)->s)
72 #define HQLOCK_LOCK(q) SCSpinLock(&(q)->s)
73 #define HQLOCK_TRYLOCK(q) SCSpinTrylock(&(q)->s)
74 #define HQLOCK_UNLOCK(q) SCSpinUnlock(&(q)->s)
75#elif defined HQLOCK_MUTEX
76 #define HQLOCK_INIT(q) SCMutexInit(&(q)->m, NULL)
77 #define HQLOCK_DESTROY(q) SCMutexDestroy(&(q)->m)
78 #define HQLOCK_LOCK(q) SCMutexLock(&(q)->m)
79 #define HQLOCK_TRYLOCK(q) SCMutexTrylock(&(q)->m)
80 #define HQLOCK_UNLOCK(q) SCMutexUnlock(&(q)->m)
81#else
82 #error Enable HQLOCK_SPIN or HQLOCK_MUTEX
83#endif
84
85typedef struct THashData_ {
86 /** ippair mutex */
88
89 /** use cnt, reference counter */
90 SC_ATOMIC_DECLARE(unsigned int, use_cnt);
91
92 void *data;
93
97
98typedef struct THashHashRow_ {
102} __attribute__((aligned(CLS))) THashHashRow;
103
104typedef struct THashDataQueue_
105{
108 uint32_t len;
109#ifdef DBG_PERF
110 uint32_t dbg_maxlen;
111#endif /* DBG_PERF */
112#ifdef HQLOCK_MUTEX
114#elif defined HQLOCK_SPIN
115 SCSpinlock s;
116#else
117 #error Enable HQLOCK_SPIN or HQLOCK_MUTEX
118#endif
120
121typedef int (*THashOutputFunc)(void *output_ctx, const uint8_t *data, const uint32_t data_len);
122typedef int (*THashFormatFunc)(const void *in_data, char *output, size_t output_size);
123
124typedef struct THashDataConfig_ {
125 SC_ATOMIC_DECLARE(uint64_t, memcap);
126 uint32_t hash_rand;
127 uint32_t hash_size;
128 uint32_t prealloc;
129
130 uint32_t data_size;
131 int (*DataSet)(void *dst, void *src);
132 void (*DataFree)(void *);
133 uint32_t (*DataHash)(uint32_t, void *);
134 bool (*DataCompare)(void *, void *);
135 bool (*DataExpired)(void *, SCTime_t ts);
136 uint32_t (*DataSize)(void *);
138
139#define THASH_DATA_SIZE(ctx) (sizeof(THashData) + (ctx)->config.data_size)
140
141typedef struct THashTableContext_ {
142 /* array of rows indexed by the hash value % hash size */
143 THashHashRow *array;
144
145 SC_ATOMIC_DECLARE(uint64_t, memuse);
146 SC_ATOMIC_DECLARE(uint32_t, counter);
147 SC_ATOMIC_DECLARE(uint32_t, prune_idx);
148
150
152
153 /* flag set if memcap was reached at least once. */
154 SC_ATOMIC_DECLARE(bool, memcap_reached);
156
157/** \brief check if a memory alloc would fit in the memcap
158 *
159 * \param size memory allocation size to check
160 *
161 * \retval 1 it fits
162 * \retval 0 no fit
163 */
164#define THASH_CHECK_MEMCAP(ctx, size) \
165 ((((uint64_t)SC_ATOMIC_GET((ctx)->memuse) + (uint64_t)(size)) <= \
166 SC_ATOMIC_GET((ctx)->config.memcap)))
167
168#define THashIncrUsecnt(h) \
169 (void)SC_ATOMIC_ADD((h)->use_cnt, 1)
170#define THashDecrUsecnt(h) \
171 (void)SC_ATOMIC_SUB((h)->use_cnt, 1)
172
173THashTableContext *THashInit(const char *cnf_prefix, uint32_t data_size,
174 int (*DataSet)(void *dst, void *src), void (*DataFree)(void *),
175 uint32_t (*DataHash)(uint32_t, void *), bool (*DataCompare)(void *, void *),
176 bool (*DataExpired)(void *, SCTime_t), uint32_t (*DataSize)(void *), bool reset_memcap,
177 uint64_t memcap, uint32_t hashsize);
178
180
181static inline void THashDataLock(THashData *d)
182{
183 SCMutexLock(&d->m);
184}
185
186static inline void THashDataUnlock(THashData *d)
187{
188 SCMutexUnlock(&d->m);
189}
190
195
205
206#endif /* SURICATA_THASH_H */
uint16_t dst
uint16_t src
struct PrefilterEngineFlowbits __attribute__
DNP3 application header.
struct Thresholds ctx
uint64_t ts
bool(* DataCompare)(void *, void *)
Definition util-thash.h:134
uint32_t data_size
Definition util-thash.h:130
uint32_t(* DataHash)(uint32_t, void *)
Definition util-thash.h:133
bool(* DataExpired)(void *, SCTime_t ts)
Definition util-thash.h:135
uint32_t hash_size
Definition util-thash.h:127
SC_ATOMIC_DECLARE(uint64_t, memcap)
int(* DataSet)(void *dst, void *src)
Definition util-thash.h:131
void(* DataFree)(void *)
Definition util-thash.h:132
uint32_t hash_rand
Definition util-thash.h:126
uint32_t prealloc
Definition util-thash.h:128
uint32_t(* DataSize)(void *)
Definition util-thash.h:136
THashData * data
Definition util-thash.h:192
THashData * bot
Definition util-thash.h:107
THashData * top
Definition util-thash.h:106
SCMutex m
Definition util-thash.h:87
void * data
Definition util-thash.h:92
struct THashData_ * next
Definition util-thash.h:94
SC_ATOMIC_DECLARE(unsigned int, use_cnt)
struct THashData_ * prev
Definition util-thash.h:95
HRLOCK_TYPE lock
Definition util-thash.h:99
THashData * head
Definition util-thash.h:100
THashData * tail
Definition util-thash.h:101
SC_ATOMIC_DECLARE(uint64_t, memuse)
THashHashRow * array
Definition util-thash.h:143
SC_ATOMIC_DECLARE(bool, memcap_reached)
SC_ATOMIC_DECLARE(uint32_t, prune_idx)
THashConfig config
Definition util-thash.h:151
THashDataQueue spare_q
Definition util-thash.h:149
SC_ATOMIC_DECLARE(uint32_t, counter)
#define CLS
#define SCSpinlock
#define SCMutex
#define SCMutexUnlock(mut)
#define SCMutexLock(mut)
#define hashsize(n)
uint32_t THashExpire(THashTableContext *ctx, const SCTime_t ts)
expire data from the hash Walk the hash table and remove data that is exprired according to the DataE...
Definition util-thash.c:423
struct THashDataQueue_ THashDataQueue
struct THashData_ THashData
struct THashDataGetResult THashGetFromHash(THashTableContext *ctx, void *data)
Definition util-thash.c:618
void THashShutdown(THashTableContext *ctx)
shutdown the flow engine
Definition util-thash.c:354
#define HRLOCK_TYPE
Definition util-thash.h:49
int THashRemoveFromHash(THashTableContext *ctx, void *data)
Definition util-thash.c:871
THashDataQueue * THashDataQueueNew(void)
Definition util-thash.c:56
THashData * THashLookupFromHash(THashTableContext *ctx, void *data)
look up data in the hash
Definition util-thash.c:728
struct THashDataConfig_ THashConfig
void THashDataMoveToSpare(THashTableContext *ctx, THashData *h)
Definition util-thash.c:41
struct THashTableContext_ THashTableContext
THashTableContext * THashInit(const char *cnf_prefix, uint32_t data_size, int(*DataSet)(void *dst, void *src), void(*DataFree)(void *), uint32_t(*DataHash)(uint32_t, void *), bool(*DataCompare)(void *, void *), bool(*DataExpired)(void *, SCTime_t), uint32_t(*DataSize)(void *), bool reset_memcap, uint64_t memcap, uint32_t hashsize)
int(* THashFormatFunc)(const void *in_data, char *output, size_t output_size)
Definition util-thash.h:122
void THashCleanup(THashTableContext *ctx)
Cleanup the thash engine.
Definition util-thash.c:481
int(* THashOutputFunc)(void *output_ctx, const uint8_t *data, const uint32_t data_len)
Definition util-thash.h:121
int THashWalk(THashTableContext *, THashFormatFunc, THashOutputFunc, void *)
Walk the hash.
Definition util-thash.c:388
void THashConsolidateMemcap(THashTableContext *ctx)
Definition util-thash.c:345