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 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)(void *);
134  bool (*DataCompare)(void *, void *);
136 
137 #define THASH_DATA_SIZE(ctx) (sizeof(THashData) + (ctx)->config.data_size)
138 
139 typedef struct THashTableContext_ {
140  /* array of rows indexed by the hash value % hash size */
141  THashHashRow *array;
142 
143  SC_ATOMIC_DECLARE(uint64_t, memuse);
144  SC_ATOMIC_DECLARE(uint32_t, counter);
145  SC_ATOMIC_DECLARE(uint32_t, prune_idx);
146 
148 
150 
151  /* flag set if memcap was reached at least once. */
152  SC_ATOMIC_DECLARE(bool, memcap_reached);
154 
155 /** \brief check if a memory alloc would fit in the memcap
156  *
157  * \param size memory allocation size to check
158  *
159  * \retval 1 it fits
160  * \retval 0 no fit
161  */
162 #define THASH_CHECK_MEMCAP(ctx, size) \
163  ((((uint64_t)SC_ATOMIC_GET((ctx)->memuse) + (uint64_t)(size)) <= (ctx)->config.memcap))
164 
165 #define THashIncrUsecnt(h) \
166  (void)SC_ATOMIC_ADD((h)->use_cnt, 1)
167 #define THashDecrUsecnt(h) \
168  (void)SC_ATOMIC_SUB((h)->use_cnt, 1)
169 
170 THashTableContext *THashInit(const char *cnf_prefix, size_t data_size,
171  int (*DataSet)(void *dst, void *src), void (*DataFree)(void *),
172  uint32_t (*DataHash)(void *), bool (*DataCompare)(void *, void *), bool reset_memcap,
173  uint64_t memcap, uint32_t hashsize);
174 
176 
177 static inline void THashDataLock(THashData *d)
178 {
179  SCMutexLock(&d->m);
180 }
181 
182 static inline void THashDataUnlock(THashData *d)
183 {
184  SCMutexUnlock(&d->m);
185 }
186 
189  bool is_new;
190 };
191 
197 int THashRemoveFromHash (THashTableContext *ctx, void *data);
200 
201 #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
THashDataGetResult::data
THashData * data
Definition: util-thash.h:188
CLS
#define CLS
Definition: suricata-common.h:56
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:121
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:132
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:133
THashDataConfig_::DataCompare
bool(* DataCompare)(void *, void *)
Definition: util-thash.h:134
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: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:139
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:141
THashConfig
struct THashDataConfig_ THashConfig
THashDataGetResult
Definition: util-thash.h:187
THashDataConfig_::memcap
uint64_t memcap
Definition: util-thash.h:125
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:147
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: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
SCSpinlock
#define SCSpinlock
Definition: threads-debug.h:234
THashDataGetResult::is_new
bool is_new
Definition: util-thash.h:189
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: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:149