From 90ab504273a7f186ebb76e6acfb778b4e0d7c91b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 13 Aug 2014 15:00:12 +0200 Subject: [PATCH] resolved: skip IPv6 LLMNR if IPv6 is not available --- src/resolve/resolved-link.c | 10 ++++++++-- src/resolve/resolved-manager.c | 25 ++++++++++++++----------- src/shared/socket-util.c | 4 ++-- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c index ed176ab41..7dcaf1863 100644 --- a/src/resolve/resolved-link.c +++ b/src/resolve/resolved-link.c @@ -93,7 +93,10 @@ static void link_allocate_scopes(Link *l) { } else l->unicast_scope = dns_scope_free(l->unicast_scope); - if (link_relevant(l, AF_INET) && l->llmnr_support != SUPPORT_NO && l->manager->llmnr_support != SUPPORT_NO) { + if (link_relevant(l, AF_INET) && + l->llmnr_support != SUPPORT_NO && + l->manager->llmnr_support != SUPPORT_NO && + l->manager->llmnr_ipv4_udp_fd >= 0) { if (!l->llmnr_ipv4_scope) { r = dns_scope_new(l->manager, &l->llmnr_ipv4_scope, l, DNS_PROTOCOL_LLMNR, AF_INET); if (r < 0) @@ -102,7 +105,10 @@ static void link_allocate_scopes(Link *l) { } else l->llmnr_ipv4_scope = dns_scope_free(l->llmnr_ipv4_scope); - if (link_relevant(l, AF_INET6) && l->llmnr_support != SUPPORT_NO && l->manager->llmnr_support != SUPPORT_NO) { + if (link_relevant(l, AF_INET6) && + l->llmnr_support != SUPPORT_NO && + l->manager->llmnr_support != SUPPORT_NO && + l->manager->llmnr_ipv6_udp_fd >= 0) { if (!l->llmnr_ipv6_scope) { r = dns_scope_new(l->manager, &l->llmnr_ipv6_scope, l, DNS_PROTOCOL_LLMNR, AF_INET6); if (r < 0) diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index a2de2edb4..84dad92c5 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -426,23 +426,25 @@ static int manager_llmnr_start(Manager *m) { if (r < 0) return r; - r = manager_llmnr_ipv6_udp_fd(m); - if (r == -EADDRINUSE) - goto eaddrinuse; - if (r < 0) - return r; - r = manager_llmnr_ipv4_tcp_fd(m); if (r == -EADDRINUSE) goto eaddrinuse; if (r < 0) return r; - r = manager_llmnr_ipv6_tcp_fd(m); - if (r == -EADDRINUSE) - goto eaddrinuse; - if (r < 0) - return r; + if (socket_ipv6_is_supported()) { + r = manager_llmnr_ipv6_udp_fd(m); + if (r == -EADDRINUSE) + goto eaddrinuse; + if (r < 0) + return r; + + r = manager_llmnr_ipv6_tcp_fd(m); + if (r == -EADDRINUSE) + goto eaddrinuse; + if (r < 0) + return r; + } return 0; @@ -450,6 +452,7 @@ eaddrinuse: log_warning("There appears to be another LLMNR respondering running. Turning off LLMNR support."); m->llmnr_support = SUPPORT_NO; manager_llmnr_stop(m); + return 0; } diff --git a/src/shared/socket-util.c b/src/shared/socket-util.c index 1a04f323a..38729a25b 100644 --- a/src/shared/socket-util.c +++ b/src/shared/socket-util.c @@ -426,11 +426,11 @@ bool socket_ipv6_is_supported(void) { _cleanup_free_ char *l = NULL; if (access("/sys/module/ipv6", F_OK) != 0) - return 0; + return false; /* If we can't check "disable" parameter, assume enabled */ if (read_one_line_file("/sys/module/ipv6/parameters/disable", &l) < 0) - return 1; + return true; /* If module was loaded with disable=1 no IPv6 available */ return l[0] == '0'; -- 2.30.2