diff options
author | Thomas Haller <thaller@redhat.com> | 2015-06-22 17:08:58 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-07-01 16:00:21 +0200 |
commit | 42664e87521eb2c04600b6f0399d49ebdca4b46a (patch) | |
tree | 3bd5e3bbaf10c2403d702fc71094b038f809cefd | |
parent | d9dba6b6624cab655f3cf8a7bcb8734d938d801a (diff) | |
download | NetworkManager-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.c | 34 | ||||
-rw-r--r-- | src/platform/nm-platform.h | 2 | ||||
-rw-r--r-- | src/platform/nmp-object.c | 2 |
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; } /******************************************************************/ |