summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-06-26 17:30:32 +0200
committerThomas Haller <thaller@redhat.com>2017-07-05 18:37:38 +0200
commit6324b779b21edea016f337bd7dc93401353598d6 (patch)
tree45b3a7ff0526ce5e93613a7817c4cf970e45435e
parent9440eefb6dc4939752bf049d1669a0a4d37213c2 (diff)
downloadNetworkManager-6324b779b21edea016f337bd7dc93401353598d6.tar.gz
platform: merge NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_*_DEFAULT indexes
Maintaining an index is expensive. We can merge indexes that are strictly distinct, because one index can just partition the objects into distinct sets.
-rw-r--r--src/platform/nmp-object.c94
-rw-r--r--src/platform/nmp-object.h12
2 files changed, 27 insertions, 79 deletions
diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c
index c63d3f2c51..5e3a9bf68e 100644
--- a/src/platform/nmp-object.c
+++ b/src/platform/nmp-object.c
@@ -190,38 +190,20 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
}
return 1;
- case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT:
+ case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT:
if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE,
NMP_OBJECT_TYPE_IP6_ROUTE)
- || NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route)
|| !nmp_object_is_visible (obj_a))
return 0;
if (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)
- && nmp_object_is_visible (obj_b);
- }
- if (request_hash) {
- h = (guint) idx_type->cache_id_type;
- h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a));
- return _HASH_NON_ZERO (h);
- }
- return 1;
-
- case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT:
- if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE,
- NMP_OBJECT_TYPE_IP6_ROUTE)
- || !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route)
- || !nmp_object_is_visible (obj_a))
- return 0;
- if (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_a->ip_route) == NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route)
&& nmp_object_is_visible (obj_b);
}
if (request_hash) {
h = (guint) idx_type->cache_id_type;
h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a));
+ h = NM_HASH_COMBINE (h, NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route));
return _HASH_NON_ZERO (h);
}
return 1;
@@ -247,41 +229,21 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
}
return 1;
- case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT:
+ case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT:
if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)
- || NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route)
|| obj_a->object.ifindex <= 0
|| !nmp_object_is_visible (obj_a))
return 0;
if (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)
- && obj_a->object.ifindex == obj_b->object.ifindex
- && nmp_object_is_visible (obj_b);
- }
- if (request_hash) {
- h = (guint) idx_type->cache_id_type;
- h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a));
- h = NM_HASH_COMBINE (h, obj_a->object.ifindex);
- return _HASH_NON_ZERO (h);
- }
- return 1;
-
- case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT:
- if ( !NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_a), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)
- || !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route)
- || obj_a->object.ifindex <= 0
- || !nmp_object_is_visible (obj_a))
- return 0;
- if (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)
&& obj_a->object.ifindex == obj_b->object.ifindex
+ && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route) == NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_b->ip_route)
&& nmp_object_is_visible (obj_b);
}
if (request_hash) {
h = (guint) idx_type->cache_id_type;
h = NM_HASH_COMBINE (h, NMP_OBJECT_GET_TYPE (obj_a));
+ h = NM_HASH_COMBINE (h, NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj_a->ip_route));
h = NM_HASH_COMBINE (h, obj_a->object.ifindex);
return _HASH_NON_ZERO (h);
}
@@ -1360,10 +1322,8 @@ static const guint8 _supported_cache_ids_ip4_route[] = {
NMP_CACHE_ID_TYPE_OBJECT_TYPE,
NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY,
NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT,
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT,
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT,
NMP_CACHE_ID_TYPE_ROUTES_BY_DESTINATION_IP4,
0,
};
@@ -1372,10 +1332,8 @@ static const guint8 _supported_cache_ids_ip6_route[] = {
NMP_CACHE_ID_TYPE_OBJECT_TYPE,
NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY,
NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT,
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT,
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT,
NMP_CACHE_ID_TYPE_ROUTES_BY_DESTINATION_IP6,
0,
};
@@ -1736,28 +1694,18 @@ nmp_lookup_init_route_visible (NMPLookup *lookup,
ifindex,
TRUE);
}
- o = _nmp_object_stackinit_from_type (&lookup->selector_obj, obj_type);
- if (ifindex <= 0) {
- o->object.ifindex = 1;
- lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT;
- } else {
- o->object.ifindex = ifindex;
- lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT;
- }
- return _L (lookup);
- } else if (with_non_default) {
- o = _nmp_object_stackinit_from_type (&lookup->selector_obj, obj_type);
- o->ip_route.plen = 1;
- if (ifindex <= 0) {
- o->object.ifindex = 1;
- lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT;
- } else {
- o->object.ifindex = ifindex;
- lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT;
- }
- return _L (lookup);
- } else
+ } else if (!with_non_default)
g_return_val_if_reached (NULL);
+ o = _nmp_object_stackinit_from_type (&lookup->selector_obj, obj_type);
+ o->ip_route.plen = with_default ? 0 : 1;
+ if (ifindex <= 0) {
+ o->object.ifindex = 1;
+ lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT;
+ } else {
+ o->object.ifindex = ifindex;
+ lookup->cache_id_type = NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT;
+ }
+ return _L (lookup);
}
const NMPLookup *
diff --git a/src/platform/nmp-object.h b/src/platform/nmp-object.h
index b63a96e043..efdc7781af 100644
--- a/src/platform/nmp-object.h
+++ b/src/platform/nmp-object.h
@@ -75,16 +75,16 @@ typedef enum { /*< skip >*/
/* all the visible objects of a certain type */
NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY,
- /* indeces for the visible routes, ignoring ifindex. */
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT,
+ /* indeces for the visible routes, ignoring ifindex.
+ * The index separates default routes from non-default routes. */
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT,
/* all the visible addresses/routes (by object-type) for an ifindex. */
NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX,
- /* indeces for the visible routes, per ifindex. */
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT,
- NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT,
+ /* indeces for the visible routes, per ifindex.
+ * The index separates default routes from non-default routes. */
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT,
/* Consider all the destination fields of a route, that is, the ID without the ifindex
* and gateway (meaning: network/plen,metric).