mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-31 14:25:41 +00:00
- Varying option space code and length bit widths (8/16/32) are now
supported. This is a milestone in acheiving RFC 3925 "VIVSO" and DHCPv6 support. [ISC-Bugs #15979]
This commit is contained in:
@@ -35,15 +35,20 @@
|
||||
#ifndef OMAPI_HASH_H
|
||||
#define OMAPI_HASH_H
|
||||
|
||||
#define DEFAULT_HASH_SIZE 9973
|
||||
#if !defined (DEFAULT_HASH_SIZE)
|
||||
# define DEFAULT_HASH_SIZE 9973
|
||||
#endif
|
||||
|
||||
#if !defined (KEY_HASH_SIZE)
|
||||
# define KEY_HASH_SIZE 1009
|
||||
#endif
|
||||
|
||||
/* The purpose of the hashed_object_t struct is to not match anything else. */
|
||||
typedef struct {
|
||||
int foo;
|
||||
} hashed_object_t;
|
||||
|
||||
typedef isc_result_t (*hash_foreach_func)(const unsigned char *, unsigned,
|
||||
void *);
|
||||
typedef isc_result_t (*hash_foreach_func)(const void *, unsigned, void *);
|
||||
typedef int (*hash_reference) (hashed_object_t **, hashed_object_t *,
|
||||
const char *, int);
|
||||
typedef int (*hash_dereference) (hashed_object_t **, const char *, int);
|
||||
@@ -63,7 +68,7 @@ struct hash_table {
|
||||
hash_reference referencer;
|
||||
hash_dereference dereferencer;
|
||||
hash_comparator_t cmp;
|
||||
int (*do_hash) (const unsigned char *, unsigned, unsigned);
|
||||
unsigned (*do_hash)(const void *, unsigned, unsigned);
|
||||
};
|
||||
|
||||
struct named_hash {
|
||||
@@ -80,26 +85,24 @@ void name##_hash_delete (hashtype *, bufarg, unsigned, \
|
||||
int name##_hash_lookup (type **, hashtype *, bufarg, unsigned, \
|
||||
const char *, int); \
|
||||
int name##_hash_foreach (hashtype *, hash_foreach_func); \
|
||||
int name##_new_hash (hashtype **, int, const char *, int); \
|
||||
int name##_new_hash (hashtype **, unsigned, const char *, int); \
|
||||
void name##_free_hash_table (hashtype **, const char *, int);
|
||||
|
||||
|
||||
#define HASH_FUNCTIONS(name, bufarg, type, hashtype, ref, deref) \
|
||||
#define HASH_FUNCTIONS(name, bufarg, type, hashtype, ref, deref, hasher) \
|
||||
void name##_hash_add (hashtype *table, \
|
||||
bufarg buf, unsigned len, type *ptr, \
|
||||
const char *file, int line) \
|
||||
{ \
|
||||
add_hash ((struct hash_table *)table, \
|
||||
(const unsigned char *)buf, \
|
||||
add_hash ((struct hash_table *)table, buf, \
|
||||
len, (hashed_object_t *)ptr, file, line); \
|
||||
} \
|
||||
\
|
||||
void name##_hash_delete (hashtype *table, \
|
||||
bufarg buf, unsigned len, const char *file, int line)\
|
||||
void name##_hash_delete (hashtype *table, bufarg buf, unsigned len, \
|
||||
const char *file, int line) \
|
||||
{ \
|
||||
delete_hash_entry ((struct hash_table *)table, \
|
||||
(const unsigned char *)buf, \
|
||||
len, file, line); \
|
||||
delete_hash_entry ((struct hash_table *)table, buf, len, \
|
||||
file, line); \
|
||||
} \
|
||||
\
|
||||
int name##_hash_lookup (type **ptr, hashtype *table, \
|
||||
@@ -107,7 +110,7 @@ int name##_hash_lookup (type **ptr, hashtype *table, \
|
||||
{ \
|
||||
return hash_lookup ((hashed_object_t **)ptr, \
|
||||
(struct hash_table *)table, \
|
||||
(const unsigned char *)buf, len, file, line); \
|
||||
buf, len, file, line); \
|
||||
} \
|
||||
\
|
||||
int name##_hash_foreach (hashtype *table, hash_foreach_func func) \
|
||||
@@ -116,11 +119,11 @@ int name##_hash_foreach (hashtype *table, hash_foreach_func func) \
|
||||
func); \
|
||||
} \
|
||||
\
|
||||
int name##_new_hash (hashtype **tp, int c, const char *file, int line) \
|
||||
int name##_new_hash (hashtype **tp, unsigned c, const char *file, int line) \
|
||||
{ \
|
||||
return new_hash ((struct hash_table **)tp, \
|
||||
(hash_reference)ref, (hash_dereference)deref, c, \
|
||||
file, line); \
|
||||
hasher, file, line); \
|
||||
} \
|
||||
\
|
||||
void name##_free_hash_table (hashtype **table, const char *file, int line) \
|
||||
@@ -129,19 +132,25 @@ void name##_free_hash_table (hashtype **table, const char *file, int line) \
|
||||
}
|
||||
|
||||
void relinquish_hash_bucket_hunks (void);
|
||||
int new_hash_table (struct hash_table **, int, const char *, int);
|
||||
int new_hash_table (struct hash_table **, unsigned, const char *, int);
|
||||
void free_hash_table (struct hash_table **, const char *, int);
|
||||
struct hash_bucket *new_hash_bucket (const char *, int);
|
||||
void free_hash_bucket (struct hash_bucket *, const char *, int);
|
||||
int new_hash (struct hash_table **,
|
||||
hash_reference, hash_dereference, int, const char *, int);
|
||||
int new_hash(struct hash_table **,
|
||||
hash_reference, hash_dereference, unsigned,
|
||||
unsigned (*do_hash)(const void *, unsigned, unsigned),
|
||||
const char *, int);
|
||||
unsigned do_string_hash(const void *, unsigned, unsigned);
|
||||
unsigned do_case_hash(const void *, unsigned, unsigned);
|
||||
unsigned do_number_hash(const void *, unsigned, unsigned);
|
||||
unsigned do_ip4_hash(const void *, unsigned, unsigned);
|
||||
void add_hash (struct hash_table *,
|
||||
const unsigned char *, unsigned, hashed_object_t *,
|
||||
const void *, unsigned, hashed_object_t *,
|
||||
const char *, int);
|
||||
void delete_hash_entry (struct hash_table *, const unsigned char *,
|
||||
void delete_hash_entry (struct hash_table *, const void *,
|
||||
unsigned, const char *, int);
|
||||
int hash_lookup (hashed_object_t **, struct hash_table *,
|
||||
const unsigned char *, unsigned, const char *, int);
|
||||
const void *, unsigned, const char *, int);
|
||||
int hash_foreach (struct hash_table *, hash_foreach_func);
|
||||
int casecmp (const void *s, const void *t, unsigned long len);
|
||||
|
||||
|
Reference in New Issue
Block a user