diff options
author | Thomas Haller <thaller@redhat.com> | 2015-03-25 11:49:38 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-04-08 14:39:16 +0200 |
commit | 110200d5d45baba17a98315c9f3627b40002935f (patch) | |
tree | dca46303c2abd346150d5a25090d4e55d909bfa4 | |
parent | 290faa003db0aac8686bd6d624c782a4a35523c5 (diff) | |
download | NetworkManager-110200d5d45baba17a98315c9f3627b40002935f.tar.gz |
default-route-manager: use NMPlatformVTableRoute
-rw-r--r-- | src/nm-default-route-manager.c | 108 |
1 files changed, 38 insertions, 70 deletions
diff --git a/src/nm-default-route-manager.c b/src/nm-default-route-manager.c index 27b5d783a9..2c0d294bab 100644 --- a/src/nm-default-route-manager.c +++ b/src/nm-default-route-manager.c @@ -141,22 +141,16 @@ typedef struct { } Entry; typedef struct { - int addr_family; + const NMPlatformVTableRoute *vt; GPtrArray *(*get_entries) (NMDefaultRouteManagerPrivate *priv); - const char *(*platform_route_to_string) (const NMPlatformIPRoute *route); - GArray *(*platform_route_get_all) (int ifindex, NMPlatformGetRouteMode mode); - gboolean (*platform_route_delete_default) (int ifindex, guint32 metric); - guint32 (*route_metric_normalize) (guint32 metric); } VTableIP; static const VTableIP vtable_ip4, vtable_ip6; -#define VTABLE_IS_IP4 (vtable->addr_family == AF_INET) - static NMPlatformIPRoute * _vt_route_index (const VTableIP *vtable, GArray *routes, guint index) { - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) return (NMPlatformIPRoute *) &g_array_index (routes, NMPlatformIP4Route, index); else return (NMPlatformIPRoute *) &g_array_index (routes, NMPlatformIP6Route, index); @@ -170,7 +164,7 @@ _vt_routes_has_entry (const VTableIP *vtable, GArray *routes, const Entry *entry route.rx.metric = entry->effective_metric; - if (VTABLE_IS_IP4) { + if (vtable->vt->is_ip4) { for (i = 0; i < routes->len; i++) { NMPlatformIP4Route *r = &g_array_index (routes, NMPlatformIP4Route, i); @@ -260,7 +254,7 @@ _platform_route_sync_add (const VTableIP *vtable, NMDefaultRouteManager *self, g if (!entry) return FALSE; - if (VTABLE_IS_IP4) { + if (vtable->vt->is_ip4) { success = nm_platform_ip4_route_add (entry->route.rx.ifindex, entry->route.rx.source, 0, @@ -279,8 +273,8 @@ _platform_route_sync_add (const VTableIP *vtable, NMDefaultRouteManager *self, g entry->route.rx.mss); } if (!success) { - _LOGW (vtable->addr_family, "failed to add default route %s with effective metric %u", - vtable->platform_route_to_string (&entry->route.rx), (guint) entry->effective_metric); + _LOGW (vtable->vt->addr_family, "failed to add default route %s with effective metric %u", + vtable->vt->route_to_string (&entry->route), (guint) entry->effective_metric); } return TRUE; } @@ -295,7 +289,7 @@ _platform_route_sync_flush (const VTableIP *vtable, NMDefaultRouteManager *self, gboolean changed = FALSE; /* prune all other default routes from this device. */ - routes = vtable->platform_route_get_all (0, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT); + routes = vtable->vt->route_get_all (0, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT); for (i = 0; i < routes->len; i++) { const NMPlatformIPRoute *route; @@ -327,7 +321,7 @@ _platform_route_sync_flush (const VTableIP *vtable, NMDefaultRouteManager *self, */ if ( !entry && (has_ifindex_synced || ifindex_to_flush == route->ifindex)) { - vtable->platform_route_delete_default (route->ifindex, route->metric); + vtable->vt->route_delete_default (route->ifindex, route->metric); changed = TRUE; } } @@ -411,7 +405,7 @@ _get_assumed_interface_metrics (const VTableIP *vtable, NMDefaultRouteManager *s } if (!ifindex_has_synced_entry) - g_hash_table_add (result, GUINT_TO_POINTER (vtable->route_metric_normalize (route->metric))); + g_hash_table_add (result, GUINT_TO_POINTER (vtable->vt->metric_normalize (route->metric))); } return result; @@ -447,7 +441,7 @@ _resync_all (const VTableIP *vtable, NMDefaultRouteManager *self, const Entry *c priv->resync.guard++; if (!external_change) { - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) priv->resync.has_v4_changes = FALSE; else priv->resync.has_v6_changes = FALSE; @@ -457,7 +451,7 @@ _resync_all (const VTableIP *vtable, NMDefaultRouteManager *self, const Entry *c entries = vtable->get_entries (priv); - routes = vtable->platform_route_get_all (0, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT); + routes = vtable->vt->route_get_all (0, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT); assumed_metrics = _get_assumed_interface_metrics (vtable, self, routes); @@ -527,24 +521,24 @@ _resync_all (const VTableIP *vtable, NMDefaultRouteManager *self, const Entry *c * or none. Hence, we only have to remember what is going to change. */ g_array_append_val (changed_metrics, expected_metric); if (old_entry) { - _LOGD (vtable->addr_family, LOG_ENTRY_FMT": update %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry), - vtable->platform_route_to_string (&entry->route.rx), (guint) old_entry->effective_metric, + _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": update %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry), + vtable->vt->route_to_string (&entry->route), (guint) old_entry->effective_metric, (guint) expected_metric); } else { - _LOGD (vtable->addr_family, LOG_ENTRY_FMT": add %s (%u)", LOG_ENTRY_ARGS (i, entry), - vtable->platform_route_to_string (&entry->route.rx), (guint) expected_metric); + _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": add %s (%u)", LOG_ENTRY_ARGS (i, entry), + vtable->vt->route_to_string (&entry->route), (guint) expected_metric); } } else if (entry->effective_metric != expected_metric) { g_array_append_val (changed_metrics, entry->effective_metric); g_array_append_val (changed_metrics, expected_metric); - _LOGD (vtable->addr_family, LOG_ENTRY_FMT": resync metric %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry), - vtable->platform_route_to_string (&entry->route.rx), (guint) entry->effective_metric, + _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": resync metric %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry), + vtable->vt->route_to_string (&entry->route), (guint) entry->effective_metric, (guint) expected_metric); } else { if (!_vt_routes_has_entry (vtable, routes, entry)) { g_array_append_val (changed_metrics, entry->effective_metric); - _LOGD (vtable->addr_family, LOG_ENTRY_FMT": readd route %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry), - vtable->platform_route_to_string (&entry->route.rx), (guint) entry->effective_metric, + _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": readd route %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry), + vtable->vt->route_to_string (&entry->route), (guint) entry->effective_metric, (guint) entry->effective_metric); } } @@ -608,10 +602,10 @@ _entry_at_idx_update (const VTableIP *vtable, NMDefaultRouteManager *self, guint if (!entry->synced && !entry->never_default) entry->effective_metric = entry->route.rx.metric; - _LOGD (vtable->addr_family, LOG_ENTRY_FMT": %s %s", + _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": %s %s", LOG_ENTRY_ARGS (entry_idx, entry), old_entry ? "update" : "add", - vtable->platform_route_to_string (&entry->route.rx)); + vtable->vt->route_to_string (&entry->route)); g_ptr_array_sort_with_data (entries, _sort_entries_cmp, NULL); @@ -631,8 +625,8 @@ _entry_at_idx_remove (const VTableIP *vtable, NMDefaultRouteManager *self, guint entry = g_ptr_array_index (entries, entry_idx); - _LOGD (vtable->addr_family, LOG_ENTRY_FMT": remove %s (%u)", LOG_ENTRY_ARGS (entry_idx, entry), - vtable->platform_route_to_string (&entry->route.rx), (guint) entry->effective_metric); + _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": remove %s (%u)", LOG_ENTRY_ARGS (entry_idx, entry), + vtable->vt->route_to_string (&entry->route), (guint) entry->effective_metric); /* Remove the entry from the list (but don't free it yet) */ g_ptr_array_index (entries, entry_idx) = NULL; @@ -692,7 +686,7 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, if ( entry && entry->route.rx.ifindex != ip_ifindex) { /* Strange... the ifindex changed... Remove the device and start again. */ - _LOGD (vtable->addr_family, "ifindex of "LOG_ENTRY_FMT" changed: %d -> %d", + _LOGD (vtable->vt->addr_family, "ifindex of "LOG_ENTRY_FMT" changed: %d -> %d", LOG_ENTRY_ARGS (entry_idx, entry), entry->route.rx.ifindex, ip_ifindex); @@ -709,7 +703,7 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, if (device) { gboolean is_assumed; - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) default_route = (const NMPlatformIPRoute *) nm_device_get_ip4_default_route (device, &is_assumed); else default_route = (const NMPlatformIPRoute *) nm_device_get_ip6_default_route (device, &is_assumed); @@ -737,7 +731,7 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, && nm_vpn_connection_get_vpn_state (vpn) == NM_VPN_CONNECTION_STATE_ACTIVATED) { memset (&rt, 0, sizeof (rt)); - if (VTABLE_IS_IP4) { + if (vtable->vt->is_ip4) { NMIP4Config *vpn_config; vpn_config = nm_vpn_connection_get_ip4_config (vpn); @@ -779,13 +773,13 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, entry = g_slice_new0 (Entry); entry->source.object = g_object_ref (source); - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) entry->route.r4 = *((const NMPlatformIP4Route *) default_route); else entry->route.r6 = *((const NMPlatformIP6Route *) default_route); /* only use normalized metrics */ - entry->route.rx.metric = vtable->route_metric_normalize (entry->route.rx.metric); + entry->route.rx.metric = vtable->vt->metric_normalize (entry->route.rx.metric); entry->route.rx.ifindex = ip_ifindex; entry->never_default = never_default; entry->effective_metric = entry->route.rx.metric; @@ -798,12 +792,12 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, Entry old_entry, new_entry; new_entry = *entry; - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) new_entry.route.r4 = *((const NMPlatformIP4Route *) default_route); else new_entry.route.r6 = *((const NMPlatformIP6Route *) default_route); /* only use normalized metrics */ - new_entry.route.rx.metric = vtable->route_metric_normalize (new_entry.route.rx.metric); + new_entry.route.rx.metric = vtable->vt->metric_normalize (new_entry.route.rx.metric); new_entry.route.rx.ifindex = ip_ifindex; new_entry.never_default = never_default; new_entry.synced = synced; @@ -843,14 +837,14 @@ _ipx_connection_has_default_route (const VTableIP *vtable, NMDefaultRouteManager g_return_val_if_fail (NM_IS_DEFAULT_ROUTE_MANAGER (self), FALSE); g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) s_ip = nm_connection_get_setting_ip4_config (connection); else s_ip = nm_connection_get_setting_ip6_config (connection); if (!s_ip || nm_setting_ip_config_get_never_default (s_ip)) return FALSE; - if (VTABLE_IS_IP4) { + if (vtable->vt->is_ip4) { method = nm_utils_get_ip_config_method (connection, NM_TYPE_SETTING_IP4_CONFIG); if ( !method || !strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED) @@ -980,7 +974,7 @@ _ipx_get_best_activating_device (const VTableIP *vtable, NMDefaultRouteManager * prio = nm_device_get_ip4_route_metric (device); } - prio = vtable->route_metric_normalize (prio); + prio = vtable->vt->metric_normalize (prio); if ( !best_device || prio < best_prio @@ -1062,7 +1056,7 @@ _ipx_get_best_config (const VTableIP *vtable, if (entry->never_default && !ignore_never_default) continue; - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) config_result = nm_vpn_connection_get_ip4_config (vpn); else config_result = nm_vpn_connection_get_ip6_config (vpn); @@ -1095,7 +1089,7 @@ _ipx_get_best_config (const VTableIP *vtable, continue; } - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) config_result = nm_device_get_ip4_config (device); else config_result = nm_device_get_ip6_config (device); @@ -1164,40 +1158,14 @@ _v6_get_entries (NMDefaultRouteManagerPrivate *priv) return priv->entries_ip6; } -static gboolean -_v4_platform_route_delete_default (int ifindex, guint32 metric) -{ - return nm_platform_ip4_route_delete (ifindex, 0, 0, metric); -} - -static gboolean -_v6_platform_route_delete_default (int ifindex, guint32 metric) -{ - return nm_platform_ip6_route_delete (ifindex, in6addr_any, 0, metric); -} - -static guint32 -_v4_route_metric_normalize (guint32 metric) -{ - return metric; -} - static const VTableIP vtable_ip4 = { - .addr_family = AF_INET, + .vt = &nm_platform_vtable_route_v4, .get_entries = _v4_get_entries, - .platform_route_to_string = (const char *(*)(const NMPlatformIPRoute *)) nm_platform_ip4_route_to_string, - .platform_route_get_all = nm_platform_ip4_route_get_all, - .platform_route_delete_default = _v4_platform_route_delete_default, - .route_metric_normalize = _v4_route_metric_normalize, }; static const VTableIP vtable_ip6 = { - .addr_family = AF_INET6, + .vt = &nm_platform_vtable_route_v6, .get_entries = _v6_get_entries, - .platform_route_to_string = (const char *(*)(const NMPlatformIPRoute *)) nm_platform_ip6_route_to_string, - .platform_route_get_all = nm_platform_ip6_route_get_all, - .platform_route_delete_default = _v6_platform_route_delete_default, - .route_metric_normalize = nm_utils_ip6_route_metric_normalize, }; /***********************************************************************************/ @@ -1296,7 +1264,7 @@ _platform_ipx_route_changed_cb (const VTableIP *vtable, return; } - if (VTABLE_IS_IP4) + if (vtable->vt->is_ip4) priv->resync.has_v4_changes = TRUE; else priv->resync.has_v6_changes = TRUE; |