From aadf202cf2c53fc911cdb70c84a89fba2d65d615 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 5 Aug 2015 10:01:39 +0200 Subject: [PATCH 1/2] core: add @merge_flags argument to nm_ip4_config_merge() and nm_ip6_config_merge() The new flags are not yet used, so there is no change in functionality. The flags NM_IP_CONFIG_MERGE_NO_ROUTES and NM_IP_CONFIG_MERGE_NO_DNS go together with the 'ignore-auto-routes' and 'ignore-auto-dns' setting. Note that for IPv4, NM_IP_CONFIG_MERGE_NO_DNS also ignores NIS, WINS, and dns-options. This is different from current other places that handle 'ignore-auto-dns' and only care about nameservers, domains, and searches. (cherry picked from commit f7a8962dd47099425438ee484e02f40e18b6ee79) --- src/devices/nm-device.c | 22 +++++++-------- src/nm-iface-helper.c | 4 +-- src/nm-ip4-config.c | 43 +++++++++++++++++++---------- src/nm-ip4-config.h | 2 +- src/nm-ip6-config.c | 21 +++++++++----- src/nm-ip6-config.h | 2 +- src/nm-types.h | 6 ++++ src/tests/test-ip4-config.c | 4 +-- src/vpn-manager/nm-vpn-connection.c | 4 +-- 9 files changed, 67 insertions(+), 41 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 6a60fee7d8..cd87a3c7f7 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -3251,17 +3251,17 @@ ip4_config_merge_and_apply (NMDevice *self, ensure_con_ip4_config (self); if (priv->dev_ip4_config) - nm_ip4_config_merge (composite, priv->dev_ip4_config); + nm_ip4_config_merge (composite, priv->dev_ip4_config, NM_IP_CONFIG_MERGE_DEFAULT); if (priv->vpn4_config) - nm_ip4_config_merge (composite, priv->vpn4_config); + nm_ip4_config_merge (composite, priv->vpn4_config, NM_IP_CONFIG_MERGE_DEFAULT); if (priv->ext_ip4_config) - nm_ip4_config_merge (composite, priv->ext_ip4_config); + nm_ip4_config_merge (composite, priv->ext_ip4_config, NM_IP_CONFIG_MERGE_DEFAULT); /* Merge WWAN config *last* to ensure modem-given settings overwrite * any external stuff set by pppd or other scripts. */ if (priv->wwan_ip4_config) - nm_ip4_config_merge (composite, priv->wwan_ip4_config); + nm_ip4_config_merge (composite, priv->wwan_ip4_config, NM_IP_CONFIG_MERGE_DEFAULT); /* Apply ignore-auto-routes and ignore-auto-dns settings */ connection = nm_device_get_connection (self); @@ -3282,7 +3282,7 @@ ip4_config_merge_and_apply (NMDevice *self, /* Merge user overrides into the composite config. For assumed connections, * con_ip4_config is empty. */ if (priv->con_ip4_config) - nm_ip4_config_merge (composite, priv->con_ip4_config); + nm_ip4_config_merge (composite, priv->con_ip4_config, NM_IP_CONFIG_MERGE_DEFAULT); /* Add the default route. @@ -3874,19 +3874,19 @@ ip6_config_merge_and_apply (NMDevice *self, /* Merge all the IP configs into the composite config */ if (priv->ac_ip6_config) - nm_ip6_config_merge (composite, priv->ac_ip6_config); + nm_ip6_config_merge (composite, priv->ac_ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); if (priv->dhcp6_ip6_config) - nm_ip6_config_merge (composite, priv->dhcp6_ip6_config); + nm_ip6_config_merge (composite, priv->dhcp6_ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); if (priv->vpn6_config) - nm_ip6_config_merge (composite, priv->vpn6_config); + nm_ip6_config_merge (composite, priv->vpn6_config, NM_IP_CONFIG_MERGE_DEFAULT); if (priv->ext_ip6_config) - nm_ip6_config_merge (composite, priv->ext_ip6_config); + nm_ip6_config_merge (composite, priv->ext_ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); /* Merge WWAN config *last* to ensure modem-given settings overwrite * any external stuff set by pppd or other scripts. */ if (priv->wwan_ip6_config) - nm_ip6_config_merge (composite, priv->wwan_ip6_config); + nm_ip6_config_merge (composite, priv->wwan_ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); /* Apply ignore-auto-routes and ignore-auto-dns settings */ connection = nm_device_get_connection (self); @@ -3907,7 +3907,7 @@ ip6_config_merge_and_apply (NMDevice *self, /* Merge user overrides into the composite config. For assumed connections, * con_ip6_config is empty. */ if (priv->con_ip6_config) - nm_ip6_config_merge (composite, priv->con_ip6_config); + nm_ip6_config_merge (composite, priv->con_ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); /* Add the default route. * diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c index 2192f36ba5..955d36cd7e 100644 --- a/src/nm-iface-helper.c +++ b/src/nm-iface-helper.c @@ -103,7 +103,7 @@ dhcp4_state_changed (NMDhcpClient *client, if (last_config) nm_ip4_config_subtract (existing, last_config); - nm_ip4_config_merge (existing, ip4_config); + nm_ip4_config_merge (existing, ip4_config, NM_IP_CONFIG_MERGE_DEFAULT); if (!nm_ip4_config_commit (existing, ifindex, TRUE, global_opt.priority_v4)) nm_log_warn (LOGD_DHCP4, "(%s): failed to apply DHCPv4 config", global_opt.ifname); @@ -240,7 +240,7 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, gpointer user_da if (last_config) nm_ip6_config_subtract (existing, last_config); - nm_ip6_config_merge (existing, ip6_config); + nm_ip6_config_merge (existing, ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); if (!nm_ip6_config_commit (existing, ifindex, TRUE)) nm_log_warn (LOGD_IP6, "(%s): failed to apply IPv6 config", global_opt.ifname); diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 035849ee62..5918f3dcb2 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -35,6 +35,7 @@ #include "nm-core-internal.h" #include "nm-route-manager.h" #include "gsystem-local-alloc.h" +#include "nm-macros-internal.h" G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, G_TYPE_OBJECT) @@ -542,7 +543,7 @@ nm_ip4_config_create_setting (const NMIP4Config *config) /******************************************************************/ void -nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src) +nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src, NMIPConfigMergeFlags merge_flags) { NMIP4ConfigPrivate *dst_priv, *src_priv; guint32 i; @@ -560,16 +561,20 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src) nm_ip4_config_add_address (dst, nm_ip4_config_get_address (src, i)); /* nameservers */ - for (i = 0; i < nm_ip4_config_get_num_nameservers (src); i++) - nm_ip4_config_add_nameserver (dst, nm_ip4_config_get_nameserver (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) { + for (i = 0; i < nm_ip4_config_get_num_nameservers (src); i++) + nm_ip4_config_add_nameserver (dst, nm_ip4_config_get_nameserver (src, i)); + } /* default gateway */ if (nm_ip4_config_has_gateway (src)) nm_ip4_config_set_gateway (dst, nm_ip4_config_get_gateway (src)); /* routes */ - for (i = 0; i < nm_ip4_config_get_num_routes (src); i++) - nm_ip4_config_add_route (dst, nm_ip4_config_get_route (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_ROUTES)) { + for (i = 0; i < nm_ip4_config_get_num_routes (src); i++) + nm_ip4_config_add_route (dst, nm_ip4_config_get_route (src, i)); + } if (dst_priv->route_metric == -1) dst_priv->route_metric = src_priv->route_metric; @@ -577,12 +582,16 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src) dst_priv->route_metric = MIN (dst_priv->route_metric, src_priv->route_metric); /* domains */ - for (i = 0; i < nm_ip4_config_get_num_domains (src); i++) - nm_ip4_config_add_domain (dst, nm_ip4_config_get_domain (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) { + for (i = 0; i < nm_ip4_config_get_num_domains (src); i++) + nm_ip4_config_add_domain (dst, nm_ip4_config_get_domain (src, i)); + } /* dns searches */ - for (i = 0; i < nm_ip4_config_get_num_searches (src); i++) - nm_ip4_config_add_search (dst, nm_ip4_config_get_search (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) { + for (i = 0; i < nm_ip4_config_get_num_searches (src); i++) + nm_ip4_config_add_search (dst, nm_ip4_config_get_search (src, i)); + } /* MSS */ if (nm_ip4_config_get_mss (src)) @@ -594,15 +603,19 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src) nm_ip4_config_get_mtu_source (src)); /* NIS */ - for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++) - nm_ip4_config_add_nis_server (dst, nm_ip4_config_get_nis_server (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) { + for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++) + nm_ip4_config_add_nis_server (dst, nm_ip4_config_get_nis_server (src, i)); - if (nm_ip4_config_get_nis_domain (src)) - nm_ip4_config_set_nis_domain (dst, nm_ip4_config_get_nis_domain (src)); + if (nm_ip4_config_get_nis_domain (src)) + nm_ip4_config_set_nis_domain (dst, nm_ip4_config_get_nis_domain (src)); + } /* WINS */ - for (i = 0; i < nm_ip4_config_get_num_wins (src); i++) - nm_ip4_config_add_wins (dst, nm_ip4_config_get_wins (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) { + for (i = 0; i < nm_ip4_config_get_num_wins (src); i++) + nm_ip4_config_add_wins (dst, nm_ip4_config_get_wins (src, i)); + } /* metered flag */ nm_ip4_config_set_metered (dst, nm_ip4_config_get_metered (dst) || diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h index 2bb766ab5a..cb3038aab0 100644 --- a/src/nm-ip4-config.h +++ b/src/nm-ip4-config.h @@ -69,7 +69,7 @@ void nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIPConfig *settin NMSetting *nm_ip4_config_create_setting (const NMIP4Config *config); /* Utility functions */ -void nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src); +void nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src, NMIPConfigMergeFlags merge_flags); void nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src); void nm_ip4_config_intersect (NMIP4Config *dst, const NMIP4Config *src); gboolean nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relevant_changes); diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 82c5662304..9647268d01 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -34,6 +34,7 @@ #include "nm-ip6-config-glue.h" #include "nm-route-manager.h" #include "NetworkManagerUtils.h" +#include "nm-macros-internal.h" G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, G_TYPE_OBJECT) @@ -616,7 +617,7 @@ nm_ip6_config_create_setting (const NMIP6Config *config) /******************************************************************/ void -nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src) +nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src, NMIPConfigMergeFlags merge_flags) { NMIP6ConfigPrivate *dst_priv, *src_priv; guint32 i; @@ -642,8 +643,10 @@ nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src) nm_ip6_config_set_gateway (dst, nm_ip6_config_get_gateway (src)); /* routes */ - for (i = 0; i < nm_ip6_config_get_num_routes (src); i++) - nm_ip6_config_add_route (dst, nm_ip6_config_get_route (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_ROUTES)) { + for (i = 0; i < nm_ip6_config_get_num_routes (src); i++) + nm_ip6_config_add_route (dst, nm_ip6_config_get_route (src, i)); + } if (dst_priv->route_metric == -1) dst_priv->route_metric = src_priv->route_metric; @@ -651,12 +654,16 @@ nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src) dst_priv->route_metric = MIN (dst_priv->route_metric, src_priv->route_metric); /* domains */ - for (i = 0; i < nm_ip6_config_get_num_domains (src); i++) - nm_ip6_config_add_domain (dst, nm_ip6_config_get_domain (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) { + for (i = 0; i < nm_ip6_config_get_num_domains (src); i++) + nm_ip6_config_add_domain (dst, nm_ip6_config_get_domain (src, i)); + } /* dns searches */ - for (i = 0; i < nm_ip6_config_get_num_searches (src); i++) - nm_ip6_config_add_search (dst, nm_ip6_config_get_search (src, i)); + if (!NM_FLAGS_HAS (merge_flags, NM_IP_CONFIG_MERGE_NO_DNS)) { + for (i = 0; i < nm_ip6_config_get_num_searches (src); i++) + nm_ip6_config_add_search (dst, nm_ip6_config_get_search (src, i)); + } if (nm_ip6_config_get_mss (src)) nm_ip6_config_set_mss (dst, nm_ip6_config_get_mss (src)); diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h index c7f3f519ae..279f89a705 100644 --- a/src/nm-ip6-config.h +++ b/src/nm-ip6-config.h @@ -69,7 +69,7 @@ void nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIPConfig *settin NMSetting *nm_ip6_config_create_setting (const NMIP6Config *config); /* Utility functions */ -void nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src); +void nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src, NMIPConfigMergeFlags merge_flags); void nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src); void nm_ip6_config_intersect (NMIP6Config *dst, const NMIP6Config *src); gboolean nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relevant_changes); diff --git a/src/nm-types.h b/src/nm-types.h index 1a002ac3f0..5806e15db0 100644 --- a/src/nm-types.h +++ b/src/nm-types.h @@ -127,6 +127,12 @@ typedef enum { NMP_OBJECT_TYPE_MAX = __NMP_OBJECT_TYPE_LAST - 1, } NMPObjectType; +typedef enum { + NM_IP_CONFIG_MERGE_DEFAULT = 0, + NM_IP_CONFIG_MERGE_NO_ROUTES = (1LL << 0), + NM_IP_CONFIG_MERGE_NO_DNS = (1LL << 1), +} NMIPConfigMergeFlags; + /* settings */ typedef struct _NMAgentManager NMAgentManager; typedef struct _NMSecretAgent NMSecretAgent; diff --git a/src/tests/test-ip4-config.c b/src/tests/test-ip4-config.c index c8bdc75fb9..235cfd426f 100644 --- a/src/tests/test-ip4-config.c +++ b/src/tests/test-ip4-config.c @@ -316,12 +316,12 @@ test_merge_subtract_mss_mtu (void) nm_ip4_config_set_mss (cfg3, expected_mss3); nm_ip4_config_set_mtu (cfg3, expected_mtu3, NM_IP_CONFIG_SOURCE_UNKNOWN); - nm_ip4_config_merge (cfg1, cfg2); + nm_ip4_config_merge (cfg1, cfg2, NM_IP_CONFIG_MERGE_DEFAULT); /* ensure MSS and MTU are in cfg1 */ g_assert_cmpuint (nm_ip4_config_get_mss (cfg1), ==, expected_mss2); g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, expected_mtu2); - nm_ip4_config_merge (cfg1, cfg3); + nm_ip4_config_merge (cfg1, cfg3, NM_IP_CONFIG_MERGE_DEFAULT); /* ensure again the MSS and MTU in cfg1 got overriden */ g_assert_cmpuint (nm_ip4_config_get_mss (cfg1), ==, expected_mss3); g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, expected_mtu3); diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c index 795a81873c..c34155efa9 100644 --- a/src/vpn-manager/nm-vpn-connection.c +++ b/src/vpn-manager/nm-vpn-connection.c @@ -932,11 +932,11 @@ apply_parent_device_config (NMVpnConnection *connection) * vpn-config. Instead we tell NMDefaultRouteManager directly about the * default route. */ if (vpn4_parent_config) { - nm_ip4_config_merge (vpn4_parent_config, priv->ip4_config); + nm_ip4_config_merge (vpn4_parent_config, priv->ip4_config, NM_IP_CONFIG_MERGE_DEFAULT); nm_ip4_config_set_gateway (vpn4_parent_config, 0); } if (vpn6_parent_config) { - nm_ip6_config_merge (vpn6_parent_config, priv->ip6_config); + nm_ip6_config_merge (vpn6_parent_config, priv->ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); nm_ip6_config_set_gateway (vpn6_parent_config, NULL); } } From 1ee28ba989d2017a5105c7af3f85e7a676de47f9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 5 Aug 2015 10:15:20 +0200 Subject: [PATCH 2/2] device: only 'ignore-auto-routes' and 'ignore-auto-dns' for certain settings During merge_and_apply(), we merge several NMIPxConfig into a new @composite. For 'ignore-auto-routes' and 'ignore-auto-dns', we want to prevent certain routes/dns-settings to be merged. But it is wrong to reject settings from all partial configs. For example, especially ext_ipx_config and vpn_ipx_config contain routes that we still must merge and preserve. This was recently changed by 79630c11e502c3b0b958abc0b1b5d777a3db2a98 and previously by ab6548c62134518ba2871306397e7fb9c84260ca. But it was wrong for a long time already. Also note, that nm_ip4_config_merge() now also ignores NIS, WINS, and dns-options. https://bugzilla.gnome.org/show_bug.cgi?id=752546 Fixes: 79630c11e502c3b0b958abc0b1b5d777a3db2a98 (cherry picked from commit 43e6f6a1784f82a2e65d71fd4ab60415858ba823) --- src/devices/nm-device.c | 89 +++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 40 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index cd87a3c7f7..ad41b6147c 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -3238,6 +3238,8 @@ ip4_config_merge_and_apply (NMDevice *self, guint32 gateway; gboolean connection_has_default_route, connection_is_never_default; gboolean routes_full_sync; + gboolean ignore_auto_routes = FALSE; + gboolean ignore_auto_dns = FALSE; /* Merge all the configs into the composite config */ if (config) { @@ -3245,13 +3247,27 @@ ip4_config_merge_and_apply (NMDevice *self, priv->dev_ip4_config = g_object_ref (config); } + /* Apply ignore-auto-routes and ignore-auto-dns settings */ + connection = nm_device_get_connection (self); + if (connection) { + NMSettingIPConfig *s_ip4 = nm_connection_get_setting_ip4_config (connection); + + if (s_ip4) { + ignore_auto_routes = nm_setting_ip_config_get_ignore_auto_routes (s_ip4); + ignore_auto_dns = nm_setting_ip_config_get_ignore_auto_dns (s_ip4); + } + } + composite = nm_ip4_config_new (); if (commit) ensure_con_ip4_config (self); - if (priv->dev_ip4_config) - nm_ip4_config_merge (composite, priv->dev_ip4_config, NM_IP_CONFIG_MERGE_DEFAULT); + if (priv->dev_ip4_config) { + nm_ip4_config_merge (composite, priv->dev_ip4_config, + (ignore_auto_routes ? NM_IP_CONFIG_MERGE_NO_ROUTES : 0) + | (ignore_auto_dns ? NM_IP_CONFIG_MERGE_NO_DNS : 0)); + } if (priv->vpn4_config) nm_ip4_config_merge (composite, priv->vpn4_config, NM_IP_CONFIG_MERGE_DEFAULT); if (priv->ext_ip4_config) @@ -3260,23 +3276,10 @@ ip4_config_merge_and_apply (NMDevice *self, /* Merge WWAN config *last* to ensure modem-given settings overwrite * any external stuff set by pppd or other scripts. */ - if (priv->wwan_ip4_config) - nm_ip4_config_merge (composite, priv->wwan_ip4_config, NM_IP_CONFIG_MERGE_DEFAULT); - - /* Apply ignore-auto-routes and ignore-auto-dns settings */ - connection = nm_device_get_connection (self); - if (connection) { - NMSettingIPConfig *s_ip4 = nm_connection_get_setting_ip4_config (connection); - - if (s_ip4) { - if (nm_setting_ip_config_get_ignore_auto_routes (s_ip4)) - nm_ip4_config_reset_routes (composite); - if (nm_setting_ip_config_get_ignore_auto_dns (s_ip4)) { - nm_ip4_config_reset_nameservers (composite); - nm_ip4_config_reset_domains (composite); - nm_ip4_config_reset_searches (composite); - } - } + if (priv->wwan_ip4_config) { + nm_ip4_config_merge (composite, priv->wwan_ip4_config, + (ignore_auto_routes ? NM_IP_CONFIG_MERGE_NO_ROUTES : 0) + | (ignore_auto_dns ? NM_IP_CONFIG_MERGE_NO_DNS : 0)); } /* Merge user overrides into the composite config. For assumed connections, @@ -3865,6 +3868,19 @@ ip6_config_merge_and_apply (NMDevice *self, const struct in6_addr *gateway; gboolean connection_has_default_route, connection_is_never_default; gboolean routes_full_sync; + gboolean ignore_auto_routes = FALSE; + gboolean ignore_auto_dns = FALSE; + + /* Apply ignore-auto-routes and ignore-auto-dns settings */ + connection = nm_device_get_connection (self); + if (connection) { + NMSettingIPConfig *s_ip6 = nm_connection_get_setting_ip6_config (connection); + + if (s_ip6) { + ignore_auto_routes = nm_setting_ip_config_get_ignore_auto_routes (s_ip6); + ignore_auto_dns = nm_setting_ip_config_get_ignore_auto_dns (s_ip6); + } + } /* If no config was passed in, create a new one */ composite = nm_ip6_config_new (); @@ -3873,10 +3889,16 @@ ip6_config_merge_and_apply (NMDevice *self, ensure_con_ip6_config (self); /* Merge all the IP configs into the composite config */ - if (priv->ac_ip6_config) - nm_ip6_config_merge (composite, priv->ac_ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); - if (priv->dhcp6_ip6_config) - nm_ip6_config_merge (composite, priv->dhcp6_ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); + if (priv->ac_ip6_config) { + nm_ip6_config_merge (composite, priv->ac_ip6_config, + (ignore_auto_routes ? NM_IP_CONFIG_MERGE_NO_ROUTES : 0) + | (ignore_auto_dns ? NM_IP_CONFIG_MERGE_NO_DNS : 0)); + } + if (priv->dhcp6_ip6_config) { + nm_ip6_config_merge (composite, priv->dhcp6_ip6_config, + (ignore_auto_routes ? NM_IP_CONFIG_MERGE_NO_ROUTES : 0) + | (ignore_auto_dns ? NM_IP_CONFIG_MERGE_NO_DNS : 0)); + } if (priv->vpn6_config) nm_ip6_config_merge (composite, priv->vpn6_config, NM_IP_CONFIG_MERGE_DEFAULT); if (priv->ext_ip6_config) @@ -3885,23 +3907,10 @@ ip6_config_merge_and_apply (NMDevice *self, /* Merge WWAN config *last* to ensure modem-given settings overwrite * any external stuff set by pppd or other scripts. */ - if (priv->wwan_ip6_config) - nm_ip6_config_merge (composite, priv->wwan_ip6_config, NM_IP_CONFIG_MERGE_DEFAULT); - - /* Apply ignore-auto-routes and ignore-auto-dns settings */ - connection = nm_device_get_connection (self); - if (connection) { - NMSettingIPConfig *s_ip6 = nm_connection_get_setting_ip6_config (connection); - - if (s_ip6) { - if (nm_setting_ip_config_get_ignore_auto_routes (s_ip6)) - nm_ip6_config_reset_routes (composite); - if (nm_setting_ip_config_get_ignore_auto_dns (s_ip6)) { - nm_ip6_config_reset_nameservers (composite); - nm_ip6_config_reset_domains (composite); - nm_ip6_config_reset_searches (composite); - } - } + if (priv->wwan_ip6_config) { + nm_ip6_config_merge (composite, priv->wwan_ip6_config, + (ignore_auto_routes ? NM_IP_CONFIG_MERGE_NO_ROUTES : 0) + | (ignore_auto_dns ? NM_IP_CONFIG_MERGE_NO_DNS : 0)); } /* Merge user overrides into the composite config. For assumed connections,