resolved: do not disable mdns/llmnr globally if it's enabled on any link

Fixes a regression caused by 2976730a4d.

Fixes #36078.
Fixes #36126.

Co-authored-by: Luca Boccassi <luca.boccassi@gmail.com>
This commit is contained in:
Yu Watanabe
2025-01-25 10:07:38 +09:00
co-authored by Luca Boccassi
parent fd39606c25
commit 962b757d9b
6 changed files with 36 additions and 5 deletions
+2 -5
View File
@@ -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);
+13
View File
@@ -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;
+1
View File
@@ -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);
+6
View File
@@ -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;
}
+13
View File
@@ -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;
+1
View File
@@ -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);