summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-06-22 17:08:58 +0200
committerThomas Haller <thaller@redhat.com>2015-07-01 16:00:21 +0200
commit42664e87521eb2c04600b6f0399d49ebdca4b46a (patch)
tree3bd5e3bbaf10c2403d702fc71094b038f809cefd
parentd9dba6b6624cab655f3cf8a7bcb8734d938d801a (diff)
downloadNetworkManager-42664e87521eb2c04600b6f0399d49ebdca4b46a.tar.gz
platform: expose routes with "proto kernel" too
Also expose routes with "proto kernel". But add a flag to nm_platform_ipx_route_get_all() to hide them by default.
-rw-r--r--src/platform/nm-linux-platform.c34
-rw-r--r--src/platform/nm-platform.h2
-rw-r--r--src/platform/nmp-object.c2
3 files changed, 30 insertions, 8 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 7ea6450ab5..5f3125d34e 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -4245,19 +4245,39 @@ static GArray *
ipx_route_get_all (NMPlatform *platform, int ifindex, NMPObjectType obj_type, NMPlatformGetRouteFlags flags)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ NMPCacheId cache_id;
+ const NMPlatformIPRoute *const* routes;
+ GArray *array;
+ const NMPClass *klass;
+ gboolean with_rtprot_kernel;
+ guint i, len;
nm_assert (NM_IN_SET (obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE));
if (!NM_FLAGS_ANY (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT))
flags |= NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT;
- return nmp_cache_lookup_multi_to_array (priv->cache,
- obj_type,
- nmp_cache_id_init_routes_visible (NMP_CACHE_ID_STATIC,
- obj_type,
- NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT),
- NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT),
- ifindex));
+ klass = nmp_class_from_type (obj_type);
+
+ nmp_cache_id_init_routes_visible (&cache_id,
+ obj_type,
+ NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT),
+ NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT),
+ ifindex);
+
+ routes = (const NMPlatformIPRoute *const*) nmp_cache_lookup_multi (priv->cache, &cache_id, &len);
+
+ array = g_array_sized_new (FALSE, FALSE, klass->sizeof_public, len);
+
+ with_rtprot_kernel = NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_RTPROT_KERNEL);
+ for (i = 0; i < len; i++) {
+ nm_assert (NMP_OBJECT_GET_CLASS (NMP_OBJECT_UP_CAST (routes[i])) == klass);
+
+ if ( with_rtprot_kernel
+ || routes[i]->source != NM_IP_CONFIG_SOURCE_RTPROT_KERNEL)
+ g_array_append_vals (array, routes[i], 1);
+ }
+ return array;
}
static GArray *
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index 932ca5ea88..bdc8201269 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -158,6 +158,8 @@ typedef enum {
* both of them. */
NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT = (1LL << 0),
NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT = (1LL << 1),
+
+ NM_PLATFORM_GET_ROUTE_FLAGS_WITH_RTPROT_KERNEL = (1LL << 2),
} NMPlatformGetRouteFlags;
typedef struct {
diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c
index 0750fa7492..51684b93c7 100644
--- a/src/platform/nmp-object.c
+++ b/src/platform/nmp-object.c
@@ -786,7 +786,7 @@ _vt_cmd_obj_is_visible_ipx_route (const NMPObject *obj)
{
NMIPConfigSource source = obj->ip_route.source;
- return obj->object.ifindex > 0 && (source != NM_IP_CONFIG_SOURCE_RTPROT_KERNEL && source != _NM_IP_CONFIG_SOURCE_RTM_F_CLONED);
+ return obj->object.ifindex > 0 && source != _NM_IP_CONFIG_SOURCE_RTM_F_CLONED;
}
/******************************************************************/