diff options
Diffstat (limited to 'src/nm-default-route-manager.c')
| -rw-r--r-- | src/nm-default-route-manager.c | 61 |
1 files changed, 55 insertions, 6 deletions
diff --git a/src/nm-default-route-manager.c b/src/nm-default-route-manager.c index e2c4eefe..3ee634a7 100644 --- a/src/nm-default-route-manager.c +++ b/src/nm-default-route-manager.c @@ -58,6 +58,10 @@ typedef struct { G_DEFINE_TYPE (NMDefaultRouteManager, nm_default_route_manager, G_TYPE_OBJECT) +NM_GOBJECT_PROPERTIES_DEFINE_BASE ( + PROP_PLATFORM, +); + NM_DEFINE_SINGLETON_GETTER (NMDefaultRouteManager, nm_default_route_manager_get, NM_TYPE_DEFAULT_ROUTE_MANAGER); #define _NMLOG_PREFIX_NAME "default-route" @@ -283,7 +287,7 @@ _platform_route_sync_add (const VTableIP *vtable, NMDefaultRouteManager *self, g return FALSE; if (vtable->vt->is_ip4) { - success = nm_platform_ip4_route_add (NM_PLATFORM_GET, + success = nm_platform_ip4_route_add (priv->platform, entry->route.rx.ifindex, entry->route.rx.source, 0, @@ -293,7 +297,7 @@ _platform_route_sync_add (const VTableIP *vtable, NMDefaultRouteManager *self, g entry->effective_metric, entry->route.rx.mss); } else { - success = nm_platform_ip6_route_add (NM_PLATFORM_GET, + success = nm_platform_ip6_route_add (priv->platform, entry->route.rx.ifindex, entry->route.rx.source, in6addr_any, @@ -319,7 +323,7 @@ _platform_route_sync_flush (const VTableIP *vtable, NMDefaultRouteManager *self, gboolean changed = FALSE; /* prune all other default routes from this device. */ - routes = vtable->vt->route_get_all (NM_PLATFORM_GET, 0, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT); + routes = vtable->vt->route_get_all (priv->platform, 0, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT); for (i = 0; i < routes->len; i++) { const NMPlatformIPRoute *route; @@ -351,7 +355,7 @@ _platform_route_sync_flush (const VTableIP *vtable, NMDefaultRouteManager *self, */ if ( !entry && (has_ifindex_synced || ifindex_to_flush == route->ifindex)) { - vtable->vt->route_delete_default (NM_PLATFORM_GET, route->ifindex, route->metric); + vtable->vt->route_delete_default (priv->platform, route->ifindex, route->metric); changed = TRUE; } } @@ -505,7 +509,7 @@ _resync_all (const VTableIP *vtable, NMDefaultRouteManager *self, const Entry *c entries = vtable->get_entries (priv); - routes = vtable->vt->route_get_all (NM_PLATFORM_GET, 0, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT); + routes = vtable->vt->route_get_all (priv->platform, 0, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT); assumed_metrics = _get_assumed_interface_metrics (vtable, self, routes); @@ -1381,20 +1385,54 @@ _platform_changed_cb (NMPlatform *platform, /***********************************************************************************/ static void +set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + NMDefaultRouteManager *self = NM_DEFAULT_ROUTE_MANAGER (object); + NMDefaultRouteManagerPrivate *priv = NM_DEFAULT_ROUTE_MANAGER_GET_PRIVATE (self); + + switch (prop_id) { + case PROP_PLATFORM: + /* construct-only */ + priv->platform = g_value_get_object (value) ? : NM_PLATFORM_GET; + if (!priv->platform) + g_return_if_reached (); + g_object_ref (priv->platform); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void nm_default_route_manager_init (NMDefaultRouteManager *self) { +} + +static void +constructed (GObject *object) +{ + NMDefaultRouteManager *self = NM_DEFAULT_ROUTE_MANAGER (object); NMDefaultRouteManagerPrivate *priv = NM_DEFAULT_ROUTE_MANAGER_GET_PRIVATE (self); priv->entries_ip4 = g_ptr_array_new_full (0, (GDestroyNotify) _entry_free); priv->entries_ip6 = g_ptr_array_new_full (0, (GDestroyNotify) _entry_free); - priv->platform = g_object_ref (NM_PLATFORM_GET); g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, G_CALLBACK (_platform_changed_cb), self); g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, G_CALLBACK (_platform_changed_cb), self); g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, G_CALLBACK (_platform_changed_cb), self); g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, G_CALLBACK (_platform_changed_cb), self); } +NMDefaultRouteManager * +nm_default_route_manager_new (NMPlatform *platform) +{ + return g_object_new (NM_TYPE_DEFAULT_ROUTE_MANAGER, + NM_DEFAULT_ROUTE_MANAGER_PLATFORM, platform, + NULL); +} + static void dispose (GObject *object) { @@ -1437,6 +1475,17 @@ nm_default_route_manager_class_init (NMDefaultRouteManagerClass *klass) g_type_class_add_private (klass, sizeof (NMDefaultRouteManagerPrivate)); /* virtual methods */ + object_class->constructed = constructed; object_class->dispose = dispose; + object_class->set_property = set_property; + + obj_properties[PROP_PLATFORM] = + g_param_spec_object (NM_DEFAULT_ROUTE_MANAGER_PLATFORM, "", "", + NM_TYPE_PLATFORM, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); + } |