diff options
author | Thomas Haller <thaller@redhat.com> | 2017-06-12 18:39:53 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-07-05 14:22:10 +0200 |
commit | 6d9c3eab385fa809996a41bceb923e353addab37 (patch) | |
tree | adef74b0c5821483279d7ab50284467ad5a69db2 | |
parent | f9202c2ac120152f047845f859bac22759e634f3 (diff) | |
download | NetworkManager-6d9c3eab385fa809996a41bceb923e353addab37.tar.gz |
platform: let NMPObject implement NMDedupIndexObj
-rw-r--r-- | src/nm-core-utils.c | 13 | ||||
-rw-r--r-- | src/nm-core-utils.h | 2 | ||||
-rw-r--r-- | src/platform/nm-platform.c | 102 | ||||
-rw-r--r-- | src/platform/nm-platform.h | 5 | ||||
-rw-r--r-- | src/platform/nmp-object.c | 109 | ||||
-rw-r--r-- | src/platform/nmp-object.h | 8 | ||||
-rw-r--r-- | src/platform/tests/test-nmp-object.c | 11 |
7 files changed, 228 insertions, 22 deletions
diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index 8b330a5a0d..81a58ad3ab 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -190,6 +190,19 @@ nm_utils_exp10 (gint16 ex) /*****************************************************************************/ +guint +nm_utils_in6_addr_hash (const struct in6_addr *addr) +{ + guint hash = (guint) 0x897da53981a13ULL; + int i; + + for (i = 0; i < sizeof (*addr); i++) + hash = NM_HASH_COMBINE (hash, ((const guint8 *) addr)[i]); + return hash; +} + +/*****************************************************************************/ + /* * 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 51a0c9cff7..f621393460 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -109,6 +109,8 @@ extern const NMIPAddr nm_ip_addr_zero; /*****************************************************************************/ +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); diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index a1a7888976..7cc582e863 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -4290,6 +4290,26 @@ nm_platform_lnk_vxlan_cmp (const NMPlatformLnkVxlan *a, const NMPlatformLnkVxlan return 0; } +guint +nm_platform_ip4_address_hash (const NMPlatformIP4Address *obj) +{ + guint h = 469681301; + + if (obj) { + h = NM_HASH_COMBINE (h, obj->ifindex); + h = NM_HASH_COMBINE (h, obj->address); + h = NM_HASH_COMBINE (h, obj->plen); + h = NM_HASH_COMBINE (h, obj->peer_address); + h = NM_HASH_COMBINE (h, obj->addr_source); + h = NM_HASH_COMBINE (h, obj->timestamp); + h = NM_HASH_COMBINE (h, obj->lifetime); + h = NM_HASH_COMBINE (h, obj->preferred); + h = NM_HASH_COMBINE (h, obj->n_ifa_flags); + h = NM_HASH_COMBINE (h, g_str_hash (obj->label)); + } + return h; +} + int nm_platform_ip4_address_cmp (const NMPlatformIP4Address *a, const NMPlatformIP4Address *b) { @@ -4307,6 +4327,25 @@ nm_platform_ip4_address_cmp (const NMPlatformIP4Address *a, const NMPlatformIP4A return 0; } +guint +nm_platform_ip6_address_hash (const NMPlatformIP6Address *obj) +{ + guint h = 605908909; + + if (obj) { + h = NM_HASH_COMBINE (h, obj->ifindex); + h = NM_HASH_COMBINE (h, nm_utils_in6_addr_hash (&obj->address)); + h = NM_HASH_COMBINE (h, obj->plen); + h = NM_HASH_COMBINE (h, nm_utils_in6_addr_hash (&obj->peer_address)); + h = NM_HASH_COMBINE (h, obj->addr_source); + h = NM_HASH_COMBINE (h, obj->timestamp); + h = NM_HASH_COMBINE (h, obj->lifetime); + h = NM_HASH_COMBINE (h, obj->preferred); + h = NM_HASH_COMBINE (h, obj->n_ifa_flags); + } + return h; +} + int nm_platform_ip6_address_cmp (const NMPlatformIP6Address *a, const NMPlatformIP6Address *b) { @@ -4327,6 +4366,37 @@ nm_platform_ip6_address_cmp (const NMPlatformIP6Address *a, const NMPlatformIP6A return 0; } +guint +nm_platform_ip4_route_hash (const NMPlatformIP4Route *obj) +{ + guint h = 1228913327; + + if (obj) { + h = NM_HASH_COMBINE (h, obj->ifindex); + h = NM_HASH_COMBINE (h, obj->network); + h = NM_HASH_COMBINE (h, obj->plen); + h = NM_HASH_COMBINE (h, obj->metric); + h = NM_HASH_COMBINE (h, obj->gateway); + h = NM_HASH_COMBINE (h, obj->rt_source); + h = NM_HASH_COMBINE (h, obj->mss); + h = NM_HASH_COMBINE (h, obj->scope_inv); + h = NM_HASH_COMBINE (h, obj->pref_src); + h = NM_HASH_COMBINE (h, obj->rt_cloned); + h = NM_HASH_COMBINE (h, obj->tos); + h = NM_HASH_COMBINE (h, obj->lock_window); + h = NM_HASH_COMBINE (h, obj->lock_cwnd); + h = NM_HASH_COMBINE (h, obj->lock_initcwnd); + h = NM_HASH_COMBINE (h, obj->lock_initrwnd); + h = NM_HASH_COMBINE (h, obj->lock_mtu); + h = NM_HASH_COMBINE (h, obj->window); + h = NM_HASH_COMBINE (h, obj->cwnd); + h = NM_HASH_COMBINE (h, obj->initcwnd); + h = NM_HASH_COMBINE (h, obj->initrwnd); + h = NM_HASH_COMBINE (h, obj->mtu); + } + return h; +} + int nm_platform_ip4_route_cmp_full (const NMPlatformIP4Route *a, const NMPlatformIP4Route *b, gboolean consider_host_part) { @@ -4360,6 +4430,38 @@ nm_platform_ip4_route_cmp_full (const NMPlatformIP4Route *a, const NMPlatformIP4 return 0; } +guint +nm_platform_ip6_route_hash (const NMPlatformIP6Route *obj) +{ + guint h = 1053326051; + + if (obj) { + h = NM_HASH_COMBINE (h, obj->ifindex); + h = NM_HASH_COMBINE (h, nm_utils_in6_addr_hash (&obj->network)); + h = NM_HASH_COMBINE (h, obj->plen); + h = NM_HASH_COMBINE (h, obj->metric); + h = NM_HASH_COMBINE (h, nm_utils_in6_addr_hash (&obj->gateway)); + h = NM_HASH_COMBINE (h, nm_utils_in6_addr_hash (&obj->pref_src)); + h = NM_HASH_COMBINE (h, nm_utils_in6_addr_hash (&obj->src)); + h = NM_HASH_COMBINE (h, obj->src_plen); + h = NM_HASH_COMBINE (h, obj->rt_source); + h = NM_HASH_COMBINE (h, obj->mss); + h = NM_HASH_COMBINE (h, obj->rt_cloned); + h = NM_HASH_COMBINE (h, obj->tos); + h = NM_HASH_COMBINE (h, obj->lock_window); + h = NM_HASH_COMBINE (h, obj->lock_cwnd); + h = NM_HASH_COMBINE (h, obj->lock_initcwnd); + h = NM_HASH_COMBINE (h, obj->lock_initrwnd); + h = NM_HASH_COMBINE (h, obj->lock_mtu); + h = NM_HASH_COMBINE (h, obj->window); + h = NM_HASH_COMBINE (h, obj->cwnd); + h = NM_HASH_COMBINE (h, obj->initcwnd); + h = NM_HASH_COMBINE (h, obj->initrwnd); + h = NM_HASH_COMBINE (h, obj->mtu); + } + return h; +} + int nm_platform_ip6_route_cmp_full (const NMPlatformIP6Route *a, const NMPlatformIP6Route *b, gboolean consider_host_part) { diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index 97c8f6ccf2..b7dcb4caca 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -1024,6 +1024,11 @@ nm_platform_ip6_route_cmp (const NMPlatformIP6Route *a, const NMPlatformIP6Route return nm_platform_ip6_route_cmp_full (a, b, TRUE); } +guint nm_platform_ip4_address_hash (const NMPlatformIP4Address *obj); +guint nm_platform_ip6_address_hash (const NMPlatformIP6Address *obj); +guint nm_platform_ip4_route_hash (const NMPlatformIP4Route *obj); +guint nm_platform_ip6_route_hash (const NMPlatformIP6Route *obj); + gboolean nm_platform_check_support_kernel_extended_ifa_flags (NMPlatform *self); gboolean nm_platform_check_support_user_ipv6ll (NMPlatform *self); diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c index 4bf2b9f8fd..751160f6f3 100644 --- a/src/platform/nmp-object.c +++ b/src/platform/nmp-object.c @@ -74,17 +74,6 @@ struct _NMPCache { /*****************************************************************************/ -static inline guint -_id_hash_ip6_addr (const struct in6_addr *addr) -{ - guint hash = (guint) 0x897da53981a13ULL; - int i; - - for (i = 0; i < sizeof (*addr); i++) - hash = NM_HASH_COMBINE (hash, ((const guint8 *) addr)[i]); - return hash; -} - static int _vlan_xgress_qos_mappings_cmp (guint n_map, const NMVlanQosMapping *map1, @@ -566,6 +555,37 @@ _vt_cmd_plobj_to_string_id (ip6_address, NMPlatformIP6Address, "%d: %s", _vt_cmd_plobj_to_string_id (ip4_route, NMPlatformIP4Route, "%d: %s/%d %d", obj->ifindex, nm_utils_inet4_ntop ( obj->network, buf1), obj->plen, obj->metric); _vt_cmd_plobj_to_string_id (ip6_route, NMPlatformIP6Route, "%d: %s/%d %d", obj->ifindex, nm_utils_inet6_ntop (&obj->network, buf1), obj->plen, obj->metric); +guint +nmp_object_hash (const NMPObject *obj) +{ + const NMPClass *klass; + + if (!obj) + return 0; + + g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj), 0); + + klass = NMP_OBJECT_GET_CLASS (obj); + + if (klass->cmd_obj_hash) + return klass->cmd_obj_hash (obj); + if (klass->cmd_plobj_hash) + return klass->cmd_plobj_hash (&obj->object); + return GPOINTER_TO_UINT (obj); +} + +static guint +_vt_cmd_obj_hash_not_implemented (const NMPObject *obj) +{ + g_return_val_if_reached (0); +} + +static guint +_vt_cmd_plobj_hash_not_implemented (const NMPlatformObject *obj) +{ + g_return_val_if_reached (0); +} + int nmp_object_cmp (const NMPObject *obj1, const NMPObject *obj2) { @@ -860,7 +880,7 @@ _vt_cmd_plobj_id_hash (ip6_address, NMPlatformIP6Address, { hash = (guint) 2907861637u; hash = hash + ((guint) obj->ifindex); /* for IPv6 addresses, the prefix length is not part of the primary identifier. */ - hash = NM_HASH_COMBINE (hash, _id_hash_ip6_addr (&obj->address)); + hash = NM_HASH_COMBINE (hash, nm_utils_in6_addr_hash (&obj->address)); }) _vt_cmd_plobj_id_hash (ip4_route, NMPlatformIP4Route, { hash = (guint) 2569857221u; @@ -877,7 +897,7 @@ _vt_cmd_plobj_id_hash (ip6_route, NMPlatformIP6Route, { hash = NM_HASH_COMBINE (hash, ({ struct in6_addr n1; - _id_hash_ip6_addr (nm_utils_ip6_address_clear_host_address (&n1, &obj->network, obj->plen)); + nm_utils_in6_addr_hash (nm_utils_ip6_address_clear_host_address (&n1, &obj->network, obj->plen)); })); }) @@ -1306,6 +1326,48 @@ _vt_cmd_obj_init_cache_id_ipx_route (const NMPObject *obj, NMPCacheIdType id_typ /*****************************************************************************/ +static NMDedupMultiObj * +_vt_dedup_obj_get_ref (const NMDedupMultiObj *obj) +{ + NMPObject *o = (NMPObject *) obj; + + if (NMP_OBJECT_IS_STACKINIT (o)) { + return (NMDedupMultiObj *) nmp_object_new (NMP_OBJECT_GET_TYPE (o), + &o->object); + } + return (NMDedupMultiObj *) nmp_object_ref (o); +} + +static void +_vt_dedup_obj_put_ref (NMDedupMultiObj *obj) +{ + nmp_object_unref ((NMPObject *) obj); +} + +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() \ + { \ + .obj_get_ref = _vt_dedup_obj_get_ref, \ + .obj_put_ref = _vt_dedup_obj_put_ref, \ + .obj_full_hash = _vt_dedup_obj_full_hash, \ + .obj_full_equal = _vt_dedup_obj_full_equal, \ + } + +/*****************************************************************************/ + gboolean nmp_cache_use_udev_get (const NMPCache *cache) { @@ -2115,6 +2177,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .signal_type = NM_PLATFORM_SIGNAL_LINK_CHANGED, .supported_cache_ids = _supported_cache_ids_link, .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_link, + .cmd_obj_hash = _vt_cmd_obj_hash_not_implemented, .cmd_obj_cmp = _vt_cmd_obj_cmp_link, .cmd_obj_copy = _vt_cmd_obj_copy_link, .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_link, @@ -2127,9 +2190,11 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_link_cmp, }, [NMP_OBJECT_TYPE_IP4_ADDRESS - 1] = { + .parent = DEDUP_MULTI_OBJ_CLASS_INIT(), .obj_type = NMP_OBJECT_TYPE_IP4_ADDRESS, .sizeof_data = sizeof (NMPObjectIP4Address), .sizeof_public = sizeof (NMPlatformIP4Address), @@ -2147,9 +2212,11 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_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_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_ip4_address_hash, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip4_address_cmp, }, [NMP_OBJECT_TYPE_IP6_ADDRESS - 1] = { + .parent = DEDUP_MULTI_OBJ_CLASS_INIT(), .obj_type = NMP_OBJECT_TYPE_IP6_ADDRESS, .sizeof_data = sizeof (NMPObjectIP6Address), .sizeof_public = sizeof (NMPlatformIP6Address), @@ -2167,9 +2234,11 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_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_hash = (guint (*) (const NMPlatformObject *obj)) nm_platform_ip6_address_hash, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_address_cmp }, [NMP_OBJECT_TYPE_IP4_ROUTE - 1] = { + .parent = DEDUP_MULTI_OBJ_CLASS_INIT(), .obj_type = NMP_OBJECT_TYPE_IP4_ROUTE, .sizeof_data = sizeof (NMPObjectIP4Route), .sizeof_public = sizeof (NMPlatformIP4Route), @@ -2187,9 +2256,11 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip4_route, .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip4_route, .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, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip4_route_cmp, }, [NMP_OBJECT_TYPE_IP6_ROUTE - 1] = { + .parent = DEDUP_MULTI_OBJ_CLASS_INIT(), .obj_type = NMP_OBJECT_TYPE_IP6_ROUTE, .sizeof_data = sizeof (NMPObjectIP6Route), .sizeof_public = sizeof (NMPlatformIP6Route), @@ -2207,6 +2278,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip6_route, .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip6_route, .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, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_route_cmp, }, [NMP_OBJECT_TYPE_LNK_GRE - 1] = { @@ -2216,6 +2288,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_gre_cmp, }, [NMP_OBJECT_TYPE_LNK_INFINIBAND - 1] = { @@ -2225,6 +2298,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_infiniband_cmp, }, [NMP_OBJECT_TYPE_LNK_IP6TNL - 1] = { @@ -2234,6 +2308,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ip6tnl_cmp, }, [NMP_OBJECT_TYPE_LNK_IPIP - 1] = { @@ -2243,6 +2318,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ipip_cmp, }, [NMP_OBJECT_TYPE_LNK_MACSEC - 1] = { @@ -2252,6 +2328,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macsec_cmp, }, [NMP_OBJECT_TYPE_LNK_MACVLAN - 1] = { @@ -2261,6 +2338,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macvlan_cmp, }, [NMP_OBJECT_TYPE_LNK_MACVTAP - 1] = { @@ -2270,6 +2348,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_macvlan_cmp, }, [NMP_OBJECT_TYPE_LNK_SIT - 1] = { @@ -2279,6 +2358,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_sit_cmp, }, [NMP_OBJECT_TYPE_LNK_VLAN - 1] = { @@ -2287,11 +2367,13 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .sizeof_public = sizeof (NMPlatformLnkVlan), .obj_type_name = "vlan", .lnk_link_type = NM_LINK_TYPE_VLAN, + .cmd_obj_hash = _vt_cmd_obj_hash_not_implemented, .cmd_obj_cmp = _vt_cmd_obj_cmp_lnk_vlan, .cmd_obj_copy = _vt_cmd_obj_copy_lnk_vlan, .cmd_obj_dispose = _vt_cmd_obj_dispose_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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_vlan_cmp, }, [NMP_OBJECT_TYPE_LNK_VXLAN - 1] = { @@ -2301,6 +2383,7 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = { .obj_type_name = "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_hash = _vt_cmd_plobj_hash_not_implemented, .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_vxlan_cmp, }, }; diff --git a/src/platform/nmp-object.h b/src/platform/nmp-object.h index a21d6fd192..7664a43817 100644 --- a/src/platform/nmp-object.h +++ b/src/platform/nmp-object.h @@ -22,6 +22,7 @@ #define __NMP_OBJECT_H__ #include "nm-utils/nm-obj.h" +#include "nm-utils/nm-dedup-multi.h" #include "nm-platform.h" #include "nm-multi-index.h" @@ -139,7 +140,7 @@ struct _NMPCacheId { }; typedef struct { - NMObjBaseClass parent; + NMDedupMultiObjClass parent; const char *obj_type_name; int sizeof_data; int sizeof_public; @@ -158,6 +159,7 @@ typedef struct { * initialize @id and set @out_id to it. Otherwise, @out_id is NULL. */ gboolean (*cmd_obj_init_cache_id) (const NMPObject *obj, NMPCacheIdType id_type, NMPCacheId *id, const NMPCacheId **out_id); + guint (*cmd_obj_hash) (const NMPObject *obj); int (*cmd_obj_cmp) (const NMPObject *obj1, const NMPObject *obj2); void (*cmd_obj_copy) (NMPObject *dst, const NMPObject *src); void (*cmd_obj_stackinit_id) (NMPObject *obj, const NMPObject *src); @@ -172,6 +174,7 @@ typedef struct { guint (*cmd_plobj_id_hash) (const NMPlatformObject *obj); 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); + guint (*cmd_plobj_hash) (const NMPlatformObject *obj); int (*cmd_plobj_cmp) (const NMPlatformObject *obj1, const NMPlatformObject *obj2); } NMPClass; @@ -269,7 +272,7 @@ typedef struct { struct _NMPObject { union { - NMObjBaseInst parent; + NMDedupMultiObj parent; const NMPClass *_class; }; guint _ref_count; @@ -398,6 +401,7 @@ const NMPObject *nmp_object_stackinit_id_ip4_route (NMPObject *obj, int ifindex, const NMPObject *nmp_object_stackinit_id_ip6_route (NMPObject *obj, int ifindex, const struct in6_addr *network, guint8 plen, guint32 metric); 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); int nmp_object_cmp (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); diff --git a/src/platform/tests/test-nmp-object.c b/src/platform/tests/test-nmp-object.c index adc006e6f2..300a0cb464 100644 --- a/src/platform/tests/test-nmp-object.c +++ b/src/platform/tests/test-nmp-object.c @@ -59,18 +59,15 @@ test_obj_base (void) STATIC_ASSERT (sizeof (o->parent) == sizeof (GTypeInstance)); STATIC_ASSERT (&c->parent == (void *) c); - STATIC_ASSERT (&c->parent.g_type_class == (void *) c); - STATIC_ASSERT (&c->parent.g_type == (void *) c); - STATIC_ASSERT (&c->parent.g_type == &k->g_type); + STATIC_ASSERT (&c->parent.parent.g_type_class == (void *) c); + STATIC_ASSERT (&c->parent.parent.g_type == (void *) c); + STATIC_ASSERT (&c->parent.parent.g_type == &k->g_type); - STATIC_ASSERT (sizeof (c->parent) == sizeof (GTypeClass)); + STATIC_ASSERT (sizeof (c->parent.parent) == sizeof (GTypeClass)); STATIC_ASSERT (&o->parent == (void *) o); STATIC_ASSERT (&o->parent.klass == (void *) &o->_class); - STATIC_ASSERT (G_STRUCT_OFFSET (NMPObject, _ref_count) == sizeof (NMObjBaseInst)); - STATIC_ASSERT (G_STRUCT_OFFSET (NMPClass, obj_type_name) == sizeof (NMObjBaseClass)); - obj = (NMObjBaseInst *) obj_cancellable; g_assert (!NMP_CLASS_IS_VALID ((NMPClass *) obj->klass)); g_assert (G_TYPE_CHECK_INSTANCE_TYPE (obj, G_TYPE_CANCELLABLE)); |