Last active
February 18, 2021 20:02
-
-
Save ephemient/8ae6a0c95106c68e809f096ba9a5ee06 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From: Daniel Lin <[email protected]> | |
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
Upstream: https://git.kernel.org/pub/scm/network/wireless/iwd.git/commit/?id=c68e9fc0a6a83bd0f345c61eae2e6c7b4fa72099