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 
85 typedef struct THashData_ {
86  /** ippair mutex */
88 
89  /** use cnt, reference counter */
90  SC_ATOMIC_DECLARE(unsigned int, use_cnt);
91 
92  void *data;
93 
94  struct THashData_ *next;
95  struct THashData_ *prev;
97 
98 typedef struct THashHashRow_ {
102 } __attribute__((aligned(CLS))) THashHashRow;
103 
104 typedef 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 
121 typedef int (*THashOutputFunc)(void *output_ctx, const uint8_t *data, const uint32_t data_len);
122 typedef int (*THashFormatFunc)(const void *in_data, char *output, size_t output_size);
123 
124 typedef struct THashDataConfig_ {
125  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 
141 typedef 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)) <= (ctx)->config.memcap))
166 
167 #define THashIncrUsecnt(h) \
168  (void)SC_ATOMIC_ADD((h)->use_cnt, 1)
169 #define THashDecrUsecnt(h) \
170  (void)SC_ATOMIC_SUB((h)->use_cnt, 1)
171 
172 THashTableContext *THashInit(const char *cnf_prefix, size_t data_size,
173  int (*DataSet)(void *dst, void *src), void (*DataFree)(void *),
174  uint32_t (*DataHash)(uint32_t, void *), bool (*DataCompare)(void *, void *),
175  bool (*DataExpired)(void *, SCTime_t), uint32_t (*DataSize)(void *), bool reset_memcap,
176  uint64_t memcap, uint32_t hashsize);
177 
179 
180 static inline void THashDataLock(THashData *d)
181 {
182  SCMutexLock(&d->m);
183 }
184 
185 static inline void THashDataUnlock(THashData *d)
186 {
187  SCMutexUnlock(&d->m);
188 }
189 
192  bool is_new;
193 };
194 
203 uint32_t THashExpire(THashTableContext *ctx, const SCTime_t ts);
204 
205 #endif /* SURICATA_THASH_H */
THashTableContext_::SC_ATOMIC_DECLARE
SC_ATOMIC_DECLARE(uint32_t, counter)
THashDataQueueNew
THashDataQueue * THashDataQueueNew(void)
Definition: util-thash.c:56
THashData
struct THashData_ THashData
ts
uint64_t ts
Definition: source-erf-file.c:55
THashDataGetResult::data
THashData * data
Definition: util-thash.h:191
CLS
#define CLS
Definition: suricata-common.h:56
THashHashRow_::tail
THashData * tail
Definition: util-thash.h:101
THashOutputFunc
int(* THashOutputFunc)(void *output_ctx, const uint8_t *data, const uint32_t data_len)
Definition: util-thash.h:121
THashShutdown
void THashShutdown(THashTableContext *ctx)
shutdown the flow engine
Definition: util-thash.c:358
THashData_::prev
struct THashData_ * prev
Definition: util-thash.h:95
THashDataConfig_::DataFree
void(* DataFree)(void *)
Definition: util-thash.h:132
threads.h
THashHashRow_::lock
HRLOCK_TYPE lock
Definition: util-thash.h:99
THashConsolidateMemcap
void THashConsolidateMemcap(THashTableContext *ctx)
Definition: util-thash.c:350
ctx
struct Thresholds ctx
THashHashRow_
Definition: util-thash.h:98
THashData_::next
struct THashData_ * next
Definition: util-thash.h:94
THashWalk
int THashWalk(THashTableContext *, THashFormatFunc, THashOutputFunc, void *)
Walk the hash.
Definition: util-thash.c:392
SCMutexLock
#define SCMutexLock(mut)
Definition: threads-debug.h:117
THashDataQueue_
Definition: util-thash.h:105
THashDataConfig_::DataCompare
bool(* DataCompare)(void *, void *)
Definition: util-thash.h:134
THashDataQueue
struct THashDataQueue_ THashDataQueue
THashDataConfig_::DataSet
int(* DataSet)(void *dst, void *src)
Definition: util-thash.h:131
__attribute__
struct THashHashRow_ __attribute__((aligned(CLS))) THashHashRow
THashDataConfig_::prealloc
uint32_t prealloc
Definition: util-thash.h:128
THashDataConfig_::hash_size
uint32_t hash_size
Definition: util-thash.h:127
SCMutexUnlock
#define SCMutexUnlock(mut)
Definition: threads-debug.h:119
THashTableContext_
Definition: util-thash.h:141
THashExpire
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:427
THashRemoveFromHash
int THashRemoveFromHash(THashTableContext *ctx, void *data)
Definition: util-thash.c:871
THashDataConfig_::DataSize
uint32_t(* DataSize)(void *)
Definition: util-thash.h:136
THashDataQueue_::bot
THashData * bot
Definition: util-thash.h:107
THashData_::m
SCMutex m
Definition: util-thash.h:87
THashTableContext_::SC_ATOMIC_DECLARE
SC_ATOMIC_DECLARE(uint32_t, prune_idx)
THashData_::SC_ATOMIC_DECLARE
SC_ATOMIC_DECLARE(unsigned int, use_cnt)
THashTableContext_::array
THashHashRow * array
Definition: util-thash.h:143
THashConfig
struct THashDataConfig_ THashConfig
THashDataGetResult
Definition: util-thash.h:190
THashDataConfig_::memcap
uint64_t memcap
Definition: util-thash.h:125
SCTime_t
Definition: util-time.h:40
THashGetFromHash
struct THashDataGetResult THashGetFromHash(THashTableContext *ctx, void *data)
Definition: util-thash.c:618
THashTableContext_::SC_ATOMIC_DECLARE
SC_ATOMIC_DECLARE(bool, memcap_reached)
THashTableContext_::spare_q
THashDataQueue spare_q
Definition: util-thash.h:149
THashDataConfig_::DataExpired
bool(* DataExpired)(void *, SCTime_t ts)
Definition: util-thash.h:135
THashInit
THashTableContext * THashInit(const char *cnf_prefix, size_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)
THashHashRow_::head
THashData * head
Definition: util-thash.h:100
THashDataMoveToSpare
void THashDataMoveToSpare(THashTableContext *ctx, THashData *h)
Definition: util-thash.c:41
THashData_::data
void * data
Definition: util-thash.h:92
THashData_
Definition: util-thash.h:85
THashDataQueue_::len
uint32_t len
Definition: util-thash.h:108
THashLookupFromHash
THashData * THashLookupFromHash(THashTableContext *ctx, void *data)
look up data in the hash
Definition: util-thash.c:728
hashsize
#define hashsize(n)
Definition: util-hash-lookup3.h:40
THashTableContext
struct THashTableContext_ THashTableContext
THashDataConfig_
Definition: util-thash.h:124
src
uint16_t src
Definition: app-layer-dnp3.h:5
THashFormatFunc
int(* THashFormatFunc)(const void *in_data, char *output, size_t output_size)
Definition: util-thash.h:122
THashDataConfig_::DataHash
uint32_t(* DataHash)(uint32_t, void *)
Definition: util-thash.h:133
SCSpinlock
#define SCSpinlock
Definition: threads-debug.h:234
THashDataGetResult::is_new
bool is_new
Definition: util-thash.h:192
THashDataConfig_::data_size
uint32_t data_size
Definition: util-thash.h:130
THashDataConfig_::hash_rand
uint32_t hash_rand
Definition: util-thash.h:126
THashCleanup
void THashCleanup(THashTableContext *ctx)
Cleanup the thash engine.
Definition: util-thash.c:485
dst
uint16_t dst
Definition: app-layer-dnp3.h:4
THashTableContext_::SC_ATOMIC_DECLARE
SC_ATOMIC_DECLARE(uint64_t, memuse)
HRLOCK_TYPE
#define HRLOCK_TYPE
Definition: util-thash.h:49
SCMutex
#define SCMutex
Definition: threads-debug.h:114
THashDataQueue_::m
SCMutex m
Definition: util-thash.h:113
THashDataQueue_::top
THashData * top
Definition: util-thash.h:106
THashTableContext_::config
THashConfig config
Definition: util-thash.h:151