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.
This commit is contained in:
Lennart Poettering
2024-09-02 17:49:19 +02:00
parent 18bd6a4d11
commit 6a198b4382
6 changed files with 71 additions and 29 deletions

View File

@@ -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);

View File

@@ -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_;

View File

@@ -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");
}

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);