all: extend hash functions with an NMHashState argument

We often want to cascade hashing, meaning, to combine the
outcome of various hash functions in a larger hash.

Instead of having each hash function return a guint hash value,
accept a hash state argument. This saves the overhead of initializing
and completing the intermediate hash states.
It also avoids loosing entropy when we reduce the larger hash state
into the intermediate guint hash value.
This commit is contained in:
Thomas Haller
2017-10-17 11:53:08 +02:00
parent 2f56de7492
commit cfe8546df9
8 changed files with 415 additions and 516 deletions

View File

@@ -420,13 +420,15 @@ _dedup_obj_destroy (NMDedupMultiObj *obj)
g_slice_free (DedupObj, o); g_slice_free (DedupObj, o);
} }
static guint static void
_dedup_obj_full_hash (const NMDedupMultiObj *obj) _dedup_obj_full_hash_update (const NMDedupMultiObj *obj, NMHashState *h)
{ {
const DedupObj *o; const DedupObj *o;
o = _dedup_obj_assert (obj); o = _dedup_obj_assert (obj);
return (o->val * 33) + o->other; nm_hash_update_vals (h,
o->val,
o->other);
} }
static gboolean static gboolean
@@ -443,7 +445,7 @@ _dedup_obj_full_equal (const NMDedupMultiObj *obj_a,
static const NMDedupMultiObjClass dedup_obj_class = { static const NMDedupMultiObjClass dedup_obj_class = {
.obj_clone = _dedup_obj_clone, .obj_clone = _dedup_obj_clone,
.obj_destroy = _dedup_obj_destroy, .obj_destroy = _dedup_obj_destroy,
.obj_full_hash = _dedup_obj_full_hash, .obj_full_hash_update = _dedup_obj_full_hash_update,
.obj_full_equal = _dedup_obj_full_equal, .obj_full_equal = _dedup_obj_full_equal,
}; };
@@ -478,20 +480,19 @@ _dedup_idx_assert (const NMDedupMultiIdxType *idx_type)
return t; return t;
} }
static guint static void
_dedup_idx_obj_id_hash (const NMDedupMultiIdxType *idx_type, _dedup_idx_obj_id_hash_update (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj) const NMDedupMultiObj *obj,
NMHashState *h)
{ {
const DedupIdxType *t; const DedupIdxType *t;
const DedupObj *o; const DedupObj *o;
guint h;
t = _dedup_idx_assert (idx_type); t = _dedup_idx_assert (idx_type);
o = _dedup_obj_assert (obj); o = _dedup_obj_assert (obj);
h = o->val / t->partition_size; nm_hash_update_val (h, o->val / t->partition_size);
h = (h * 33) + (o->val % t->val_mod); nm_hash_update_val (h, o->val % t->val_mod);
return h;
} }
static gboolean static gboolean
@@ -511,9 +512,10 @@ _dedup_idx_obj_id_equal (const NMDedupMultiIdxType *idx_type,
&& (o_a->val % t->val_mod) == (o_b->val % t->val_mod); && (o_a->val % t->val_mod) == (o_b->val % t->val_mod);
} }
static guint static void
_dedup_idx_obj_partition_hash (const NMDedupMultiIdxType *idx_type, _dedup_idx_obj_partition_hash_update (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj) const NMDedupMultiObj *obj,
NMHashState *h)
{ {
const DedupIdxType *t; const DedupIdxType *t;
const DedupObj *o; const DedupObj *o;
@@ -521,7 +523,7 @@ _dedup_idx_obj_partition_hash (const NMDedupMultiIdxType *idx_type,
t = _dedup_idx_assert (idx_type); t = _dedup_idx_assert (idx_type);
o = _dedup_obj_assert (obj); o = _dedup_obj_assert (obj);
return o->val / t->partition_size; nm_hash_update_val (h, o->val / t->partition_size);
} }
static gboolean static gboolean
@@ -541,9 +543,9 @@ _dedup_idx_obj_partition_equal (const NMDedupMultiIdxType *idx_type,
} }
static const NMDedupMultiIdxTypeClass dedup_idx_type_class = { static const NMDedupMultiIdxTypeClass dedup_idx_type_class = {
.idx_obj_id_hash = _dedup_idx_obj_id_hash, .idx_obj_id_hash_update = _dedup_idx_obj_id_hash_update,
.idx_obj_id_equal = _dedup_idx_obj_id_equal, .idx_obj_id_equal = _dedup_idx_obj_id_equal,
.idx_obj_partition_hash = _dedup_idx_obj_partition_hash, .idx_obj_partition_hash_update = _dedup_idx_obj_partition_hash_update,
.idx_obj_partition_equal = _dedup_idx_obj_partition_equal, .idx_obj_partition_equal = _dedup_idx_obj_partition_equal,
}; };

View File

@@ -55,9 +55,9 @@ ASSERT_idx_type (const NMDedupMultiIdxType *idx_type)
nm_assert (idx_type); nm_assert (idx_type);
#if NM_MORE_ASSERTS > 10 #if NM_MORE_ASSERTS > 10
nm_assert (idx_type->klass); nm_assert (idx_type->klass);
nm_assert (idx_type->klass->idx_obj_id_hash); nm_assert (idx_type->klass->idx_obj_id_hash_update);
nm_assert (idx_type->klass->idx_obj_id_equal); nm_assert (idx_type->klass->idx_obj_id_equal);
nm_assert (!!idx_type->klass->idx_obj_partition_hash == !!idx_type->klass->idx_obj_partition_equal); nm_assert (!!idx_type->klass->idx_obj_partition_hash_update == !!idx_type->klass->idx_obj_partition_equal);
nm_assert (idx_type->lst_idx_head.next); nm_assert (idx_type->lst_idx_head.next);
#endif #endif
} }
@@ -181,13 +181,13 @@ _dict_idx_entries_hash (const NMDedupMultiEntry *entry)
_entry_unpack (entry, &idx_type, &obj, &lookup_head); _entry_unpack (entry, &idx_type, &obj, &lookup_head);
nm_hash_init (&h, 1914869417u); nm_hash_init (&h, 1914869417u);
if (idx_type->klass->idx_obj_partition_hash) { if (idx_type->klass->idx_obj_partition_hash_update) {
nm_assert (obj); nm_assert (obj);
nm_hash_update_val (&h, idx_type->klass->idx_obj_partition_hash (idx_type, obj)); idx_type->klass->idx_obj_partition_hash_update (idx_type, obj, &h);
} }
if (!lookup_head) if (!lookup_head)
nm_hash_update_val (&h, idx_type->klass->idx_obj_id_hash (idx_type, obj)); idx_type->klass->idx_obj_id_hash_update (idx_type, obj, &h);
nm_hash_update_val (&h, idx_type); nm_hash_update_val (&h, idx_type);
return nm_hash_complete (&h); return nm_hash_complete (&h);
@@ -797,7 +797,11 @@ nm_dedup_multi_index_dirty_remove_idx (NMDedupMultiIndex *self,
static guint static guint
_dict_idx_objs_hash (const NMDedupMultiObj *obj) _dict_idx_objs_hash (const NMDedupMultiObj *obj)
{ {
return obj->klass->obj_full_hash (obj); NMHashState h;
nm_hash_init (&h, 1748638583u);
obj->klass->obj_full_hash_update (obj, &h);
return nm_hash_complete (&h);
} }
static gboolean static gboolean

View File

@@ -27,6 +27,8 @@
/*****************************************************************************/ /*****************************************************************************/
struct _NMHashState;
typedef struct _NMDedupMultiObj NMDedupMultiObj; typedef struct _NMDedupMultiObj NMDedupMultiObj;
typedef struct _NMDedupMultiObjClass NMDedupMultiObjClass; typedef struct _NMDedupMultiObjClass NMDedupMultiObjClass;
typedef struct _NMDedupMultiIdxType NMDedupMultiIdxType; typedef struct _NMDedupMultiIdxType NMDedupMultiIdxType;
@@ -69,9 +71,10 @@ struct _NMDedupMultiObjClass {
void (*obj_destroy) (NMDedupMultiObj *obj); void (*obj_destroy) (NMDedupMultiObj *obj);
/* the NMDedupMultiObj can be deduplicated. For that the obj_full_hash() /* the NMDedupMultiObj can be deduplicated. For that the obj_full_hash_update()
* and obj_full_equal() compare *all* fields of the object, even minor ones. */ * and obj_full_equal() compare *all* fields of the object, even minor ones. */
guint (*obj_full_hash) (const NMDedupMultiObj *obj); void (*obj_full_hash_update) (const NMDedupMultiObj *obj,
struct _NMHashState *h);
gboolean (*obj_full_equal) (const NMDedupMultiObj *obj_a, gboolean (*obj_full_equal) (const NMDedupMultiObj *obj_a,
const NMDedupMultiObj *obj_b); const NMDedupMultiObj *obj_b);
}; };
@@ -152,8 +155,9 @@ void nm_dedup_multi_idx_type_init (NMDedupMultiIdxType *idx_type,
struct _NMDedupMultiIdxTypeClass { struct _NMDedupMultiIdxTypeClass {
NMObjBaseClass parent; NMObjBaseClass parent;
guint (*idx_obj_id_hash) (const NMDedupMultiIdxType *idx_type, void (*idx_obj_id_hash_update) (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj); const NMDedupMultiObj *obj,
struct _NMHashState *h);
gboolean (*idx_obj_id_equal) (const NMDedupMultiIdxType *idx_type, gboolean (*idx_obj_id_equal) (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj_a, const NMDedupMultiObj *obj_a,
const NMDedupMultiObj *obj_b); const NMDedupMultiObj *obj_b);
@@ -167,8 +171,9 @@ struct _NMDedupMultiIdxTypeClass {
* object is not partitionable, it is never added to the NMDedupMultiIndex. */ * object is not partitionable, it is never added to the NMDedupMultiIndex. */
gboolean (*idx_obj_partitionable) (const NMDedupMultiIdxType *idx_type, gboolean (*idx_obj_partitionable) (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj); const NMDedupMultiObj *obj);
guint (*idx_obj_partition_hash) (const NMDedupMultiIdxType *idx_type, void (*idx_obj_partition_hash_update) (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj); const NMDedupMultiObj *obj,
struct _NMHashState *h);
gboolean (*idx_obj_partition_equal) (const NMDedupMultiIdxType *idx_type, gboolean (*idx_obj_partition_equal) (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj_a, const NMDedupMultiObj *obj_a,
const NMDedupMultiObj *obj_b); const NMDedupMultiObj *obj_b);

View File

@@ -57,11 +57,12 @@ _route_valid (const NMPlatformIP4Route *r)
/*****************************************************************************/ /*****************************************************************************/
static guint static void
_idx_obj_id_hash (const NMDedupMultiIdxType *idx_type, _idx_obj_id_hash_update (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj) const NMDedupMultiObj *obj,
NMHashState *h)
{ {
return nmp_object_id_hash ((NMPObject *) obj); nmp_object_id_hash_update ((NMPObject *) obj, h);
} }
static gboolean static gboolean
@@ -77,7 +78,7 @@ nm_ip_config_dedup_multi_idx_type_init (NMIPConfigDedupMultiIdxType *idx_type,
NMPObjectType obj_type) NMPObjectType obj_type)
{ {
static const NMDedupMultiIdxTypeClass idx_type_class = { static const NMDedupMultiIdxTypeClass idx_type_class = {
.idx_obj_id_hash = _idx_obj_id_hash, .idx_obj_id_hash_update = _idx_obj_id_hash_update,
.idx_obj_id_equal = _idx_obj_id_equal, .idx_obj_id_equal = _idx_obj_id_equal,
}; };

View File

@@ -5123,36 +5123,32 @@ nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route, char *buf, gsi
return buf; return buf;
} }
guint void
nm_platform_link_hash (const NMPlatformLink *obj) nm_platform_link_hash_update (const NMPlatformLink *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_vals (h,
nm_hash_init (&h, 99413953u);
nm_hash_update_vals (&h,
obj->ifindex, obj->ifindex,
obj->master, obj->master,
obj->parent); obj->parent);
nm_hash_update_val (&h, obj->type); nm_hash_update_val (h, obj->type);
nm_hash_update_strarr (&h, obj->name); nm_hash_update_strarr (h, obj->name);
nm_hash_update_vals (&h, nm_hash_update_vals (h,
obj->n_ifi_flags, obj->n_ifi_flags,
obj->mtu); obj->mtu);
nm_hash_update_bools (&h, obj->connected, nm_hash_update_bools (h, obj->connected,
obj->initialized); obj->initialized);
nm_hash_update_val (&h, obj->arptype); nm_hash_update_val (h, obj->arptype);
nm_hash_update_val (&h, obj->inet6_addr_gen_mode_inv); nm_hash_update_val (h, obj->inet6_addr_gen_mode_inv);
nm_hash_update_str0 (&h, obj->kind); nm_hash_update_str0 (h, obj->kind);
nm_hash_update_str0 (&h, obj->driver); nm_hash_update_str0 (h, obj->driver);
/* nm_hash_update_mem() also hashes the length obj->addr.len */ /* 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->addr.data, obj->addr.len);
nm_hash_update (&h, &obj->inet6_token, sizeof (obj->inet6_token)); nm_hash_update (h, &obj->inet6_token, sizeof (obj->inet6_token));
nm_hash_update_vals (&h, nm_hash_update_vals (h,
obj->rx_packets, obj->rx_packets,
obj->rx_bytes, obj->rx_bytes,
obj->tx_packets, obj->tx_packets,
obj->tx_bytes); obj->tx_bytes);
return nm_hash_complete (&h);
} }
int int
@@ -5183,23 +5179,19 @@ nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b)
return 0; return 0;
} }
guint void
nm_platform_lnk_gre_hash (const NMPlatformLnkGre *obj) nm_platform_lnk_gre_hash_update (const NMPlatformLnkGre *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->parent_ifindex);
nm_hash_update_val (h, obj->input_flags);
nm_hash_init (&h, 1887023311u); nm_hash_update_val (h, obj->output_flags);
nm_hash_update_val (&h, obj->parent_ifindex); nm_hash_update_val (h, obj->input_key);
nm_hash_update_val (&h, obj->input_flags); nm_hash_update_val (h, obj->output_key);
nm_hash_update_val (&h, obj->output_flags); nm_hash_update_val (h, obj->local);
nm_hash_update_val (&h, obj->input_key); nm_hash_update_val (h, obj->remote);
nm_hash_update_val (&h, obj->output_key); nm_hash_update_val (h, obj->ttl);
nm_hash_update_val (&h, obj->local); nm_hash_update_val (h, obj->tos);
nm_hash_update_val (&h, obj->remote); nm_hash_update_bool (h, obj->path_mtu_discovery);
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);
} }
int int
@@ -5219,15 +5211,11 @@ nm_platform_lnk_gre_cmp (const NMPlatformLnkGre *a, const NMPlatformLnkGre *b)
return 0; return 0;
} }
guint void
nm_platform_lnk_infiniband_hash (const NMPlatformLnkInfiniband *obj) nm_platform_lnk_infiniband_hash_update (const NMPlatformLnkInfiniband *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->p_key);
nm_hash_update_str0 (h, obj->mode);
nm_hash_init (&h, 1748638583u);
nm_hash_update_val (&h, obj->p_key);
nm_hash_update_str0 (&h, obj->mode);
return nm_hash_complete (&h);
} }
int int
@@ -5239,21 +5227,17 @@ nm_platform_lnk_infiniband_cmp (const NMPlatformLnkInfiniband *a, const NMPlatfo
return 0; return 0;
} }
guint void
nm_platform_lnk_ip6tnl_hash (const NMPlatformLnkIp6Tnl *obj) nm_platform_lnk_ip6tnl_hash_update (const NMPlatformLnkIp6Tnl *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->parent_ifindex);
nm_hash_update_in6addr (h, &obj->local);
nm_hash_init (&h, 1651660009u); nm_hash_update_in6addr (h, &obj->remote);
nm_hash_update_val (&h, obj->parent_ifindex); nm_hash_update_val (h, obj->ttl);
nm_hash_update_in6addr (&h, &obj->local); nm_hash_update_val (h, obj->tclass);
nm_hash_update_in6addr (&h, &obj->remote); nm_hash_update_val (h, obj->encap_limit);
nm_hash_update_val (&h, obj->ttl); nm_hash_update_val (h, obj->flow_label);
nm_hash_update_val (&h, obj->tclass); nm_hash_update_val (h, obj->proto);
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);
} }
int int
@@ -5271,19 +5255,15 @@ nm_platform_lnk_ip6tnl_cmp (const NMPlatformLnkIp6Tnl *a, const NMPlatformLnkIp6
return 0; return 0;
} }
guint void
nm_platform_lnk_ipip_hash (const NMPlatformLnkIpIp *obj) nm_platform_lnk_ipip_hash_update (const NMPlatformLnkIpIp *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->parent_ifindex);
nm_hash_update_val (h, obj->local);
nm_hash_init (&h, 861934429u); nm_hash_update_val (h, obj->remote);
nm_hash_update_val (&h, obj->parent_ifindex); nm_hash_update_val (h, obj->ttl);
nm_hash_update_val (&h, obj->local); nm_hash_update_val (h, obj->tos);
nm_hash_update_val (&h, obj->remote); nm_hash_update_bool (h, obj->path_mtu_discovery);
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);
} }
int int
@@ -5299,28 +5279,24 @@ nm_platform_lnk_ipip_cmp (const NMPlatformLnkIpIp *a, const NMPlatformLnkIpIp *b
return 0; return 0;
} }
guint void
nm_platform_lnk_macsec_hash (const NMPlatformLnkMacsec *obj) nm_platform_lnk_macsec_hash_update (const NMPlatformLnkMacsec *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->parent_ifindex);
nm_hash_update_val (h, obj->window);
nm_hash_init (&h, 226984267u); nm_hash_update_vals (h,
nm_hash_update_val (&h, obj->parent_ifindex);
nm_hash_update_val (&h, obj->window);
nm_hash_update_vals (&h,
obj->cipher_suite, obj->cipher_suite,
obj->sci); obj->sci);
nm_hash_update_vals (&h, nm_hash_update_vals (h,
obj->icv_length, obj->icv_length,
obj->encoding_sa, obj->encoding_sa,
obj->validation); obj->validation);
nm_hash_update_bools (&h, obj->encrypt, nm_hash_update_bools (h, obj->encrypt,
obj->protect, obj->protect,
obj->include_sci, obj->include_sci,
obj->es, obj->es,
obj->scb, obj->scb,
obj->replay_protect); obj->replay_protect);
return nm_hash_complete (&h);
} }
int int
@@ -5343,16 +5319,12 @@ nm_platform_lnk_macsec_cmp (const NMPlatformLnkMacsec *a, const NMPlatformLnkMac
return 0; return 0;
} }
guint void
nm_platform_lnk_macvlan_hash (const NMPlatformLnkMacvlan *obj) nm_platform_lnk_macvlan_hash_update (const NMPlatformLnkMacvlan *obj, NMHashState *h )
{ {
NMHashState h; nm_hash_update_val (h, obj->mode);
nm_hash_update_bools (h, obj->no_promisc,
nm_hash_init (&h, 771014989u); obj->tap);
nm_hash_update_val (&h, obj->mode);
nm_hash_update_bools (&h, obj->no_promisc,
obj->tap);
return nm_hash_complete (&h);
} }
int int
@@ -5365,21 +5337,17 @@ nm_platform_lnk_macvlan_cmp (const NMPlatformLnkMacvlan *a, const NMPlatformLnkM
return 0; return 0;
} }
guint void
nm_platform_lnk_sit_hash (const NMPlatformLnkSit *obj) nm_platform_lnk_sit_hash_update (const NMPlatformLnkSit *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->parent_ifindex);
nm_hash_update_val (h, obj->local);
nm_hash_init (&h, 1690154969u); nm_hash_update_val (h, obj->remote);
nm_hash_update_val (&h, obj->parent_ifindex); nm_hash_update_val (h, obj->ttl);
nm_hash_update_val (&h, obj->local); nm_hash_update_val (h, obj->tos);
nm_hash_update_val (&h, obj->remote); nm_hash_update_bool (h, obj->path_mtu_discovery);
nm_hash_update_val (&h, obj->ttl); nm_hash_update_val (h, obj->flags);
nm_hash_update_val (&h, obj->tos); nm_hash_update_val (h, obj->proto);
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);
} }
int int
@@ -5397,15 +5365,11 @@ nm_platform_lnk_sit_cmp (const NMPlatformLnkSit *a, const NMPlatformLnkSit *b)
return 0; return 0;
} }
guint void
nm_platform_lnk_vlan_hash (const NMPlatformLnkVlan *obj) nm_platform_lnk_vlan_hash_update (const NMPlatformLnkVlan *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->id);
nm_hash_update_val (h, obj->flags);
nm_hash_init (&h, 58751383u);
nm_hash_update_val (&h, obj->id);
nm_hash_update_val (&h, obj->flags);
return nm_hash_complete (&h);
} }
int int
@@ -5417,31 +5381,27 @@ nm_platform_lnk_vlan_cmp (const NMPlatformLnkVlan *a, const NMPlatformLnkVlan *b
return 0; return 0;
} }
guint void
nm_platform_lnk_vxlan_hash (const NMPlatformLnkVxlan *obj) nm_platform_lnk_vxlan_hash_update (const NMPlatformLnkVxlan *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->parent_ifindex);
nm_hash_update_val (h, obj->id);
nm_hash_init (&h, 461041297u); nm_hash_update_val (h, obj->group);
nm_hash_update_val (&h, obj->parent_ifindex); nm_hash_update_val (h, obj->local);
nm_hash_update_val (&h, obj->id); nm_hash_update_in6addr (h, &obj->group6);
nm_hash_update_val (&h, obj->group); nm_hash_update_in6addr (h, &obj->local6);
nm_hash_update_val (&h, obj->local); nm_hash_update_val (h, obj->tos);
nm_hash_update_in6addr (&h, &obj->group6); nm_hash_update_val (h, obj->ttl);
nm_hash_update_in6addr (&h, &obj->local6); nm_hash_update_val (h, obj->ageing);
nm_hash_update_val (&h, obj->tos); nm_hash_update_val (h, obj->limit);
nm_hash_update_val (&h, obj->ttl); nm_hash_update_val (h, obj->dst_port);
nm_hash_update_val (&h, obj->ageing); nm_hash_update_val (h, obj->src_port_min);
nm_hash_update_val (&h, obj->limit); nm_hash_update_val (h, obj->src_port_max);
nm_hash_update_val (&h, obj->dst_port); nm_hash_update_bools (h, obj->learning,
nm_hash_update_val (&h, obj->src_port_min); obj->proxy,
nm_hash_update_val (&h, obj->src_port_max); obj->rsc,
nm_hash_update_bools (&h, obj->learning, obj->l2miss,
obj->proxy, obj->l3miss);
obj->rsc,
obj->l2miss,
obj->l3miss);
return nm_hash_complete (&h);
} }
int int
@@ -5469,25 +5429,19 @@ nm_platform_lnk_vxlan_cmp (const NMPlatformLnkVxlan *a, const NMPlatformLnkVxlan
return 0; return 0;
} }
guint void
nm_platform_ip4_address_hash (const NMPlatformIP4Address *obj) nm_platform_ip4_address_hash_update (const NMPlatformIP4Address *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->ifindex);
nm_hash_update_val (h, obj->address);
nm_hash_init (&h, 469681301u); nm_hash_update_val (h, obj->plen);
if (obj) { nm_hash_update_val (h, obj->peer_address);
nm_hash_update_val (&h, obj->ifindex); nm_hash_update_val (h, obj->addr_source);
nm_hash_update_val (&h, obj->address); nm_hash_update_val (h, obj->timestamp);
nm_hash_update_val (&h, obj->plen); nm_hash_update_val (h, obj->lifetime);
nm_hash_update_val (&h, obj->peer_address); nm_hash_update_val (h, obj->preferred);
nm_hash_update_val (&h, obj->addr_source); nm_hash_update_val (h, obj->n_ifa_flags);
nm_hash_update_val (&h, obj->timestamp); nm_hash_update_strarr (h, obj->label);
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);
} }
int int
@@ -5507,24 +5461,18 @@ nm_platform_ip4_address_cmp (const NMPlatformIP4Address *a, const NMPlatformIP4A
return 0; return 0;
} }
guint void
nm_platform_ip6_address_hash (const NMPlatformIP6Address *obj) nm_platform_ip6_address_hash_update (const NMPlatformIP6Address *obj, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, obj->ifindex);
nm_hash_update_in6addr (h, &obj->address);
nm_hash_init (&h, 605908909u); nm_hash_update_val (h, obj->plen);
if (obj) { nm_hash_update_in6addr (h, &obj->peer_address);
nm_hash_update_val (&h, obj->ifindex); nm_hash_update_val (h, obj->addr_source);
nm_hash_update_in6addr (&h, &obj->address); nm_hash_update_val (h, obj->timestamp);
nm_hash_update_val (&h, obj->plen); nm_hash_update_val (h, obj->lifetime);
nm_hash_update_in6addr (&h, &obj->peer_address); nm_hash_update_val (h, obj->preferred);
nm_hash_update_val (&h, obj->addr_source); nm_hash_update_val (h, obj->n_ifa_flags);
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);
} }
int int
@@ -5547,65 +5495,62 @@ nm_platform_ip6_address_cmp (const NMPlatformIP6Address *a, const NMPlatformIP6A
return 0; return 0;
} }
guint void
nm_platform_ip4_route_hash (const NMPlatformIP4Route *obj, NMPlatformIPRouteCmpType cmp_type) nm_platform_ip4_route_hash_update (const NMPlatformIP4Route *obj, NMPlatformIPRouteCmpType cmp_type, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, cmp_type);
nm_hash_init (&h, 1228913327u);
nm_hash_update_val (&h, cmp_type);
if (obj) { if (obj) {
switch (cmp_type) { switch (cmp_type) {
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID:
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
nm_hash_update_val (&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_val (&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));
nm_hash_update_val (&h, obj->plen); nm_hash_update_val (h, obj->plen);
nm_hash_update_val (&h, obj->metric); nm_hash_update_val (h, obj->metric);
nm_hash_update_val (&h, obj->tos); nm_hash_update_val (h, obj->tos);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) { if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) {
nm_hash_update_val (&h, obj->ifindex); 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, 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, _ip_route_scope_inv_get_normalized (obj));
nm_hash_update_val (&h, obj->gateway); nm_hash_update_val (h, obj->gateway);
nm_hash_update_val (&h, obj->mss); nm_hash_update_val (h, obj->mss);
nm_hash_update_val (&h, obj->pref_src); nm_hash_update_val (h, obj->pref_src);
nm_hash_update_vals (&h, nm_hash_update_vals (h,
obj->window, obj->window,
obj->cwnd, obj->cwnd,
obj->initcwnd, obj->initcwnd,
obj->initrwnd, obj->initrwnd,
obj->mtu); obj->mtu);
nm_hash_update_bools (&h, obj->lock_window, nm_hash_update_bools (h, obj->lock_window,
obj->lock_cwnd, obj->lock_cwnd,
obj->lock_initcwnd, obj->lock_initcwnd,
obj->lock_initrwnd, obj->lock_initrwnd,
obj->lock_mtu); obj->lock_mtu);
} }
break; break;
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY:
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL:
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
nm_hash_update_val (&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 else
nm_hash_update_val (&h, obj->table_coerced); nm_hash_update_val (h, obj->table_coerced);
nm_hash_update_val (&h, obj->ifindex); nm_hash_update_val (h, obj->ifindex);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
nm_hash_update_val (&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 else
nm_hash_update_val (&h, obj->network); nm_hash_update_val (h, obj->network);
nm_hash_update_val (&h, obj->plen); nm_hash_update_val (h, obj->plen);
nm_hash_update_val (&h, obj->metric); nm_hash_update_val (h, obj->metric);
nm_hash_update_val (&h, obj->gateway); nm_hash_update_val (h, obj->gateway);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) { if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) {
nm_hash_update_val (&h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); 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, _ip_route_scope_inv_get_normalized (obj));
} else { } else {
nm_hash_update_val (&h, obj->rt_source); nm_hash_update_val (h, obj->rt_source);
nm_hash_update_val (&h, obj->scope_inv); nm_hash_update_val (h, obj->scope_inv);
} }
nm_hash_update_val (&h, obj->tos); nm_hash_update_val (h, obj->tos);
nm_hash_update_vals (&h, nm_hash_update_vals (h,
obj->mss, obj->mss,
obj->pref_src, obj->pref_src,
obj->window, obj->window,
@@ -5613,16 +5558,15 @@ nm_platform_ip4_route_hash (const NMPlatformIP4Route *obj, NMPlatformIPRouteCmpT
obj->initcwnd, obj->initcwnd,
obj->initrwnd, obj->initrwnd,
obj->mtu); obj->mtu);
nm_hash_update_bools (&h, obj->rt_cloned, nm_hash_update_bools (h, obj->rt_cloned,
obj->lock_window, obj->lock_window,
obj->lock_cwnd, obj->lock_cwnd,
obj->lock_initcwnd, obj->lock_initcwnd,
obj->lock_initrwnd, obj->lock_initrwnd,
obj->lock_mtu); obj->lock_mtu);
break; break;
} }
} }
return nm_hash_complete (&h);
} }
int int
@@ -5702,75 +5646,71 @@ nm_platform_ip4_route_cmp (const NMPlatformIP4Route *a, const NMPlatformIP4Route
return 0; return 0;
} }
guint void
nm_platform_ip6_route_hash (const NMPlatformIP6Route *obj, NMPlatformIPRouteCmpType cmp_type) nm_platform_ip6_route_hash_update (const NMPlatformIP6Route *obj, NMPlatformIPRouteCmpType cmp_type, NMHashState *h)
{ {
NMHashState h; nm_hash_update_val (h, cmp_type);
nm_hash_init (&h, 1053326051u);
nm_hash_update_val (&h, cmp_type);
if (obj) { if (obj) {
switch (cmp_type) { switch (cmp_type) {
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID:
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
nm_hash_update_val (&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_in6addr_prefix (h, &obj->network, obj->plen);
nm_hash_update_val (&h, obj->plen); nm_hash_update_val (h, obj->plen);
nm_hash_update_val (&h, nm_utils_ip6_route_metric_normalize (obj->metric)); 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_in6addr_prefix (h, &obj->src, obj->src_plen);
nm_hash_update_val (&h, obj->src_plen); nm_hash_update_val (h, obj->src_plen);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) { if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) {
nm_hash_update_val (&h, obj->ifindex); nm_hash_update_val (h, obj->ifindex);
nm_hash_update_in6addr (&h, &obj->gateway); nm_hash_update_in6addr (h, &obj->gateway);
} }
break; break;
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY:
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL: case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL:
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
nm_hash_update_val (&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 else
nm_hash_update_val (&h, obj->table_coerced); nm_hash_update_val (h, obj->table_coerced);
nm_hash_update_val (&h, obj->ifindex); nm_hash_update_val (h, obj->ifindex);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
nm_hash_update_in6addr_prefix (&h, &obj->network, obj->plen); nm_hash_update_in6addr_prefix (h, &obj->network, obj->plen);
else else
nm_hash_update_in6addr (&h, &obj->network); nm_hash_update_in6addr (h, &obj->network);
nm_hash_update_val (&h, obj->plen); nm_hash_update_val (h, obj->plen);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
nm_hash_update_val (&h, nm_utils_ip6_route_metric_normalize (obj->metric)); nm_hash_update_val (h, nm_utils_ip6_route_metric_normalize (obj->metric));
else else
nm_hash_update_val (&h, obj->metric); nm_hash_update_val (h, obj->metric);
nm_hash_update_in6addr (&h, &obj->gateway); nm_hash_update_in6addr (h, &obj->gateway);
nm_hash_update_in6addr (&h, &obj->pref_src); nm_hash_update_in6addr (h, &obj->pref_src);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) { if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) {
nm_hash_update_in6addr_prefix (&h, &obj->src, obj->src_plen); nm_hash_update_in6addr_prefix (h, &obj->src, obj->src_plen);
nm_hash_update_val (&h, obj->src_plen); nm_hash_update_val (h, obj->src_plen);
nm_hash_update_val (&h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source)); nm_hash_update_val (h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source));
} else { } else {
nm_hash_update_in6addr (&h, &obj->src); nm_hash_update_in6addr (h, &obj->src);
nm_hash_update_val (&h, obj->src_plen); nm_hash_update_val (h, obj->src_plen);
nm_hash_update_val (&h, obj->rt_source); nm_hash_update_val (h, obj->rt_source);
} }
nm_hash_update_val (&h, obj->mss); nm_hash_update_val (h, obj->mss);
nm_hash_update_bools (&h, obj->rt_cloned, nm_hash_update_bools (h, obj->rt_cloned,
obj->lock_window, obj->lock_window,
obj->lock_cwnd, obj->lock_cwnd,
obj->lock_initcwnd, obj->lock_initcwnd,
obj->lock_initrwnd, obj->lock_initrwnd,
obj->lock_mtu); obj->lock_mtu);
nm_hash_update_val (&h, obj->window); nm_hash_update_val (h, obj->window);
nm_hash_update_val (&h, obj->cwnd); nm_hash_update_val (h, obj->cwnd);
nm_hash_update_val (&h, obj->initcwnd); nm_hash_update_val (h, obj->initcwnd);
nm_hash_update_val (&h, obj->initrwnd); nm_hash_update_val (h, obj->initrwnd);
nm_hash_update_val (&h, obj->mtu); nm_hash_update_val (h, obj->mtu);
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
nm_hash_update_val (&h, _route_pref_normalize (obj->rt_pref)); nm_hash_update_val (h, _route_pref_normalize (obj->rt_pref));
else else
nm_hash_update_val (&h, obj->rt_pref); nm_hash_update_val (h, obj->rt_pref);
break; break;
} }
} }
return nm_hash_complete (&h);
} }
int int

View File

@@ -1300,32 +1300,20 @@ nm_platform_ip6_route_cmp_full (const NMPlatformIP6Route *a, const NMPlatformIP6
return nm_platform_ip6_route_cmp (a, b, NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL); return nm_platform_ip6_route_cmp (a, b, NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL);
} }
guint nm_platform_link_hash (const NMPlatformLink *obj); void nm_platform_link_hash_update (const NMPlatformLink *obj, NMHashState *h);
guint nm_platform_ip4_address_hash (const NMPlatformIP4Address *obj); void nm_platform_ip4_address_hash_update (const NMPlatformIP4Address *obj, NMHashState *h);
guint nm_platform_ip6_address_hash (const NMPlatformIP6Address *obj); void nm_platform_ip6_address_hash_update (const NMPlatformIP6Address *obj, NMHashState *h);
guint nm_platform_ip4_route_hash (const NMPlatformIP4Route *obj, NMPlatformIPRouteCmpType cmp_type); void nm_platform_ip4_route_hash_update (const NMPlatformIP4Route *obj, NMPlatformIPRouteCmpType cmp_type, NMHashState *h);
guint nm_platform_ip6_route_hash (const NMPlatformIP6Route *obj, NMPlatformIPRouteCmpType cmp_type); void nm_platform_ip6_route_hash_update (const NMPlatformIP6Route *obj, NMPlatformIPRouteCmpType cmp_type, NMHashState *h);
guint nm_platform_lnk_gre_hash (const NMPlatformLnkGre *obj); void nm_platform_lnk_gre_hash_update (const NMPlatformLnkGre *obj, NMHashState *h);
guint nm_platform_lnk_infiniband_hash (const NMPlatformLnkInfiniband *obj); void nm_platform_lnk_infiniband_hash_update (const NMPlatformLnkInfiniband *obj, NMHashState *h);
guint nm_platform_lnk_ip6tnl_hash (const NMPlatformLnkIp6Tnl *obj); void nm_platform_lnk_ip6tnl_hash_update (const NMPlatformLnkIp6Tnl *obj, NMHashState *h);
guint nm_platform_lnk_ipip_hash (const NMPlatformLnkIpIp *obj); void nm_platform_lnk_ipip_hash_update (const NMPlatformLnkIpIp *obj, NMHashState *h);
guint nm_platform_lnk_macsec_hash (const NMPlatformLnkMacsec *obj); void nm_platform_lnk_macsec_hash_update (const NMPlatformLnkMacsec *obj, NMHashState *h);
guint nm_platform_lnk_macvlan_hash (const NMPlatformLnkMacvlan *obj); void nm_platform_lnk_macvlan_hash_update (const NMPlatformLnkMacvlan *obj, NMHashState *h);
guint nm_platform_lnk_sit_hash (const NMPlatformLnkSit *obj); void nm_platform_lnk_sit_hash_update (const NMPlatformLnkSit *obj, NMHashState *h);
guint nm_platform_lnk_vlan_hash (const NMPlatformLnkVlan *obj); void nm_platform_lnk_vlan_hash_update (const NMPlatformLnkVlan *obj, NMHashState *h);
guint nm_platform_lnk_vxlan_hash (const NMPlatformLnkVxlan *obj); void nm_platform_lnk_vxlan_hash_update (const NMPlatformLnkVxlan *obj, NMHashState *h);
static inline guint
nm_platform_ip4_route_hash_full (const NMPlatformIP4Route *obj)
{
return nm_platform_ip4_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL);
}
static inline guint
nm_platform_ip6_route_hash_full (const NMPlatformIP6Route *obj)
{
return nm_platform_ip6_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL);
}
NMPlatformKernelSupportFlags nm_platform_check_kernel_support (NMPlatform *self, NMPlatformKernelSupportFlags nm_platform_check_kernel_support (NMPlatform *self,
NMPlatformKernelSupportFlags request_flags); NMPlatformKernelSupportFlags request_flags);

View File

@@ -86,16 +86,17 @@ struct _NMPCache {
static const NMDedupMultiIdxTypeClass _dedup_multi_idx_type_class; static const NMDedupMultiIdxTypeClass _dedup_multi_idx_type_class;
static guint static void
_idx_obj_id_hash (const NMDedupMultiIdxType *idx_type, _idx_obj_id_hash_update (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj) const NMDedupMultiObj *obj,
NMHashState *h)
{ {
const NMPObject *o = (NMPObject *) obj; const NMPObject *o = (NMPObject *) obj;
nm_assert (idx_type && idx_type->klass == &_dedup_multi_idx_type_class); nm_assert (idx_type && idx_type->klass == &_dedup_multi_idx_type_class);
nm_assert (NMP_OBJECT_GET_TYPE (o) != NMP_OBJECT_TYPE_UNKNOWN); nm_assert (NMP_OBJECT_GET_TYPE (o) != NMP_OBJECT_TYPE_UNKNOWN);
return nmp_object_id_hash (o); nmp_object_id_hash_update (o, h);
} }
static gboolean static gboolean
@@ -113,33 +114,11 @@ _idx_obj_id_equal (const NMDedupMultiIdxType *idx_type,
return nmp_object_id_equal (o_a, o_b); return nmp_object_id_equal (o_a, o_b);
} }
/* the return value of _idx_obj_part() encodes 3 things:
* 1) for idx_obj_partitionable(), it returns 0 or non-zero.
* 2) for idx_obj_partition_hash(), it returns the hash value (which
* must never be zero not to clash with idx_obj_partitionable().
* 3) for idx_obj_partition_equal(), returns 0 or 1 depending
* 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.
*
* 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 static guint
_idx_obj_part (const DedupMultiIdxType *idx_type, _idx_obj_part (const DedupMultiIdxType *idx_type,
gboolean request_hash,
const NMPObject *obj_a, const NMPObject *obj_a,
const NMPObject *obj_b) const NMPObject *obj_b,
NMHashState *h)
{ {
NMPObjectType obj_type; NMPObjectType obj_type;
@@ -151,21 +130,17 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
nm_assert (obj_a); nm_assert (obj_a);
nm_assert (NMP_OBJECT_GET_TYPE (obj_a) != NMP_OBJECT_TYPE_UNKNOWN); nm_assert (NMP_OBJECT_GET_TYPE (obj_a) != NMP_OBJECT_TYPE_UNKNOWN);
nm_assert (!obj_b || (NMP_OBJECT_GET_TYPE (obj_b) != NMP_OBJECT_TYPE_UNKNOWN)); nm_assert (!obj_b || (NMP_OBJECT_GET_TYPE (obj_b) != NMP_OBJECT_TYPE_UNKNOWN));
nm_assert (!request_hash || !obj_b); nm_assert (!h || !obj_b);
switch (idx_type->cache_id_type) { switch (idx_type->cache_id_type) {
case NMP_CACHE_ID_TYPE_OBJECT_TYPE: case NMP_CACHE_ID_TYPE_OBJECT_TYPE:
if (obj_b) if (obj_b)
return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b); return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b);
if (request_hash) { if (h) {
NMHashState h; nm_hash_update_vals (h,
nm_hash_init (&h, 487703243u);
nm_hash_update_vals (&h,
idx_type->cache_id_type, idx_type->cache_id_type,
NMP_OBJECT_GET_TYPE (obj_a)); NMP_OBJECT_GET_TYPE (obj_a));
return _HASH_NON_ZERO (&h);
} }
return 1; return 1;
@@ -174,6 +149,8 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
/* first check, whether obj_a is suitable for this idx_type. /* first check, whether obj_a is suitable for this idx_type.
* If not, return 0 (which is correct for partitionable(), hash() and equal() * If not, return 0 (which is correct for partitionable(), hash() and equal()
* functions. */ * functions. */
if (h)
nm_hash_update_val (h, obj_a);
return 0; return 0;
} }
if (obj_b) { if (obj_b) {
@@ -181,14 +158,9 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
return NMP_OBJECT_GET_TYPE (obj_b) == NMP_OBJECT_TYPE_LINK return NMP_OBJECT_GET_TYPE (obj_b) == NMP_OBJECT_TYPE_LINK
&& nm_streq (obj_a->link.name, obj_b->link.name); && nm_streq (obj_a->link.name, obj_b->link.name);
} }
if (request_hash) { if (h) {
NMHashState h; nm_hash_update_val (h, idx_type->cache_id_type);
nm_hash_update_strarr (h, obj_a->link.name);
/* we request a hash from obj_a. Hash the relevant parts. */
nm_hash_init (&h, 2126752699u);
nm_hash_update_val (&h, idx_type->cache_id_type);
nm_hash_update_strarr (&h, obj_a->link.name);
return _HASH_NON_ZERO (&h);
} }
/* just return 1, to indicate that obj_a is partitionable by this idx_type. */ /* just return 1, to indicate that obj_a is partitionable by this idx_type. */
return 1; return 1;
@@ -197,21 +169,20 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE, if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE,
NMP_OBJECT_TYPE_IP6_ROUTE) NMP_OBJECT_TYPE_IP6_ROUTE)
|| !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route) || !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route)
|| !nmp_object_is_visible (obj_a)) || !nmp_object_is_visible (obj_a)) {
if (h)
nm_hash_update_val (h, obj_a);
return 0; return 0;
}
if (obj_b) { if (obj_b) {
return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b) return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b)
&& NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route) && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route)
&& nmp_object_is_visible (obj_b); && nmp_object_is_visible (obj_b);
} }
if (request_hash) { if (h) {
NMHashState h; nm_hash_update_vals (h,
nm_hash_init (&h, 4278960223u);
nm_hash_update_vals (&h,
idx_type->cache_id_type, idx_type->cache_id_type,
NMP_OBJECT_GET_TYPE (obj_a)); NMP_OBJECT_GET_TYPE (obj_a));
return _HASH_NON_ZERO (&h);
} }
return 1; return 1;
@@ -220,22 +191,21 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
NMP_OBJECT_TYPE_IP6_ADDRESS, NMP_OBJECT_TYPE_IP6_ADDRESS,
NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP4_ROUTE,
NMP_OBJECT_TYPE_IP6_ROUTE) NMP_OBJECT_TYPE_IP6_ROUTE)
|| !nmp_object_is_visible (obj_a)) || !nmp_object_is_visible (obj_a)) {
if (h)
nm_hash_update_val (h, obj_a);
return 0; return 0;
}
nm_assert (obj_a->object.ifindex > 0); nm_assert (obj_a->object.ifindex > 0);
if (obj_b) { if (obj_b) {
return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b) return NMP_OBJECT_GET_TYPE (obj_a) == NMP_OBJECT_GET_TYPE (obj_b)
&& obj_a->object.ifindex == obj_b->object.ifindex && obj_a->object.ifindex == obj_b->object.ifindex
&& nmp_object_is_visible (obj_b); && nmp_object_is_visible (obj_b);
} }
if (request_hash) { if (h) {
NMHashState h; nm_hash_update_vals (h,
nm_hash_init (&h, 920415631u);
nm_hash_update_vals (&h,
idx_type->cache_id_type, idx_type->cache_id_type,
obj_a->object.ifindex); obj_a->object.ifindex);
return _HASH_NON_ZERO (&h);
} }
return 1; return 1;
@@ -243,8 +213,11 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
obj_type = NMP_OBJECT_GET_TYPE (obj_a); obj_type = NMP_OBJECT_GET_TYPE (obj_a);
if ( !NM_IN_SET (obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, if ( !NM_IN_SET (obj_type, NMP_OBJECT_TYPE_IP4_ROUTE,
NMP_OBJECT_TYPE_IP6_ROUTE) NMP_OBJECT_TYPE_IP6_ROUTE)
|| obj_a->object.ifindex <= 0) || obj_a->object.ifindex <= 0) {
if (h)
nm_hash_update_val (h, obj_a);
return 0; return 0;
}
if (obj_b) { if (obj_b) {
return obj_type == NMP_OBJECT_GET_TYPE (obj_b) return obj_type == NMP_OBJECT_GET_TYPE (obj_b)
&& obj_b->object.ifindex > 0 && obj_b->object.ifindex > 0
@@ -252,19 +225,12 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
? (nm_platform_ip4_route_cmp (&obj_a->ip4_route, &obj_b->ip4_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID) == 0) ? (nm_platform_ip4_route_cmp (&obj_a->ip4_route, &obj_b->ip4_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID) == 0)
: (nm_platform_ip6_route_cmp (&obj_a->ip6_route, &obj_b->ip6_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID) == 0)); : (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) { if (h) {
NMHashState h; nm_hash_update_val (h, idx_type->cache_id_type);
guint h2; if (obj_type == NMP_OBJECT_TYPE_IP4_ROUTE)
nm_platform_ip4_route_hash_update (&obj_a->ip4_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID, h);
h2 = (obj_type == NMP_OBJECT_TYPE_IP4_ROUTE) else
? nm_platform_ip4_route_hash (&obj_a->ip4_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID) nm_platform_ip6_route_hash_update (&obj_a->ip6_route, NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID, h);
: 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_vals (&h,
idx_type->cache_id_type,
h2);
return _HASH_NON_ZERO (&h);
} }
return 1; return 1;
@@ -281,19 +247,20 @@ _idx_obj_partitionable (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj) const NMDedupMultiObj *obj)
{ {
return _idx_obj_part ((DedupMultiIdxType *) idx_type, return _idx_obj_part ((DedupMultiIdxType *) idx_type,
FALSE,
(NMPObject *) obj, (NMPObject *) obj,
NULL,
NULL) != 0; NULL) != 0;
} }
static guint static void
_idx_obj_partition_hash (const NMDedupMultiIdxType *idx_type, _idx_obj_partition_hash_update (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj) const NMDedupMultiObj *obj,
NMHashState *h)
{ {
return _idx_obj_part ((DedupMultiIdxType *) idx_type, _idx_obj_part ((DedupMultiIdxType *) idx_type,
TRUE, (NMPObject *) obj,
(NMPObject *) obj, NULL,
NULL); h);
} }
static gboolean static gboolean
@@ -302,16 +269,16 @@ _idx_obj_partition_equal (const NMDedupMultiIdxType *idx_type,
const NMDedupMultiObj *obj_b) const NMDedupMultiObj *obj_b)
{ {
return _idx_obj_part ((DedupMultiIdxType *) idx_type, return _idx_obj_part ((DedupMultiIdxType *) idx_type,
FALSE,
(NMPObject *) obj_a, (NMPObject *) obj_a,
(NMPObject *) obj_b); (NMPObject *) obj_b,
NULL);
} }
static const NMDedupMultiIdxTypeClass _dedup_multi_idx_type_class = { static const NMDedupMultiIdxTypeClass _dedup_multi_idx_type_class = {
.idx_obj_id_hash = _idx_obj_id_hash, .idx_obj_id_hash_update = _idx_obj_id_hash_update,
.idx_obj_id_equal = _idx_obj_id_equal, .idx_obj_id_equal = _idx_obj_id_equal,
.idx_obj_partitionable = _idx_obj_partitionable, .idx_obj_partitionable = _idx_obj_partitionable,
.idx_obj_partition_hash = _idx_obj_partition_hash, .idx_obj_partition_hash_update = _idx_obj_partition_hash_update,
.idx_obj_partition_equal = _idx_obj_partition_equal, .idx_obj_partition_equal = _idx_obj_partition_equal,
}; };
@@ -771,63 +738,48 @@ _vt_cmd_plobj_to_string_id (ip4_address, NMPlatformIP4Address, "%d: %s/%d%s%s",
obj->peer_address != obj->address ? nm_utils_inet4_ntop (nm_utils_ip4_address_clear_host_address (obj->peer_address, 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)); _vt_cmd_plobj_to_string_id (ip6_address, NMPlatformIP6Address, "%d: %s", obj->ifindex, nm_utils_inet6_ntop (&obj->address, buf1));
guint void
nmp_object_hash (const NMPObject *obj) nmp_object_hash_update (const NMPObject *obj, NMHashState *h)
{ {
const NMPClass *klass; const NMPClass *klass;
NMHashState h;
if (!obj) g_return_if_fail (NMP_OBJECT_IS_VALID (obj));
return 0;
g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj), 0);
klass = NMP_OBJECT_GET_CLASS (obj); klass = NMP_OBJECT_GET_CLASS (obj);
nm_hash_init (&h, 816200863u); nm_hash_update_val (h, klass->obj_type);
nm_hash_update_val (&h, klass->obj_type); if (klass->cmd_obj_hash_update)
if (klass->cmd_obj_hash) klass->cmd_obj_hash_update (obj, h);
nm_hash_update_val (&h, klass->cmd_obj_hash (obj)); else if (klass->cmd_plobj_hash_update)
else if (klass->cmd_plobj_hash) klass->cmd_plobj_hash_update (&obj->object, h);
nm_hash_update_val (&h, klass->cmd_plobj_hash (&obj->object));
else else
nm_hash_update_val (&h, obj); nm_hash_update_val (h, obj);
return nm_hash_complete (&h);
} }
static guint static void
_vt_cmd_obj_hash_link (const NMPObject *obj) _vt_cmd_obj_hash_update_link (const NMPObject *obj, NMHashState *h)
{ {
NMHashState h;
nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK); nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK);
nm_hash_init (&h, 3448776161u); nm_platform_link_hash_update (&obj->link, h);
nm_hash_update_val (&h, nm_platform_link_hash (&obj->link)); nm_hash_update_val (h, obj->_link.netlink.is_in_netlink);
nm_hash_update_val (&h, obj->_link.netlink.is_in_netlink);
if (obj->_link.netlink.lnk) if (obj->_link.netlink.lnk)
nm_hash_update_val (&h, nmp_object_hash (obj->_link.netlink.lnk)); nmp_object_hash_update (obj->_link.netlink.lnk, h);
nm_hash_update_val (&h, obj->_link.udev.device); nm_hash_update_val (h, obj->_link.udev.device);
return nm_hash_complete (&h);
} }
static guint static void
_vt_cmd_obj_hash_lnk_vlan (const NMPObject *obj) _vt_cmd_obj_hash_update_lnk_vlan (const NMPObject *obj, NMHashState *h)
{ {
NMHashState h;
nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LNK_VLAN); nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LNK_VLAN);
nm_hash_init (&h, 914932607u); nm_platform_lnk_vlan_hash_update (&obj->lnk_vlan, h);
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, _vlan_xgress_qos_mappings_hash_update (obj->_lnk_vlan.n_ingress_qos_map,
obj->_lnk_vlan.ingress_qos_map, obj->_lnk_vlan.ingress_qos_map,
&h); h);
_vlan_xgress_qos_mappings_hash_update (obj->_lnk_vlan.n_egress_qos_map, _vlan_xgress_qos_mappings_hash_update (obj->_lnk_vlan.n_egress_qos_map,
obj->_lnk_vlan.egress_qos_map, obj->_lnk_vlan.egress_qos_map,
&h); h);
return nm_hash_complete (&h);
} }
int int
@@ -1033,7 +985,7 @@ nmp_object_id_cmp (const NMPObject *obj1, const NMPObject *obj2)
g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj2), FALSE); g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj2), FALSE);
klass = NMP_OBJECT_GET_CLASS (obj1); klass = NMP_OBJECT_GET_CLASS (obj1);
nm_assert (!klass->cmd_plobj_id_hash == !klass->cmd_plobj_id_cmp); nm_assert (!klass->cmd_plobj_id_hash_update == !klass->cmd_plobj_id_cmp);
klass2 = NMP_OBJECT_GET_CLASS (obj2); klass2 = NMP_OBJECT_GET_CLASS (obj2);
nm_assert (klass); nm_assert (klass);
@@ -1095,63 +1047,84 @@ _vt_cmd_plobj_id_cmp_ip6_route (const NMPlatformObject *obj1, const NMPlatformOb
return nm_platform_ip6_route_cmp ((NMPlatformIP6Route *) obj1, (NMPlatformIP6Route *) obj2, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID); return nm_platform_ip6_route_cmp ((NMPlatformIP6Route *) obj1, (NMPlatformIP6Route *) obj2, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID);
} }
void
nmp_object_id_hash_update (const NMPObject *obj, NMHashState *h)
{
const NMPClass *klass;
g_return_if_fail (NMP_OBJECT_IS_VALID (obj));
klass = NMP_OBJECT_GET_CLASS (obj);
nm_assert (!klass->cmd_plobj_id_hash_update == !klass->cmd_plobj_id_cmp);
if (!klass->cmd_plobj_id_hash_update) {
/* The klass doesn't implement ID compare. It means, to use pointer
* equality. */
nm_hash_update_val (h, obj);
return;
}
nm_hash_update_val (h, klass->obj_type);
klass->cmd_plobj_id_hash_update (&obj->object, h);
}
guint guint
nmp_object_id_hash (const NMPObject *obj) nmp_object_id_hash (const NMPObject *obj)
{ {
const NMPClass *klass; NMHashState h;
if (!obj) if (!obj)
return 0; return 0;
g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj), 0); nm_hash_init (&h, 914932607u);
nmp_object_id_hash_update (obj, &h);
klass = NMP_OBJECT_GET_CLASS (obj); return nm_hash_complete (&h);
nm_assert (!klass->cmd_plobj_id_hash == !klass->cmd_plobj_id_cmp);
if (!klass->cmd_plobj_id_hash) {
/* The klass doesn't implement ID compare. It means, to use pointer
* equality. */
return nm_hash_ptr (obj);
}
return klass->cmd_plobj_id_hash (&obj->object);
} }
#define _vt_cmd_plobj_id_hash(type, plat_type, hash_seed, cmd) \ #define _vt_cmd_plobj_id_hash_update(type, plat_type, cmd) \
static guint \ static void \
_vt_cmd_plobj_id_hash_##type (const NMPlatformObject *_obj) \ _vt_cmd_plobj_id_hash_update_##type (const NMPlatformObject *_obj, NMHashState *h) \
{ \ { \
const plat_type *const obj = (const plat_type *) _obj; \ const plat_type *const obj = (const plat_type *) _obj; \
NMHashState h; \
nm_hash_init (&h, (hash_seed)); \
{ cmd; } \ { cmd; } \
return nm_hash_complete (&h); \
} }
_vt_cmd_plobj_id_hash (link, NMPlatformLink, 3982791431u, { _vt_cmd_plobj_id_hash_update (link, NMPlatformLink, {
nm_hash_update_val (&h, obj->ifindex); nm_hash_update_val (h, obj->ifindex);
}) })
_vt_cmd_plobj_id_hash (ip4_address, NMPlatformIP4Address, 3591309853u, { _vt_cmd_plobj_id_hash_update (ip4_address, NMPlatformIP4Address, {
nm_hash_update_vals (&h, nm_hash_update_vals (h,
obj->ifindex, obj->ifindex,
obj->plen, obj->plen,
obj->address, obj->address,
/* for IPv4 we must also consider the net-part of the peer-address (IFA_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)); nm_utils_ip4_address_clear_host_address (obj->peer_address, obj->plen));
}) })
_vt_cmd_plobj_id_hash (ip6_address, NMPlatformIP6Address, 2907861637u, { _vt_cmd_plobj_id_hash_update (ip6_address, NMPlatformIP6Address, {
nm_hash_update_vals (&h, nm_hash_update_vals (h,
obj->ifindex, obj->ifindex,
/* for IPv6 addresses, the prefix length is not part of the primary identifier. */ /* for IPv6 addresses, the prefix length is not part of the primary identifier. */
obj->address); obj->address);
}) })
_vt_cmd_plobj_id_hash (ip4_route, NMPlatformIP4Route, 1038302471u, { _vt_cmd_plobj_id_hash_update (ip4_route, NMPlatformIP4Route, {
nm_hash_update_val (&h, nm_platform_ip4_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)); nm_platform_ip4_route_hash_update (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID, h);
}) })
_vt_cmd_plobj_id_hash (ip6_route, NMPlatformIP6Route, 1233384151u, { _vt_cmd_plobj_id_hash_update (ip6_route, NMPlatformIP6Route, {
nm_hash_update_val (&h, nm_platform_ip6_route_hash (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID)); nm_platform_ip6_route_hash_update (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID, h);
}) })
static inline void
_vt_cmd_plobj_hash_update_ip4_route (const NMPlatformObject *obj, NMHashState *h)
{
return nm_platform_ip4_route_hash_update ((const NMPlatformIP4Route *) obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL, h);
}
static inline void
_vt_cmd_plobj_hash_update_ip6_route (const NMPlatformObject *obj, NMHashState *h)
{
return nm_platform_ip6_route_hash_update ((const NMPlatformIP6Route *) obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL, h);
}
gboolean gboolean
nmp_object_is_alive (const NMPObject *obj) nmp_object_is_alive (const NMPObject *obj)
{ {
@@ -1271,26 +1244,12 @@ _vt_dedup_obj_clone (const NMDedupMultiObj *obj)
return (const NMDedupMultiObj *) nmp_object_clone ((const NMPObject *) obj, FALSE); return (const NMDedupMultiObj *) nmp_object_clone ((const NMPObject *) obj, FALSE);
} }
static guint
_vt_dedup_obj_full_hash (const NMDedupMultiObj *obj)
{
return nmp_object_hash ((NMPObject *) obj);
}
static gboolean
_vt_dedup_obj_full_equal (const NMDedupMultiObj *obj_a,
const NMDedupMultiObj *obj_b)
{
return nmp_object_equal ((NMPObject *) obj_a,
(NMPObject *) obj_b);
}
#define DEDUP_MULTI_OBJ_CLASS_INIT() \ #define DEDUP_MULTI_OBJ_CLASS_INIT() \
{ \ { \
.obj_clone = _vt_dedup_obj_clone, \ .obj_clone = _vt_dedup_obj_clone, \
.obj_destroy = _vt_dedup_obj_destroy, \ .obj_destroy = _vt_dedup_obj_destroy, \
.obj_full_hash = _vt_dedup_obj_full_hash, \ .obj_full_hash_update = (void (*)(const NMDedupMultiObj *obj, NMHashState *h)) nmp_object_hash_update, \
.obj_full_equal = _vt_dedup_obj_full_equal, \ .obj_full_equal = (gboolean (*)(const NMDedupMultiObj *obj_a, const NMDedupMultiObj *obj_b)) nmp_object_equal, \
} }
/*****************************************************************************/ /*****************************************************************************/
@@ -1523,7 +1482,6 @@ _L (const NMPLookup *lookup)
nm_assert (lookup); nm_assert (lookup);
_dedup_multi_idx_type_init (&idx_type, lookup->cache_id_type); _dedup_multi_idx_type_init (&idx_type, lookup->cache_id_type);
nm_assert (idx_type.parent.klass->idx_obj_partitionable ((NMDedupMultiIdxType *) &idx_type, (NMDedupMultiObj *) &lookup->selector_obj)); nm_assert (idx_type.parent.klass->idx_obj_partitionable ((NMDedupMultiIdxType *) &idx_type, (NMDedupMultiObj *) &lookup->selector_obj));
nm_assert (idx_type.parent.klass->idx_obj_partition_hash ((NMDedupMultiIdxType *) &idx_type, (NMDedupMultiObj *) &lookup->selector_obj) > 0);
#endif #endif
return lookup; return lookup;
} }
@@ -2515,7 +2473,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.signal_type_id = NM_PLATFORM_SIGNAL_ID_LINK, .signal_type_id = NM_PLATFORM_SIGNAL_ID_LINK,
.signal_type = NM_PLATFORM_SIGNAL_LINK_CHANGED, .signal_type = NM_PLATFORM_SIGNAL_LINK_CHANGED,
.supported_cache_ids = _supported_cache_ids_link, .supported_cache_ids = _supported_cache_ids_link,
.cmd_obj_hash = _vt_cmd_obj_hash_link, .cmd_obj_hash_update = _vt_cmd_obj_hash_update_link,
.cmd_obj_cmp = _vt_cmd_obj_cmp_link, .cmd_obj_cmp = _vt_cmd_obj_cmp_link,
.cmd_obj_copy = _vt_cmd_obj_copy_link, .cmd_obj_copy = _vt_cmd_obj_copy_link,
.cmd_obj_dispose = _vt_cmd_obj_dispose_link, .cmd_obj_dispose = _vt_cmd_obj_dispose_link,
@@ -2524,10 +2482,10 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.cmd_obj_to_string = _vt_cmd_obj_to_string_link, .cmd_obj_to_string = _vt_cmd_obj_to_string_link,
.cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_link, .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_link,
.cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_link, .cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_link,
.cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_link, .cmd_plobj_id_hash_update = _vt_cmd_plobj_id_hash_update_link,
.cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_link, .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_link,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_link_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_link_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_link_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_link_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_link_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_link_cmp,
}, },
[NMP_OBJECT_TYPE_IP4_ADDRESS - 1] = { [NMP_OBJECT_TYPE_IP4_ADDRESS - 1] = {
@@ -2544,10 +2502,10 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_address, .cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_address,
.cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip4_address, .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip4_address,
.cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_ip4_address, .cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_ip4_address,
.cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip4_address, .cmd_plobj_id_hash_update = _vt_cmd_plobj_id_hash_update_ip4_address,
.cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip4_address, .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip4_address,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip4_address_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip4_address_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_ip4_address_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_ip4_address_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip4_address_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip4_address_cmp,
}, },
[NMP_OBJECT_TYPE_IP6_ADDRESS - 1] = { [NMP_OBJECT_TYPE_IP6_ADDRESS - 1] = {
@@ -2564,10 +2522,10 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_address, .cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_address,
.cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip6_address, .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip6_address,
.cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_ip6_address, .cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_ip6_address,
.cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip6_address, .cmd_plobj_id_hash_update = _vt_cmd_plobj_id_hash_update_ip6_address,
.cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip6_address, .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip6_address,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip6_address_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip6_address_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_ip6_address_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_ip6_address_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_address_cmp .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_address_cmp
}, },
[NMP_OBJECT_TYPE_IP4_ROUTE - 1] = { [NMP_OBJECT_TYPE_IP4_ROUTE - 1] = {
@@ -2584,10 +2542,10 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_route, .cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_route,
.cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip4_route, .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip4_route,
.cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_ip4_route, .cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_ip4_route,
.cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip4_route, .cmd_plobj_id_hash_update = _vt_cmd_plobj_id_hash_update_ip4_route,
.cmd_plobj_to_string_id = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip4_route_to_string, .cmd_plobj_to_string_id = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip4_route_to_string,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip4_route_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip4_route_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_ip4_route_hash_full, .cmd_plobj_hash_update = _vt_cmd_plobj_hash_update_ip4_route,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip4_route_cmp_full, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip4_route_cmp_full,
}, },
[NMP_OBJECT_TYPE_IP6_ROUTE - 1] = { [NMP_OBJECT_TYPE_IP6_ROUTE - 1] = {
@@ -2604,10 +2562,10 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_route, .cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_route,
.cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip6_route, .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip6_route,
.cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_ip6_route, .cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_ip6_route,
.cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip6_route, .cmd_plobj_id_hash_update = _vt_cmd_plobj_id_hash_update_ip6_route,
.cmd_plobj_to_string_id = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip6_route_to_string, .cmd_plobj_to_string_id = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip6_route_to_string,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip6_route_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_ip6_route_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_ip6_route_hash_full, .cmd_plobj_hash_update = _vt_cmd_plobj_hash_update_ip6_route,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_route_cmp_full, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_route_cmp_full,
}, },
[NMP_OBJECT_TYPE_LNK_GRE - 1] = { [NMP_OBJECT_TYPE_LNK_GRE - 1] = {
@@ -2618,7 +2576,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "gre", .obj_type_name = "gre",
.lnk_link_type = NM_LINK_TYPE_GRE, .lnk_link_type = NM_LINK_TYPE_GRE,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_gre_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_gre_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_gre_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_gre_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_gre_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_gre_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_INFINIBAND - 1] = { [NMP_OBJECT_TYPE_LNK_INFINIBAND - 1] = {
@@ -2629,7 +2587,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "infiniband", .obj_type_name = "infiniband",
.lnk_link_type = NM_LINK_TYPE_INFINIBAND, .lnk_link_type = NM_LINK_TYPE_INFINIBAND,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_infiniband_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_infiniband_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_infiniband_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_infiniband_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_infiniband_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_infiniband_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_IP6TNL - 1] = { [NMP_OBJECT_TYPE_LNK_IP6TNL - 1] = {
@@ -2640,7 +2598,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "ip6tnl", .obj_type_name = "ip6tnl",
.lnk_link_type = NM_LINK_TYPE_IP6TNL, .lnk_link_type = NM_LINK_TYPE_IP6TNL,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_ip6tnl_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_ip6tnl_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_ip6tnl_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_ip6tnl_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ip6tnl_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ip6tnl_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_IPIP - 1] = { [NMP_OBJECT_TYPE_LNK_IPIP - 1] = {
@@ -2651,7 +2609,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "ipip", .obj_type_name = "ipip",
.lnk_link_type = NM_LINK_TYPE_IPIP, .lnk_link_type = NM_LINK_TYPE_IPIP,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_ipip_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_ipip_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_ipip_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_ipip_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ipip_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ipip_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_MACSEC - 1] = { [NMP_OBJECT_TYPE_LNK_MACSEC - 1] = {
@@ -2662,7 +2620,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "macsec", .obj_type_name = "macsec",
.lnk_link_type = NM_LINK_TYPE_MACSEC, .lnk_link_type = NM_LINK_TYPE_MACSEC,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_macsec_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_macsec_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_macsec_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_macsec_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macsec_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macsec_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_MACVLAN - 1] = { [NMP_OBJECT_TYPE_LNK_MACVLAN - 1] = {
@@ -2673,7 +2631,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "macvlan", .obj_type_name = "macvlan",
.lnk_link_type = NM_LINK_TYPE_MACVLAN, .lnk_link_type = NM_LINK_TYPE_MACVLAN,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_macvlan_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_macvlan_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_macvlan_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_macvlan_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macvlan_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macvlan_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_MACVTAP - 1] = { [NMP_OBJECT_TYPE_LNK_MACVTAP - 1] = {
@@ -2684,7 +2642,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "macvtap", .obj_type_name = "macvtap",
.lnk_link_type = NM_LINK_TYPE_MACVTAP, .lnk_link_type = NM_LINK_TYPE_MACVTAP,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_macvlan_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_macvlan_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_macvlan_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_macvlan_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macvlan_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macvlan_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_SIT - 1] = { [NMP_OBJECT_TYPE_LNK_SIT - 1] = {
@@ -2695,7 +2653,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "sit", .obj_type_name = "sit",
.lnk_link_type = NM_LINK_TYPE_SIT, .lnk_link_type = NM_LINK_TYPE_SIT,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_sit_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_sit_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_sit_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_sit_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_sit_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_sit_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_VLAN - 1] = { [NMP_OBJECT_TYPE_LNK_VLAN - 1] = {
@@ -2705,13 +2663,13 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.sizeof_public = sizeof (NMPlatformLnkVlan), .sizeof_public = sizeof (NMPlatformLnkVlan),
.obj_type_name = "vlan", .obj_type_name = "vlan",
.lnk_link_type = NM_LINK_TYPE_VLAN, .lnk_link_type = NM_LINK_TYPE_VLAN,
.cmd_obj_hash = _vt_cmd_obj_hash_lnk_vlan, .cmd_obj_hash_update = _vt_cmd_obj_hash_update_lnk_vlan,
.cmd_obj_cmp = _vt_cmd_obj_cmp_lnk_vlan, .cmd_obj_cmp = _vt_cmd_obj_cmp_lnk_vlan,
.cmd_obj_copy = _vt_cmd_obj_copy_lnk_vlan, .cmd_obj_copy = _vt_cmd_obj_copy_lnk_vlan,
.cmd_obj_dispose = _vt_cmd_obj_dispose_lnk_vlan, .cmd_obj_dispose = _vt_cmd_obj_dispose_lnk_vlan,
.cmd_obj_to_string = _vt_cmd_obj_to_string_lnk_vlan, .cmd_obj_to_string = _vt_cmd_obj_to_string_lnk_vlan,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_vlan_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_vlan_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_vlan_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_vlan_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_vlan_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_vlan_cmp,
}, },
[NMP_OBJECT_TYPE_LNK_VXLAN - 1] = { [NMP_OBJECT_TYPE_LNK_VXLAN - 1] = {
@@ -2722,7 +2680,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.obj_type_name = "vxlan", .obj_type_name = "vxlan",
.lnk_link_type = NM_LINK_TYPE_VXLAN, .lnk_link_type = NM_LINK_TYPE_VXLAN,
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_vxlan_to_string, .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_vxlan_to_string,
.cmd_plobj_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_lnk_vxlan_hash, .cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_vxlan_hash_update,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_vxlan_cmp, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_vxlan_cmp,
}, },
}; };

View File

@@ -115,7 +115,7 @@ typedef struct {
/* Only for NMPObjectLnk* types. */ /* Only for NMPObjectLnk* types. */
NMLinkType lnk_link_type; NMLinkType lnk_link_type;
guint (*cmd_obj_hash) (const NMPObject *obj); void (*cmd_obj_hash_update) (const NMPObject *obj, NMHashState *h);
int (*cmd_obj_cmp) (const NMPObject *obj1, const NMPObject *obj2); int (*cmd_obj_cmp) (const NMPObject *obj1, const NMPObject *obj2);
void (*cmd_obj_copy) (NMPObject *dst, const NMPObject *src); void (*cmd_obj_copy) (NMPObject *dst, const NMPObject *src);
void (*cmd_obj_dispose) (NMPObject *obj); void (*cmd_obj_dispose) (NMPObject *obj);
@@ -126,10 +126,10 @@ typedef struct {
/* functions that operate on NMPlatformObject */ /* functions that operate on NMPlatformObject */
void (*cmd_plobj_id_copy) (NMPlatformObject *dst, const NMPlatformObject *src); void (*cmd_plobj_id_copy) (NMPlatformObject *dst, const NMPlatformObject *src);
int (*cmd_plobj_id_cmp) (const NMPlatformObject *obj1, const NMPlatformObject *obj2); int (*cmd_plobj_id_cmp) (const NMPlatformObject *obj1, const NMPlatformObject *obj2);
guint (*cmd_plobj_id_hash) (const NMPlatformObject *obj); void (*cmd_plobj_id_hash_update) (const NMPlatformObject *obj, NMHashState *h);
const char *(*cmd_plobj_to_string_id) (const NMPlatformObject *obj, char *buf, gsize buf_size); const char *(*cmd_plobj_to_string_id) (const NMPlatformObject *obj, char *buf, gsize buf_size);
const char *(*cmd_plobj_to_string) (const NMPlatformObject *obj, char *buf, gsize len); const char *(*cmd_plobj_to_string) (const NMPlatformObject *obj, char *buf, gsize len);
guint (*cmd_plobj_hash) (const NMPlatformObject *obj); void (*cmd_plobj_hash_update) (const NMPlatformObject *obj, NMHashState *h);
int (*cmd_plobj_cmp) (const NMPlatformObject *obj1, const NMPlatformObject *obj2); int (*cmd_plobj_cmp) (const NMPlatformObject *obj1, const NMPlatformObject *obj2);
} NMPClass; } NMPClass;
@@ -469,13 +469,14 @@ const NMPObject *nmp_object_stackinit_id_ip4_address (NMPObject *obj, int ifinde
const NMPObject *nmp_object_stackinit_id_ip6_address (NMPObject *obj, int ifindex, const struct in6_addr *address); const NMPObject *nmp_object_stackinit_id_ip6_address (NMPObject *obj, int ifindex, const struct in6_addr *address);
const char *nmp_object_to_string (const NMPObject *obj, NMPObjectToStringMode to_string_mode, char *buf, gsize buf_size); const char *nmp_object_to_string (const NMPObject *obj, NMPObjectToStringMode to_string_mode, char *buf, gsize buf_size);
guint nmp_object_hash (const NMPObject *obj); void nmp_object_hash_update (const NMPObject *obj, NMHashState *h);
int nmp_object_cmp (const NMPObject *obj1, const NMPObject *obj2); int nmp_object_cmp (const NMPObject *obj1, const NMPObject *obj2);
gboolean nmp_object_equal (const NMPObject *obj1, const NMPObject *obj2); gboolean nmp_object_equal (const NMPObject *obj1, const NMPObject *obj2);
void nmp_object_copy (NMPObject *dst, const NMPObject *src, gboolean id_only); void nmp_object_copy (NMPObject *dst, const NMPObject *src, gboolean id_only);
NMPObject *nmp_object_clone (const NMPObject *obj, gboolean id_only); NMPObject *nmp_object_clone (const NMPObject *obj, gboolean id_only);
int nmp_object_id_cmp (const NMPObject *obj1, const NMPObject *obj2); int nmp_object_id_cmp (const NMPObject *obj1, const NMPObject *obj2);
void nmp_object_id_hash_update (const NMPObject *obj, NMHashState *h);
guint nmp_object_id_hash (const NMPObject *obj); guint nmp_object_id_hash (const NMPObject *obj);
static inline gboolean static inline gboolean