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);