mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 00:14:32 +09:00
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:
@@ -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);
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user