From: Lennart Poettering Date: Mon, 2 Sep 2024 15:49:19 +0000 (+0200) Subject: resolved: add a new DnsScopeOrigin enum, to delcare the "origin" of a DnsScope explicitly X-Git-Tag: v258-rc1~563^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6a198b43828a41bbb85917ef6656b3ecabf6c747;p=thirdparty%2Fsystemd.git resolved: add a new DnsScopeOrigin enum, to delcare the "origin" of a DnsScope explicitly This new enum field is supposed to indicate why a DnsScope came to be. For now it distinguishes two origins: the "global" one (which is what is configured in resolved.conf) and "link" ones (which are synthesized for each link). The field as is is pretty redundant, the same information can be determined from whether the .link field is set or not. This is pretty much just preparation for later commits that add statically configured additional DnsScopes whose origin shall be encoded with this. --- diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 50f290a8d86..d4bfbccdc3b 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 834bc918859..54f0b7b7a33 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 1e2d95b4ea3..432d7cf8b0f 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 e5c2ff8bb7e..856161fa47c 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 6ae6b9e09e1..ca4bd22ce38 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 0023f0bf939..120080d94e8 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);