diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 50f290a8d8..d4bfbccdc3 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -29,6 +29,7 @@ #include "resolved-mdns.h" #include "resolved-timeouts.h" #include "socket-util.h" +#include "string-table.h" #include "strv.h" #define MULTICAST_RATELIMIT_INTERVAL_USEC (1*USEC_PER_SEC) @@ -38,11 +39,22 @@ #define MULTICAST_RESEND_TIMEOUT_MIN_USEC (100 * USEC_PER_MSEC) #define MULTICAST_RESEND_TIMEOUT_MAX_USEC (1 * USEC_PER_SEC) -int dns_scope_new(Manager *m, DnsScope **ret, Link *l, DnsProtocol protocol, int family) { +int dns_scope_new( + Manager *m, + DnsScope **ret, + DnsScopeOrigin origin, + Link *link, + DnsProtocol protocol, + int family) { + DnsScope *s; assert(m); assert(ret); + assert(origin >= 0); + assert(origin < _DNS_SCOPE_ORIGIN_MAX); + + assert(!!link == (origin == DNS_SCOPE_LINK)); s = new(DnsScope, 1); if (!s) @@ -50,7 +62,8 @@ int dns_scope_new(Manager *m, DnsScope **ret, Link *l, DnsProtocol protocol, int *s = (DnsScope) { .manager = m, - .link = l, + .link = link, + .origin = origin, .protocol = protocol, .family = family, .resend_timeout = MULTICAST_RESEND_TIMEOUT_MIN_USEC, @@ -66,9 +79,9 @@ int dns_scope_new(Manager *m, DnsScope **ret, Link *l, DnsProtocol protocol, int * not update it from the on, even if the setting * changes. */ - if (l) { - s->dnssec_mode = link_get_dnssec_mode(l); - s->dns_over_tls_mode = link_get_dns_over_tls_mode(l); + if (link) { + s->dnssec_mode = link_get_dnssec_mode(link); + s->dns_over_tls_mode = link_get_dns_over_tls_mode(link); } else { s->dnssec_mode = manager_get_dnssec_mode(m); s->dns_over_tls_mode = manager_get_dns_over_tls_mode(m); @@ -84,7 +97,11 @@ int dns_scope_new(Manager *m, DnsScope **ret, Link *l, DnsProtocol protocol, int dns_scope_llmnr_membership(s, true); dns_scope_mdns_membership(s, true); - log_debug("New scope on link %s, protocol %s, family %s", l ? l->ifname : "*", dns_protocol_to_string(protocol), family == AF_UNSPEC ? "*" : af_to_name(family)); + log_debug("New scope on link %s, protocol %s, family %s, origin %s", + link ? link->ifname : "*", + dns_protocol_to_string(protocol), + family == AF_UNSPEC ? "*" : af_to_name(family), + dns_scope_origin_to_string(origin)); *ret = s; return 0; @@ -112,7 +129,11 @@ DnsScope* dns_scope_free(DnsScope *s) { if (!s) return NULL; - log_debug("Removing scope on link %s, protocol %s, family %s", s->link ? s->link->ifname : "*", dns_protocol_to_string(s->protocol), s->family == AF_UNSPEC ? "*" : af_to_name(s->family)); + log_debug("Removing scope on link %s, protocol %s, family %s, origin %s", + s->link ? s->link->ifname : "*", + dns_protocol_to_string(s->protocol), + s->family == AF_UNSPEC ? "*" : af_to_name(s->family), + dns_scope_origin_to_string(s->origin)); dns_scope_llmnr_membership(s, false); dns_scope_mdns_membership(s, false); @@ -1380,6 +1401,8 @@ void dns_scope_dump(DnsScope *s, FILE *f) { fputs(af_to_name(s->family), f); } + fputs(" origin=", f); + fputs(dns_scope_origin_to_string(s->origin), f); fputs("]\n", f); if (!dns_zone_is_empty(&s->zone)) { @@ -1806,3 +1829,10 @@ int dns_question_types_suitable_for_protocol(DnsQuestion *q, DnsProtocol protoco return false; } + +static const char* const dns_scope_origin_table[_DNS_SCOPE_ORIGIN_MAX] = { + [DNS_SCOPE_GLOBAL] = "global", + [DNS_SCOPE_LINK] = "link", +}; + +DEFINE_STRING_TABLE_LOOKUP(dns_scope_origin, DnsScopeOrigin); diff --git a/src/resolve/resolved-dns-scope.h b/src/resolve/resolved-dns-scope.h index 834bc91885..54f0b7b7a3 100644 --- a/src/resolve/resolved-dns-scope.h +++ b/src/resolve/resolved-dns-scope.h @@ -31,9 +31,18 @@ typedef enum DnsScopeMatch { _DNS_SCOPE_MATCH_INVALID = -EINVAL, } DnsScopeMatch; +typedef enum DnsScopeOrigin { + DNS_SCOPE_GLOBAL, + DNS_SCOPE_LINK, + _DNS_SCOPE_ORIGIN_MAX, + _DNS_SCOPE_ORIGIN_INVALID = -EINVAL, +} DnsScopeOrigin; + struct DnsScope { Manager *manager; + DnsScopeOrigin origin; + DnsProtocol protocol; int family; @@ -74,7 +83,7 @@ struct DnsScope { bool announced; }; -int dns_scope_new(Manager *m, DnsScope **ret, Link *l, DnsProtocol p, int family); +int dns_scope_new(Manager *m, DnsScope **ret, DnsScopeOrigin origin, Link *link, DnsProtocol protocol, int family); DnsScope* dns_scope_free(DnsScope *s); void dns_scope_packet_received(DnsScope *s, usec_t rtt); @@ -124,3 +133,6 @@ int dns_scope_dump_cache_to_json(DnsScope *scope, sd_json_variant **ret); int dns_type_suitable_for_protocol(uint16_t type, DnsProtocol protocol); int dns_question_types_suitable_for_protocol(DnsQuestion *q, DnsProtocol protocol); + +const char* dns_scope_origin_to_string(DnsScopeOrigin origin) _const_; +DnsScopeOrigin dns_scope_origin_from_string(const char *s) _pure_; diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c index 1e2d95b4ea..432d7cf8b0 100644 --- a/src/resolve/resolved-link.c +++ b/src/resolve/resolved-link.c @@ -139,7 +139,7 @@ void link_allocate_scopes(Link *l) { if (!l->unicast_scope) { dns_server_reset_features_all(l->dns_servers); - r = dns_scope_new(l->manager, &l->unicast_scope, l, DNS_PROTOCOL_DNS, AF_UNSPEC); + r = dns_scope_new(l->manager, &l->unicast_scope, DNS_SCOPE_LINK, l, DNS_PROTOCOL_DNS, AF_UNSPEC); if (r < 0) log_link_warning_errno(l, r, "Failed to allocate DNS scope, ignoring: %m"); } @@ -149,7 +149,7 @@ void link_allocate_scopes(Link *l) { if (link_relevant(l, AF_INET, true) && link_get_llmnr_support(l) != RESOLVE_SUPPORT_NO) { if (!l->llmnr_ipv4_scope) { - r = dns_scope_new(l->manager, &l->llmnr_ipv4_scope, l, DNS_PROTOCOL_LLMNR, AF_INET); + r = dns_scope_new(l->manager, &l->llmnr_ipv4_scope, DNS_SCOPE_LINK, l, DNS_PROTOCOL_LLMNR, AF_INET); if (r < 0) log_link_warning_errno(l, r, "Failed to allocate LLMNR IPv4 scope, ignoring: %m"); } @@ -159,7 +159,7 @@ void link_allocate_scopes(Link *l) { if (link_relevant(l, AF_INET6, true) && link_get_llmnr_support(l) != RESOLVE_SUPPORT_NO) { if (!l->llmnr_ipv6_scope) { - r = dns_scope_new(l->manager, &l->llmnr_ipv6_scope, l, DNS_PROTOCOL_LLMNR, AF_INET6); + r = dns_scope_new(l->manager, &l->llmnr_ipv6_scope, DNS_SCOPE_LINK, l, DNS_PROTOCOL_LLMNR, AF_INET6); if (r < 0) log_link_warning_errno(l, r, "Failed to allocate LLMNR IPv6 scope, ignoring: %m"); } @@ -169,7 +169,7 @@ void link_allocate_scopes(Link *l) { if (link_relevant(l, AF_INET, true) && link_get_mdns_support(l) != RESOLVE_SUPPORT_NO) { if (!l->mdns_ipv4_scope) { - r = dns_scope_new(l->manager, &l->mdns_ipv4_scope, l, DNS_PROTOCOL_MDNS, AF_INET); + r = dns_scope_new(l->manager, &l->mdns_ipv4_scope, DNS_SCOPE_LINK, l, DNS_PROTOCOL_MDNS, AF_INET); if (r < 0) log_link_warning_errno(l, r, "Failed to allocate mDNS IPv4 scope, ignoring: %m"); } @@ -179,7 +179,7 @@ void link_allocate_scopes(Link *l) { if (link_relevant(l, AF_INET6, true) && link_get_mdns_support(l) != RESOLVE_SUPPORT_NO) { if (!l->mdns_ipv6_scope) { - r = dns_scope_new(l->manager, &l->mdns_ipv6_scope, l, DNS_PROTOCOL_MDNS, AF_INET6); + r = dns_scope_new(l->manager, &l->mdns_ipv6_scope, DNS_SCOPE_LINK, l, DNS_PROTOCOL_MDNS, AF_INET6); if (r < 0) log_link_warning_errno(l, r, "Failed to allocate mDNS IPv6 scope, ignoring: %m"); } diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index e5c2ff8bb7..856161fa47 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -674,7 +674,7 @@ static int manager_dispatch_reload_signal(sd_event_source *s, const struct signa /* The default scope configuration is influenced by the manager's configuration (modes, etc.), so * recreate it on reload. */ - r = dns_scope_new(m, &m->unicast_scope, NULL, DNS_PROTOCOL_DNS, AF_UNSPEC); + r = dns_scope_new(m, &m->unicast_scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_UNSPEC); if (r < 0) return r; @@ -755,7 +755,7 @@ int manager_new(Manager **ret) { if (r < 0) log_warning_errno(r, "Failed to load DNS-SD configuration files: %m"); - r = dns_scope_new(m, &m->unicast_scope, NULL, DNS_PROTOCOL_DNS, AF_UNSPEC); + r = dns_scope_new(m, &m->unicast_scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_UNSPEC); if (r < 0) return r; diff --git a/src/resolve/test-dns-query.c b/src/resolve/test-dns-query.c index 6ae6b9e09e..ca4bd22ce3 100644 --- a/src/resolve/test-dns-query.c +++ b/src/resolve/test-dns-query.c @@ -786,7 +786,7 @@ static void go_env_setup(GoEnvironment *env, GoConfig *cfg) { } if (cfg->has_scope) { - ASSERT_OK(dns_scope_new(&env->manager, &env->scope, env->link, env->protocol, env->family)); + ASSERT_OK(dns_scope_new(&env->manager, &env->scope, env->link ? DNS_SCOPE_LINK : DNS_SCOPE_GLOBAL, env->link, env->protocol, env->family)); ASSERT_NOT_NULL(env->scope); env->server_addr.in.s_addr = htobe32(0x7f000001); diff --git a/src/resolve/test-dns-zone.c b/src/resolve/test-dns-zone.c index 0023f0bf93..120080d94e 100644 --- a/src/resolve/test-dns-zone.c +++ b/src/resolve/test-dns-zone.c @@ -27,7 +27,7 @@ TEST(dns_zone_put_simple) { DnsZoneItem *item = NULL; _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; - ASSERT_OK(dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET)); + ASSERT_OK(dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET)); ASSERT_NOT_NULL(scope); zone = &scope->zone; @@ -51,7 +51,7 @@ TEST(dns_zone_put_any_class_is_invalid) { DnsZone *zone = NULL; _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); zone = &scope->zone; @@ -69,7 +69,7 @@ TEST(dns_zone_put_any_type_is_invalid) { DnsZone *zone = NULL; _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); zone = &scope->zone; @@ -91,7 +91,7 @@ TEST(dns_zone_remove_rr_match) { DnsZone *zone = NULL; _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr_in = NULL, *rr_out = NULL; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); zone = &scope->zone; @@ -116,7 +116,7 @@ TEST(dns_zone_remove_rr_match_one) { DnsZone *zone = NULL; _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr_in = NULL, *rr_out = NULL; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); zone = &scope->zone; @@ -149,7 +149,7 @@ TEST(dns_zone_remove_rr_different_payload) { DnsZone *zone = NULL; _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr_in = NULL, *rr_out = NULL; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); zone = &scope->zone; @@ -179,7 +179,7 @@ TEST(dns_zone_remove_rrs_by_key) { _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr1 = NULL, *rr2 = NULL, *rr3 = NULL; DnsResourceKey *key = NULL; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); zone = &scope->zone; @@ -249,7 +249,7 @@ TEST(dns_zone_lookup_match_a) { _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL, *soa = NULL; bool tentative; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); add_zone_rrs(scope); @@ -271,7 +271,7 @@ TEST(dns_zone_lookup_match_cname) { _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL, *soa = NULL; bool tentative; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); add_zone_rrs(scope); @@ -294,7 +294,7 @@ TEST(dns_zone_lookup_match_any) { _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL, *soa = NULL; bool tentative; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); add_zone_rrs(scope); @@ -325,7 +325,7 @@ TEST(dns_zone_lookup_match_any_apex) { _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL, *soa = NULL; bool tentative; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); add_zone_rrs(scope); @@ -350,7 +350,7 @@ TEST(dns_zone_lookup_match_nothing) { _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL, *soa = NULL; bool tentative; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); add_zone_rrs(scope); @@ -371,7 +371,7 @@ TEST(dns_zone_lookup_match_nothing_with_soa) { _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL, *soa = NULL; bool tentative; - dns_scope_new(&manager, &scope, NULL, DNS_PROTOCOL_DNS, AF_INET); + dns_scope_new(&manager, &scope, DNS_SCOPE_GLOBAL, /* link= */ NULL, DNS_PROTOCOL_DNS, AF_INET); ASSERT_NOT_NULL(scope); add_zone_rrs(scope);