summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>2015-10-29 15:12:32 +0100
committerLubomir Rintel <lkundrak@v3.sk>2015-10-30 10:16:55 +0100
commitfdf113aa96df9c363a0173268ee48078da66f447 (patch)
treeee02c88e8bb5b0edb57ec8565ee81169cf57ba79
parente45ddaabafdaa740544ac42fc8430e4b2dc60cad (diff)
downloadNetworkManager-fdf113aa96df9c363a0173268ee48078da66f447.tar.gz
Filter DNS servers to add to dnsmasq based on availability and VPN status
-rw-r--r--src/dns-manager/nm-dns-dnsmasq.c47
1 files changed, 39 insertions, 8 deletions
diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c
index 84c2701eb9..4567cd6ab3 100644
--- a/src/dns-manager/nm-dns-dnsmasq.c
+++ b/src/dns-manager/nm-dns-dnsmasq.c
@@ -311,6 +311,8 @@ update (NMDnsPlugin *plugin,
gboolean have_dnsmasq = FALSE;
gboolean ret = FALSE;
dbus_bool_t result;
+ gboolean might_default = FALSE;
+ GSList *vpn_configs_copy;
have_dnsmasq = start_dnsmasq (self);
if (!have_dnsmasq)
@@ -325,20 +327,49 @@ update (NMDnsPlugin *plugin,
message = dbus_message_new_method_call (DNSMASQ_DBUS_SERVICE, DNSMASQ_DBUS_PATH,
DNSMASQ_DBUS_INTERFACE, "SetServers");
- /* Use split DNS for VPN configs */
- for (iter = (GSList *) vpn_configs; iter; iter = g_slist_next (iter)) {
+ /* Work on a copy of the vpn_configs list because we might want to remove
+ * some items from it, yet not affect other DNS plugins that might run
+ */
+ vpn_configs_copy = g_slist_copy (vpn_configs);
+
+ /* Look for a VPN config that is set to get a default route, and if
+ * there is one, install it *without* splitting into per-domain servers.
+ */
+ for (iter = (GSList *) vpn_configs_copy; iter; iter = g_slist_next (iter)) {
if (NM_IS_IP4_CONFIG (iter->data))
- add_ip4_config (message, NM_IP4_CONFIG (iter->data), TRUE);
+ might_default = !nm_ip4_config_get_never_default (iter->data);
else if (NM_IS_IP6_CONFIG (iter->data))
- add_ip6_config (message, NM_IP6_CONFIG (iter->data), TRUE);
+ might_default = !nm_ip6_config_get_never_default (iter->data);
+ if (might_default) {
+ if (NM_IS_IP4_CONFIG (iter->data))
+ add_ip4_config (message, NM_IP4_CONFIG (iter->data), FALSE);
+ else if (NM_IS_IP6_CONFIG (iter->data))
+ add_ip6_config (message, NM_IP6_CONFIG (iter->data), FALSE);
+ vpn_configs_copy = g_slist_remove (vpn_configs_copy, iter->data);
+ break;
+ }
}
- /* Now add interface configs without split DNS */
- for (iter = (GSList *) dev_configs; iter; iter = g_slist_next (iter)) {
+ /* Use split DNS for remaining VPN configs */
+ for (iter = (GSList *) vpn_configs_copy; iter; iter = g_slist_next (iter)) {
if (NM_IS_IP4_CONFIG (iter->data))
- add_ip4_config (message, NM_IP4_CONFIG (iter->data), FALSE);
+ add_ip4_config (message, NM_IP4_CONFIG (iter->data), TRUE);
else if (NM_IS_IP6_CONFIG (iter->data))
- add_ip6_config (message, NM_IP6_CONFIG (iter->data), FALSE);
+ add_ip6_config (message, NM_IP6_CONFIG (iter->data), TRUE);
+ }
+
+ /* Now add interface configs without split DNS, unless some VPN
+ * grabs the default route (in which case we should not install them
+ * at all, since even split DNS may fail, if the local subnet defines
+ * its domain as being the same domain as what the "default" VPN provides.
+ */
+ if (!might_default) {
+ for (iter = (GSList *) dev_configs; iter; iter = g_slist_next (iter)) {
+ if (NM_IS_IP4_CONFIG (iter->data))
+ add_ip4_config (message, NM_IP4_CONFIG (iter->data), FALSE);
+ else if (NM_IS_IP6_CONFIG (iter->data))
+ add_ip6_config (message, NM_IP6_CONFIG (iter->data), FALSE);
+ }
}
/* And any other random configs */