OpenVPN
list.h
Go to the documentation of this file.
1 /*
2  * OpenVPN -- An application to securely tunnel IP networks
3  * over a single TCP/UDP port, with support for SSL/TLS-based
4  * session authentication and key exchange,
5  * packet encryption, packet authentication, and
6  * packet compression.
7  *
8  * Copyright (C) 2002-2024 OpenVPN Inc <sales@openvpn.net>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2
12  * as published by the Free Software Foundation.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23 
24 #ifndef LIST_H
25 #define LIST_H
26 
27 /*
28  * This code is a fairly straightforward hash
29  * table implementation using Bob Jenkins'
30  * hash function.
31  *
32  * Hash tables are used in OpenVPN to keep track of
33  * client instances over various key spaces.
34  */
35 
36 
37 #include "basic.h"
38 #include "buffer.h"
39 
40 #define hashsize(n) ((uint32_t)1<<(n))
41 #define hashmask(n) (hashsize(n)-1)
42 
44 {
45  void *value;
46  const void *key;
47  unsigned int hash_value;
48  struct hash_element *next;
49 };
50 
52 {
53  struct hash_element *list;
54 };
55 
56 struct hash
57 {
58  int n_buckets;
60  int mask;
61  uint32_t iv;
62  uint32_t (*hash_function)(const void *key, uint32_t iv);
63  bool (*compare_function)(const void *key1, const void *key2); /* return true if equal */
65 };
66 
67 struct hash *hash_init(const int n_buckets,
68  const uint32_t iv,
69  uint32_t (*hash_function)(const void *key, uint32_t iv),
70  bool (*compare_function)(const void *key1, const void *key2));
71 
72 void hash_free(struct hash *hash);
73 
74 bool hash_add(struct hash *hash, const void *key, void *value, bool replace);
75 
76 struct hash_element *hash_lookup_fast(struct hash *hash,
77  struct hash_bucket *bucket,
78  const void *key,
79  uint32_t hv);
80 
81 bool hash_remove_fast(struct hash *hash,
82  struct hash_bucket *bucket,
83  const void *key,
84  uint32_t hv);
85 
86 void hash_remove_by_value(struct hash *hash, void *value);
87 
89 {
90  struct hash *hash;
93  struct hash_element *elem;
94  struct hash_element *last;
98 };
99 
100 void hash_iterator_init_range(struct hash *hash,
101  struct hash_iterator *hi,
102  int start_bucket,
103  int end_bucket);
104 
105 void hash_iterator_init(struct hash *hash, struct hash_iterator *iter);
106 
107 struct hash_element *hash_iterator_next(struct hash_iterator *hi);
108 
110 
111 void hash_iterator_free(struct hash_iterator *hi);
112 
113 uint32_t hash_func(const uint8_t *k, uint32_t length, uint32_t initval);
114 
115 static inline uint32_t
116 hash_value(const struct hash *hash, const void *key)
117 {
118  return (*hash->hash_function)(key, hash->iv);
119 }
120 
121 static inline int
122 hash_n_elements(const struct hash *hash)
123 {
124  return hash->n_elements;
125 }
126 
127 static inline int
128 hash_n_buckets(const struct hash *hash)
129 {
130  return hash->n_buckets;
131 }
132 
133 static inline struct hash_bucket *
134 hash_bucket(struct hash *hash, uint32_t hv)
135 {
136  return &hash->buckets[hv & hash->mask];
137 }
138 
139 static inline void *
140 hash_lookup(struct hash *hash, const void *key)
141 {
142  void *ret = NULL;
143  struct hash_element *he;
144  uint32_t hv = hash_value(hash, key);
145  struct hash_bucket *bucket = &hash->buckets[hv & hash->mask];
146 
147  he = hash_lookup_fast(hash, bucket, key, hv);
148  if (he)
149  {
150  ret = he->value;
151  }
152 
153  return ret;
154 }
155 
156 /* NOTE: assumes that key is not a duplicate */
157 static inline void
159  struct hash_bucket *bucket,
160  const void *key,
161  uint32_t hv,
162  void *value)
163 {
164  struct hash_element *he;
165 
166  ALLOC_OBJ(he, struct hash_element);
167  he->value = value;
168  he->key = key;
169  he->hash_value = hv;
170  he->next = bucket->list;
171  bucket->list = he;
172  ++hash->n_elements;
173 }
174 
175 static inline bool
176 hash_remove(struct hash *hash, const void *key)
177 {
178  uint32_t hv;
179  struct hash_bucket *bucket;
180  bool ret;
181 
182  hv = hash_value(hash, key);
183  bucket = &hash->buckets[hv & hash->mask];
184  ret = hash_remove_fast(hash, bucket, key, hv);
185  return ret;
186 }
187 
188 #endif /* LIST */
hash::n_elements
int n_elements
Definition: list.h:59
hash_n_elements
static int hash_n_elements(const struct hash *hash)
Definition: list.h:122
hash_bucket
static struct hash_bucket * hash_bucket(struct hash *hash, uint32_t hv)
Definition: list.h:134
key2
#define key2
Definition: cert_data.h:82
hash_remove_by_value
void hash_remove_by_value(struct hash *hash, void *value)
Definition: list.c:175
hash_iterator
Definition: list.h:88
hash
Definition: list.h:56
hash_element::next
struct hash_element * next
Definition: list.h:48
key1
static const char *const key1
Definition: cert_data.h:56
hash_iterator::bucket_index_end
int bucket_index_end
Definition: list.h:97
hash_element::value
void * value
Definition: list.h:45
hash_remove
static bool hash_remove(struct hash *hash, const void *key)
Definition: list.h:176
hash_lookup
static void * hash_lookup(struct hash *hash, const void *key)
Definition: list.h:140
hash::buckets
struct hash_bucket * buckets
Definition: list.h:64
key
Container for unidirectional cipher and HMAC key material.
Definition: crypto.h:149
hash::hash_function
uint32_t(* hash_function)(const void *key, uint32_t iv)
Definition: list.h:62
hash_add_fast
static void hash_add_fast(struct hash *hash, struct hash_bucket *bucket, const void *key, uint32_t hv, void *value)
Definition: list.h:158
ALLOC_OBJ
#define ALLOC_OBJ(dptr, type)
Definition: buffer.h:1060
hash_add
bool hash_add(struct hash *hash, const void *key, void *value, bool replace)
Definition: list.c:147
hash_element::key
const void * key
Definition: list.h:46
hash_bucket::list
struct hash_element * list
Definition: list.h:53
hash_free
void hash_free(struct hash *hash)
Definition: list.c:63
hash_iterator::elem
struct hash_element * elem
Definition: list.h:93
hash_remove_fast
bool hash_remove_fast(struct hash *hash, struct hash_bucket *bucket, const void *key, uint32_t hv)
Definition: list.c:114
hash_func
uint32_t hash_func(const uint8_t *k, uint32_t length, uint32_t initval)
Definition: list.c:408
hash::mask
int mask
Definition: list.h:60
hash_iterator_free
void hash_iterator_free(struct hash_iterator *hi)
Definition: list.c:283
hash_iterator::bucket_index
int bucket_index
Definition: list.h:91
hash_iterator_init
void hash_iterator_init(struct hash *hash, struct hash_iterator *iter)
Definition: list.c:246
buffer.h
hash_init
struct hash * hash_init(const int n_buckets, const uint32_t iv, uint32_t(*hash_function)(const void *key, uint32_t iv), bool(*compare_function)(const void *key1, const void *key2))
Definition: list.c:38
hash::iv
uint32_t iv
Definition: list.h:61
hash_lookup_fast
struct hash_element * hash_lookup_fast(struct hash *hash, struct hash_bucket *bucket, const void *key, uint32_t hv)
Definition: list.c:83
hash_iterator::bucket
struct hash_bucket * bucket
Definition: list.h:92
basic.h
hash_iterator_init_range
void hash_iterator_init_range(struct hash *hash, struct hash_iterator *hi, int start_bucket, int end_bucket)
Definition: list.c:223
hash_element
Definition: list.h:43
hash_bucket
Definition: list.h:51
hash_iterator::bucket_index_start
int bucket_index_start
Definition: list.h:96
hash_iterator::hash
struct hash * hash
Definition: list.h:90
hash_element::hash_value
unsigned int hash_value
Definition: list.h:47
key2
Container for bidirectional cipher and HMAC key material.
Definition: crypto.h:179
hash::n_buckets
int n_buckets
Definition: list.h:58
hash_iterator::bucket_marked
bool bucket_marked
Definition: list.h:95
hash_n_buckets
static int hash_n_buckets(const struct hash *hash)
Definition: list.h:128
hash::compare_function
bool(* compare_function)(const void *key1, const void *key2)
Definition: list.h:63
hash_iterator::last
struct hash_element * last
Definition: list.h:94
hash_iterator_next
struct hash_element * hash_iterator_next(struct hash_iterator *hi)
Definition: list.c:289
hash_value
static uint32_t hash_value(const struct hash *hash, const void *key)
Definition: list.h:116
hash_iterator_delete_element
void hash_iterator_delete_element(struct hash_iterator *hi)
Definition: list.c:321