diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml
index 446540aa1b..135550ce27 100644
--- a/man/NetworkManager.conf.xml
+++ b/man/NetworkManager.conf.xml
@@ -654,6 +654,9 @@ ipv6.ip6-privacy=0
connection.lldp
+
+ connection.mdns
+
connection.stable-id
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index d45f1bb07b..ce6c585364 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -1788,6 +1788,34 @@ out:
return nm_utils_ip_route_metric_normalize (addr_family, route_metric);
}
+static NMSettingConnectionMdns
+_get_mdns (NMDevice *self)
+{
+ NMConnection *connection;
+ NMSettingConnectionMdns mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT;
+
+ g_return_val_if_fail (NM_IS_DEVICE (self), NM_SETTING_CONNECTION_MDNS_DEFAULT);
+
+ connection = nm_device_get_applied_connection (self);
+ if (connection)
+ mdns = nm_setting_connection_get_mdns (nm_connection_get_setting_connection (connection));
+
+ if (mdns == NM_SETTING_CONNECTION_MDNS_DEFAULT) {
+ gs_free char *value = NULL;
+
+ value = nm_config_data_get_connection_default (NM_CONFIG_GET_DATA,
+ "connection.mdns",
+ self);
+ mdns = _nm_utils_ascii_str_to_int64 (value,
+ 10,
+ NM_SETTING_CONNECTION_MDNS_NO,
+ NM_SETTING_CONNECTION_MDNS_YES,
+ NM_SETTING_CONNECTION_MDNS_DEFAULT);
+ }
+
+ return mdns;
+}
+
guint32
nm_device_get_route_table (NMDevice *self,
int addr_family,
@@ -5867,6 +5895,7 @@ ensure_con_ip4_config (NMDevice *self)
priv->con_ip4_config = _ip4_config_new (self);
nm_ip4_config_merge_setting (priv->con_ip4_config,
nm_connection_get_setting_ip4_config (connection),
+ _get_mdns (self),
nm_device_get_route_table (self, AF_INET, TRUE),
nm_device_get_route_metric (self, AF_INET));
@@ -6177,6 +6206,7 @@ dhcp4_state_changed (NMDhcpClient *client,
manual = _ip4_config_new (self);
nm_ip4_config_merge_setting (manual,
nm_connection_get_setting_ip4_config (connection),
+ NM_SETTING_CONNECTION_MDNS_DEFAULT,
nm_device_get_route_table (self, AF_INET, TRUE),
nm_device_get_route_metric (self, AF_INET));
@@ -6555,6 +6585,7 @@ act_stage3_ip4_config_start (NMDevice *self,
config = _ip4_config_new (self);
nm_ip4_config_merge_setting (config,
nm_connection_get_setting_ip4_config (connection),
+ NM_SETTING_CONNECTION_MDNS_DEFAULT,
nm_device_get_route_table (self, AF_INET, TRUE),
nm_device_get_route_metric (self, AF_INET));
@@ -9250,6 +9281,7 @@ nm_device_reactivate_ip4_config (NMDevice *self,
priv->con_ip4_config = _ip4_config_new (self);
nm_ip4_config_merge_setting (priv->con_ip4_config,
s_ip4_new,
+ _get_mdns (self),
nm_device_get_route_table (self, AF_INET, TRUE),
nm_device_get_route_metric (self, AF_INET));
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index ac73ee0c4b..c7d233ff7d 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -24,6 +24,7 @@
#include
+#include "nm-setting-connection.h"
#include "nm-exported-object.h"
#include "nm-dbus-interface.h"
#include "nm-connection.h"
diff --git a/src/dns/nm-dns-systemd-resolved.c b/src/dns/nm-dns-systemd-resolved.c
index 95a89059dc..b03d9842cb 100644
--- a/src/dns/nm-dns-systemd-resolved.c
+++ b/src/dns/nm-dns-systemd-resolved.c
@@ -230,6 +230,8 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic)
NMDnsSystemdResolvedPrivate *priv = NM_DNS_SYSTEMD_RESOLVED_GET_PRIVATE (self);
GVariantBuilder dns, domains;
NMCListElem *elem;
+ NMSettingConnectionMdns mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT;
+ const char *mdns_arg = NULL;
g_variant_builder_init (&dns, G_VARIANT_TYPE ("(ia(iay))"));
g_variant_builder_add (&dns, "i", ic->ifindex);
@@ -239,18 +241,43 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic)
g_variant_builder_add (&domains, "i", ic->ifindex);
g_variant_builder_open (&domains, G_VARIANT_TYPE ("a(sb)"));
- c_list_for_each_entry (elem, &ic->configs_lst_head, lst)
- update_add_ip_config (self, &dns, &domains, elem->data);
+ c_list_for_each_entry (elem, &ic->configs_lst_head, lst) {
+ NMIPConfig *ip_config = elem->data;
+
+ update_add_ip_config (self, &dns, &domains, ip_config);
+
+ if (NM_IS_IP4_CONFIG (ip_config))
+ mdns = NM_MAX (mdns, nm_ip4_config_mdns_get (NM_IP4_CONFIG (ip_config)));
+ }
g_variant_builder_close (&dns);
g_variant_builder_close (&domains);
+ switch (mdns) {
+ case NM_SETTING_CONNECTION_MDNS_NO:
+ mdns_arg = "no";
+ break;
+ case NM_SETTING_CONNECTION_MDNS_RESOLVE:
+ mdns_arg = "resolve";
+ break;
+ case NM_SETTING_CONNECTION_MDNS_YES:
+ mdns_arg = "yes";
+ break;
+ case NM_SETTING_CONNECTION_MDNS_DEFAULT:
+ mdns_arg = "";
+ break;
+ }
+ nm_assert (mdns_arg);
+
_request_item_append (&priv->request_queue_lst_head,
"SetLinkDNS",
g_variant_builder_end (&dns));
_request_item_append (&priv->request_queue_lst_head,
"SetLinkDomains",
g_variant_builder_end (&domains));
+ _request_item_append (&priv->request_queue_lst_head,
+ "SetLinkMulticastDNS",
+ g_variant_new ("(is)", ic->ifindex, mdns_arg ?: ""));
}
static void
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index 15157739c1..aeb5bbe8a8 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -293,6 +293,7 @@ typedef struct {
int ifindex;
NMIPConfigSource mtu_source;
gint dns_priority;
+ NMSettingConnectionMdns mdns;
GArray *nameservers;
GPtrArray *domains;
GPtrArray *searches;
@@ -893,6 +894,7 @@ _nm_ip_config_merge_route_attributes (int addr_family,
void
nm_ip4_config_merge_setting (NMIP4Config *self,
NMSettingIPConfig *setting,
+ NMSettingConnectionMdns mdns,
guint32 route_table,
guint32 route_metric)
{
@@ -1012,6 +1014,8 @@ nm_ip4_config_merge_setting (NMIP4Config *self,
if (priority)
nm_ip4_config_set_dns_priority (self, priority);
+ nm_ip4_config_mdns_set (self, mdns);
+
g_object_thaw_notify (G_OBJECT (self));
}
@@ -1227,6 +1231,11 @@ nm_ip4_config_merge (NMIP4Config *dst,
if (nm_ip4_config_get_dns_priority (src))
nm_ip4_config_set_dns_priority (dst, nm_ip4_config_get_dns_priority (src));
+ /* mdns */
+ nm_ip4_config_mdns_set (dst,
+ NM_MAX (nm_ip4_config_mdns_get (src),
+ nm_ip4_config_mdns_get (dst)));
+
g_object_thaw_notify (G_OBJECT (dst));
}
@@ -1463,6 +1472,10 @@ nm_ip4_config_subtract (NMIP4Config *dst,
if (nm_ip4_config_get_dns_priority (src) == nm_ip4_config_get_dns_priority (dst))
nm_ip4_config_set_dns_priority (dst, 0);
+ /* mdns */
+ if (nm_ip4_config_mdns_get (src) == nm_ip4_config_mdns_get (dst))
+ nm_ip4_config_mdns_set (dst, NM_SETTING_CONNECTION_MDNS_DEFAULT);
+
g_object_thaw_notify (G_OBJECT (dst));
}
@@ -1550,6 +1563,7 @@ nm_ip4_config_intersect (NMIP4Config *dst,
/* ignore dns options */
/* ignore NIS */
/* ignore WINS */
+ /* ignore mdns */
g_object_thaw_notify (G_OBJECT (dst));
}
@@ -1779,6 +1793,8 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev
has_relevant_changes = TRUE;
}
+ dst_priv->mdns = src_priv->mdns;
+
/* DNS priority */
if (src_priv->dns_priority != dst_priv->dns_priority) {
nm_ip4_config_set_dns_priority (dst, src_priv->dns_priority);
@@ -2456,6 +2472,21 @@ nm_ip4_config_get_dns_option (const NMIP4Config *self, guint i)
/*****************************************************************************/
+NMSettingConnectionMdns
+nm_ip4_config_mdns_get (const NMIP4Config *self)
+{
+ return NM_IP4_CONFIG_GET_PRIVATE (self)->mdns;
+}
+
+void
+nm_ip4_config_mdns_set (NMIP4Config *self,
+ NMSettingConnectionMdns mdns)
+{
+ NM_IP4_CONFIG_GET_PRIVATE (self)->mdns = mdns;
+}
+
+/*****************************************************************************/
+
void
nm_ip4_config_set_dns_priority (NMIP4Config *self, gint priority)
{
@@ -3065,6 +3096,7 @@ nm_ip4_config_init (NMIP4Config *self)
nm_ip_config_dedup_multi_idx_type_init ((NMIPConfigDedupMultiIdxType *) &priv->idx_ip4_routes,
NMP_OBJECT_TYPE_IP4_ROUTE);
+ priv->mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT;
priv->nameservers = g_array_new (FALSE, FALSE, sizeof (guint32));
priv->domains = g_ptr_array_new_with_free_func (g_free);
priv->searches = g_ptr_array_new_with_free_func (g_free);
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index 2f20a7b23f..c2ead0c66e 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -21,6 +21,8 @@
#ifndef __NETWORKMANAGER_IP4_CONFIG_H__
#define __NETWORKMANAGER_IP4_CONFIG_H__
+#include "nm-setting-connection.h"
+
#include "nm-exported-object.h"
#include "nm-setting-ip4-config.h"
@@ -171,6 +173,7 @@ gboolean nm_ip4_config_commit (const NMIP4Config *self,
void nm_ip4_config_merge_setting (NMIP4Config *self,
NMSettingIPConfig *setting,
+ NMSettingConnectionMdns mdns,
guint32 route_table,
guint32 route_metric);
NMSetting *nm_ip4_config_create_setting (const NMIP4Config *self);
@@ -194,6 +197,10 @@ const NMPObject *_nm_ip4_config_best_default_route_find (const NMIP4Config *self
in_addr_t nmtst_ip4_config_get_gateway (NMIP4Config *config);
+NMSettingConnectionMdns nm_ip4_config_mdns_get (const NMIP4Config *self);
+void nm_ip4_config_mdns_set (NMIP4Config *self,
+ NMSettingConnectionMdns mdns);
+
const NMDedupMultiHeadEntry *nm_ip4_config_lookup_addresses (const NMIP4Config *self);
void nm_ip4_config_reset_addresses (NMIP4Config *self);
void nm_ip4_config_add_address (NMIP4Config *self, const NMPlatformIP4Address *address);
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
index 33cc172a0b..af70c83b0f 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
@@ -1894,9 +1894,8 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
if (mdns != NM_SETTING_CONNECTION_MDNS_DEFAULT) {
svSetValueEnum (ifcfg, "MDNS", nm_setting_connection_mdns_get_type (),
mdns);
- } else {
+ } else
svUnsetValue (ifcfg, "MDNS");
- }
}
static char *
diff --git a/src/vpn/nm-vpn-connection.c b/src/vpn/nm-vpn-connection.c
index d5a649ba03..1a093e674c 100644
--- a/src/vpn/nm-vpn-connection.c
+++ b/src/vpn/nm-vpn-connection.c
@@ -1462,6 +1462,7 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict)
NMPlatformIP4Address address;
guint32 u32, route_metric;
NMSettingIPConfig *s_ip;
+ NMSettingConnection *s_con;
guint32 route_table;
NMIP4Config *config;
GVariantIter *iter;
@@ -1566,6 +1567,7 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict)
route_table = get_route_table (self, AF_INET, TRUE);
route_metric = nm_vpn_connection_get_ip4_route_metric (self);
s_ip = nm_connection_get_setting_ip4_config (_get_applied_connection (self));
+ s_con = nm_connection_get_setting_connection (_get_applied_connection (self));
if (nm_setting_ip_config_get_ignore_auto_routes (s_ip)) {
/* ignore VPN routes */
@@ -1623,6 +1625,7 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict)
/* Merge in user overrides from the NMConnection's IPv4 setting */
nm_ip4_config_merge_setting (config,
s_ip,
+ nm_setting_connection_get_mdns (s_con),
route_table,
route_metric);