diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml index 34ab6999d3..87cf001621 100644 --- a/man/NetworkManager.conf.xml +++ b/man/NetworkManager.conf.xml @@ -653,6 +653,9 @@ ipv6.ip6-privacy=0 connection.lldp + + connection.llmnr + connection.mdns diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 54dce5a844..872f6c8f07 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2177,6 +2177,28 @@ _get_mdns (NMDevice *self) NM_SETTING_CONNECTION_MDNS_DEFAULT); } +static NMSettingConnectionLlmnr +_get_llmnr (NMDevice *self) +{ + NMConnection *connection; + NMSettingConnectionLlmnr llmnr = NM_SETTING_CONNECTION_LLMNR_DEFAULT; + + g_return_val_if_fail (NM_IS_DEVICE (self), NM_SETTING_CONNECTION_LLMNR_DEFAULT); + + connection = nm_device_get_applied_connection (self); + if (connection) + llmnr = nm_setting_connection_get_llmnr (nm_connection_get_setting_connection (connection)); + if (llmnr != NM_SETTING_CONNECTION_LLMNR_DEFAULT) + return llmnr; + + return nm_config_data_get_connection_default_int64 (NM_CONFIG_GET_DATA, + "connection.llmnr", + self, + NM_SETTING_CONNECTION_LLMNR_NO, + NM_SETTING_CONNECTION_LLMNR_YES, + NM_SETTING_CONNECTION_LLMNR_DEFAULT); +} + guint32 nm_device_get_route_table (NMDevice *self, int addr_family, @@ -6883,6 +6905,7 @@ ensure_con_ip_config (NMDevice *self, int addr_family) nm_ip4_config_merge_setting (NM_IP4_CONFIG (con_ip_config), nm_connection_get_setting_ip4_config (connection), _get_mdns (self), + _get_llmnr (self), nm_device_get_route_table (self, addr_family, TRUE), nm_device_get_route_metric (self, addr_family)); } else { @@ -7295,6 +7318,7 @@ dhcp4_state_changed (NMDhcpClient *client, nm_ip4_config_merge_setting (manual, nm_connection_get_setting_ip4_config (connection), NM_SETTING_CONNECTION_MDNS_DEFAULT, + NM_SETTING_CONNECTION_LLMNR_DEFAULT, nm_device_get_route_table (self, AF_INET, TRUE), nm_device_get_route_metric (self, AF_INET)); @@ -7817,6 +7841,7 @@ act_stage3_ip4_config_start (NMDevice *self, nm_ip4_config_merge_setting (config, nm_connection_get_setting_ip4_config (connection), NM_SETTING_CONNECTION_MDNS_DEFAULT, + NM_SETTING_CONNECTION_LLMNR_DEFAULT, nm_device_get_route_table (self, AF_INET, TRUE), nm_device_get_route_metric (self, AF_INET)); configs = g_new0 (NMIP4Config *, 2); @@ -10682,6 +10707,7 @@ nm_device_reactivate_ip4_config (NMDevice *self, nm_ip4_config_merge_setting (priv->con_ip_config_4, s_ip4_new, _get_mdns (self), + _get_llmnr (self), nm_device_get_route_table (self, AF_INET, TRUE), nm_device_get_route_metric (self, AF_INET)); diff --git a/src/dns/nm-dns-systemd-resolved.c b/src/dns/nm-dns-systemd-resolved.c index 1a73aae127..544f19c107 100644 --- a/src/dns/nm-dns-systemd-resolved.c +++ b/src/dns/nm-dns-systemd-resolved.c @@ -65,7 +65,6 @@ typedef struct { GDBusProxy *resolve; GCancellable *init_cancellable; GCancellable *update_cancellable; - GCancellable *mdns_cancellable; CList request_queue_lst_head; } NMDnsSystemdResolvedPrivate; @@ -192,7 +191,8 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic) GVariantBuilder dns, domains; NMCListElem *elem; NMSettingConnectionMdns mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT; - const char *mdns_arg = NULL; + NMSettingConnectionLlmnr llmnr = NM_SETTING_CONNECTION_LLMNR_DEFAULT; + const char *mdns_arg = NULL, *llmnr_arg = NULL; g_variant_builder_init (&dns, G_VARIANT_TYPE ("(ia(iay))")); g_variant_builder_add (&dns, "i", ic->ifindex); @@ -208,8 +208,10 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic) update_add_ip_config (self, &dns, &domains, data); - if (NM_IS_IP4_CONFIG (ip_config)) + if (NM_IS_IP4_CONFIG (ip_config)) { mdns = NM_MAX (mdns, nm_ip4_config_mdns_get (NM_IP4_CONFIG (ip_config))); + llmnr = NM_MAX (llmnr, nm_ip4_config_llmnr_get (NM_IP4_CONFIG (ip_config))); + } } g_variant_builder_close (&dns); @@ -231,6 +233,22 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic) } nm_assert (mdns_arg); + switch (llmnr) { + case NM_SETTING_CONNECTION_LLMNR_NO: + llmnr_arg = "no"; + break; + case NM_SETTING_CONNECTION_LLMNR_RESOLVE: + llmnr_arg = "resolve"; + break; + case NM_SETTING_CONNECTION_LLMNR_YES: + llmnr_arg = "yes"; + break; + case NM_SETTING_CONNECTION_LLMNR_DEFAULT: + llmnr_arg = ""; + break; + } + nm_assert (llmnr_arg); + _request_item_append (&priv->request_queue_lst_head, "SetLinkDNS", g_variant_builder_end (&dns)); @@ -240,6 +258,9 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic) _request_item_append (&priv->request_queue_lst_head, "SetLinkMulticastDNS", g_variant_new ("(is)", ic->ifindex, mdns_arg ?: "")); + _request_item_append (&priv->request_queue_lst_head, + "SetLinkLLMNR", + g_variant_new ("(is)", ic->ifindex, llmnr_arg ?: "")); } static void @@ -410,7 +431,6 @@ dispose (GObject *object) g_clear_object (&priv->resolve); nm_clear_g_cancellable (&priv->init_cancellable); nm_clear_g_cancellable (&priv->update_cancellable); - nm_clear_g_cancellable (&priv->mdns_cancellable); G_OBJECT_CLASS (nm_dns_systemd_resolved_parent_class)->dispose (object); } diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 1edd3257af..5f1004130c 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -295,6 +295,7 @@ typedef struct { NMIPConfigSource mtu_source; int dns_priority; NMSettingConnectionMdns mdns; + NMSettingConnectionLlmnr llmnr; GArray *nameservers; GPtrArray *domains; GPtrArray *searches; @@ -916,6 +917,7 @@ void nm_ip4_config_merge_setting (NMIP4Config *self, NMSettingIPConfig *setting, NMSettingConnectionMdns mdns, + NMSettingConnectionLlmnr llmnr, guint32 route_table, guint32 route_metric) { @@ -1033,6 +1035,7 @@ nm_ip4_config_merge_setting (NMIP4Config *self, nm_ip4_config_set_dns_priority (self, priority); nm_ip4_config_mdns_set (self, mdns); + nm_ip4_config_llmnr_set (self, llmnr); g_object_thaw_notify (G_OBJECT (self)); } @@ -1253,6 +1256,10 @@ nm_ip4_config_merge (NMIP4Config *dst, nm_ip4_config_mdns_set (dst, NM_MAX (nm_ip4_config_mdns_get (src), nm_ip4_config_mdns_get (dst))); + /* LLMNR */ + nm_ip4_config_llmnr_set (dst, + NM_MAX (nm_ip4_config_llmnr_get (src), + nm_ip4_config_llmnr_get (dst))); g_object_thaw_notify (G_OBJECT (dst)); } @@ -1494,6 +1501,10 @@ nm_ip4_config_subtract (NMIP4Config *dst, if (nm_ip4_config_mdns_get (src) == nm_ip4_config_mdns_get (dst)) nm_ip4_config_mdns_set (dst, NM_SETTING_CONNECTION_MDNS_DEFAULT); + /* LLMNR */ + if (nm_ip4_config_llmnr_get (src) == nm_ip4_config_llmnr_get (dst)) + nm_ip4_config_llmnr_set (dst, NM_SETTING_CONNECTION_LLMNR_DEFAULT); + g_object_thaw_notify (G_OBJECT (dst)); } @@ -1595,6 +1606,7 @@ _nm_ip4_config_intersect_helper (NMIP4Config *dst, /* ignore NIS */ /* ignore WINS */ /* ignore mdns */ + /* ignore LLMNR */ if (update_dst) g_object_thaw_notify (G_OBJECT (dst)); @@ -1874,6 +1886,7 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev } dst_priv->mdns = src_priv->mdns; + dst_priv->llmnr = src_priv->llmnr; /* DNS priority */ if (src_priv->dns_priority != dst_priv->dns_priority) { @@ -2562,6 +2575,19 @@ nm_ip4_config_mdns_set (NMIP4Config *self, NM_IP4_CONFIG_GET_PRIVATE (self)->mdns = mdns; } +NMSettingConnectionLlmnr +nm_ip4_config_llmnr_get (const NMIP4Config *self) +{ + return NM_IP4_CONFIG_GET_PRIVATE (self)->llmnr; +} + +void +nm_ip4_config_llmnr_set (NMIP4Config *self, + NMSettingConnectionLlmnr llmnr) +{ + NM_IP4_CONFIG_GET_PRIVATE (self)->llmnr = llmnr; +} + /*****************************************************************************/ void @@ -3212,6 +3238,7 @@ nm_ip4_config_init (NMIP4Config *self) NMP_OBJECT_TYPE_IP4_ROUTE); priv->mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT; + priv->llmnr = NM_SETTING_CONNECTION_LLMNR_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 1992fc2e95..d9ac969cb2 100644 --- a/src/nm-ip4-config.h +++ b/src/nm-ip4-config.h @@ -175,6 +175,7 @@ gboolean nm_ip4_config_commit (const NMIP4Config *self, void nm_ip4_config_merge_setting (NMIP4Config *self, NMSettingIPConfig *setting, NMSettingConnectionMdns mdns, + NMSettingConnectionLlmnr llmnr, guint32 route_table, guint32 route_metric); NMSetting *nm_ip4_config_create_setting (const NMIP4Config *self); @@ -203,6 +204,9 @@ 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); +NMSettingConnectionLlmnr nm_ip4_config_llmnr_get (const NMIP4Config *self); +void nm_ip4_config_llmnr_set (NMIP4Config *self, + NMSettingConnectionLlmnr llmnr); const NMDedupMultiHeadEntry *nm_ip4_config_lookup_addresses (const NMIP4Config *self); void nm_ip4_config_reset_addresses (NMIP4Config *self); diff --git a/src/vpn/nm-vpn-connection.c b/src/vpn/nm-vpn-connection.c index bbf6b9e99a..d1aaa7c991 100644 --- a/src/vpn/nm-vpn-connection.c +++ b/src/vpn/nm-vpn-connection.c @@ -1619,6 +1619,7 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict) nm_ip4_config_merge_setting (config, s_ip, nm_setting_connection_get_mdns (s_con), + nm_setting_connection_get_llmnr (s_con), route_table, route_metric);