diff --git a/src/resolve/resolved-link-bus.c b/src/resolve/resolved-link-bus.c index 5e9e5bf17a..1c26dcbc66 100644 --- a/src/resolve/resolved-link-bus.c +++ b/src/resolve/resolved-link-bus.c @@ -14,6 +14,8 @@ #include "resolve-util.h" #include "resolved-bus.h" #include "resolved-link-bus.h" +#include "resolved-llmnr.h" +#include "resolved-mdns.h" #include "resolved-resolv-conf.h" #include "socket-netlink.h" #include "stdio-util.h" @@ -517,6 +519,8 @@ int bus_link_method_set_llmnr(sd_bus_message *message, void *userdata, sd_bus_er (void) link_save_user(l); + manager_llmnr_maybe_stop(l->manager); + log_link_info(l, "Bus client set LLMNR setting: %s", resolve_support_to_string(mode)); } @@ -567,6 +571,8 @@ int bus_link_method_set_mdns(sd_bus_message *message, void *userdata, sd_bus_err (void) link_save_user(l); + manager_mdns_maybe_stop(l->manager); + log_link_info(l, "Bus client set MulticastDNS setting: %s", resolve_support_to_string(mode)); } @@ -769,6 +775,9 @@ int bus_link_method_revert(sd_bus_message *message, void *userdata, sd_bus_error (void) manager_write_resolv_conf(l->manager); (void) manager_send_changed(l->manager, "DNS"); + manager_llmnr_maybe_stop(l->manager); + manager_mdns_maybe_stop(l->manager); + return sd_bus_reply_method_return(message, NULL); } diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c index 067a0813ec..928137b967 100644 --- a/src/resolve/resolved-link.c +++ b/src/resolve/resolved-link.c @@ -651,16 +651,13 @@ int link_update(Link *l) { r = manager_llmnr_start(l->manager); if (r < 0) return r; - } else - manager_llmnr_stop(l->manager); - + } if (link_get_mdns_support(l) != RESOLVE_SUPPORT_NO) { r = manager_mdns_start(l->manager); if (r < 0) return r; - } else - manager_mdns_stop(l->manager); + } link_allocate_scopes(l); link_add_rrs(l, false); diff --git a/src/resolve/resolved-llmnr.c b/src/resolve/resolved-llmnr.c index 9469bdac86..abb9c46960 100644 --- a/src/resolve/resolved-llmnr.c +++ b/src/resolve/resolved-llmnr.c @@ -25,6 +25,19 @@ void manager_llmnr_stop(Manager *m) { m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd); } +void manager_llmnr_maybe_stop(Manager *m) { + assert(m); + + /* This stops LLMNR only when no interface enables LLMNR. */ + + Link *l; + HASHMAP_FOREACH(l, m->links) + if (link_get_llmnr_support(l) != RESOLVE_SUPPORT_NO) + return; + + manager_llmnr_stop(m); +} + int manager_llmnr_start(Manager *m) { int r; diff --git a/src/resolve/resolved-llmnr.h b/src/resolve/resolved-llmnr.h index 4cdd2606e6..358201b5df 100644 --- a/src/resolve/resolved-llmnr.h +++ b/src/resolve/resolved-llmnr.h @@ -11,4 +11,5 @@ int manager_llmnr_ipv4_tcp_fd(Manager *m); int manager_llmnr_ipv6_tcp_fd(Manager *m); void manager_llmnr_stop(Manager *m); +void manager_llmnr_maybe_stop(Manager *m); int manager_llmnr_start(Manager *m); diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index dbaad81734..5ec946717f 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -105,6 +105,9 @@ static int manager_process_link(sd_netlink *rtnl, sd_netlink_message *mm, void * break; } + /* Now check all the links, and if mDNS/llmr are disabled everywhere, stop them globally too. */ + manager_llmnr_maybe_stop(m); + manager_mdns_maybe_stop(m); return 0; fail: @@ -287,6 +290,9 @@ static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void * (void) manager_write_resolv_conf(m); (void) manager_send_changed(m, "DNS"); + /* Now check all the links, and if mDNS/llmr are disabled everywhere, stop them globally too. */ + manager_llmnr_maybe_stop(m); + manager_mdns_maybe_stop(m); return 0; } diff --git a/src/resolve/resolved-mdns.c b/src/resolve/resolved-mdns.c index 7e9bb693af..4e6aade726 100644 --- a/src/resolve/resolved-mdns.c +++ b/src/resolve/resolved-mdns.c @@ -22,6 +22,19 @@ void manager_mdns_stop(Manager *m) { m->mdns_ipv6_fd = safe_close(m->mdns_ipv6_fd); } +void manager_mdns_maybe_stop(Manager *m) { + assert(m); + + /* This stops mDNS only when no interface enables mDNS. */ + + Link *l; + HASHMAP_FOREACH(l, m->links) + if (link_get_mdns_support(l) != RESOLVE_SUPPORT_NO) + return; + + manager_mdns_stop(m); +} + int manager_mdns_start(Manager *m) { int r; diff --git a/src/resolve/resolved-mdns.h b/src/resolve/resolved-mdns.h index 38ef1808df..c52bce1069 100644 --- a/src/resolve/resolved-mdns.h +++ b/src/resolve/resolved-mdns.h @@ -10,4 +10,5 @@ int manager_mdns_ipv4_fd(Manager *m); int manager_mdns_ipv6_fd(Manager *m); void manager_mdns_stop(Manager *m); +void manager_mdns_maybe_stop(Manager *m); int manager_mdns_start(Manager *m);