summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-09-22 12:11:32 +0200
committerThomas Haller <thaller@redhat.com>2017-09-26 19:36:51 +0200
commit0fce60c767e60446220e492a259473ea29b78c7e (patch)
tree4bb9931b29e517f1ffd70bf4933ac63177863f45
parent8207bfd5d62693815f111375b2b146827c13d37d (diff)
downloadNetworkManager-0fce60c767e60446220e492a259473ea29b78c7e.tar.gz
device: do full update_ext_ip_config() during merge-and-apply
Since commit a21b8882cc9defc43248afc94bf59ca0f84f0d27 ("device: update external configuration before commit"), we correctly re-sync the external IP configuration before a merge, in case we notice that there were some changes in platform. Go a step further, and do the full update_ext_ip_config(). We should have one way how to capture the external config, including intersect and subtract. Otherwise, we end up with an @ext_ip4_config, which is different from how it looks usually.
-rw-r--r--src/devices/nm-device.c113
1 files changed, 50 insertions, 63 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 629edbca50..e20f7fb478 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -497,6 +497,8 @@ G_DEFINE_ABSTRACT_TYPE (NMDevice, nm_device, NM_TYPE_EXPORTED_OBJECT)
static void nm_device_set_proxy_config (NMDevice *self, const char *pac_url);
+static gboolean update_ext_ip_config (NMDevice *self, int addr_family, gboolean initial, gboolean intersect_configs);
+
static gboolean nm_device_set_ip4_config (NMDevice *self,
NMIP4Config *config,
gboolean commit,
@@ -5605,14 +5607,9 @@ ip4_config_merge_and_apply (NMDevice *self,
init_ip4_config_dns_priority (self, composite);
if (commit) {
+ if (priv->queued_ip4_config_id)
+ update_ext_ip_config (self, AF_INET, FALSE, FALSE);
ensure_con_ip4_config (self);
- if (priv->queued_ip4_config_id) {
- g_clear_object (&priv->ext_ip4_config);
- priv->ext_ip4_config = nm_ip4_config_capture (nm_device_get_multi_index (self),
- nm_device_get_platform (self),
- nm_device_get_ip_ifindex (self),
- FALSE);
- }
}
if (priv->dev_ip4_config) {
@@ -6324,18 +6321,9 @@ ip6_config_merge_and_apply (NMDevice *self,
init_ip6_config_dns_priority (self, composite);
if (commit) {
+ if (priv->queued_ip6_config_id)
+ update_ext_ip_config (self, AF_INET6, FALSE, FALSE);
ensure_con_ip6_config (self);
- if (priv->queued_ip6_config_id) {
- g_clear_object (&priv->ext_ip6_config);
- g_clear_object (&priv->ext_ip6_config_captured);
- priv->ext_ip6_config_captured = nm_ip6_config_capture (nm_device_get_multi_index (self),
- nm_device_get_platform (self),
- nm_device_get_ip_ifindex (self),
- FALSE,
- NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
- if (priv->ext_ip6_config_captured)
- priv->ext_ip6_config = nm_ip6_config_new_cloned (priv->ext_ip6_config_captured);
- }
}
/* Merge all the IP configs into the composite config */
@@ -10746,7 +10734,7 @@ capture_lease_config (NMDevice *self,
}
static gboolean
-update_ext_ip_config (NMDevice *self, int addr_family, gboolean initial)
+update_ext_ip_config (NMDevice *self, int addr_family, gboolean initial, gboolean intersect_configs)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
int ifindex;
@@ -10775,29 +10763,26 @@ update_ext_ip_config (NMDevice *self, int addr_family, gboolean initial)
capture_lease_config (self, priv->ext_ip4_config, &priv->dev_ip4_config, NULL, NULL);
}
- /* FIXME: ext_ip4_config does not contain routes with source==RTPROT_KERNEL.
- * Hence, we will wrongly remove device-routes with metric=0 if they were added by
- * the user on purpose. This should be fixed by also tracking and exposing
- * kernel routes. */
-
- /* This function was called upon external changes. Remove the configuration
- * (addresses,routes) that is no longer present externally from the internal
- * config. This way, we don't re-add addresses that were manually removed
- * by the user. */
- if (priv->con_ip4_config)
- nm_ip4_config_intersect (priv->con_ip4_config, priv->ext_ip4_config);
- if (priv->dev_ip4_config)
- nm_ip4_config_intersect (priv->dev_ip4_config, priv->ext_ip4_config);
- if (priv->wwan_ip4_config)
- nm_ip4_config_intersect (priv->wwan_ip4_config, priv->ext_ip4_config);
- for (iter = priv->vpn4_configs; iter; iter = iter->next)
- nm_ip4_config_intersect (iter->data, priv->ext_ip4_config);
- if ( priv->default_route4
- && !nm_ip4_config_nmpobj_lookup (priv->ext_ip4_config, priv->default_route4))
- nm_clear_nmp_object (&priv->default_route4);
- if ( priv->default_routegw4
- && !nm_ip4_config_nmpobj_lookup (priv->ext_ip4_config, priv->default_routegw4))
- nm_clear_nmp_object (&priv->default_routegw4);
+ if (intersect_configs) {
+ /* This function was called upon external changes. Remove the configuration
+ * (addresses,routes) that is no longer present externally from the internal
+ * config. This way, we don't re-add addresses that were manually removed
+ * by the user. */
+ if (priv->con_ip4_config)
+ nm_ip4_config_intersect (priv->con_ip4_config, priv->ext_ip4_config);
+ if (priv->dev_ip4_config)
+ nm_ip4_config_intersect (priv->dev_ip4_config, priv->ext_ip4_config);
+ if (priv->wwan_ip4_config)
+ nm_ip4_config_intersect (priv->wwan_ip4_config, priv->ext_ip4_config);
+ for (iter = priv->vpn4_configs; iter; iter = iter->next)
+ nm_ip4_config_intersect (iter->data, priv->ext_ip4_config);
+ if ( priv->default_route4
+ && !nm_ip4_config_nmpobj_lookup (priv->ext_ip4_config, priv->default_route4))
+ nm_clear_nmp_object (&priv->default_route4);
+ if ( priv->default_routegw4
+ && !nm_ip4_config_nmpobj_lookup (priv->ext_ip4_config, priv->default_routegw4))
+ nm_clear_nmp_object (&priv->default_routegw4);
+ }
/* Remove parts from ext_ip4_config to only contain the information that
* was configured externally -- we already have the same configuration from
@@ -10830,26 +10815,28 @@ update_ext_ip_config (NMDevice *self, int addr_family, gboolean initial)
priv->ext_ip6_config = nm_ip6_config_new_cloned (priv->ext_ip6_config_captured);
- /* This function was called upon external changes. Remove the configuration
- * (addresses,routes) that is no longer present externally from the internal
- * config. This way, we don't re-add addresses that were manually removed
- * by the user. */
- if (priv->con_ip6_config)
- nm_ip6_config_intersect (priv->con_ip6_config, priv->ext_ip6_config);
- if (priv->ac_ip6_config)
- nm_ip6_config_intersect (priv->ac_ip6_config, priv->ext_ip6_config);
- if (priv->dhcp6.ip6_config)
- nm_ip6_config_intersect (priv->dhcp6.ip6_config, priv->ext_ip6_config);
- if (priv->wwan_ip6_config)
- nm_ip6_config_intersect (priv->wwan_ip6_config, priv->ext_ip6_config);
- for (iter = priv->vpn6_configs; iter; iter = iter->next)
- nm_ip6_config_intersect (iter->data, priv->ext_ip6_config);
- if ( priv->default_route6
- && !nm_ip6_config_nmpobj_lookup (priv->ext_ip6_config, priv->default_route6))
- nm_clear_nmp_object (&priv->default_route6);
- if ( priv->default_routegw6
- && !nm_ip6_config_nmpobj_lookup (priv->ext_ip6_config, priv->default_routegw6))
- nm_clear_nmp_object (&priv->default_routegw6);
+ if (intersect_configs) {
+ /* This function was called upon external changes. Remove the configuration
+ * (addresses,routes) that is no longer present externally from the internal
+ * config. This way, we don't re-add addresses that were manually removed
+ * by the user. */
+ if (priv->con_ip6_config)
+ nm_ip6_config_intersect (priv->con_ip6_config, priv->ext_ip6_config);
+ if (priv->ac_ip6_config)
+ nm_ip6_config_intersect (priv->ac_ip6_config, priv->ext_ip6_config);
+ if (priv->dhcp6.ip6_config)
+ nm_ip6_config_intersect (priv->dhcp6.ip6_config, priv->ext_ip6_config);
+ if (priv->wwan_ip6_config)
+ nm_ip6_config_intersect (priv->wwan_ip6_config, priv->ext_ip6_config);
+ for (iter = priv->vpn6_configs; iter; iter = iter->next)
+ nm_ip6_config_intersect (iter->data, priv->ext_ip6_config);
+ if ( priv->default_route6
+ && !nm_ip6_config_nmpobj_lookup (priv->ext_ip6_config, priv->default_route6))
+ nm_clear_nmp_object (&priv->default_route6);
+ if ( priv->default_routegw6
+ && !nm_ip6_config_nmpobj_lookup (priv->ext_ip6_config, priv->default_routegw6))
+ nm_clear_nmp_object (&priv->default_routegw6);
+ }
/* Remove parts from ext_ip6_config to only contain the information that
* was configured externally -- we already have the same configuration from
@@ -10881,7 +10868,7 @@ update_ip_config (NMDevice *self, int addr_family, gboolean initial)
nm_assert (NM_IN_SET (addr_family, AF_INET, AF_INET6));
- if (update_ext_ip_config (self, addr_family, initial)) {
+ if (update_ext_ip_config (self, addr_family, initial, TRUE)) {
if (addr_family == AF_INET) {
if (priv->ext_ip4_config)
ip4_config_merge_and_apply (self, NULL, FALSE);