mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-28 15:40:10 +01:00
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.
This commit is contained in:
parent
9440eefb6d
commit
6324b779b2
2 changed files with 27 additions and 79 deletions
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue