summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-03-16 13:13:21 +0100
committerThomas Haller <thaller@redhat.com>2017-03-16 13:38:21 +0100
commit745e5f61d13a04803a36699e82c543ff9ffccf00 (patch)
treeecc12ba4a0c20305a280e57baf22b60ec624ea8e
parent38712e762608198382db7220a3bf3792b9d4bef6 (diff)
downloadNetworkManager-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.c8
-rw-r--r--src/nm-default-route-manager.c52
-rw-r--r--src/nm-default-route-manager.h8
-rw-r--r--src/vpn/nm-vpn-connection.c8
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)