All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Lin <ephemient@gmail.com>
To: iwd@lists.01.org
Subject: [PATCH v3] src: configure systemd-resolved's MulticastDNS= setting
Date: Thu, 11 Feb 2021 15:54:17 -0500	[thread overview]
Message-ID: <20210211205417.U5ob5%ephemient@gmail.com> (raw)
In-Reply-To: <20210210234359.11WKe%ephemient@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 6708 bytes --]

When using iwd.conf:[General].EnableNetworkConfiguration=true, it is not
possible to configure systemd.network:[Network].MulticastDNS= as
systemd-networkd considers the link to be unmanaged. This patch allows
iwd to configure that setting on systemd-resolved directly.
---
 src/iwd.config.rst |  9 ++++++
 src/netconfig.c    |  6 ++++
 src/resolve.c      | 70 ++++++++++++++++++++++++++++++----------------
 src/resolve.h      |  1 +
 4 files changed, 62 insertions(+), 24 deletions(-)

diff --git a/src/iwd.config.rst b/src/iwd.config.rst
index 0064dfd2..b3c9491e 100644
--- a/src/iwd.config.rst
+++ b/src/iwd.config.rst
@@ -212,6 +212,15 @@ The group ``[Network]`` contains network configuration related settings.
 
        If not specified, ``300`` is used as default.
 
+   * - MulticastDNS
+     - Values: true, false, resolve
+
+       Configures multicast DNS on each interface. If not specified,
+       systemd-resolved's default value will remain untouched.
+       See ``man 5 systemd.network`` for details.
+
+       Only applies when ``NameResolvingService=systemd``.
+
 Blacklist
 ---------
 
diff --git a/src/netconfig.c b/src/netconfig.c
index cf092b78..749ba0ad 100644
--- a/src/netconfig.c
+++ b/src/netconfig.c
@@ -963,6 +963,8 @@ bool netconfig_configure(struct netconfig *netconfig,
 				const uint8_t *mac_address,
 				netconfig_notify_func_t notify, void *user_data)
 {
+	char *mdns;
+
 	netconfig->dns4_overrides = l_settings_get_string_list(active_settings,
 							"IPv4", "DNS", ' ');
 
@@ -1006,6 +1008,10 @@ bool netconfig_configure(struct netconfig *netconfig,
 
 	netconfig_ipv6_select_and_install(netconfig);
 
+	mdns = l_settings_get_string(active_settings, "Network", "MulticastDNS");
+	resolve_set_mdns(netconfig->resolve, mdns);
+	l_free(mdns);
+
 	return true;
 }
 
diff --git a/src/resolve.c b/src/resolve.c
index d3b483a8..5b20b8c9 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -40,6 +40,7 @@
 struct resolve_ops {
 	void (*set_dns)(struct resolve *resolve, char **dns_list);
 	void (*set_domains)(struct resolve *resolve, char **domain_list);
+	void (*set_mdns)(struct resolve *resolve, const char *mdns);
 	void (*revert)(struct resolve *resolve);
 	void (*destroy)(struct resolve *resolve);
 };
@@ -78,6 +79,17 @@ void resolve_set_domains(struct resolve *resolve, char **domain_list)
 	resolve->ops->set_domains(resolve, domain_list);
 }
 
+void resolve_set_mdns(struct resolve *resolve, const char *mdns)
+{
+	if (!mdns)
+		return;
+
+	if (!resolve->ops->set_mdns)
+		return;
+
+	resolve->ops->set_mdns(resolve, mdns);
+}
+
 void resolve_revert(struct resolve *resolve)
 {
 	if (!resolve->ops->revert)
@@ -112,9 +124,10 @@ struct systemd {
 	struct resolve super;
 };
 
-static void systemd_link_dns_reply(struct l_dbus_message *message,
+static void systemd_link_generic_reply(struct l_dbus_message *message,
 								void *user_data)
 {
+	const char *type = user_data;
 	const char *name;
 	const char *text;
 
@@ -123,8 +136,8 @@ static void systemd_link_dns_reply(struct l_dbus_message *message,
 
 	l_dbus_message_get_error(message, &name, &text);
 
-	l_error("resolve-systemd: Failed to modify the DNS entries. %s: %s",
-								name, text);
+	l_error("resolve-systemd: Failed to modify the %s entries. %s: %s",
+								type, name, text);
 }
 
 static bool systemd_builder_add_dns(struct l_dbus_message_builder *builder,
@@ -205,23 +218,8 @@ static void resolve_systemd_set_dns(struct resolve *resolve, char **dns_list)
 	l_dbus_message_builder_finalize(builder);
 	l_dbus_message_builder_destroy(builder);
 
-	l_dbus_send_with_reply(dbus_get_bus(), message, systemd_link_dns_reply,
-								NULL, NULL);
-}
-
-static void systemd_set_link_domains_reply(struct l_dbus_message *message,
-								void *user_data)
-{
-	const char *name;
-	const char *text;
-
-	if (!l_dbus_message_is_error(message))
-		return;
-
-	l_dbus_message_get_error(message, &name, &text);
-
-	l_error("resolve-systemd: Failed to modify the domain entries. %s: %s",
-								name, text);
+	l_dbus_send_with_reply(dbus_get_bus(), message, systemd_link_generic_reply,
+								"DNS", NULL);
 }
 
 static void resolve_systemd_set_domains(struct resolve *resolve,
@@ -266,8 +264,31 @@ static void resolve_systemd_set_domains(struct resolve *resolve,
 	l_dbus_message_builder_finalize(builder);
 	l_dbus_message_builder_destroy(builder);
 
-	l_dbus_send_with_reply(dbus_get_bus(), message,
-				systemd_set_link_domains_reply, NULL, NULL);
+	l_dbus_send_with_reply(dbus_get_bus(), message, systemd_link_generic_reply,
+				"domains", NULL);
+}
+
+static void resolve_systemd_set_mdns(struct resolve *resolve, const char *mdns)
+{
+	struct l_dbus_message *message;
+
+	l_debug("ifindex: %u", resolve->ifindex);
+
+	if (L_WARN_ON(!systemd_state.is_ready))
+		return;
+
+	message = l_dbus_message_new_method_call(dbus_get_bus(),
+					SYSTEMD_RESOLVED_SERVICE,
+					SYSTEMD_RESOLVED_MANAGER_PATH,
+					SYSTEMD_RESOLVED_MANAGER_INTERFACE,
+					"SetLinkMulticastDNS");
+
+	if (!message)
+		return;
+
+	l_dbus_message_set_arguments(message, "is", resolve->ifindex, mdns);
+	l_dbus_send_with_reply(dbus_get_bus(), message, systemd_link_generic_reply,
+								"MulticastDNS", NULL);
 }
 
 static void resolve_systemd_revert(struct resolve *resolve)
@@ -288,8 +309,8 @@ static void resolve_systemd_revert(struct resolve *resolve)
 		return;
 
 	l_dbus_message_set_arguments(message, "i", resolve->ifindex);
-	l_dbus_send_with_reply(dbus_get_bus(), message, systemd_link_dns_reply,
-								NULL, NULL);
+	l_dbus_send_with_reply(dbus_get_bus(), message, systemd_link_generic_reply,
+								"DNS", NULL);
 }
 
 static void resolve_systemd_destroy(struct resolve *resolve)
@@ -302,6 +323,7 @@ static void resolve_systemd_destroy(struct resolve *resolve)
 static const struct resolve_ops systemd_ops = {
 	.set_dns = resolve_systemd_set_dns,
 	.set_domains = resolve_systemd_set_domains,
+	.set_mdns = resolve_systemd_set_mdns,
 	.revert = resolve_systemd_revert,
 	.destroy = resolve_systemd_destroy,
 };
diff --git a/src/resolve.h b/src/resolve.h
index 64ed15f3..2301a288 100644
--- a/src/resolve.h
+++ b/src/resolve.h
@@ -23,5 +23,6 @@
 struct resolve *resolve_new(uint32_t ifindex);
 void resolve_set_dns(struct resolve *resolve, char **dns_list);
 void resolve_set_domains(struct resolve *resolve, char **domain_list);
+void resolve_set_mdns(struct resolve *resolve, const char *mdns);
 void resolve_revert(struct resolve *resolve);
 void resolve_free(struct resolve *resolve);
-- 
2.30.1

  parent reply	other threads:[~2021-02-11 20:54 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-10 23:43 [PATCH] src: configure systemd-resolved's MulticastDNS= setting Daniel Lin
2021-02-11 15:59 ` Denis Kenzior
2021-02-11 18:04   ` Daniel Lin
2021-02-11 20:45     ` Denis Kenzior
2021-02-11 18:11 ` [PATCH v2] " Daniel Lin
2021-02-11 20:48   ` Denis Kenzior
2021-02-11 20:54 ` Daniel Lin [this message]
2021-02-11 21:08   ` [PATCH v3] " Denis Kenzior

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210211205417.U5ob5%ephemient@gmail.com \
    --to=ephemient@gmail.com \
    --cc=iwd@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.