Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ephemient/8ae6a0c95106c68e809f096ba9a5ee06 to your computer and use it in GitHub Desktop.
Save ephemient/8ae6a0c95106c68e809f096ba9a5ee06 to your computer and use it in GitHub Desktop.
From: Daniel Lin <ephemient@gmail.com>
Date: Thu, 11 Feb 2021 15:54:17 -0500
Subject: [PATCH] resolve: configure systemd-resolved's MulticastDNS= setting
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 | 7 +++++
src/resolve.c | 69 ++++++++++++++++++++++++++++++----------------
src/resolve.h | 1 +
4 files changed, 63 insertions(+), 23 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..fa642122 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,11 @@ 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..28fe6558 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,
@@ -267,7 +265,31 @@ static void resolve_systemd_set_domains(struct resolve *resolve,
l_dbus_message_builder_destroy(builder);
l_dbus_send_with_reply(dbus_get_bus(), message,
- systemd_set_link_domains_reply, NULL, NULL);
+ 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 +310,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 +324,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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment