suricata
util-thash.h
Go to the documentation of this file.
1 /* Copyright (C) 2007-2016 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 __THASH_H__
27 #define __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 #define THASH_VERBOSE 0
122 #define THASH_QUIET 1
123 
124 typedef int (*THashOutputFunc)(void *output_ctx, const uint8_t *data, const uint32_t data_len);
125 typedef int (*THashFormatFunc)(const void *in_data, char *output, size_t output_size);
126 
127 typedef struct THashDataConfig_ {
128  uint64_t memcap;
129  uint32_t hash_rand;
130  uint32_t hash_size;
131  uint32_t prealloc;
132 
133  uint32_t data_size;
134  int (*DataSet)(void *dst, void *src);
135  void (*DataFree)(void *);
136  uint32_t (*DataHash)(void *);
137  bool (*DataCompare)(void *, void *);
139 
140 #define THASH_DATA_SIZE(ctx) (sizeof(THashData) + (ctx)->config.data_size)
141 
142 typedef struct THashTableContext_ {
143  /* array of rows indexed by the hash value % hash size */
144  THashHashRow *array;
145 
146  SC_ATOMIC_DECLARE(uint64_t, memuse);
147  SC_ATOMIC_DECLARE(uint32_t, counter);
148  SC_ATOMIC_DECLARE(uint32_t, prune_idx);
149 
151 
153 
154  /* flag set if memcap was reached at least once. */
155  SC_ATOMIC_DECLARE(bool, memcap_reached);
157 
158 /** \brief check if a memory alloc would fit in the memcap
159  *
160  * \param size memory allocation size to check
161  *
162  * \retval 1 it fits
163  * \retval 0 no fit
164  */
165 #define THASH_CHECK_MEMCAP(ctx, size) \
166  ((((uint64_t)SC_ATOMIC_GET((ctx)->memuse) + (uint64_t)(size)) <= (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 
173 #define THashReference(dst_h_ptr, h) do { \
174  if ((h) != NULL) { \
175  THashIncrUsecnt((h)); \
176  *(dst_h_ptr) = h; \
177  } \
178  } while (0)
179 
180 #define THashDeReference(src_h_ptr) do { \
181  if (*(src_h_ptr) != NULL) { \
182  THashDecrUsecnt(*(src_h_ptr)); \
183  *(src_h_ptr) = NULL; \
184  } \
185  } while (0)
186 
187 THashTableContext *THashInit(const char *cnf_prefix, size_t data_size,
188  int (*DataSet)(void *dst, void *src), void (*DataFree)(void *),
189  uint32_t (*DataHash)(void *), bool (*DataCompare)(void *, void *), bool reset_memcap,
190  uint64_t memcap, uint32_t hashsize);
191 
193 
194 static inline void THashDataLock(THashData *d)
195 {
196  SCMutexLock(&d->m);
197 }
198 
199 static inline void THashDataUnlock(THashData *d)
200 {
201  SCMutexUnlock(&d->m);
202 }
203 
206  bool is_new;
207 };
208 
214 int THashRemoveFromHash (THashTableContext *ctx, void *data);
217 
218 #endif /* __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
THashDataGetResult::data
THashData * data
Definition: util-thash.h:205
CLS
#define CLS
Definition: suricata-common.h:53
THashInit
THashTableContext * THashInit(const char *cnf_prefix, size_t data_size, int(*DataSet)(void *dst, void *src), void(*DataFree)(void *), uint32_t(*DataHash)(void *), bool(*DataCompare)(void *, void *), bool reset_memcap, uint64_t memcap, uint32_t hashsize)
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:124
THashShutdown
void THashShutdown(THashTableContext *ctx)
shutdown the flow engine
Definition: util-thash.c:347
THashData_::prev
struct THashData_ * prev
Definition: util-thash.h:95
THashDataConfig_::DataFree
void(* DataFree)(void *)
Definition: util-thash.h:135
threads.h
THashHashRow_::lock
HRLOCK_TYPE lock
Definition: util-thash.h:99
THashConsolidateMemcap
void THashConsolidateMemcap(THashTableContext *ctx)
Definition: util-thash.c:339
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:381
SCMutexLock
#define SCMutexLock(mut)
Definition: threads-debug.h:117
THashDataQueue_
Definition: util-thash.h:105
THashDataConfig_::DataHash
uint32_t(* DataHash)(void *)
Definition: util-thash.h:136
THashDataConfig_::DataCompare
bool(* DataCompare)(void *, void *)
Definition: util-thash.h:137
THashDataQueue
struct THashDataQueue_ THashDataQueue
hashsize
#define hashsize(n)
Definition: util-hash-lookup3.c:67
THashDataConfig_::DataSet
int(* DataSet)(void *dst, void *src)
Definition: util-thash.h:134
__attribute__
struct THashHashRow_ __attribute__((aligned(CLS))) THashHashRow
THashDataConfig_::prealloc
uint32_t prealloc
Definition: util-thash.h:131
THashDataConfig_::hash_size
uint32_t hash_size
Definition: util-thash.h:130
SCMutexUnlock
#define SCMutexUnlock(mut)
Definition: threads-debug.h:119
THashTableContext_
Definition: util-thash.h:142
THashRemoveFromHash
int THashRemoveFromHash(THashTableContext *ctx, void *data)
Definition: util-thash.c:775
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:144
THashConfig
struct THashDataConfig_ THashConfig
THashDataGetResult
Definition: util-thash.h:204
THashDataConfig_::memcap
uint64_t memcap
Definition: util-thash.h:128
THashGetFromHash
struct THashDataGetResult THashGetFromHash(THashTableContext *ctx, void *data)
Definition: util-thash.c:530
THashTableContext_::SC_ATOMIC_DECLARE
SC_ATOMIC_DECLARE(bool, memcap_reached)
THashTableContext_::spare_q
THashDataQueue spare_q
Definition: util-thash.h:150
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:640
THashTableContext
struct THashTableContext_ THashTableContext
THashDataConfig_
Definition: util-thash.h:127
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:125
SCSpinlock
#define SCSpinlock
Definition: threads-debug.h:234
THashDataGetResult::is_new
bool is_new
Definition: util-thash.h:206
THashDataConfig_::data_size
uint32_t data_size
Definition: util-thash.h:133
THashDataConfig_::hash_rand
uint32_t hash_rand
Definition: util-thash.h:129
THashCleanup
void THashCleanup(THashTableContext *ctx)
Cleanup the thash engine.
Definition: util-thash.c:416
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:152