diff options
-rw-r--r-- | libnm-core/nm-utils.c | 14 | ||||
-rw-r--r-- | libnm-core/tests/test-general.c | 62 | ||||
-rw-r--r-- | shared/nm-utils/nm-dedup-multi.c | 14 | ||||
-rw-r--r-- | shared/nm-utils/nm-hash-utils.c | 31 | ||||
-rw-r--r-- | shared/nm-utils/nm-hash-utils.h | 101 | ||||
-rw-r--r-- | src/devices/nm-device.c | 9 | ||||
-rw-r--r-- | src/devices/nm-lldp-listener.c | 15 | ||||
-rw-r--r-- | src/nm-core-utils.c | 9 | ||||
-rw-r--r-- | src/nm-core-utils.h | 17 | ||||
-rw-r--r-- | src/platform/nm-platform.c | 473 | ||||
-rw-r--r-- | src/platform/nmp-object.c | 173 |
11 files changed, 558 insertions, 360 deletions
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 9a79ba47c0..4ac41944c8 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -4007,27 +4007,27 @@ _nm_utils_strstrdictkey_hash (gconstpointer a) { const NMUtilsStrStrDictKey *k = a; const signed char *p; - guint32 h = NM_HASH_INIT (76642997u); + NMHashState h; + nm_hash_init (&h, 76642997u); if (k) { if (((int) k->type) & ~STRSTRDICTKEY_ALL_SET) g_return_val_if_reached (0); - h = NM_HASH_COMBINE (h, k->type); + nm_hash_update_uint (&h, k->type); if (k->type & STRSTRDICTKEY_ALL_SET) { p = (void *) k->data; for (; *p != '\0'; p++) - h = NM_HASH_COMBINE (h, *p); + nm_hash_update_uint (&h, *p); if (k->type == STRSTRDICTKEY_ALL_SET) { /* the key contains two strings. Continue... */ - h = NM_HASH_COMBINE (h, '\0'); + nm_hash_update_uint (&h, '\0'); for (p++; *p != '\0'; p++) - h = NM_HASH_COMBINE (h, *p); + nm_hash_update_uint (&h, *p); } } } - - return h; + return nm_hash_complete (&h); } gboolean diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index b95e307cd7..31a445971e 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -26,6 +26,7 @@ #include <string.h> #include "nm-utils/c-list-util.h" +#include "nm-utils/nm-hash-utils.h" #include "nm-utils.h" #include "nm-setting-private.h" @@ -78,6 +79,66 @@ G_STATIC_ASSERT (sizeof (bool) <= sizeof (int)); /*****************************************************************************/ +static guint +_test_hash_str (const char *str) +{ + NMHashState h; + guint v, v2; + const guint SEED = 10; + + nm_hash_init (&h, SEED); + nm_hash_update_str (&h, str); + v = nm_hash_complete (&h); + + { + /* assert that hashing a string and a buffer yields the + * same result. + * + * I think that is a desirable property. */ + nm_hash_init (&h, SEED); + nm_hash_update_mem (&h, str, str ? strlen (str) : 0); + v2 = nm_hash_complete (&h); + } + g_assert (v == v2); + return v; +} + +static void +test_nm_hash (void) +{ + NMHashState h; + + _test_hash_str (""); + _test_hash_str ("a"); + _test_hash_str ("aa"); + _test_hash_str ("diceros bicornis longipes"); + + memset (&h, 0, sizeof (h)); + g_assert_cmpint (nm_hash_complete (&h), ==, 1396707757u); + + /* note how two different string still always hash the same, + * although we use a global seed that we initialize each time + * differently. + * + * The aim would be that two collisions depend on the seed value, + * which they currently don't. */ + g_assert_cmpint (nm_hash_str ("BA"), ==, nm_hash_str ("Ab")); + + /* with the current hasing algorighm, once we know two words that hash + * the same, we can trivally find more collions by concatenating + * them (which is bad). */ + g_assert_cmpint (nm_hash_str ("BABABA"), ==, nm_hash_str ("AbAbAb")); + g_assert_cmpint (nm_hash_str ("BABABA"), ==, nm_hash_str ("AbAbBA")); + g_assert_cmpint (nm_hash_str ("BABABA"), ==, nm_hash_str ("AbBAAb")); + g_assert_cmpint (nm_hash_str ("BABABA"), ==, nm_hash_str ("AbBABA")); + g_assert_cmpint (nm_hash_str ("BABABA"), ==, nm_hash_str ("BAAbAb")); + g_assert_cmpint (nm_hash_str ("BABABA"), ==, nm_hash_str ("BAAbBA")); + g_assert_cmpint (nm_hash_str ("BABABA"), ==, nm_hash_str ("BABAAb")); + g_assert_cmpint (nm_hash_str ("BABABA"), ==, nm_hash_str ("BABABA")); +} + +/*****************************************************************************/ + static void test_nm_g_slice_free_fcn (void) { @@ -6341,6 +6402,7 @@ int main (int argc, char **argv) { nmtst_init (&argc, &argv, TRUE); + g_test_add_func ("/core/general/test_nm_hash", test_nm_hash); g_test_add_func ("/core/general/test_nm_g_slice_free_fcn", test_nm_g_slice_free_fcn); g_test_add_func ("/core/general/test_c_list_sort", test_c_list_sort); g_test_add_func ("/core/general/test_dedup_multi", test_dedup_multi); diff --git a/shared/nm-utils/nm-dedup-multi.c b/shared/nm-utils/nm-dedup-multi.c index 04eec19436..b1872d4766 100644 --- a/shared/nm-utils/nm-dedup-multi.c +++ b/shared/nm-utils/nm-dedup-multi.c @@ -176,21 +176,21 @@ _dict_idx_entries_hash (const NMDedupMultiEntry *entry) const NMDedupMultiIdxType *idx_type; const NMDedupMultiObj *obj; gboolean lookup_head; - guint h; + NMHashState h; _entry_unpack (entry, &idx_type, &obj, &lookup_head); + nm_hash_init (&h, 1914869417u); if (idx_type->klass->idx_obj_partition_hash) { nm_assert (obj); - h = idx_type->klass->idx_obj_partition_hash (idx_type, obj); - } else - h = NM_HASH_INIT (1914869417u); + nm_hash_update_uint (&h, idx_type->klass->idx_obj_partition_hash (idx_type, obj)); + } if (!lookup_head) - h = NM_HASH_COMBINE (h, idx_type->klass->idx_obj_id_hash (idx_type, obj)); + nm_hash_update_uint (&h, idx_type->klass->idx_obj_id_hash (idx_type, obj)); - h = NM_HASH_COMBINE (h, GPOINTER_TO_UINT (idx_type)); - return h; + nm_hash_update_ptr (&h, idx_type); + return nm_hash_complete (&h); } static gboolean diff --git a/shared/nm-utils/nm-hash-utils.c b/shared/nm-utils/nm-hash-utils.c index 6d9bb7005e..4a450218e7 100644 --- a/shared/nm-utils/nm-hash-utils.c +++ b/shared/nm-utils/nm-hash-utils.c @@ -28,12 +28,14 @@ /*****************************************************************************/ -guint -NM_HASH_INIT (guint seed) +void +nm_hash_init (NMHashState *state, guint static_seed) { static volatile guint global_seed = 0; guint g, s; + nm_assert (state); + /* we xor @seed with a random @global_seed. This is to make the hashing behavior * less predictable and harder to exploit collisions. */ g = global_seed; @@ -46,5 +48,28 @@ NM_HASH_INIT (guint seed) nm_assert (g); } - return g ^ seed; + s = g ^ static_seed; + state->hash = s; +} + +guint +nm_hash_str (const char *str) +{ + NMHashState h; + + nm_hash_init (&h, 1867854211u); + nm_hash_update_str (&h, str); + return nm_hash_complete (&h); +} + +guint +nm_str_hash (gconstpointer str) +{ + return nm_hash_str (str); +} + +guint +nm_direct_hash (gconstpointer ptr) +{ + return nm_hash_ptr (ptr); } diff --git a/shared/nm-utils/nm-hash-utils.h b/shared/nm-utils/nm-hash-utils.h index de563b7dfa..55a832ef14 100644 --- a/shared/nm-utils/nm-hash-utils.h +++ b/shared/nm-utils/nm-hash-utils.h @@ -22,26 +22,107 @@ #ifndef __NM_HASH_UTILS_H__ #define __NM_HASH_UTILS_H__ -guint NM_HASH_INIT (guint seed); +#include <stdint.h> + +typedef struct { + guint hash; +} NMHashState; + +void nm_hash_init (NMHashState *state, guint static_seed); static inline guint -NM_HASH_COMBINE (guint h, guint val) +nm_hash_complete (NMHashState *state) { - /* see g_str_hash() for reasons */ - return (h << 5) + h + val; + nm_assert (state); + /* we don't ever want to return a zero hash. + * + * NMPObject requires that in _idx_obj_part(), and it's just a good idea. */ + return state->hash ?: 1396707757u; } -static inline guint -NM_HASH_COMBINE_UINT64 (guint h, guint64 val) +static inline void +nm_hash_update_uint (NMHashState *state, guint val) +{ + guint h; + + nm_assert (state); + + h = state->hash; + h = (h << 5) + h + val; + state->hash = h; +} + +static inline void +nm_hash_update_uint64 (NMHashState *state, guint64 val) +{ + guint h; + + nm_assert (state); + + h = state->hash; + h = (h << 5) + h + ((guint) val); + h = (h << 5) + h + ((guint) (val >> 32)); + state->hash = h; +} + +static inline void +nm_hash_update_ptr (NMHashState *state, gconstpointer ptr) +{ + if (sizeof (ptr) <= sizeof (guint)) + nm_hash_update_uint (state, ((guint) ((uintptr_t) ptr))); + else + nm_hash_update_uint64 (state, (guint64) ((uintptr_t) ptr)); +} + +static inline void +nm_hash_update_mem (NMHashState *state, const void *ptr, gsize n) +{ + gsize i; + guint h; + + nm_assert (state); + + /* use the same hash seed as nm_hash_update_str(). + * That way, nm_hash_update_str(&h, s) is identical to + * nm_hash_update_mem(&h, s, strlen(s)). */ + h = state->hash; + for (i = 0; i < n; i++) + h = (h << 5) + h + ((guint) ((const guint8 *) ptr)[i]); + h = (h << 5) + h + 1774132687u; + state->hash = h; +} + +static inline void +nm_hash_update_str (NMHashState *state, const char *str) { - return NM_HASH_COMBINE (h, (((guint) val) & 0xFFFFFFFFu) + ((guint) (val >> 32))); + const guint8 *p = (const guint8 *) str; + guint8 c; + guint h; + + nm_assert (state); + + /* Note that NULL hashes differently from "". */ + h = state->hash; + if (str) { + while ((c = *p++)) + h = (h << 5) + h + ((guint) c); + h = (h << 5) + h + 1774132687u; + } else + h = (h << 5) + h + 2967906233u; + state->hash = h; } static inline guint -NM_HASH_POINTER (gconstpointer ptr) +nm_hash_ptr (gconstpointer ptr) { - /* same as g_direct_hash(), but inline. */ - return GPOINTER_TO_UINT (ptr); + if (sizeof (ptr) <= sizeof (guint)) + return (guint) ((uintptr_t) ptr); + else + return ((guint) (((uintptr_t) ptr) >> 32)) ^ ((guint) ((uintptr_t) ptr)); } +guint nm_direct_hash (gconstpointer str); + +guint nm_hash_str (const char *str); +guint nm_str_hash (gconstpointer str); #endif /* __NM_HASH_UTILS_H__ */ diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index c8ec439e5a..cbb806861f 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2858,11 +2858,12 @@ typedef struct { static guint _v4_has_shadowed_routes_detect_hash (const IP4RPFilterData *d) { - guint h = NM_HASH_INIT (1105201169u); + NMHashState h; - h = NM_HASH_COMBINE (h, d->network); - h = NM_HASH_COMBINE (h, d->plen); - return h; + nm_hash_init (&h, 1105201169u); + nm_hash_update_uint (&h, d->network); + nm_hash_update_uint (&h, d->plen); + return nm_hash_complete (&h); } static gboolean diff --git a/src/devices/nm-lldp-listener.c b/src/devices/nm-lldp-listener.c index 28e7fd6c77..3cf6a209ec 100644 --- a/src/devices/nm-lldp-listener.c +++ b/src/devices/nm-lldp-listener.c @@ -274,13 +274,14 @@ static guint lldp_neighbor_id_hash (gconstpointer ptr) { const LldpNeighbor *neigh = ptr; - guint hash = NM_HASH_INIT (23423423u); - - hash = NM_HASH_COMBINE (hash, neigh->chassis_id ? g_str_hash (neigh->chassis_id) : 12321u); - hash = NM_HASH_COMBINE (hash, neigh->port_id ? g_str_hash (neigh->port_id) : 34342343u); - hash = NM_HASH_COMBINE (hash, neigh->chassis_id_type); - hash = NM_HASH_COMBINE (hash, neigh->port_id_type); - return hash; + NMHashState h; + + nm_hash_init (&h, 23423423u); + nm_hash_update_str (&h, neigh->chassis_id); + nm_hash_update_str (&h, neigh->port_id); + nm_hash_update_uint (&h, neigh->chassis_id_type); + nm_hash_update_uint (&h, neigh->port_id_type); + return nm_hash_complete (&h); } static int diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index 94f71ce3ea..04a382ae48 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -189,12 +189,11 @@ nm_utils_exp10 (gint16 ex) guint nm_utils_in6_addr_hash (const struct in6_addr *addr) { - guint hash = NM_HASH_INIT (3675559913u); - int i; + NMHashState h; - for (i = 0; i < sizeof (*addr); i++) - hash = NM_HASH_COMBINE (hash, ((const guint8 *) addr)[i]); - return hash; + nm_hash_init (&h, 3675559913u); + nm_hash_update_in6addr (&h, addr); + return nm_hash_complete (&h); } /*****************************************************************************/ diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index 283bd686fb..097cac5fd3 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -128,24 +128,23 @@ nm_utils_ip6_address_same_prefix (const struct in6_addr *addr_a, const struct in #define NM_CMP_DIRECT_IN6ADDR_SAME_PREFIX(a, b, plen) \ NM_CMP_RETURN (nm_utils_ip6_address_same_prefix_cmp ((a), (b), (plen))) -static inline guint -NM_HASH_COMBINE_IN6ADDR (guint h, const struct in6_addr *addr) +static inline void +nm_hash_update_in6addr (NMHashState *h, const struct in6_addr *addr) { - if (!addr) - g_return_val_if_reached (h); - return NM_HASH_COMBINE (h, nm_utils_in6_addr_hash (addr)); + nm_hash_update_mem (h, addr, addr ? sizeof (*addr) : 0); } -static inline guint -NM_HASH_COMBINE_IN6ADDR_PREFIX (guint h, const struct in6_addr *addr, guint8 plen) +static inline void +nm_hash_update_in6addr_prefix (NMHashState *h, const struct in6_addr *addr, guint8 plen) { struct in6_addr a; if (!addr) - g_return_val_if_reached (h); + g_return_if_reached (); + nm_utils_ip6_address_clear_host_address (&a, addr, plen); /* we don't hash plen itself. The caller may want to do that.*/ - return NM_HASH_COMBINE (h, nm_utils_in6_addr_hash (&a)); + nm_hash_update_in6addr (h, &a); } double nm_utils_exp10 (gint16 e); diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index a04c3723fa..60b1a5aa17 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -5126,34 +5126,30 @@ nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route, char *buf, gsi guint nm_platform_link_hash (const NMPlatformLink *obj) { - guint h = NM_HASH_INIT (99413953u); - guint8 i8; - - h = NM_HASH_COMBINE (h, obj->ifindex); - h = NM_HASH_COMBINE (h, obj->type); - h = NM_HASH_COMBINE (h, g_str_hash (obj->name)); - h = NM_HASH_COMBINE (h, obj->master); - h = NM_HASH_COMBINE (h, obj->parent); - h = NM_HASH_COMBINE (h, obj->n_ifi_flags); - h = NM_HASH_COMBINE (h, obj->connected); - h = NM_HASH_COMBINE (h, obj->mtu); - h = NM_HASH_COMBINE (h, !!obj->initialized); - h = NM_HASH_COMBINE (h, obj->arptype); - h = NM_HASH_COMBINE (h, obj->addr.len); - h = NM_HASH_COMBINE (h, obj->inet6_addr_gen_mode_inv); - if (obj->kind) - h = NM_HASH_COMBINE (h, g_str_hash (obj->kind)); - if (obj->driver) - h = NM_HASH_COMBINE (h, g_str_hash (obj->driver)); - for (i8 = 0; i8 < obj->addr.len; i8++) - h = NM_HASH_COMBINE (h, obj->addr.data[i8]); - for (i8 = 0; i8 < sizeof (obj->inet6_token); i8++) - h = NM_HASH_COMBINE (h, obj->inet6_token.id_u8[i8]); - h = NM_HASH_COMBINE (h, obj->rx_packets); - h = NM_HASH_COMBINE (h, obj->rx_bytes); - h = NM_HASH_COMBINE (h, obj->tx_packets); - h = NM_HASH_COMBINE (h, obj->tx_bytes); - return h; + NMHashState h; + + nm_hash_init (&h, 99413953u); + nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_uint (&h, obj->type); + nm_hash_update_str (&h, obj->name); + nm_hash_update_uint (&h, obj->master); + nm_hash_update_uint (&h, obj->parent); + nm_hash_update_uint (&h, obj->n_ifi_flags); + nm_hash_update_uint (&h, obj->connected); + nm_hash_update_uint (&h, obj->mtu); + nm_hash_update_uint (&h, !!obj->initialized); + nm_hash_update_uint (&h, obj->arptype); + nm_hash_update_uint (&h, obj->addr.len); + nm_hash_update_uint (&h, obj->inet6_addr_gen_mode_inv); + nm_hash_update_str (&h, obj->kind); + nm_hash_update_str (&h, obj->driver); + nm_hash_update_mem (&h, obj->addr.data, obj->addr.len); + nm_hash_update_mem (&h, &obj->inet6_token, sizeof (obj->inet6_token)); + nm_hash_update_uint (&h, obj->rx_packets); + nm_hash_update_uint (&h, obj->rx_bytes); + nm_hash_update_uint (&h, obj->tx_packets); + nm_hash_update_uint (&h, obj->tx_bytes); + return nm_hash_complete (&h); } int @@ -5187,19 +5183,20 @@ nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b) guint nm_platform_lnk_gre_hash (const NMPlatformLnkGre *obj) { - guint h = NM_HASH_INIT (1887023311u); + NMHashState h; - h = NM_HASH_COMBINE (h, obj->parent_ifindex); - h = NM_HASH_COMBINE (h, obj->input_flags); - h = NM_HASH_COMBINE (h, obj->output_flags); - h = NM_HASH_COMBINE (h, obj->input_key); - h = NM_HASH_COMBINE (h, obj->output_key); - h = NM_HASH_COMBINE (h, obj->local); - h = NM_HASH_COMBINE (h, obj->remote); - h = NM_HASH_COMBINE (h, obj->ttl); - h = NM_HASH_COMBINE (h, obj->tos); - h = NM_HASH_COMBINE (h, !obj->path_mtu_discovery); - return h; + nm_hash_init (&h, 1887023311u); + nm_hash_update_uint (&h, obj->parent_ifindex); + nm_hash_update_uint (&h, obj->input_flags); + nm_hash_update_uint (&h, obj->output_flags); + nm_hash_update_uint (&h, obj->input_key); + nm_hash_update_uint (&h, obj->output_key); + nm_hash_update_uint (&h, obj->local); + nm_hash_update_uint (&h, obj->remote); + nm_hash_update_uint (&h, obj->ttl); + nm_hash_update_uint (&h, obj->tos); + nm_hash_update_uint (&h, !obj->path_mtu_discovery); + return nm_hash_complete (&h); } int @@ -5222,12 +5219,13 @@ nm_platform_lnk_gre_cmp (const NMPlatformLnkGre *a, const NMPlatformLnkGre *b) guint nm_platform_lnk_infiniband_hash (const NMPlatformLnkInfiniband *obj) { - guint h = NM_HASH_INIT (1748638583u); + NMHashState h; - h = NM_HASH_COMBINE (h, obj->p_key); + nm_hash_init (&h, 1748638583u); + nm_hash_update_uint (&h, obj->p_key); if (obj->mode) - h = NM_HASH_COMBINE (h, g_str_hash (obj->mode)); - return h; + nm_hash_update_str (&h, obj->mode); + return nm_hash_complete (&h); } int @@ -5242,17 +5240,18 @@ nm_platform_lnk_infiniband_cmp (const NMPlatformLnkInfiniband *a, const NMPlatfo guint nm_platform_lnk_ip6tnl_hash (const NMPlatformLnkIp6Tnl *obj) { - guint h = NM_HASH_INIT (1651660009u); + NMHashState h; - h = NM_HASH_COMBINE (h, obj->parent_ifindex); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->local); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->remote); - h = NM_HASH_COMBINE (h, obj->ttl); - h = NM_HASH_COMBINE (h, obj->tclass); - h = NM_HASH_COMBINE (h, obj->encap_limit); - h = NM_HASH_COMBINE (h, obj->flow_label); - h = NM_HASH_COMBINE (h, obj->proto); - return h; + nm_hash_init (&h, 1651660009u); + nm_hash_update_uint (&h, obj->parent_ifindex); + nm_hash_update_in6addr (&h, &obj->local); + nm_hash_update_in6addr (&h, &obj->remote); + nm_hash_update_uint (&h, obj->ttl); + nm_hash_update_uint (&h, obj->tclass); + nm_hash_update_uint (&h, obj->encap_limit); + nm_hash_update_uint (&h, obj->flow_label); + nm_hash_update_uint (&h, obj->proto); + return nm_hash_complete (&h); } int @@ -5273,15 +5272,16 @@ nm_platform_lnk_ip6tnl_cmp (const NMPlatformLnkIp6Tnl *a, const NMPlatformLnkIp6 guint nm_platform_lnk_ipip_hash (const NMPlatformLnkIpIp *obj) { - guint h = NM_HASH_INIT (861934429u); + NMHashState h; - h = NM_HASH_COMBINE (h, obj->parent_ifindex); - h = NM_HASH_COMBINE (h, obj->local); - h = NM_HASH_COMBINE (h, obj->remote); - h = NM_HASH_COMBINE (h, obj->ttl); - h = NM_HASH_COMBINE (h, obj->tos); - h = NM_HASH_COMBINE (h, obj->path_mtu_discovery); - return h; + nm_hash_init (&h, 861934429u); + nm_hash_update_uint (&h, obj->parent_ifindex); + nm_hash_update_uint (&h, obj->local); + nm_hash_update_uint (&h, obj->remote); + nm_hash_update_uint (&h, obj->ttl); + nm_hash_update_uint (&h, obj->tos); + nm_hash_update_uint (&h, obj->path_mtu_discovery); + return nm_hash_complete (&h); } int @@ -5300,22 +5300,23 @@ nm_platform_lnk_ipip_cmp (const NMPlatformLnkIpIp *a, const NMPlatformLnkIpIp *b guint nm_platform_lnk_macsec_hash (const NMPlatformLnkMacsec *obj) { - guint h = NM_HASH_INIT (226984267u); - - h = NM_HASH_COMBINE (h, obj->parent_ifindex); - h = NM_HASH_COMBINE (h, obj->sci); - h = NM_HASH_COMBINE_UINT64 (h, obj->icv_length); - h = NM_HASH_COMBINE_UINT64 (h, obj->cipher_suite); - h = NM_HASH_COMBINE (h, obj->window); - h = NM_HASH_COMBINE (h, obj->encoding_sa); - h = NM_HASH_COMBINE (h, obj->validation); - h = NM_HASH_COMBINE (h, obj->encrypt); - h = NM_HASH_COMBINE (h, obj->protect); - h = NM_HASH_COMBINE (h, obj->include_sci); - h = NM_HASH_COMBINE (h, obj->es); - h = NM_HASH_COMBINE (h, obj->scb); - h = NM_HASH_COMBINE (h, obj->replay_protect); - return h; + NMHashState h; + + nm_hash_init (&h, 226984267u); + nm_hash_update_uint (&h, obj->parent_ifindex); + nm_hash_update_uint (&h, obj->sci); + nm_hash_update_uint64 (&h, obj->icv_length); + nm_hash_update_uint64 (&h, obj->cipher_suite); + nm_hash_update_uint (&h, obj->window); + nm_hash_update_uint (&h, obj->encoding_sa); + nm_hash_update_uint (&h, obj->validation); + nm_hash_update_uint (&h, obj->encrypt); + nm_hash_update_uint (&h, obj->protect); + nm_hash_update_uint (&h, obj->include_sci); + nm_hash_update_uint (&h, obj->es); + nm_hash_update_uint (&h, obj->scb); + nm_hash_update_uint (&h, obj->replay_protect); + return nm_hash_complete (&h); } int @@ -5341,12 +5342,13 @@ nm_platform_lnk_macsec_cmp (const NMPlatformLnkMacsec *a, const NMPlatformLnkMac guint nm_platform_lnk_macvlan_hash (const NMPlatformLnkMacvlan *obj) { - guint h = NM_HASH_INIT (771014989u); + NMHashState h; - h = NM_HASH_COMBINE (h, obj->mode); - h = NM_HASH_COMBINE (h, obj->no_promisc); - h = NM_HASH_COMBINE (h, obj->tap); - return h; + nm_hash_init (&h, 771014989u); + nm_hash_update_uint (&h, obj->mode); + nm_hash_update_uint (&h, obj->no_promisc); + nm_hash_update_uint (&h, obj->tap); + return nm_hash_complete (&h); } int @@ -5362,17 +5364,18 @@ nm_platform_lnk_macvlan_cmp (const NMPlatformLnkMacvlan *a, const NMPlatformLnkM guint nm_platform_lnk_sit_hash (const NMPlatformLnkSit *obj) { - guint h = NM_HASH_INIT (1690154969u); + NMHashState h; - h = NM_HASH_COMBINE (h, obj->parent_ifindex); - h = NM_HASH_COMBINE (h, obj->local); - h = NM_HASH_COMBINE (h, obj->remote); - h = NM_HASH_COMBINE (h, obj->ttl); - h = NM_HASH_COMBINE (h, obj->tos); - h = NM_HASH_COMBINE (h, obj->path_mtu_discovery); - h = NM_HASH_COMBINE (h, obj->flags); - h = NM_HASH_COMBINE (h, obj->proto); - return h; + nm_hash_init (&h, 1690154969u); + nm_hash_update_uint (&h, obj->parent_ifindex); + nm_hash_update_uint (&h, obj->local); + nm_hash_update_uint (&h, obj->remote); + nm_hash_update_uint (&h, obj->ttl); + nm_hash_update_uint (&h, obj->tos); + nm_hash_update_uint (&h, obj->path_mtu_discovery); + nm_hash_update_uint (&h, obj->flags); + nm_hash_update_uint (&h, obj->proto); + return nm_hash_complete (&h); } int @@ -5393,11 +5396,12 @@ nm_platform_lnk_sit_cmp (const NMPlatformLnkSit *a, const NMPlatformLnkSit *b) guint nm_platform_lnk_vlan_hash (const NMPlatformLnkVlan *obj) { - guint h = NM_HASH_INIT (58751383u); + NMHashState h; - h = NM_HASH_COMBINE (h, obj->id); - h = NM_HASH_COMBINE (h, obj->flags); - return h; + nm_hash_init (&h, 58751383u); + nm_hash_update_uint (&h, obj->id); + nm_hash_update_uint (&h, obj->flags); + return nm_hash_complete (&h); } int @@ -5412,27 +5416,28 @@ nm_platform_lnk_vlan_cmp (const NMPlatformLnkVlan *a, const NMPlatformLnkVlan *b guint nm_platform_lnk_vxlan_hash (const NMPlatformLnkVxlan *obj) { - guint h = NM_HASH_INIT (461041297u); - - h = NM_HASH_COMBINE (h, obj->parent_ifindex); - h = NM_HASH_COMBINE (h, obj->id); - h = NM_HASH_COMBINE (h, obj->group); - h = NM_HASH_COMBINE (h, obj->local); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->group6); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->local6); - h = NM_HASH_COMBINE (h, obj->tos); - h = NM_HASH_COMBINE (h, obj->ttl); - h = NM_HASH_COMBINE (h, obj->learning); - h = NM_HASH_COMBINE (h, obj->ageing); - h = NM_HASH_COMBINE (h, obj->limit); - h = NM_HASH_COMBINE (h, obj->dst_port); - h = NM_HASH_COMBINE (h, obj->src_port_min); - h = NM_HASH_COMBINE (h, obj->src_port_max); - h = NM_HASH_COMBINE (h, obj->proxy); - h = NM_HASH_COMBINE (h, obj->rsc); - h = NM_HASH_COMBINE (h, obj->l2miss); - h = NM_HASH_COMBINE (h, obj->l3miss); - return h; + NMHashState h; + + nm_hash_init (&h, 461041297u); + nm_hash_update_uint (&h, obj->parent_ifindex); + nm_hash_update_uint (&h, obj->id); + nm_hash_update_uint (&h, obj->group); + nm_hash_update_uint (&h, obj->local); + nm_hash_update_in6addr (&h, &obj->group6); + nm_hash_update_in6addr (&h, &obj->local6); + nm_hash_update_uint (&h, obj->tos); + nm_hash_update_uint (&h, obj->ttl); + nm_hash_update_uint (&h, obj->learning); + nm_hash_update_uint (&h, obj->ageing); + nm_hash_update_uint (&h, obj->limit); + nm_hash_update_uint (&h, obj->dst_port); + nm_hash_update_uint (&h, obj->src_port_min); + nm_hash_update_uint (&h, obj->src_port_max); + nm_hash_update_uint (&h, obj->proxy); + nm_hash_update_uint (&h, obj->rsc); + nm_hash_update_uint (&h, obj->l2miss); + nm_hash_update_uint (&h, obj->l3miss); + return nm_hash_complete (&h); } int @@ -5463,21 +5468,22 @@ nm_platform_lnk_vxlan_cmp (const NMPlatformLnkVxlan *a, const NMPlatformLnkVxlan guint nm_platform_ip4_address_hash (const NMPlatformIP4Address *obj) { - guint h = NM_HASH_INIT (469681301u); + NMHashState h; + nm_hash_init (&h, 469681301u); if (obj) { - h = NM_HASH_COMBINE (h, obj->ifindex); - h = NM_HASH_COMBINE (h, obj->address); - h = NM_HASH_COMBINE (h, obj->plen); - h = NM_HASH_COMBINE (h, obj->peer_address); - h = NM_HASH_COMBINE (h, obj->addr_source); - h = NM_HASH_COMBINE (h, obj->timestamp); - h = NM_HASH_COMBINE (h, obj->lifetime); - h = NM_HASH_COMBINE (h, obj->preferred); - h = NM_HASH_COMBINE (h, obj->n_ifa_flags); - h = NM_HASH_COMBINE (h, g_str_hash (obj->label)); + nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_uint (&h, obj->address); + nm_hash_update_uint (&h, obj->plen); + nm_hash_update_uint (&h, obj->peer_address); + nm_hash_update_uint (&h, obj->addr_source); + nm_hash_update_uint (&h, obj->timestamp); + nm_hash_update_uint (&h, obj->lifetime); + nm_hash_update_uint (&h, obj->preferred); + nm_hash_update_uint (&h, obj->n_ifa_flags); + nm_hash_update_str (&h, obj->label); } - return h; + return nm_hash_complete (&h); } int @@ -5500,20 +5506,21 @@ nm_platform_ip4_address_cmp (const NMPlatformIP4Address *a, const NMPlatformIP4A guint nm_platform_ip6_address_hash (const NMPlatformIP6Address *obj) { - guint h = NM_HASH_INIT (605908909u); + NMHashState h; + nm_hash_init (&h, 605908909u); if (obj) { - h = NM_HASH_COMBINE (h, obj->ifindex); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->address); - h = NM_HASH_COMBINE (h, obj->plen); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->peer_address); - h = NM_HASH_COMBINE (h, obj->addr_source); - h = NM_HASH_COMBINE (h, obj->timestamp); - h = NM_HASH_COMBINE (h, obj->lifetime); - h = NM_HASH_COMBINE (h, obj->preferred); - h = NM_HASH_COMBINE (h, obj->n_ifa_flags); + nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_in6addr (&h, &obj->address); + nm_hash_update_uint (&h, obj->plen); + nm_hash_update_in6addr (&h, &obj->peer_address); + nm_hash_update_uint (&h, obj->addr_source); + nm_hash_update_uint (&h, obj->timestamp); + nm_hash_update_uint (&h, obj->lifetime); + nm_hash_update_uint (&h, obj->preferred); + nm_hash_update_uint (&h, obj->n_ifa_flags); } - return h; + return nm_hash_complete (&h); } int @@ -5539,76 +5546,77 @@ nm_platform_ip6_address_cmp (const NMPlatformIP6Address *a, const NMPlatformIP6A guint nm_platform_ip4_route_hash (const NMPlatformIP4Route *obj, NMPlatformIPRouteCmpType cmp_type) { - guint h = NM_HASH_INIT (1228913327u); + NMHashState h; - h = NM_HASH_COMBINE (h, cmp_type); + nm_hash_init (&h, 1228913327u); + nm_hash_update_uint (&h, cmp_type); if (obj) { switch (cmp_type) { case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID: - h = NM_HASH_COMBINE (h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); - h = NM_HASH_COMBINE (h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen)); - h = NM_HASH_COMBINE (h, obj->plen); - h = NM_HASH_COMBINE (h, obj->metric); - h = NM_HASH_COMBINE (h, obj->tos); + nm_hash_update_uint (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); + nm_hash_update_uint (&h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen)); + nm_hash_update_uint (&h, obj->plen); + nm_hash_update_uint (&h, obj->metric); + nm_hash_update_uint (&h, obj->tos); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) { - h = NM_HASH_COMBINE (h, obj->ifindex); - h = NM_HASH_COMBINE (h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); - h = NM_HASH_COMBINE (h, _ip_route_scope_inv_get_normalized (obj)); - h = NM_HASH_COMBINE (h, obj->gateway); - h = NM_HASH_COMBINE (h, obj->mss); - h = NM_HASH_COMBINE (h, obj->pref_src); - h = NM_HASH_COMBINE (h, obj->window); - h = NM_HASH_COMBINE (h, obj->cwnd); - h = NM_HASH_COMBINE (h, obj->initcwnd); - h = NM_HASH_COMBINE (h, obj->initrwnd); - h = NM_HASH_COMBINE (h, obj->mtu); - h = NM_HASH_COMBINE (h, obj->lock_window); - h = NM_HASH_COMBINE (h, obj->lock_cwnd); - h = NM_HASH_COMBINE (h, obj->lock_initcwnd); - h = NM_HASH_COMBINE (h, obj->lock_initrwnd); - h = NM_HASH_COMBINE (h, obj->lock_mtu); + nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_uint (&h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); + nm_hash_update_uint (&h, _ip_route_scope_inv_get_normalized (obj)); + nm_hash_update_uint (&h, obj->gateway); + nm_hash_update_uint (&h, obj->mss); + nm_hash_update_uint (&h, obj->pref_src); + nm_hash_update_uint (&h, obj->window); + nm_hash_update_uint (&h, obj->cwnd); + nm_hash_update_uint (&h, obj->initcwnd); + nm_hash_update_uint (&h, obj->initrwnd); + nm_hash_update_uint (&h, obj->mtu); + nm_hash_update_uint (&h, obj->lock_window); + nm_hash_update_uint (&h, obj->lock_cwnd); + nm_hash_update_uint (&h, obj->lock_initcwnd); + nm_hash_update_uint (&h, obj->lock_initrwnd); + nm_hash_update_uint (&h, obj->lock_mtu); } break; case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL: if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - h = NM_HASH_COMBINE (h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); + nm_hash_update_uint (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); else - h = NM_HASH_COMBINE (h, obj->table_coerced); - h = NM_HASH_COMBINE (h, obj->ifindex); + nm_hash_update_uint (&h, obj->table_coerced); + nm_hash_update_uint (&h, obj->ifindex); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - h = NM_HASH_COMBINE (h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen)); + nm_hash_update_uint (&h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen)); else - h = NM_HASH_COMBINE (h, obj->network); - h = NM_HASH_COMBINE (h, obj->plen); - h = NM_HASH_COMBINE (h, obj->metric); - h = NM_HASH_COMBINE (h, obj->gateway); + nm_hash_update_uint (&h, obj->network); + nm_hash_update_uint (&h, obj->plen); + nm_hash_update_uint (&h, obj->metric); + nm_hash_update_uint (&h, obj->gateway); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) { - h = NM_HASH_COMBINE (h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); - h = NM_HASH_COMBINE (h, _ip_route_scope_inv_get_normalized (obj)); + nm_hash_update_uint (&h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); + nm_hash_update_uint (&h, _ip_route_scope_inv_get_normalized (obj)); } else { - h = NM_HASH_COMBINE (h, obj->rt_source); - h = NM_HASH_COMBINE (h, obj->scope_inv); + nm_hash_update_uint (&h, obj->rt_source); + nm_hash_update_uint (&h, obj->scope_inv); } - h = NM_HASH_COMBINE (h, obj->mss); - h = NM_HASH_COMBINE (h, obj->pref_src); - h = NM_HASH_COMBINE (h, obj->rt_cloned); - h = NM_HASH_COMBINE (h, obj->tos); - h = NM_HASH_COMBINE (h, obj->lock_window); - h = NM_HASH_COMBINE (h, obj->lock_cwnd); - h = NM_HASH_COMBINE (h, obj->lock_initcwnd); - h = NM_HASH_COMBINE (h, obj->lock_initrwnd); - h = NM_HASH_COMBINE (h, obj->lock_mtu); - h = NM_HASH_COMBINE (h, obj->window); - h = NM_HASH_COMBINE (h, obj->cwnd); - h = NM_HASH_COMBINE (h, obj->initcwnd); - h = NM_HASH_COMBINE (h, obj->initrwnd); - h = NM_HASH_COMBINE (h, obj->mtu); + nm_hash_update_uint (&h, obj->mss); + nm_hash_update_uint (&h, obj->pref_src); + nm_hash_update_uint (&h, obj->rt_cloned); + nm_hash_update_uint (&h, obj->tos); + nm_hash_update_uint (&h, obj->lock_window); + nm_hash_update_uint (&h, obj->lock_cwnd); + nm_hash_update_uint (&h, obj->lock_initcwnd); + nm_hash_update_uint (&h, obj->lock_initrwnd); + nm_hash_update_uint (&h, obj->lock_mtu); + nm_hash_update_uint (&h, obj->window); + nm_hash_update_uint (&h, obj->cwnd); + nm_hash_update_uint (&h, obj->initcwnd); + nm_hash_update_uint (&h, obj->initrwnd); + nm_hash_update_uint (&h, obj->mtu); break; } } - return h; + return nm_hash_complete (&h); } int @@ -5691,71 +5699,72 @@ nm_platform_ip4_route_cmp (const NMPlatformIP4Route *a, const NMPlatformIP4Route guint nm_platform_ip6_route_hash (const NMPlatformIP6Route *obj, NMPlatformIPRouteCmpType cmp_type) { - guint h = NM_HASH_INIT (1053326051u); + NMHashState h; - h = NM_HASH_COMBINE (h, cmp_type); + nm_hash_init (&h, 1053326051u); + nm_hash_update_uint (&h, cmp_type); if (obj) { switch (cmp_type) { case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID: - h = NM_HASH_COMBINE (h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); - h = NM_HASH_COMBINE_IN6ADDR_PREFIX (h, &obj->network, obj->plen); - h = NM_HASH_COMBINE (h, obj->plen); - h = NM_HASH_COMBINE (h, nm_utils_ip6_route_metric_normalize (obj->metric)); - h = NM_HASH_COMBINE_IN6ADDR_PREFIX (h, &obj->src, obj->src_plen); - h = NM_HASH_COMBINE (h, obj->src_plen); + nm_hash_update_uint (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); + nm_hash_update_in6addr_prefix (&h, &obj->network, obj->plen); + nm_hash_update_uint (&h, obj->plen); + nm_hash_update_uint (&h, nm_utils_ip6_route_metric_normalize (obj->metric)); + nm_hash_update_in6addr_prefix (&h, &obj->src, obj->src_plen); + nm_hash_update_uint (&h, obj->src_plen); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) { - h = NM_HASH_COMBINE (h, obj->ifindex); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->gateway); + nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_in6addr (&h, &obj->gateway); } break; case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL: if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - h = NM_HASH_COMBINE (h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); + nm_hash_update_uint (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); else - h = NM_HASH_COMBINE (h, obj->table_coerced); - h = NM_HASH_COMBINE (h, obj->ifindex); + nm_hash_update_uint (&h, obj->table_coerced); + nm_hash_update_uint (&h, obj->ifindex); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - h = NM_HASH_COMBINE_IN6ADDR_PREFIX (h, &obj->network, obj->plen); + nm_hash_update_in6addr_prefix (&h, &obj->network, obj->plen); else - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->network); - h = NM_HASH_COMBINE (h, obj->plen); + nm_hash_update_in6addr (&h, &obj->network); + nm_hash_update_uint (&h, obj->plen); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - h = NM_HASH_COMBINE (h, nm_utils_ip6_route_metric_normalize (obj->metric)); + nm_hash_update_uint (&h, nm_utils_ip6_route_metric_normalize (obj->metric)); else - h = NM_HASH_COMBINE (h, obj->metric); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->gateway); - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->pref_src); + nm_hash_update_uint (&h, obj->metric); + nm_hash_update_in6addr (&h, &obj->gateway); + nm_hash_update_in6addr (&h, &obj->pref_src); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) { - h = NM_HASH_COMBINE_IN6ADDR_PREFIX (h, &obj->src, obj->src_plen); - h = NM_HASH_COMBINE (h, obj->src_plen); - h = NM_HASH_COMBINE (h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); + nm_hash_update_in6addr_prefix (&h, &obj->src, obj->src_plen); + nm_hash_update_uint (&h, obj->src_plen); + nm_hash_update_uint (&h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); } else { - h = NM_HASH_COMBINE_IN6ADDR (h, &obj->src); - h = NM_HASH_COMBINE (h, obj->src_plen); - h = NM_HASH_COMBINE (h, obj->rt_source); + nm_hash_update_in6addr (&h, &obj->src); + nm_hash_update_uint (&h, obj->src_plen); + nm_hash_update_uint (&h, obj->rt_source); } - h = NM_HASH_COMBINE (h, obj->mss); - h = NM_HASH_COMBINE (h, obj->rt_cloned); - h = NM_HASH_COMBINE (h, obj->lock_window); - h = NM_HASH_COMBINE (h, obj->lock_cwnd); - h = NM_HASH_COMBINE (h, obj->lock_initcwnd); - h = NM_HASH_COMBINE (h, obj->lock_initrwnd); - h = NM_HASH_COMBINE (h, obj->lock_mtu); - h = NM_HASH_COMBINE (h, obj->window); - h = NM_HASH_COMBINE (h, obj->cwnd); - h = NM_HASH_COMBINE (h, obj->initcwnd); - h = NM_HASH_COMBINE (h, obj->initrwnd); - h = NM_HASH_COMBINE (h, obj->mtu); + nm_hash_update_uint (&h, obj->mss); + nm_hash_update_uint (&h, obj->rt_cloned); + nm_hash_update_uint (&h, obj->lock_window); + nm_hash_update_uint (&h, obj->lock_cwnd); + nm_hash_update_uint (&h, obj->lock_initcwnd); + nm_hash_update_uint (&h, obj->lock_initrwnd); + nm_hash_update_uint (&h, obj->lock_mtu); + nm_hash_update_uint (&h, obj->window); + nm_hash_update_uint (&h, obj->cwnd); + nm_hash_update_uint (&h, obj->initcwnd); + nm_hash_update_uint (&h, obj->initrwnd); + nm_hash_update_uint (&h, obj->mtu); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - h = NM_HASH_COMBINE (h, _route_pref_normalize (obj->rt_pref)); + nm_hash_update_uint (&h, _route_pref_normalize (obj->rt_pref)); else - h = NM_HASH_COMBINE (h, obj->rt_pref); + nm_hash_update_uint (&h, obj->rt_pref); break; } } - return h; + return nm_hash_complete (&h); } int diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c index 24651a66d0..fdc8dd87a9 100644 --- a/src/platform/nmp-object.c +++ b/src/platform/nmp-object.c @@ -121,9 +121,19 @@ _idx_obj_id_equal (const NMDedupMultiIdxType *idx_type, * on whether the objects are equal. * * _HASH_NON_ZERO() is used to for case 2), to avoid that the a zero hash value - * is returned. */ -#define _HASH_NON_ZERO(h) \ - ((h) ?: (1998098407 + __LINE__)) \ + * is returned. + * + * Actually, nm_hash_complete() never returns zero. This code is only + * here as a safeguard and a reminder that the has MUST not be zero. */ +static inline guint +_HASH_NON_ZERO (NMHashState *h) +{ + guint v; + + v = nm_hash_complete (h); + nm_assert (v != 0); + return v; +} static guint _idx_obj_part (const DedupMultiIdxType *idx_type, @@ -131,7 +141,6 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, const NMPObject *obj_a, const NMPObject *obj_b) { - guint h; NMPObjectType obj_type; /* the hash/equals functions are strongly related. So, keep them @@ -150,10 +159,12 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, if (obj_b) return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b); if (request_hash) { - h = NM_HASH_INIT (487703243u); - h = NM_HASH_COMBINE (h, idx_type->cache_id_type); - h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a)); - return _HASH_NON_ZERO (h); + NMHashState h; + + nm_hash_init (&h, 487703243u); + nm_hash_update_uint (&h, idx_type->cache_id_type); + nm_hash_update_uint (&h, NMP_OBJECT_GET_TYPE (obj_a)); + return _HASH_NON_ZERO (&h); } return 1; @@ -170,11 +181,13 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, && nm_streq (obj_a->link.name, obj_b->link.name); } if (request_hash) { + NMHashState h; + /* we request a hash from obj_a. Hash the relevant parts. */ - h = NM_HASH_INIT (2126752699u); - h = NM_HASH_COMBINE (h, idx_type->cache_id_type); - h = NM_HASH_COMBINE (h, g_str_hash (obj_a->link.name)); - return _HASH_NON_ZERO (h); + nm_hash_init (&h, 2126752699u); + nm_hash_update_uint (&h, idx_type->cache_id_type); + nm_hash_update_str (&h, obj_a->link.name); + return _HASH_NON_ZERO (&h); } /* just return 1, to indicate that obj_a is partitionable by this idx_type. */ return 1; @@ -191,10 +204,12 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, && nmp_object_is_visible (obj_b); } if (request_hash) { - h = NM_HASH_INIT (4278960223u); - h = NM_HASH_COMBINE (h, idx_type->cache_id_type); - h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a)); - return _HASH_NON_ZERO (h); + NMHashState h; + + nm_hash_init (&h, 4278960223u); + nm_hash_update_uint (&h, idx_type->cache_id_type); + nm_hash_update_uint (&h, NMP_OBJECT_GET_TYPE (obj_a)); + return _HASH_NON_ZERO (&h); } return 1; @@ -212,11 +227,13 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, && nmp_object_is_visible (obj_b); } if (request_hash) { - h = NM_HASH_INIT (920415631u); - h = NM_HASH_COMBINE (h, idx_type->cache_id_type); - h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a)); - h = NM_HASH_COMBINE (h, obj_a->object.ifindex); - return _HASH_NON_ZERO (h); + NMHashState h; + + nm_hash_init (&h, 920415631u); + nm_hash_update_uint (&h, idx_type->cache_id_type); + nm_hash_update_uint (&h, NMP_OBJECT_GET_TYPE (obj_a)); + nm_hash_update_uint (&h, obj_a->object.ifindex); + return _HASH_NON_ZERO (&h); } return 1; @@ -234,13 +251,15 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, : (nm_platform_ip6_route_cmp (&obj_a->ip6_route, &obj_b->ip6_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID) == 0)); } if (request_hash) { - h = NM_HASH_INIT (778646573u); - h = NM_HASH_COMBINE (h, idx_type->cache_id_type); + NMHashState h; + + nm_hash_init (&h, 778646573u); + nm_hash_update_uint (&h, idx_type->cache_id_type); if (obj_type == NMP_OBJECT_TYPE_IP4_ROUTE) - h = NM_HASH_COMBINE (h, nm_platform_ip4_route_hash (&obj_a->ip4_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID)); + nm_hash_update_uint (&h, nm_platform_ip4_route_hash (&obj_a->ip4_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID)); else - h = NM_HASH_COMBINE (h, nm_platform_ip6_route_hash (&obj_a->ip6_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID)); - return _HASH_NON_ZERO (h); + nm_hash_update_uint (&h, nm_platform_ip6_route_hash (&obj_a->ip6_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID)); + return _HASH_NON_ZERO (&h); } return 1; @@ -301,18 +320,18 @@ _dedup_multi_idx_type_init (DedupMultiIdxType *idx_type, NMPCacheIdType cache_id /*****************************************************************************/ -static guint -_vlan_xgress_qos_mappings_hash (guint n_map, +static void +_vlan_xgress_qos_mappings_hash (NMHashState *h, + guint n_map, const NMVlanQosMapping *map) { - guint h = NM_HASH_INIT (1453577309u); guint i; + nm_hash_update_uint (h, 1453577309u); for (i = 0; i < n_map; i++) { - h = NM_HASH_COMBINE (h, map[i].from); - h = NM_HASH_COMBINE (h, map[i].to); + nm_hash_update_uint (h, map[i].from); + nm_hash_update_uint (h, map[i].to); } - return h; } static int @@ -745,14 +764,14 @@ _vt_cmd_plobj_to_string_id_##type (const NMPlatformObject *_obj, char *buf, gsiz _vt_cmd_plobj_to_string_id (link, NMPlatformLink, "%d", obj->ifindex); _vt_cmd_plobj_to_string_id (ip4_address, NMPlatformIP4Address, "%d: %s/%d%s%s", obj->ifindex, nm_utils_inet4_ntop ( obj->address, buf1), obj->plen, obj->peer_address != obj->address ? "," : "", - obj->peer_address != obj->address ? nm_utils_inet4_ntop (obj->peer_address & _nm_utils_ip4_prefix_to_netmask (obj->plen), buf2) : ""); + obj->peer_address != obj->address ? nm_utils_inet4_ntop (nm_utils_ip4_address_clear_host_address (obj->peer_address, obj->plen), buf2) : ""); _vt_cmd_plobj_to_string_id (ip6_address, NMPlatformIP6Address, "%d: %s", obj->ifindex, nm_utils_inet6_ntop (&obj->address, buf1)); guint nmp_object_hash (const NMPObject *obj) { const NMPClass *klass; - guint h; + NMHashState h; if (!obj) return 0; @@ -761,44 +780,50 @@ nmp_object_hash (const NMPObject *obj) klass = NMP_OBJECT_GET_CLASS (obj); - h = NM_HASH_INIT (816200863u); + nm_hash_init (&h, 816200863u); + nm_hash_update_uint (&h, klass->obj_type); if (klass->cmd_obj_hash) - h = NM_HASH_COMBINE (h, klass->cmd_obj_hash (obj)); + nm_hash_update_uint (&h, klass->cmd_obj_hash (obj)); else if (klass->cmd_plobj_hash) - h = NM_HASH_COMBINE (h, klass->cmd_plobj_hash (&obj->object)); + nm_hash_update_uint (&h, klass->cmd_plobj_hash (&obj->object)); else - return NM_HASH_POINTER (obj); - return NM_HASH_COMBINE (h, klass->obj_type); + nm_hash_update_ptr (&h, obj); + + return nm_hash_complete (&h); } static guint _vt_cmd_obj_hash_link (const NMPObject *obj) { - guint h = NM_HASH_INIT (3448776161u); + NMHashState h; nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK); - h = NM_HASH_COMBINE (h, nm_platform_link_hash (&obj->link)); - h = NM_HASH_COMBINE (h, obj->_link.netlink.is_in_netlink); + nm_hash_init (&h, 3448776161u); + nm_hash_update_uint (&h, nm_platform_link_hash (&obj->link)); + nm_hash_update_uint (&h, obj->_link.netlink.is_in_netlink); if (obj->_link.netlink.lnk) - h = NM_HASH_COMBINE (h, nmp_object_hash (obj->_link.netlink.lnk)); - h = NM_HASH_COMBINE (h, GPOINTER_TO_UINT (obj->_link.udev.device)); - return h; + nm_hash_update_uint (&h, nmp_object_hash (obj->_link.netlink.lnk)); + nm_hash_update_ptr (&h, obj->_link.udev.device); + return nm_hash_complete (&h); } static guint _vt_cmd_obj_hash_lnk_vlan (const NMPObject *obj) { - guint h = NM_HASH_INIT (914932607u); + NMHashState h; nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LNK_VLAN); - h = NM_HASH_COMBINE (h, nm_platform_lnk_vlan_hash (&obj->lnk_vlan)); - h = NM_HASH_COMBINE (h, _vlan_xgress_qos_mappings_hash (obj->_lnk_vlan.n_ingress_qos_map, - obj->_lnk_vlan.ingress_qos_map)); - h = NM_HASH_COMBINE (h, _vlan_xgress_qos_mappings_hash (obj->_lnk_vlan.n_egress_qos_map, - obj->_lnk_vlan.egress_qos_map)); - return h; + nm_hash_init (&h, 914932607u); + nm_hash_update_uint (&h, nm_platform_lnk_vlan_hash (&obj->lnk_vlan)); + _vlan_xgress_qos_mappings_hash (&h, + obj->_lnk_vlan.n_ingress_qos_map, + obj->_lnk_vlan.ingress_qos_map); + _vlan_xgress_qos_mappings_hash (&h, + obj->_lnk_vlan.n_egress_qos_map, + obj->_lnk_vlan.egress_qos_map); + return nm_hash_complete (&h); } int @@ -1082,47 +1107,43 @@ nmp_object_id_hash (const NMPObject *obj) if (!klass->cmd_plobj_id_hash) { /* The klass doesn't implement ID compare. It means, to use pointer - * equality (g_direct_hash). */ - return NM_HASH_POINTER (obj); + * equality. */ + return nm_hash_ptr (obj); } return klass->cmd_plobj_id_hash (&obj->object); } -#define _vt_cmd_plobj_id_hash(type, plat_type, cmd) \ +#define _vt_cmd_plobj_id_hash(type, plat_type, hash_seed, cmd) \ static guint \ _vt_cmd_plobj_id_hash_##type (const NMPlatformObject *_obj) \ { \ const plat_type *const obj = (const plat_type *) _obj; \ - guint hash; \ + NMHashState h; \ + nm_hash_init (&h, (hash_seed)); \ { cmd; } \ - return hash; \ + return nm_hash_complete (&h); \ } -_vt_cmd_plobj_id_hash (link, NMPlatformLink, { - hash = NM_HASH_INIT (3982791431u); - hash = NM_HASH_COMBINE (hash, ((guint) obj->ifindex)); +_vt_cmd_plobj_id_hash (link, NMPlatformLink, 3982791431u, { + nm_hash_update_uint (&h, obj->ifindex); }) -_vt_cmd_plobj_id_hash (ip4_address, NMPlatformIP4Address, { - hash = NM_HASH_INIT (3591309853u); - hash = NM_HASH_COMBINE (hash, ((guint) obj->ifindex)); - hash = NM_HASH_COMBINE (hash, obj->plen); - hash = NM_HASH_COMBINE (hash, obj->address); +_vt_cmd_plobj_id_hash (ip4_address, NMPlatformIP4Address, 3591309853u, { + nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_uint (&h, obj->plen); + nm_hash_update_uint (&h, obj->address); /* for IPv4 we must also consider the net-part of the peer-address (IFA_ADDRESS) */ - hash = NM_HASH_COMBINE (hash, (obj->peer_address & _nm_utils_ip4_prefix_to_netmask (obj->plen))); + nm_hash_update_uint (&h, nm_utils_ip4_address_clear_host_address (obj->peer_address, obj->plen)); }) -_vt_cmd_plobj_id_hash (ip6_address, NMPlatformIP6Address, { - hash = NM_HASH_INIT (2907861637u); - hash = NM_HASH_COMBINE (hash, ((guint) obj->ifindex)); +_vt_cmd_plobj_id_hash (ip6_address, NMPlatformIP6Address, 2907861637u, { + nm_hash_update_uint (&h, obj->ifindex); /* for IPv6 addresses, the prefix length is not part of the primary identifier. */ - hash = NM_HASH_COMBINE (hash, nm_utils_in6_addr_hash (&obj->address)); + nm_hash_update_in6addr (&h, &obj->address); }) -_vt_cmd_plobj_id_hash (ip4_route, NMPlatformIP4Route, { - hash = NM_HASH_INIT (1038302471u); - hash = NM_HASH_COMBINE (hash, nm_platform_ip4_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)); +_vt_cmd_plobj_id_hash (ip4_route, NMPlatformIP4Route, 1038302471u, { + nm_hash_update_uint (&h, nm_platform_ip4_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)); }) -_vt_cmd_plobj_id_hash (ip6_route, NMPlatformIP6Route, { - hash = NM_HASH_INIT (1233384151u); - hash = NM_HASH_COMBINE (hash, nm_platform_ip6_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)); +_vt_cmd_plobj_id_hash (ip6_route, NMPlatformIP6Route, 1233384151u, { + nm_hash_update_uint (&h, nm_platform_ip6_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)); }) gboolean |