diff options
author | Thomas Haller <thaller@redhat.com> | 2017-03-16 13:13:21 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-03-16 13:38:21 +0100 |
commit | 745e5f61d13a04803a36699e82c543ff9ffccf00 (patch) | |
tree | ecc12ba4a0c20305a280e57baf22b60ec624ea8e | |
parent | 38712e762608198382db7220a3bf3792b9d4bef6 (diff) | |
download | NetworkManager-745e5f61d13a04803a36699e82c543ff9ffccf00.tar.gz |
default-route-manager: add force_sync argument for updating default route
By default, when the internal book-keeping of NMDefaultRouteManager
already indicates that the new configuration during
update_default_route() already exists, it would do nothing.
Add an argument @force_sync to always recheck with the platform
cache and possibly restore whatever is there.
The argument is still unused.
-rw-r--r-- | src/devices/nm-device.c | 8 | ||||
-rw-r--r-- | src/nm-default-route-manager.c | 52 | ||||
-rw-r--r-- | src/nm-default-route-manager.h | 8 | ||||
-rw-r--r-- | src/vpn/nm-vpn-connection.c | 8 |
4 files changed, 49 insertions, 27 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index aabea840ea..e67e405561 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -1452,9 +1452,9 @@ _update_default_route (NMDevice *self, int addr_family, gboolean has, gboolean i *p_is_assumed = is_assumed; if (addr_family == AF_INET) - nm_default_route_manager_ip4_update_default_route (nm_default_route_manager_get (), self); + nm_default_route_manager_ip4_update_default_route (nm_default_route_manager_get (), self, FALSE); else - nm_default_route_manager_ip6_update_default_route (nm_default_route_manager_get (), self); + nm_default_route_manager_ip6_update_default_route (nm_default_route_manager_get (), self, FALSE); } const NMPlatformIP4Route * @@ -9319,7 +9319,7 @@ nm_device_set_ip4_config (NMDevice *self, g_clear_object (&priv->dev_ip4_config); } - nm_default_route_manager_ip4_update_default_route (nm_default_route_manager_get (), self); + nm_default_route_manager_ip4_update_default_route (nm_default_route_manager_get (), self, FALSE); if (has_changes) { _update_ip4_address (self); @@ -9475,7 +9475,7 @@ nm_device_set_ip6_config (NMDevice *self, nm_exported_object_get_path (NM_EXPORTED_OBJECT (old_config))); } - nm_default_route_manager_ip6_update_default_route (nm_default_route_manager_get (), self); + nm_default_route_manager_ip6_update_default_route (nm_default_route_manager_get (), self, FALSE); if (has_changes) { if (old_config != priv->ip6_config) diff --git a/src/nm-default-route-manager.c b/src/nm-default-route-manager.c index 9cb7ff63ea..b6fdd88e51 100644 --- a/src/nm-default-route-manager.c +++ b/src/nm-default-route-manager.c @@ -533,8 +533,6 @@ _resync_all (const VTableIP *vtable, NMDefaultRouteManager *self, const Entry *c for (i = 0; i < entries->len; i++) { entry = g_ptr_array_index (entries, i); - g_assert (entry != old_entry); - if (entry->never_default) continue; @@ -589,12 +587,15 @@ _resync_all (const VTableIP *vtable, NMDefaultRouteManager *self, const Entry *c /* for the changed entry, the previous metric was either old_entry->effective_metric, * or none. Hence, we only have to remember what is going to change. */ g_array_append_val (changed_metrics, expected_metric); - if (old_entry) { + if (!old_entry) { + _LOG2D (vtable, i, entry, "sync:add %s (%u)", + vtable->vt->route_to_string (&entry->route, NULL, 0), (guint) expected_metric); + } else if (old_entry != changed_entry) { _LOG2D (vtable, i, entry, "sync:update %s (%u -> %u)", vtable->vt->route_to_string (&entry->route, NULL, 0), (guint) old_entry->effective_metric, (guint) expected_metric); } else { - _LOG2D (vtable, i, entry, "sync:add %s (%u)", + _LOG2D (vtable, i, entry, "sync:resync %s (%u)", vtable->vt->route_to_string (&entry->route, NULL, 0), (guint) expected_metric); } } else if (entry->effective_metric != expected_metric) { @@ -672,7 +673,11 @@ _entry_at_idx_update (const VTableIP *vtable, NMDefaultRouteManager *self, guint entry->effective_metric = entry->route.rx.metric; _LOG2D (vtable, entry_idx, entry, "%s %s (%"G_GUINT32_FORMAT")", - old_entry ? "record:update" : "record:add ", + old_entry + ? (entry != old_entry + ? "record:update" + : "record:resync") + : "record:add ", vtable->vt->route_to_string (&entry->route, NULL, 0), entry->effective_metric); @@ -709,7 +714,10 @@ _entry_at_idx_remove (const VTableIP *vtable, NMDefaultRouteManager *self, guint /*****************************************************************************/ static void -_ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, gpointer source) +_ipx_update_default_route (const VTableIP *vtable, + NMDefaultRouteManager *self, + gpointer source, + gboolean force_sync) { NMDefaultRouteManagerPrivate *priv; Entry *entry; @@ -753,7 +761,7 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, g_object_freeze_notify (G_OBJECT (self)); _entry_at_idx_remove (vtable, self, entry_idx); g_assert (!_entry_find_by_source (entries, source, NULL)); - _ipx_update_default_route (vtable, self, source); + _ipx_update_default_route (vtable, self, source, force_sync); g_object_thaw_notify (G_OBJECT (self)); return; } @@ -874,12 +882,18 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, new_entry.never_default = never_default; new_entry.synced = synced; - if (memcmp (entry, &new_entry, sizeof (new_entry)) == 0) - return; - - old_entry = *entry; - *entry = new_entry; - _entry_at_idx_update (vtable, self, entry_idx, &old_entry); + if (memcmp (entry, &new_entry, sizeof (new_entry)) == 0) { + if (!force_sync) { + /* the internal book-keeping doesn't change, so don't do a full + * sync of the configured routes. */ + return; + } + _entry_at_idx_update (vtable, self, entry_idx, entry); + } else { + old_entry = *entry; + *entry = new_entry; + _entry_at_idx_update (vtable, self, entry_idx, &old_entry); + } } else { /* delete */ _entry_at_idx_remove (vtable, self, entry_idx); @@ -887,15 +901,19 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, } void -nm_default_route_manager_ip4_update_default_route (NMDefaultRouteManager *self, gpointer source) +nm_default_route_manager_ip4_update_default_route (NMDefaultRouteManager *self, + gpointer source, + gboolean force_sync) { - _ipx_update_default_route (&vtable_ip4, self, source); + _ipx_update_default_route (&vtable_ip4, self, source, force_sync); } void -nm_default_route_manager_ip6_update_default_route (NMDefaultRouteManager *self, gpointer source) +nm_default_route_manager_ip6_update_default_route (NMDefaultRouteManager *self, + gpointer source, + gboolean force_sync) { - _ipx_update_default_route (&vtable_ip6, self, source); + _ipx_update_default_route (&vtable_ip6, self, source, force_sync); } /*****************************************************************************/ diff --git a/src/nm-default-route-manager.h b/src/nm-default-route-manager.h index cecc9501a9..0a32a33c0a 100644 --- a/src/nm-default-route-manager.h +++ b/src/nm-default-route-manager.h @@ -39,8 +39,12 @@ GType nm_default_route_manager_get_type (void); NMDefaultRouteManager *nm_default_route_manager_get (void); NMDefaultRouteManager *nm_default_route_manager_new (NMPlatform *platform); -void nm_default_route_manager_ip4_update_default_route (NMDefaultRouteManager *manager, gpointer source); -void nm_default_route_manager_ip6_update_default_route (NMDefaultRouteManager *manager, gpointer source); +void nm_default_route_manager_ip4_update_default_route (NMDefaultRouteManager *self, + gpointer source, + gboolean force_sync); +void nm_default_route_manager_ip6_update_default_route (NMDefaultRouteManager *self, + gpointer source, + gboolean force_sync); gboolean nm_default_route_manager_ip4_connection_has_default_route (NMDefaultRouteManager *manager, NMConnection *connection, gboolean *out_is_never_default); gboolean nm_default_route_manager_ip6_connection_has_default_route (NMDefaultRouteManager *manager, NMConnection *connection, gboolean *out_is_never_default); diff --git a/src/vpn/nm-vpn-connection.c b/src/vpn/nm-vpn-connection.c index 2120bbe37e..f44fc536df 100644 --- a/src/vpn/nm-vpn-connection.c +++ b/src/vpn/nm-vpn-connection.c @@ -507,8 +507,8 @@ _set_vpn_state (NMVpnConnection *self, dispatcher_cleanup (self); - nm_default_route_manager_ip4_update_default_route (priv->default_route_manager, self); - nm_default_route_manager_ip6_update_default_route (priv->default_route_manager, self); + nm_default_route_manager_ip4_update_default_route (priv->default_route_manager, self, FALSE); + nm_default_route_manager_ip6_update_default_route (priv->default_route_manager, self, FALSE); /* The connection gets destroyed by the VPN manager when it enters the * disconnected/failed state, but we need to keep it around for a bit @@ -1125,8 +1125,8 @@ nm_vpn_connection_apply_config (NMVpnConnection *self) apply_parent_device_config (self); - nm_default_route_manager_ip4_update_default_route (priv->default_route_manager, self); - nm_default_route_manager_ip6_update_default_route (priv->default_route_manager, self); + nm_default_route_manager_ip4_update_default_route (priv->default_route_manager, self, FALSE); + nm_default_route_manager_ip6_update_default_route (priv->default_route_manager, self, FALSE); _LOGI ("VPN connection: (IP Config Get) complete"); if (priv->vpn_state < STATE_PRE_UP) |