diff options
author | Thomas Haller <thaller@redhat.com> | 2017-10-16 12:38:16 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-10-18 13:29:22 +0200 |
commit | 2f56de7492563c75fdbb480aa6f06c1442c867b5 (patch) | |
tree | 6096cace142c6f76f6921a80993a61f77c015a8a | |
parent | ee76b0979ff0b3eef77168af0cbbdb4f1a9b843a (diff) | |
download | NetworkManager-2f56de7492563c75fdbb480aa6f06c1442c867b5.tar.gz |
all: add helper functions for nm_hash_update*()
By using a macro, we don't cast all the types to guint. Instead,
we use their native types directly. Hence, we don't need
nm_hash_update_uint64() nor nm_hash_update_ptr().
Also, for types smaller then guint like char, we save hashing
the all zero bytes.
-rw-r--r-- | libnm-core/nm-utils.c | 17 | ||||
-rw-r--r-- | libnm-core/tests/test-general.c | 83 | ||||
-rw-r--r-- | shared/nm-utils/nm-dedup-multi.c | 6 | ||||
-rw-r--r-- | shared/nm-utils/nm-hash-utils.h | 107 | ||||
-rw-r--r-- | src/devices/nm-device.c | 4 | ||||
-rw-r--r-- | src/devices/nm-lldp-listener.c | 5 | ||||
-rw-r--r-- | src/nm-core-utils.c | 12 | ||||
-rw-r--r-- | src/nm-core-utils.h | 9 | ||||
-rw-r--r-- | src/platform/nm-platform.c | 357 | ||||
-rw-r--r-- | src/platform/nmp-object.c | 84 |
10 files changed, 425 insertions, 259 deletions
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 4ac41944c8..b3c3fc5d68 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -4006,7 +4006,7 @@ guint _nm_utils_strstrdictkey_hash (gconstpointer a) { const NMUtilsStrStrDictKey *k = a; - const signed char *p; + const char *p; NMHashState h; nm_hash_init (&h, 76642997u); @@ -4014,17 +4014,18 @@ _nm_utils_strstrdictkey_hash (gconstpointer a) if (((int) k->type) & ~STRSTRDICTKEY_ALL_SET) g_return_val_if_reached (0); - nm_hash_update_uint (&h, k->type); + nm_hash_update_val (&h, k->type); if (k->type & STRSTRDICTKEY_ALL_SET) { - p = (void *) k->data; - for (; *p != '\0'; p++) - nm_hash_update_uint (&h, *p); + gsize n; + + n = 0; + p = strchr (k->data, '\0'); if (k->type == STRSTRDICTKEY_ALL_SET) { /* the key contains two strings. Continue... */ - nm_hash_update_uint (&h, '\0'); - for (p++; *p != '\0'; p++) - nm_hash_update_uint (&h, *p); + p = strchr (p + 1, '\0'); } + if (p != k->data) + nm_hash_update (&h, k->data, p - k->data); } } return nm_hash_complete (&h); diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index 9bf567154a..1f4aa21702 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -79,6 +79,41 @@ G_STATIC_ASSERT (sizeof (bool) <= sizeof (int)); /*****************************************************************************/ +typedef struct _nm_packed { + int v0; + char v1; + double v2; + guint8 v3; +} TestHashStruct; + +static void +_test_hash_struct (int v0, char v1, double v2, guint8 v3) +{ + const TestHashStruct s = { + .v0 = v0, + .v1 = v1, + .v2 = v2, + .v3 = v3, + }; + NMHashState h; + guint hh; + + nm_hash_init (&h, 100); + nm_hash_update (&h, &s, sizeof (s)); + hh = nm_hash_complete (&h); + + nm_hash_init (&h, 100); + nm_hash_update_val (&h, v0); + nm_hash_update_val (&h, v1); + nm_hash_update_val (&h, v2); + nm_hash_update_val (&h, v3); + g_assert_cmpint (hh, ==, nm_hash_complete (&h)); + + nm_hash_init (&h, 100); + nm_hash_update_vals (&h, v0, v1, v2, v3); + g_assert_cmpint (hh, ==, nm_hash_complete (&h)); +} + static guint _test_hash_str (const char *str) { @@ -102,6 +137,34 @@ _test_hash_str (const char *str) return v; } +#define _test_hash_vals(type, ...) \ + G_STMT_START { \ + NMHashState h0, h1, h2, h3; \ + const type v[] = { __VA_ARGS__ }; \ + guint h; \ + guint i; \ + \ + nm_hash_init (&h0, 10); \ + nm_hash_init (&h1, 10); \ + nm_hash_init (&h2, 10); \ + nm_hash_init (&h3, 10); \ + \ + /* assert that it doesn't matter, whether we hash the values individually, + * or all at once, or via the convenience macros nm_hash_update_val() + * and nm_hash_update_vals(). */ \ + for (i = 0; i < G_N_ELEMENTS (v); i++) { \ + nm_hash_update (&h0, &v[i], sizeof (type)); \ + nm_hash_update_val (&h1, v[i]); \ + } \ + nm_hash_update_vals (&h2, __VA_ARGS__); \ + nm_hash_update (&h3, v, sizeof (v)); \ + \ + h = nm_hash_complete (&h0); \ + g_assert_cmpint (h, ==, nm_hash_complete (&h1)); \ + g_assert_cmpint (h, ==, nm_hash_complete (&h2)); \ + g_assert_cmpint (h, ==, nm_hash_complete (&h3)); \ + } G_STMT_END + static void test_nm_hash (void) { @@ -109,6 +172,26 @@ test_nm_hash (void) _test_hash_str ("a"); _test_hash_str ("aa"); _test_hash_str ("diceros bicornis longipes"); + + /* assert that nm_hash_update_vals() is the same as calling nm_hash_update_val() multiple times. */ + _test_hash_vals (int, 1); + _test_hash_vals (int, 1, 2); + _test_hash_vals (int, 1, 2, 3); + _test_hash_vals (int, 1, 2, 3, 4); + _test_hash_vals (long, 1l); + _test_hash_vals (long, 1l, 2l, 3l, 4l, 5l); + + _test_hash_struct (10, 'a', 5.4, 7); + _test_hash_struct (-10, '\0', -5.4e49, 255); + + g_assert_cmpint (NM_HASH_COMBINE_BOOLS (guint8, 1, 0), ==, 0x002); + g_assert_cmpint (NM_HASH_COMBINE_BOOLS (guint8, 1, 1), ==, 0x003); + g_assert_cmpint (NM_HASH_COMBINE_BOOLS (guint8, 1, 1, 0, 0, 0, 0), ==, 0x030); + g_assert_cmpint (NM_HASH_COMBINE_BOOLS (guint8, 1, 1, 0, 0, 0, 1), ==, 0x031); + g_assert_cmpint (NM_HASH_COMBINE_BOOLS (guint8, 0, 0, 1, 1, 0, 0, 0, 1), ==, 0x031); + g_assert_cmpint (NM_HASH_COMBINE_BOOLS (guint16, 0, 0, 1, 1, 0, 0, 0, 1), ==, 0x031); + g_assert_cmpint (NM_HASH_COMBINE_BOOLS (guint16, 0, 0, 0, 1, 1, 0, 0, 0, 1), ==, 0x031); + g_assert_cmpint (NM_HASH_COMBINE_BOOLS (guint16, 1, 0, 0, 1, 1, 0, 0, 0, 1), ==, 0x131); } /*****************************************************************************/ diff --git a/shared/nm-utils/nm-dedup-multi.c b/shared/nm-utils/nm-dedup-multi.c index b1872d4766..fb57f6c1ad 100644 --- a/shared/nm-utils/nm-dedup-multi.c +++ b/shared/nm-utils/nm-dedup-multi.c @@ -183,13 +183,13 @@ _dict_idx_entries_hash (const NMDedupMultiEntry *entry) nm_hash_init (&h, 1914869417u); if (idx_type->klass->idx_obj_partition_hash) { nm_assert (obj); - nm_hash_update_uint (&h, idx_type->klass->idx_obj_partition_hash (idx_type, obj)); + nm_hash_update_val (&h, idx_type->klass->idx_obj_partition_hash (idx_type, obj)); } if (!lookup_head) - nm_hash_update_uint (&h, idx_type->klass->idx_obj_id_hash (idx_type, obj)); + nm_hash_update_val (&h, idx_type->klass->idx_obj_id_hash (idx_type, obj)); - nm_hash_update_ptr (&h, idx_type); + nm_hash_update_val (&h, idx_type); return nm_hash_complete (&h); } diff --git a/shared/nm-utils/nm-hash-utils.h b/shared/nm-utils/nm-hash-utils.h index 45afa9ae32..276e1ebe02 100644 --- a/shared/nm-utils/nm-hash-utils.h +++ b/shared/nm-utils/nm-hash-utils.h @@ -23,10 +23,13 @@ #define __NM_HASH_UTILS_H__ #include "siphash24.h" +#include "nm-macros-internal.h" -typedef struct { +struct _NMHashState { struct siphash _state; -} NMHashState; +}; + +typedef struct _NMHashState NMHashState; void nm_hash_init (NMHashState *state, guint static_seed); @@ -55,23 +58,101 @@ nm_hash_update (NMHashState *state, const void *ptr, gsize n) siphash24_compress (ptr, n, &state->_state); } -static inline void -nm_hash_update_uint (NMHashState *state, guint val) -{ - nm_hash_update (state, &val, sizeof (val)); -} +#define nm_hash_update_val(state, val) \ + G_STMT_START { \ + typeof (val) _val = (val); \ + \ + nm_hash_update ((state), &_val, sizeof (_val)); \ + } G_STMT_END static inline void -nm_hash_update_uint64 (NMHashState *state, guint64 val) +nm_hash_update_bool (NMHashState *state, bool val) { nm_hash_update (state, &val, sizeof (val)); } -static inline void -nm_hash_update_ptr (NMHashState *state, gconstpointer ptr) -{ - nm_hash_update (state, &ptr, sizeof (ptr)); -} +#define _NM_HASH_COMBINE_BOOLS_x_1( t, y) ((y) ? ((t) (1ull << 0)) : ((t) 0ull)) +#define _NM_HASH_COMBINE_BOOLS_x_2( t, y, ...) ((y) ? ((t) (1ull << 1)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_1 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_x_3( t, y, ...) ((y) ? ((t) (1ull << 2)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_2 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_x_4( t, y, ...) ((y) ? ((t) (1ull << 3)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_3 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_x_5( t, y, ...) ((y) ? ((t) (1ull << 4)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_4 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_x_6( t, y, ...) ((y) ? ((t) (1ull << 5)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_5 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_x_7( t, y, ...) ((y) ? ((t) (1ull << 6)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_6 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_x_8( t, y, ...) ((y) ? ((t) (1ull << 7)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_7 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_x_9( t, y, ...) ((y) ? ((t) (1ull << 8)) : ((t) 0ull)) | (G_STATIC_ASSERT_EXPR (sizeof (t) >= 2), (_NM_HASH_COMBINE_BOOLS_x_8 (t, __VA_ARGS__))) +#define _NM_HASH_COMBINE_BOOLS_x_10(t, y, ...) ((y) ? ((t) (1ull << 9)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_9 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_x_11(t, y, ...) ((y) ? ((t) (1ull << 10)) : ((t) 0ull)) | _NM_HASH_COMBINE_BOOLS_x_10 (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_n2(t, n, ...) _NM_HASH_COMBINE_BOOLS_x_##n (t, __VA_ARGS__) +#define _NM_HASH_COMBINE_BOOLS_n(t, n, ...) _NM_HASH_COMBINE_BOOLS_n2(t, n, __VA_ARGS__) + +#define NM_HASH_COMBINE_BOOLS(type, ...) ((type) (_NM_HASH_COMBINE_BOOLS_n(type, NM_NARG (__VA_ARGS__), __VA_ARGS__))) + +#define nm_hash_update_bools(state, ...) \ + nm_hash_update_val (state, NM_HASH_COMBINE_BOOLS (guint8, __VA_ARGS__)) + +#define _NM_HASH_COMBINE_VALS_typ_x_1( y) typeof (y) _v1; +#define _NM_HASH_COMBINE_VALS_typ_x_2( y, ...) typeof (y) _v2; _NM_HASH_COMBINE_VALS_typ_x_1 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_3( y, ...) typeof (y) _v3; _NM_HASH_COMBINE_VALS_typ_x_2 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_4( y, ...) typeof (y) _v4; _NM_HASH_COMBINE_VALS_typ_x_3 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_5( y, ...) typeof (y) _v5; _NM_HASH_COMBINE_VALS_typ_x_4 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_6( y, ...) typeof (y) _v6; _NM_HASH_COMBINE_VALS_typ_x_5 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_7( y, ...) typeof (y) _v7; _NM_HASH_COMBINE_VALS_typ_x_6 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_8( y, ...) typeof (y) _v8; _NM_HASH_COMBINE_VALS_typ_x_7 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_9( y, ...) typeof (y) _v9; _NM_HASH_COMBINE_VALS_typ_x_8 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_10(y, ...) typeof (y) _v10; _NM_HASH_COMBINE_VALS_typ_x_9 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_11(y, ...) typeof (y) _v11; _NM_HASH_COMBINE_VALS_typ_x_10 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_12(y, ...) typeof (y) _v12; _NM_HASH_COMBINE_VALS_typ_x_11 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_13(y, ...) typeof (y) _v13; _NM_HASH_COMBINE_VALS_typ_x_12 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_14(y, ...) typeof (y) _v14; _NM_HASH_COMBINE_VALS_typ_x_13 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_15(y, ...) typeof (y) _v15; _NM_HASH_COMBINE_VALS_typ_x_14 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_16(y, ...) typeof (y) _v16; _NM_HASH_COMBINE_VALS_typ_x_15 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_17(y, ...) typeof (y) _v17; _NM_HASH_COMBINE_VALS_typ_x_16 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_18(y, ...) typeof (y) _v18; _NM_HASH_COMBINE_VALS_typ_x_17 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_19(y, ...) typeof (y) _v19; _NM_HASH_COMBINE_VALS_typ_x_18 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_x_20(y, ...) typeof (y) _v20; _NM_HASH_COMBINE_VALS_typ_x_19 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_n2(n, ...) _NM_HASH_COMBINE_VALS_typ_x_##n (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_typ_n(n, ...) _NM_HASH_COMBINE_VALS_typ_n2(n, __VA_ARGS__) + +#define _NM_HASH_COMBINE_VALS_val_x_1( y) ._v1 = (y), +#define _NM_HASH_COMBINE_VALS_val_x_2( y, ...) ._v2 = (y), _NM_HASH_COMBINE_VALS_val_x_1 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_3( y, ...) ._v3 = (y), _NM_HASH_COMBINE_VALS_val_x_2 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_4( y, ...) ._v4 = (y), _NM_HASH_COMBINE_VALS_val_x_3 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_5( y, ...) ._v5 = (y), _NM_HASH_COMBINE_VALS_val_x_4 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_6( y, ...) ._v6 = (y), _NM_HASH_COMBINE_VALS_val_x_5 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_7( y, ...) ._v7 = (y), _NM_HASH_COMBINE_VALS_val_x_6 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_8( y, ...) ._v8 = (y), _NM_HASH_COMBINE_VALS_val_x_7 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_9( y, ...) ._v9 = (y), _NM_HASH_COMBINE_VALS_val_x_8 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_10(y, ...) ._v10 = (y), _NM_HASH_COMBINE_VALS_val_x_9 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_11(y, ...) ._v11 = (y), _NM_HASH_COMBINE_VALS_val_x_10 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_12(y, ...) ._v12 = (y), _NM_HASH_COMBINE_VALS_val_x_11 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_13(y, ...) ._v13 = (y), _NM_HASH_COMBINE_VALS_val_x_12 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_14(y, ...) ._v14 = (y), _NM_HASH_COMBINE_VALS_val_x_13 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_15(y, ...) ._v15 = (y), _NM_HASH_COMBINE_VALS_val_x_14 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_16(y, ...) ._v16 = (y), _NM_HASH_COMBINE_VALS_val_x_15 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_17(y, ...) ._v17 = (y), _NM_HASH_COMBINE_VALS_val_x_16 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_18(y, ...) ._v18 = (y), _NM_HASH_COMBINE_VALS_val_x_17 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_19(y, ...) ._v19 = (y), _NM_HASH_COMBINE_VALS_val_x_18 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_x_20(y, ...) ._v20 = (y), _NM_HASH_COMBINE_VALS_val_x_19 (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_n2(n, ...) _NM_HASH_COMBINE_VALS_val_x_##n (__VA_ARGS__) +#define _NM_HASH_COMBINE_VALS_val_n(n, ...) _NM_HASH_COMBINE_VALS_val_n2(n, __VA_ARGS__) + +/* NM_HASH_COMBINE_VALS() is faster then nm_hash_update_val() as it combines multiple + * calls to nm_hash_update() using a packed structure. */ +#define NM_HASH_COMBINE_VALS(var, ...) \ + const struct _nm_packed { \ + _NM_HASH_COMBINE_VALS_typ_n (NM_NARG (__VA_ARGS__), __VA_ARGS__) \ + } var _nm_alignas (guint64) = { \ + _NM_HASH_COMBINE_VALS_val_n (NM_NARG (__VA_ARGS__), __VA_ARGS__) \ + } + +/* nm_hash_update_vals() is faster then nm_hash_update_val() as it combines multiple + * calls to nm_hash_update() using a packed structure. */ +#define nm_hash_update_vals(state, ...) \ + G_STMT_START { \ + NM_HASH_COMBINE_VALS (_val, __VA_ARGS__); \ + \ + nm_hash_update ((state), &_val, sizeof (_val)); \ + } G_STMT_END static inline void nm_hash_update_mem (NMHashState *state, const void *ptr, gsize n) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 5ce96cf71a..a6a0fb35bc 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2861,8 +2861,8 @@ _v4_has_shadowed_routes_detect_hash (const IP4RPFilterData *d) NMHashState h; nm_hash_init (&h, 1105201169u); - nm_hash_update_uint (&h, d->network); - nm_hash_update_uint (&h, d->plen); + nm_hash_update_val (&h, d->network); + nm_hash_update_val (&h, d->plen); return nm_hash_complete (&h); } diff --git a/src/devices/nm-lldp-listener.c b/src/devices/nm-lldp-listener.c index 2431f909e8..2ed2a7d9fa 100644 --- a/src/devices/nm-lldp-listener.c +++ b/src/devices/nm-lldp-listener.c @@ -279,8 +279,9 @@ lldp_neighbor_id_hash (gconstpointer ptr) nm_hash_init (&h, 23423423u); nm_hash_update_str0 (&h, neigh->chassis_id); nm_hash_update_str0 (&h, neigh->port_id); - nm_hash_update_uint (&h, neigh->chassis_id_type); - nm_hash_update_uint (&h, neigh->port_id_type); + nm_hash_update_vals (&h, + neigh->chassis_id_type, + neigh->port_id_type); return nm_hash_complete (&h); } diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index 04a382ae48..6199521b66 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -186,18 +186,6 @@ nm_utils_exp10 (gint16 ex) /*****************************************************************************/ -guint -nm_utils_in6_addr_hash (const struct in6_addr *addr) -{ - NMHashState h; - - nm_hash_init (&h, 3675559913u); - nm_hash_update_in6addr (&h, addr); - return nm_hash_complete (&h); -} - -/*****************************************************************************/ - /* * nm_ethernet_address_is_valid: * @addr: pointer to a binary or ASCII Ethernet address diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index 097cac5fd3..8dc65283ed 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -92,8 +92,6 @@ GETTER (void) \ /*****************************************************************************/ -guint nm_utils_in6_addr_hash (const struct in6_addr *addr); - gboolean nm_ethernet_address_is_valid (gconstpointer addr, gssize len); gconstpointer nm_utils_ipx_address_clear_host_address (int family, gpointer dst, gconstpointer src, guint8 plen); @@ -131,7 +129,9 @@ nm_utils_ip6_address_same_prefix (const struct in6_addr *addr_a, const struct in static inline void nm_hash_update_in6addr (NMHashState *h, const struct in6_addr *addr) { - nm_hash_update_mem (h, addr, addr ? sizeof (*addr) : 0); + nm_assert (addr); + + nm_hash_update (h, addr, sizeof (*addr)); } static inline void @@ -139,8 +139,7 @@ nm_hash_update_in6addr_prefix (NMHashState *h, const struct in6_addr *addr, guin { struct in6_addr a; - if (!addr) - g_return_if_reached (); + nm_assert (addr); nm_utils_ip6_address_clear_host_address (&a, addr, plen); /* we don't hash plen itself. The caller may want to do that.*/ diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index df87c85038..83b6744ced 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -5129,26 +5129,29 @@ nm_platform_link_hash (const NMPlatformLink *obj) NMHashState h; nm_hash_init (&h, 99413953u); - nm_hash_update_uint (&h, obj->ifindex); - nm_hash_update_uint (&h, obj->type); + nm_hash_update_vals (&h, + obj->ifindex, + obj->master, + obj->parent); + nm_hash_update_val (&h, obj->type); nm_hash_update_strarr (&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_vals (&h, + obj->n_ifi_flags, + obj->mtu); + nm_hash_update_bools (&h, obj->connected, + obj->initialized); + nm_hash_update_val (&h, obj->arptype); + nm_hash_update_val (&h, obj->inet6_addr_gen_mode_inv); nm_hash_update_str0 (&h, obj->kind); nm_hash_update_str0 (&h, obj->driver); + /* nm_hash_update_mem() also hashes the length obj->addr.len */ 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); + nm_hash_update (&h, &obj->inet6_token, sizeof (obj->inet6_token)); + nm_hash_update_vals (&h, + obj->rx_packets, + obj->rx_bytes, + obj->tx_packets, + obj->tx_bytes); return nm_hash_complete (&h); } @@ -5186,16 +5189,16 @@ nm_platform_lnk_gre_hash (const NMPlatformLnkGre *obj) NMHashState 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); + nm_hash_update_val (&h, obj->parent_ifindex); + nm_hash_update_val (&h, obj->input_flags); + nm_hash_update_val (&h, obj->output_flags); + nm_hash_update_val (&h, obj->input_key); + nm_hash_update_val (&h, obj->output_key); + nm_hash_update_val (&h, obj->local); + nm_hash_update_val (&h, obj->remote); + nm_hash_update_val (&h, obj->ttl); + nm_hash_update_val (&h, obj->tos); + nm_hash_update_bool (&h, obj->path_mtu_discovery); return nm_hash_complete (&h); } @@ -5222,7 +5225,7 @@ nm_platform_lnk_infiniband_hash (const NMPlatformLnkInfiniband *obj) NMHashState h; nm_hash_init (&h, 1748638583u); - nm_hash_update_uint (&h, obj->p_key); + nm_hash_update_val (&h, obj->p_key); nm_hash_update_str0 (&h, obj->mode); return nm_hash_complete (&h); } @@ -5242,14 +5245,14 @@ nm_platform_lnk_ip6tnl_hash (const NMPlatformLnkIp6Tnl *obj) NMHashState h; nm_hash_init (&h, 1651660009u); - nm_hash_update_uint (&h, obj->parent_ifindex); + nm_hash_update_val (&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); + nm_hash_update_val (&h, obj->ttl); + nm_hash_update_val (&h, obj->tclass); + nm_hash_update_val (&h, obj->encap_limit); + nm_hash_update_val (&h, obj->flow_label); + nm_hash_update_val (&h, obj->proto); return nm_hash_complete (&h); } @@ -5274,12 +5277,12 @@ nm_platform_lnk_ipip_hash (const NMPlatformLnkIpIp *obj) NMHashState 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); + nm_hash_update_val (&h, obj->parent_ifindex); + nm_hash_update_val (&h, obj->local); + nm_hash_update_val (&h, obj->remote); + nm_hash_update_val (&h, obj->ttl); + nm_hash_update_val (&h, obj->tos); + nm_hash_update_bool (&h, obj->path_mtu_discovery); return nm_hash_complete (&h); } @@ -5302,19 +5305,21 @@ nm_platform_lnk_macsec_hash (const NMPlatformLnkMacsec *obj) 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); + nm_hash_update_val (&h, obj->parent_ifindex); + nm_hash_update_val (&h, obj->window); + nm_hash_update_vals (&h, + obj->cipher_suite, + obj->sci); + nm_hash_update_vals (&h, + obj->icv_length, + obj->encoding_sa, + obj->validation); + nm_hash_update_bools (&h, obj->encrypt, + obj->protect, + obj->include_sci, + obj->es, + obj->scb, + obj->replay_protect); return nm_hash_complete (&h); } @@ -5344,9 +5349,9 @@ nm_platform_lnk_macvlan_hash (const NMPlatformLnkMacvlan *obj) NMHashState 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); + nm_hash_update_val (&h, obj->mode); + nm_hash_update_bools (&h, obj->no_promisc, + obj->tap); return nm_hash_complete (&h); } @@ -5366,14 +5371,14 @@ nm_platform_lnk_sit_hash (const NMPlatformLnkSit *obj) NMHashState 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); + nm_hash_update_val (&h, obj->parent_ifindex); + nm_hash_update_val (&h, obj->local); + nm_hash_update_val (&h, obj->remote); + nm_hash_update_val (&h, obj->ttl); + nm_hash_update_val (&h, obj->tos); + nm_hash_update_bool (&h, obj->path_mtu_discovery); + nm_hash_update_val (&h, obj->flags); + nm_hash_update_val (&h, obj->proto); return nm_hash_complete (&h); } @@ -5398,8 +5403,8 @@ nm_platform_lnk_vlan_hash (const NMPlatformLnkVlan *obj) NMHashState h; nm_hash_init (&h, 58751383u); - nm_hash_update_uint (&h, obj->id); - nm_hash_update_uint (&h, obj->flags); + nm_hash_update_val (&h, obj->id); + nm_hash_update_val (&h, obj->flags); return nm_hash_complete (&h); } @@ -5418,24 +5423,24 @@ nm_platform_lnk_vxlan_hash (const NMPlatformLnkVxlan *obj) 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_val (&h, obj->parent_ifindex); + nm_hash_update_val (&h, obj->id); + nm_hash_update_val (&h, obj->group); + nm_hash_update_val (&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); + nm_hash_update_val (&h, obj->tos); + nm_hash_update_val (&h, obj->ttl); + nm_hash_update_val (&h, obj->ageing); + nm_hash_update_val (&h, obj->limit); + nm_hash_update_val (&h, obj->dst_port); + nm_hash_update_val (&h, obj->src_port_min); + nm_hash_update_val (&h, obj->src_port_max); + nm_hash_update_bools (&h, obj->learning, + obj->proxy, + obj->rsc, + obj->l2miss, + obj->l3miss); return nm_hash_complete (&h); } @@ -5471,15 +5476,15 @@ nm_platform_ip4_address_hash (const NMPlatformIP4Address *obj) nm_hash_init (&h, 469681301u); if (obj) { - 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_val (&h, obj->ifindex); + nm_hash_update_val (&h, obj->address); + nm_hash_update_val (&h, obj->plen); + nm_hash_update_val (&h, obj->peer_address); + nm_hash_update_val (&h, obj->addr_source); + nm_hash_update_val (&h, obj->timestamp); + nm_hash_update_val (&h, obj->lifetime); + nm_hash_update_val (&h, obj->preferred); + nm_hash_update_val (&h, obj->n_ifa_flags); nm_hash_update_strarr (&h, obj->label); } return nm_hash_complete (&h); @@ -5509,15 +5514,15 @@ nm_platform_ip6_address_hash (const NMPlatformIP6Address *obj) nm_hash_init (&h, 605908909u); if (obj) { - nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_val (&h, obj->ifindex); nm_hash_update_in6addr (&h, &obj->address); - nm_hash_update_uint (&h, obj->plen); + nm_hash_update_val (&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); + nm_hash_update_val (&h, obj->addr_source); + nm_hash_update_val (&h, obj->timestamp); + nm_hash_update_val (&h, obj->lifetime); + nm_hash_update_val (&h, obj->preferred); + nm_hash_update_val (&h, obj->n_ifa_flags); } return nm_hash_complete (&h); } @@ -5548,70 +5553,72 @@ nm_platform_ip4_route_hash (const NMPlatformIP4Route *obj, NMPlatformIPRouteCmpT NMHashState h; nm_hash_init (&h, 1228913327u); - nm_hash_update_uint (&h, cmp_type); + nm_hash_update_val (&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: - 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); + nm_hash_update_val (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); + nm_hash_update_val (&h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen)); + nm_hash_update_val (&h, obj->plen); + nm_hash_update_val (&h, obj->metric); + nm_hash_update_val (&h, obj->tos); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) { - 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); + nm_hash_update_val (&h, obj->ifindex); + nm_hash_update_val (&h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); + nm_hash_update_val (&h, _ip_route_scope_inv_get_normalized (obj)); + nm_hash_update_val (&h, obj->gateway); + nm_hash_update_val (&h, obj->mss); + nm_hash_update_val (&h, obj->pref_src); + nm_hash_update_vals (&h, + obj->window, + obj->cwnd, + obj->initcwnd, + obj->initrwnd, + obj->mtu); + nm_hash_update_bools (&h, obj->lock_window, + obj->lock_cwnd, + obj->lock_initcwnd, + obj->lock_initrwnd, + 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) - nm_hash_update_uint (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); + nm_hash_update_val (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); else - nm_hash_update_uint (&h, obj->table_coerced); - nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_val (&h, obj->table_coerced); + nm_hash_update_val (&h, obj->ifindex); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - nm_hash_update_uint (&h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen)); + nm_hash_update_val (&h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen)); else - 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); + nm_hash_update_val (&h, obj->network); + nm_hash_update_val (&h, obj->plen); + nm_hash_update_val (&h, obj->metric); + nm_hash_update_val (&h, obj->gateway); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) { - 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_val (&h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); + nm_hash_update_val (&h, _ip_route_scope_inv_get_normalized (obj)); } else { - nm_hash_update_uint (&h, obj->rt_source); - nm_hash_update_uint (&h, obj->scope_inv); + nm_hash_update_val (&h, obj->rt_source); + nm_hash_update_val (&h, obj->scope_inv); } - 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); + nm_hash_update_val (&h, obj->tos); + nm_hash_update_vals (&h, + obj->mss, + obj->pref_src, + obj->window, + obj->cwnd, + obj->initcwnd, + obj->initrwnd, + obj->mtu); + nm_hash_update_bools (&h, obj->rt_cloned, + obj->lock_window, + obj->lock_cwnd, + obj->lock_initcwnd, + obj->lock_initrwnd, + obj->lock_mtu); break; } } @@ -5701,65 +5708,65 @@ nm_platform_ip6_route_hash (const NMPlatformIP6Route *obj, NMPlatformIPRouteCmpT NMHashState h; nm_hash_init (&h, 1053326051u); - nm_hash_update_uint (&h, cmp_type); + nm_hash_update_val (&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: - nm_hash_update_uint (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); + nm_hash_update_val (&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_val (&h, obj->plen); + nm_hash_update_val (&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); + nm_hash_update_val (&h, obj->src_plen); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) { - nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_val (&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) - nm_hash_update_uint (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); + nm_hash_update_val (&h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE)); else - nm_hash_update_uint (&h, obj->table_coerced); - nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_val (&h, obj->table_coerced); + nm_hash_update_val (&h, obj->ifindex); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) nm_hash_update_in6addr_prefix (&h, &obj->network, obj->plen); else nm_hash_update_in6addr (&h, &obj->network); - nm_hash_update_uint (&h, obj->plen); + nm_hash_update_val (&h, obj->plen); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - nm_hash_update_uint (&h, nm_utils_ip6_route_metric_normalize (obj->metric)); + nm_hash_update_val (&h, nm_utils_ip6_route_metric_normalize (obj->metric)); else - nm_hash_update_uint (&h, obj->metric); + nm_hash_update_val (&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) { 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)); + nm_hash_update_val (&h, obj->src_plen); + nm_hash_update_val (&h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); } else { nm_hash_update_in6addr (&h, &obj->src); - nm_hash_update_uint (&h, obj->src_plen); - nm_hash_update_uint (&h, obj->rt_source); + nm_hash_update_val (&h, obj->src_plen); + nm_hash_update_val (&h, obj->rt_source); } - 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); + nm_hash_update_val (&h, obj->mss); + nm_hash_update_bools (&h, obj->rt_cloned, + obj->lock_window, + obj->lock_cwnd, + obj->lock_initcwnd, + obj->lock_initrwnd, + obj->lock_mtu); + nm_hash_update_val (&h, obj->window); + nm_hash_update_val (&h, obj->cwnd); + nm_hash_update_val (&h, obj->initcwnd); + nm_hash_update_val (&h, obj->initrwnd); + nm_hash_update_val (&h, obj->mtu); if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) - nm_hash_update_uint (&h, _route_pref_normalize (obj->rt_pref)); + nm_hash_update_val (&h, _route_pref_normalize (obj->rt_pref)); else - nm_hash_update_uint (&h, obj->rt_pref); + nm_hash_update_val (&h, obj->rt_pref); break; } } diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c index 731c81f0f2..bec3f44a37 100644 --- a/src/platform/nmp-object.c +++ b/src/platform/nmp-object.c @@ -162,8 +162,9 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, 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)); + nm_hash_update_vals (&h, + idx_type->cache_id_type, + NMP_OBJECT_GET_TYPE (obj_a)); return _HASH_NON_ZERO (&h); } return 1; @@ -185,7 +186,7 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, /* we request a hash from obj_a. Hash the relevant parts. */ nm_hash_init (&h, 2126752699u); - nm_hash_update_uint (&h, idx_type->cache_id_type); + nm_hash_update_val (&h, idx_type->cache_id_type); nm_hash_update_strarr (&h, obj_a->link.name); return _HASH_NON_ZERO (&h); } @@ -207,8 +208,9 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, 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)); + nm_hash_update_vals (&h, + idx_type->cache_id_type, + NMP_OBJECT_GET_TYPE (obj_a)); return _HASH_NON_ZERO (&h); } return 1; @@ -230,9 +232,9 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, 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); + nm_hash_update_vals (&h, + idx_type->cache_id_type, + obj_a->object.ifindex); return _HASH_NON_ZERO (&h); } return 1; @@ -252,13 +254,16 @@ _idx_obj_part (const DedupMultiIdxType *idx_type, } if (request_hash) { NMHashState h; + guint h2; + + h2 = (obj_type == NMP_OBJECT_TYPE_IP4_ROUTE) + ? nm_platform_ip4_route_hash (&obj_a->ip4_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID) + : nm_platform_ip6_route_hash (&obj_a->ip6_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID); nm_hash_init (&h, 778646573u); - nm_hash_update_uint (&h, idx_type->cache_id_type); - if (obj_type == NMP_OBJECT_TYPE_IP4_ROUTE) - nm_hash_update_uint (&h, nm_platform_ip4_route_hash (&obj_a->ip4_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID)); - else - nm_hash_update_uint (&h, nm_platform_ip6_route_hash (&obj_a->ip6_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID)); + nm_hash_update_vals (&h, + idx_type->cache_id_type, + h2); return _HASH_NON_ZERO (&h); } return 1; @@ -325,13 +330,12 @@ _vlan_xgress_qos_mappings_hash_update (guint n_map, const NMVlanQosMapping *map, NMHashState *h) { - guint i; + /* ensure no padding. */ + G_STATIC_ASSERT (sizeof (NMVlanQosMapping) == 2 * sizeof (guint32)); - nm_hash_update_uint (h, 1453577309u); - for (i = 0; i < n_map; i++) { - nm_hash_update_uint (h, map[i].from); - nm_hash_update_uint (h, map[i].to); - } + nm_hash_update_val (h, n_map); + if (n_map) + nm_hash_update (h, map, n_map * sizeof (*map)); } static int @@ -781,13 +785,13 @@ nmp_object_hash (const NMPObject *obj) klass = NMP_OBJECT_GET_CLASS (obj); nm_hash_init (&h, 816200863u); - nm_hash_update_uint (&h, klass->obj_type); + nm_hash_update_val (&h, klass->obj_type); if (klass->cmd_obj_hash) - nm_hash_update_uint (&h, klass->cmd_obj_hash (obj)); + nm_hash_update_val (&h, klass->cmd_obj_hash (obj)); else if (klass->cmd_plobj_hash) - nm_hash_update_uint (&h, klass->cmd_plobj_hash (&obj->object)); + nm_hash_update_val (&h, klass->cmd_plobj_hash (&obj->object)); else - nm_hash_update_ptr (&h, obj); + nm_hash_update_val (&h, obj); return nm_hash_complete (&h); } @@ -800,11 +804,11 @@ _vt_cmd_obj_hash_link (const NMPObject *obj) nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK); 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); + nm_hash_update_val (&h, nm_platform_link_hash (&obj->link)); + nm_hash_update_val (&h, obj->_link.netlink.is_in_netlink); if (obj->_link.netlink.lnk) - nm_hash_update_uint (&h, nmp_object_hash (obj->_link.netlink.lnk)); - nm_hash_update_ptr (&h, obj->_link.udev.device); + nm_hash_update_val (&h, nmp_object_hash (obj->_link.netlink.lnk)); + nm_hash_update_val (&h, obj->_link.udev.device); return nm_hash_complete (&h); } @@ -816,7 +820,7 @@ _vt_cmd_obj_hash_lnk_vlan (const NMPObject *obj) nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LNK_VLAN); nm_hash_init (&h, 914932607u); - nm_hash_update_uint (&h, nm_platform_lnk_vlan_hash (&obj->lnk_vlan)); + nm_hash_update_val (&h, nm_platform_lnk_vlan_hash (&obj->lnk_vlan)); _vlan_xgress_qos_mappings_hash_update (obj->_lnk_vlan.n_ingress_qos_map, obj->_lnk_vlan.ingress_qos_map, &h); @@ -1125,25 +1129,27 @@ _vt_cmd_plobj_id_hash_##type (const NMPlatformObject *_obj) \ return nm_hash_complete (&h); \ } _vt_cmd_plobj_id_hash (link, NMPlatformLink, 3982791431u, { - nm_hash_update_uint (&h, obj->ifindex); + nm_hash_update_val (&h, obj->ifindex); }) _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) */ - nm_hash_update_uint (&h, nm_utils_ip4_address_clear_host_address (obj->peer_address, obj->plen)); + nm_hash_update_vals (&h, + obj->ifindex, + obj->plen, + obj->address, + /* for IPv4 we must also consider the net-part of the peer-address (IFA_ADDRESS) */ + nm_utils_ip4_address_clear_host_address (obj->peer_address, obj->plen)); }) _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. */ - nm_hash_update_in6addr (&h, &obj->address); + nm_hash_update_vals (&h, + obj->ifindex, + /* for IPv6 addresses, the prefix length is not part of the primary identifier. */ + obj->address); }) _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)); + nm_hash_update_val (&h, nm_platform_ip4_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)); + nm_hash_update_val (&h, nm_platform_ip6_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)); }) gboolean |