From 78f5c649e2e6b449574e1e81ec4f929b2ef516fb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 15 Apr 2024 14:47:44 +0900 Subject: [PATCH 1/9] network: rename DHCPUseDomains -> UseDomains As it is also used for NDisc. --- src/network/networkd-dhcp-common.c | 17 ++++++++--------- src/network/networkd-dhcp-common.h | 20 ++++++++++---------- src/network/networkd-dhcp4.c | 2 +- src/network/networkd-gperf.gperf | 4 ++-- src/network/networkd-json.c | 4 ++-- src/network/networkd-manager.h | 4 ++-- src/network/networkd-ndisc.c | 4 +--- src/network/networkd-ndisc.h | 1 - src/network/networkd-network-gperf.gperf | 2 +- src/network/networkd-network.h | 6 +++--- src/network/networkd-state-file.c | 16 ++++++++-------- src/network/test-network-tables.c | 2 +- 12 files changed, 39 insertions(+), 43 deletions(-) diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index 3015e2b5c8..fb578fe714 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -594,7 +594,7 @@ int config_parse_dhcp_use_domains( void *userdata) { Network *network = userdata; - DHCPUseDomains d; + UseDomains d; assert(filename); assert(lvalue); @@ -602,7 +602,7 @@ int config_parse_dhcp_use_domains( assert(rvalue); assert(data); - d = dhcp_use_domains_from_string(rvalue); + d = use_domains_from_string(rvalue); if (d < 0) { log_syntax(unit, LOG_WARNING, filename, line, d, "Failed to parse %s=%s, ignoring assignment: %m", lvalue, rvalue); @@ -632,8 +632,6 @@ int config_parse_dhcp_use_domains( return 0; } -DEFINE_CONFIG_PARSE_ENUM(config_parse_default_dhcp_use_domains, dhcp_use_domains, DHCPUseDomains, "Failed to parse UseDomains=") - int config_parse_dhcp_use_ntp( const char* unit, const char *filename, @@ -1139,13 +1137,14 @@ int config_parse_dhcp_request_options( } } -static const char* const dhcp_use_domains_table[_DHCP_USE_DOMAINS_MAX] = { - [DHCP_USE_DOMAINS_NO] = "no", - [DHCP_USE_DOMAINS_ROUTE] = "route", - [DHCP_USE_DOMAINS_YES] = "yes", +static const char* const use_domains_table[_USE_DOMAINS_MAX] = { + [USE_DOMAINS_NO] = "no", + [USE_DOMAINS_ROUTE] = "route", + [USE_DOMAINS_YES] = "yes", }; -DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dhcp_use_domains, DHCPUseDomains, DHCP_USE_DOMAINS_YES); +DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(use_domains, UseDomains, USE_DOMAINS_YES); +DEFINE_CONFIG_PARSE_ENUM(config_parse_use_domains, use_domains, UseDomains, "Failed to parse UseDomains=") static const char * const dhcp_option_data_type_table[_DHCP_OPTION_DATA_MAX] = { [DHCP_OPTION_DATA_UINT8] = "uint8", diff --git a/src/network/networkd-dhcp-common.h b/src/network/networkd-dhcp-common.h index 53e3e12f53..880429960a 100644 --- a/src/network/networkd-dhcp-common.h +++ b/src/network/networkd-dhcp-common.h @@ -24,13 +24,13 @@ typedef struct Link Link; typedef struct Manager Manager; typedef struct Network Network; -typedef enum DHCPUseDomains { - DHCP_USE_DOMAINS_NO, - DHCP_USE_DOMAINS_YES, - DHCP_USE_DOMAINS_ROUTE, - _DHCP_USE_DOMAINS_MAX, - _DHCP_USE_DOMAINS_INVALID = -EINVAL, -} DHCPUseDomains; +typedef enum UseDomains { + USE_DOMAINS_NO, + USE_DOMAINS_YES, + USE_DOMAINS_ROUTE, + _USE_DOMAINS_MAX, + _USE_DOMAINS_INVALID = -EINVAL, +} UseDomains; typedef enum DHCPOptionDataType { DHCP_OPTION_DATA_UINT8, @@ -87,8 +87,8 @@ static inline bool in6_prefix_is_filtered(const struct in6_addr *prefix, uint8_t int link_get_captive_portal(Link *link, const char **ret); -const char* dhcp_use_domains_to_string(DHCPUseDomains p) _const_; -DHCPUseDomains dhcp_use_domains_from_string(const char *s) _pure_; +const char* use_domains_to_string(UseDomains p) _const_; +UseDomains use_domains_from_string(const char *s) _pure_; const char *dhcp_option_data_type_to_string(DHCPOptionDataType d) _const_; DHCPOptionDataType dhcp_option_data_type_from_string(const char *d) _pure_; @@ -99,7 +99,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_route_metric); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_send_hostname); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_dns); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_domains); -CONFIG_PARSER_PROTOTYPE(config_parse_default_dhcp_use_domains); +CONFIG_PARSER_PROTOTYPE(config_parse_use_domains); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_ntp); CONFIG_PARSER_PROTOTYPE(config_parse_iaid); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_or_ra_route_table); diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 71b132f94f..4a0e26d172 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1540,7 +1540,7 @@ static int dhcp4_configure(Link *link) { return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set request flag for classless static route: %m"); } - if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) { + if (link->network->dhcp_use_domains > 0) { r = sd_dhcp_client_set_request_option(link->dhcp_client, SD_DHCP_OPTION_DOMAIN_SEARCH); if (r < 0) return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set request flag for domain search list: %m"); diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index 0c23b4ba82..8bd75d9e3b 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -30,10 +30,10 @@ Network.RouteTable, config_parse_route_table_names, Network.IPv4Forwarding, config_parse_tristate, 0, offsetof(Manager, ip_forwarding[0]) Network.IPv6Forwarding, config_parse_tristate, 0, offsetof(Manager, ip_forwarding[1]) Network.IPv6PrivacyExtensions, config_parse_ipv6_privacy_extensions, 0, offsetof(Manager, ipv6_privacy_extensions) -DHCPv4.UseDomains, config_parse_default_dhcp_use_domains, 0, offsetof(Manager, dhcp_use_domains) +DHCPv4.UseDomains, config_parse_use_domains, 0, offsetof(Manager, dhcp_use_domains) DHCPv4.DUIDType, config_parse_duid_type, 0, offsetof(Manager, dhcp_duid) DHCPv4.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, dhcp_duid) -DHCPv6.UseDomains, config_parse_default_dhcp_use_domains, 0, offsetof(Manager, dhcp6_use_domains) +DHCPv6.UseDomains, config_parse_use_domains, 0, offsetof(Manager, dhcp6_use_domains) DHCPv6.DUIDType, config_parse_duid_type, 0, offsetof(Manager, dhcp6_duid) DHCPv6.DUIDRawData, config_parse_duid_rawdata, 0, offsetof(Manager, dhcp6_duid) DHCPServer.PersistLeases, config_parse_bool, 0, offsetof(Manager, dhcp_server_persist_leases) diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index 88df71b053..9807653289 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -671,7 +671,7 @@ static int domain_append_json(int family, const char *domain, NetworkConfigSourc static int domains_append_json(Link *link, bool is_route, JsonVariant **v) { _cleanup_(json_variant_unrefp) JsonVariant *array = NULL; OrderedSet *link_domains, *network_domains; - DHCPUseDomains use_domains; + UseDomains use_domains; union in_addr_union s; char **domains; const char *domain; @@ -685,7 +685,7 @@ static int domains_append_json(Link *link, bool is_route, JsonVariant **v) { link_domains = is_route ? link->route_domains : link->search_domains; network_domains = is_route ? link->network->route_domains : link->network->search_domains; - use_domains = is_route ? DHCP_USE_DOMAINS_ROUTE : DHCP_USE_DOMAINS_YES; + use_domains = is_route ? USE_DOMAINS_ROUTE : USE_DOMAINS_YES; ORDERED_SET_FOREACH(domain, link_domains ?: network_domains) { r = domain_append_json(AF_UNSPEC, domain, diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h index 9f621b7486..31ddbdf617 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -64,8 +64,8 @@ struct Manager { OrderedSet *address_pools; Set *dhcp_pd_subnet_ids; - DHCPUseDomains dhcp_use_domains; - DHCPUseDomains dhcp6_use_domains; + UseDomains dhcp_use_domains; + UseDomains dhcp6_use_domains; DUID dhcp_duid; DUID dhcp6_duid; diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 4720f616d5..9d7cdbb4a2 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -1501,7 +1501,7 @@ static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) { assert(link->network); assert(rt); - if (link->network->ndisc_use_domains == DHCP_USE_DOMAINS_NO) + if (link->network->ndisc_use_domains == USE_DOMAINS_NO) return 0; r = sd_ndisc_router_get_sender_address(rt, &router); @@ -2483,7 +2483,5 @@ static const char* const ndisc_start_dhcp6_client_table[_IPV6_ACCEPT_RA_START_DH DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING_WITH_BOOLEAN(ndisc_start_dhcp6_client, IPv6AcceptRAStartDHCP6Client, IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES); -DEFINE_CONFIG_PARSE_ENUM(config_parse_ndisc_use_domains, dhcp_use_domains, DHCPUseDomains, - "Failed to parse UseDomains= setting"); DEFINE_CONFIG_PARSE_ENUM(config_parse_ndisc_start_dhcp6_client, ndisc_start_dhcp6_client, IPv6AcceptRAStartDHCP6Client, "Failed to parse DHCPv6Client= setting"); diff --git a/src/network/networkd-ndisc.h b/src/network/networkd-ndisc.h index 019fe4da42..6094881ac5 100644 --- a/src/network/networkd-ndisc.h +++ b/src/network/networkd-ndisc.h @@ -65,4 +65,3 @@ int link_request_ndisc(Link *link); int ndisc_reconfigure_address(Address *address, Link *link); CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_start_dhcp6_client); -CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_use_domains); diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 2f9855465f..79d577b3b5 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -299,7 +299,7 @@ IPv6AcceptRA.UseAutonomousPrefix, config_parse_bool, IPv6AcceptRA.UseOnLinkPrefix, config_parse_bool, 0, offsetof(Network, ndisc_use_onlink_prefix) IPv6AcceptRA.UsePREF64, config_parse_bool, 0, offsetof(Network, ndisc_use_pref64) IPv6AcceptRA.UseDNS, config_parse_bool, 0, offsetof(Network, ndisc_use_dns) -IPv6AcceptRA.UseDomains, config_parse_ndisc_use_domains, 0, offsetof(Network, ndisc_use_domains) +IPv6AcceptRA.UseDomains, config_parse_use_domains, 0, offsetof(Network, ndisc_use_domains) IPv6AcceptRA.UseMTU, config_parse_bool, 0, offsetof(Network, ndisc_use_mtu) IPv6AcceptRA.UseHopLimit, config_parse_bool, 0, offsetof(Network, ndisc_use_hop_limit) IPv6AcceptRA.UseReachableTime, config_parse_bool, 0, offsetof(Network, ndisc_use_reachable_time) diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index eacf3a3dd6..807aa48bb6 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -162,7 +162,7 @@ struct Network { bool dhcp_use_6rd; bool dhcp_send_release; bool dhcp_send_decline; - DHCPUseDomains dhcp_use_domains; + UseDomains dhcp_use_domains; bool dhcp_use_domains_set; Set *dhcp_deny_listed_ip; Set *dhcp_allow_listed_ip; @@ -184,7 +184,7 @@ struct Network { bool dhcp6_use_ntp_set; bool dhcp6_use_captive_portal; bool dhcp6_use_rapid_commit; - DHCPUseDomains dhcp6_use_domains; + UseDomains dhcp6_use_domains; bool dhcp6_use_domains_set; uint32_t dhcp6_iaid; bool dhcp6_iaid_set; @@ -352,7 +352,7 @@ struct Network { bool ndisc_use_pref64; bool active_slave; bool primary_slave; - DHCPUseDomains ndisc_use_domains; + UseDomains ndisc_use_domains; IPv6AcceptRAStartDHCP6Client ndisc_start_dhcp6_client; uint32_t ndisc_route_table; bool ndisc_route_table_set; diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index b1bbe13609..b2e6c50de5 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -206,7 +206,7 @@ static int link_put_sip(Link *link, OrderedSet **s) { static int link_put_domains(Link *link, bool is_route, OrderedSet **s) { OrderedSet *link_domains, *network_domains; - DHCPUseDomains use_domains; + UseDomains use_domains; int r; assert(link); @@ -215,7 +215,7 @@ static int link_put_domains(Link *link, bool is_route, OrderedSet **s) { link_domains = is_route ? link->route_domains : link->search_domains; network_domains = is_route ? link->network->route_domains : link->network->search_domains; - use_domains = is_route ? DHCP_USE_DOMAINS_ROUTE : DHCP_USE_DOMAINS_YES; + use_domains = is_route ? USE_DOMAINS_ROUTE : USE_DOMAINS_YES; if (link_domains) return ordered_set_put_string_set(s, link_domains); @@ -528,7 +528,7 @@ static void serialize_addresses( fputc('\n', f); } -static void link_save_domains(Link *link, FILE *f, OrderedSet *static_domains, DHCPUseDomains use_domains) { +static void link_save_domains(Link *link, FILE *f, OrderedSet *static_domains, UseDomains use_domains) { bool space = false; const char *p; @@ -539,7 +539,7 @@ static void link_save_domains(Link *link, FILE *f, OrderedSet *static_domains, D ORDERED_SET_FOREACH(p, static_domains) fputs_with_separator(f, p, NULL, &space); - if (use_domains == DHCP_USE_DOMAINS_NO) + if (use_domains == USE_DOMAINS_NO) return; if (link->dhcp_lease && link->network->dhcp_use_domains == use_domains) { @@ -720,18 +720,18 @@ static int link_save(Link *link) { fputs("DOMAINS=", f); if (link->search_domains) - link_save_domains(link, f, link->search_domains, DHCP_USE_DOMAINS_NO); + link_save_domains(link, f, link->search_domains, USE_DOMAINS_NO); else - link_save_domains(link, f, link->network->search_domains, DHCP_USE_DOMAINS_YES); + link_save_domains(link, f, link->network->search_domains, USE_DOMAINS_YES); fputc('\n', f); /************************************************************/ fputs("ROUTE_DOMAINS=", f); if (link->route_domains) - link_save_domains(link, f, link->route_domains, DHCP_USE_DOMAINS_NO); + link_save_domains(link, f, link->route_domains, USE_DOMAINS_NO); else - link_save_domains(link, f, link->network->route_domains, DHCP_USE_DOMAINS_ROUTE); + link_save_domains(link, f, link->network->route_domains, USE_DOMAINS_ROUTE); fputc('\n', f); /************************************************************/ diff --git a/src/network/test-network-tables.c b/src/network/test-network-tables.c index 96f5b4d705..f4e14c6d9b 100644 --- a/src/network/test-network-tables.c +++ b/src/network/test-network-tables.c @@ -32,7 +32,7 @@ int main(int argc, char **argv) { test_table(bond_xmit_hash_policy, NETDEV_BOND_XMIT_HASH_POLICY); test_table(dhcp6_message_status, DHCP6_STATUS); test_table_sparse(dhcp6_message_type, DHCP6_MESSAGE_TYPE); /* enum starts from 1 */ - test_table(dhcp_use_domains, DHCP_USE_DOMAINS); + test_table(use_domains, USE_DOMAINS); test_table(duplex, DUP); test_table(ip6tnl_mode, NETDEV_IP6_TNL_MODE); test_table(ipv6_privacy_extensions, IPV6_PRIVACY_EXTENSIONS); From 54bb2c0e61ef85a1be53f0e74b18411d18080ea0 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 15 Apr 2024 15:15:09 +0900 Subject: [PATCH 2/9] network: move DNS related conf parsers to networkd-dns.[ch] No functional change, just refactoring. --- src/network/meson.build | 1 + src/network/networkd-dhcp-common.c | 110 -------- src/network/networkd-dhcp-common.h | 14 - src/network/networkd-dns.c | 309 +++++++++++++++++++++++ src/network/networkd-dns.h | 23 ++ src/network/networkd-gperf.gperf | 1 + src/network/networkd-network-gperf.gperf | 1 + src/network/networkd-network.c | 190 -------------- src/network/networkd-network.h | 4 +- 9 files changed, 336 insertions(+), 317 deletions(-) create mode 100644 src/network/networkd-dns.c create mode 100644 src/network/networkd-dns.h diff --git a/src/network/meson.build b/src/network/meson.build index 14810ddb75..75a7dfdf5b 100644 --- a/src/network/meson.build +++ b/src/network/meson.build @@ -47,6 +47,7 @@ sources = files( 'networkd-dhcp4.c', 'networkd-dhcp6-bus.c', 'networkd-dhcp6.c', + 'networkd-dns.c', 'networkd-ipv4acd.c', 'networkd-ipv4ll.c', 'networkd-ipv6-proxy-ndp.c', diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index fb578fe714..ec52ab93c4 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -530,107 +530,6 @@ int config_parse_dhcp_send_hostname( return 0; } -int config_parse_dhcp_use_dns( - const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Network *network = userdata; - int r; - - assert(filename); - assert(lvalue); - assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); - assert(rvalue); - assert(data); - - r = parse_boolean(rvalue); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to parse UseDNS=%s, ignoring assignment: %m", rvalue); - return 0; - } - - switch (ltype) { - case AF_INET: - network->dhcp_use_dns = r; - network->dhcp_use_dns_set = true; - break; - case AF_INET6: - network->dhcp6_use_dns = r; - network->dhcp6_use_dns_set = true; - break; - case AF_UNSPEC: - /* For backward compatibility. */ - if (!network->dhcp_use_dns_set) - network->dhcp_use_dns = r; - if (!network->dhcp6_use_dns_set) - network->dhcp6_use_dns = r; - break; - default: - assert_not_reached(); - } - - return 0; -} - -int config_parse_dhcp_use_domains( - const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Network *network = userdata; - UseDomains d; - - assert(filename); - assert(lvalue); - assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); - assert(rvalue); - assert(data); - - d = use_domains_from_string(rvalue); - if (d < 0) { - log_syntax(unit, LOG_WARNING, filename, line, d, - "Failed to parse %s=%s, ignoring assignment: %m", lvalue, rvalue); - return 0; - } - - switch (ltype) { - case AF_INET: - network->dhcp_use_domains = d; - network->dhcp_use_domains_set = true; - break; - case AF_INET6: - network->dhcp6_use_domains = d; - network->dhcp6_use_domains_set = true; - break; - case AF_UNSPEC: - /* For backward compatibility. */ - if (!network->dhcp_use_domains_set) - network->dhcp_use_domains = d; - if (!network->dhcp6_use_domains_set) - network->dhcp6_use_domains = d; - break; - default: - assert_not_reached(); - } - - return 0; -} int config_parse_dhcp_use_ntp( const char* unit, @@ -1137,15 +1036,6 @@ int config_parse_dhcp_request_options( } } -static const char* const use_domains_table[_USE_DOMAINS_MAX] = { - [USE_DOMAINS_NO] = "no", - [USE_DOMAINS_ROUTE] = "route", - [USE_DOMAINS_YES] = "yes", -}; - -DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(use_domains, UseDomains, USE_DOMAINS_YES); -DEFINE_CONFIG_PARSE_ENUM(config_parse_use_domains, use_domains, UseDomains, "Failed to parse UseDomains=") - static const char * const dhcp_option_data_type_table[_DHCP_OPTION_DATA_MAX] = { [DHCP_OPTION_DATA_UINT8] = "uint8", [DHCP_OPTION_DATA_UINT16] = "uint16", diff --git a/src/network/networkd-dhcp-common.h b/src/network/networkd-dhcp-common.h index 880429960a..79c18f998e 100644 --- a/src/network/networkd-dhcp-common.h +++ b/src/network/networkd-dhcp-common.h @@ -24,14 +24,6 @@ typedef struct Link Link; typedef struct Manager Manager; typedef struct Network Network; -typedef enum UseDomains { - USE_DOMAINS_NO, - USE_DOMAINS_YES, - USE_DOMAINS_ROUTE, - _USE_DOMAINS_MAX, - _USE_DOMAINS_INVALID = -EINVAL, -} UseDomains; - typedef enum DHCPOptionDataType { DHCP_OPTION_DATA_UINT8, DHCP_OPTION_DATA_UINT16, @@ -87,9 +79,6 @@ static inline bool in6_prefix_is_filtered(const struct in6_addr *prefix, uint8_t int link_get_captive_portal(Link *link, const char **ret); -const char* use_domains_to_string(UseDomains p) _const_; -UseDomains use_domains_from_string(const char *s) _pure_; - const char *dhcp_option_data_type_to_string(DHCPOptionDataType d) _const_; DHCPOptionDataType dhcp_option_data_type_from_string(const char *d) _pure_; @@ -97,9 +86,6 @@ CONFIG_PARSER_PROTOTYPE(config_parse_dhcp); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_route_metric); CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_route_metric); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_send_hostname); -CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_dns); -CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_domains); -CONFIG_PARSER_PROTOTYPE(config_parse_use_domains); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_ntp); CONFIG_PARSER_PROTOTYPE(config_parse_iaid); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_or_ra_route_table); diff --git a/src/network/networkd-dns.c b/src/network/networkd-dns.c new file mode 100644 index 0000000000..9fa330a452 --- /dev/null +++ b/src/network/networkd-dns.c @@ -0,0 +1,309 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "dns-domain.h" +#include "hostname-util.h" +#include "networkd-dns.h" +#include "networkd-network.h" +#include "parse-util.h" +#include "string-table.h" + +int config_parse_domains( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + Network *n = ASSERT_PTR(userdata); + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + n->search_domains = ordered_set_free(n->search_domains); + n->route_domains = ordered_set_free(n->route_domains); + return 0; + } + + for (const char *p = rvalue;;) { + _cleanup_free_ char *w = NULL, *normalized = NULL; + const char *domain; + bool is_route; + + r = extract_first_word(&p, &w, NULL, 0); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to extract search or route domain, ignoring: %s", rvalue); + return 0; + } + if (r == 0) + return 0; + + is_route = w[0] == '~'; + domain = is_route ? w + 1 : w; + + if (dns_name_is_root(domain) || streq(domain, "*")) { + /* If the root domain appears as is, or the special token "*" is found, we'll + * consider this as routing domain, unconditionally. */ + is_route = true; + domain = "."; /* make sure we don't allow empty strings, thus write the root + * domain as "." */ + } else { + r = dns_name_normalize(domain, 0, &normalized); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "'%s' is not a valid domain name, ignoring.", domain); + continue; + } + + domain = normalized; + + if (is_localhost(domain)) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "'localhost' domain may not be configured as search or route domain, ignoring assignment: %s", + domain); + continue; + } + } + + OrderedSet **set = is_route ? &n->route_domains : &n->search_domains; + r = ordered_set_put_strdup(set, domain); + if (r == -EEXIST) + continue; + if (r < 0) + return log_oom(); + } +} + +int config_parse_dns( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + Network *n = ASSERT_PTR(userdata); + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + for (unsigned i = 0; i < n->n_dns; i++) + in_addr_full_free(n->dns[i]); + n->dns = mfree(n->dns); + n->n_dns = 0; + return 0; + } + + for (const char *p = rvalue;;) { + _cleanup_(in_addr_full_freep) struct in_addr_full *dns = NULL; + _cleanup_free_ char *w = NULL; + struct in_addr_full **m; + + r = extract_first_word(&p, &w, NULL, 0); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Invalid syntax, ignoring: %s", rvalue); + return 0; + } + if (r == 0) + return 0; + + r = in_addr_full_new_from_string(w, &dns); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to parse dns server address, ignoring: %s", w); + continue; + } + + if (IN_SET(dns->port, 53, 853)) + dns->port = 0; + + m = reallocarray(n->dns, n->n_dns + 1, sizeof(struct in_addr_full*)); + if (!m) + return log_oom(); + + m[n->n_dns++] = TAKE_PTR(dns); + n->dns = m; + } +} + +int config_parse_dnssec_negative_trust_anchors( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + Set **nta = ASSERT_PTR(data); + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + *nta = set_free_free(*nta); + return 0; + } + + for (const char *p = rvalue;;) { + _cleanup_free_ char *w = NULL; + + r = extract_first_word(&p, &w, NULL, 0); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to extract negative trust anchor domain, ignoring: %s", rvalue); + return 0; + } + if (r == 0) + return 0; + + r = dns_name_is_valid(w); + if (r <= 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "%s is not a valid domain name, ignoring.", w); + continue; + } + + r = set_ensure_consume(nta, &dns_name_hash_ops, TAKE_PTR(w)); + if (r < 0) + return log_oom(); + } +} + +int config_parse_dhcp_use_dns( + const char* unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + Network *network = userdata; + int r; + + assert(filename); + assert(lvalue); + assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); + assert(rvalue); + assert(data); + + r = parse_boolean(rvalue); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to parse UseDNS=%s, ignoring assignment: %m", rvalue); + return 0; + } + + switch (ltype) { + case AF_INET: + network->dhcp_use_dns = r; + network->dhcp_use_dns_set = true; + break; + case AF_INET6: + network->dhcp6_use_dns = r; + network->dhcp6_use_dns_set = true; + break; + case AF_UNSPEC: + /* For backward compatibility. */ + if (!network->dhcp_use_dns_set) + network->dhcp_use_dns = r; + if (!network->dhcp6_use_dns_set) + network->dhcp6_use_dns = r; + break; + default: + assert_not_reached(); + } + + return 0; +} + +int config_parse_dhcp_use_domains( + const char* unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + Network *network = userdata; + UseDomains d; + + assert(filename); + assert(lvalue); + assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); + assert(rvalue); + assert(data); + + d = use_domains_from_string(rvalue); + if (d < 0) { + log_syntax(unit, LOG_WARNING, filename, line, d, + "Failed to parse %s=%s, ignoring assignment: %m", lvalue, rvalue); + return 0; + } + + switch (ltype) { + case AF_INET: + network->dhcp_use_domains = d; + network->dhcp_use_domains_set = true; + break; + case AF_INET6: + network->dhcp6_use_domains = d; + network->dhcp6_use_domains_set = true; + break; + case AF_UNSPEC: + /* For backward compatibility. */ + if (!network->dhcp_use_domains_set) + network->dhcp_use_domains = d; + if (!network->dhcp6_use_domains_set) + network->dhcp6_use_domains = d; + break; + default: + assert_not_reached(); + } + + return 0; +} + +static const char* const use_domains_table[_USE_DOMAINS_MAX] = { + [USE_DOMAINS_NO] = "no", + [USE_DOMAINS_ROUTE] = "route", + [USE_DOMAINS_YES] = "yes", +}; + +DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(use_domains, UseDomains, USE_DOMAINS_YES); +DEFINE_CONFIG_PARSE_ENUM(config_parse_use_domains, use_domains, UseDomains, "Failed to parse UseDomains=") diff --git a/src/network/networkd-dns.h b/src/network/networkd-dns.h new file mode 100644 index 0000000000..f458aa86c7 --- /dev/null +++ b/src/network/networkd-dns.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "conf-parser.h" +#include "macro.h" + +typedef enum UseDomains { + USE_DOMAINS_NO, + USE_DOMAINS_YES, + USE_DOMAINS_ROUTE, + _USE_DOMAINS_MAX, + _USE_DOMAINS_INVALID = -EINVAL, +} UseDomains; + +const char* use_domains_to_string(UseDomains p) _const_; +UseDomains use_domains_from_string(const char *s) _pure_; + +CONFIG_PARSER_PROTOTYPE(config_parse_domains); +CONFIG_PARSER_PROTOTYPE(config_parse_dns); +CONFIG_PARSER_PROTOTYPE(config_parse_dnssec_negative_trust_anchors); +CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_dns); +CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_domains); +CONFIG_PARSER_PROTOTYPE(config_parse_use_domains); diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index 8bd75d9e3b..b2d116e98d 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -7,6 +7,7 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") #include "conf-parser.h" #include "networkd-conf.h" #include "networkd-dhcp-common.h" +#include "networkd-dns.h" #include "networkd-manager.h" #include "networkd-route-util.h" %} diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 79d577b3b5..5261482212 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -20,6 +20,7 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") #include "networkd-dhcp-server.h" #include "networkd-dhcp4.h" #include "networkd-dhcp6.h" +#include "networkd-dns.h" #include "networkd-ipv4ll.h" #include "networkd-ipv6-proxy-ndp.h" #include "networkd-ipv6ll.h" diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 833f1bd059..7020741aa1 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -922,83 +922,6 @@ int config_parse_stacked_netdev( return 0; } -int config_parse_domains( - const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Network *n = ASSERT_PTR(userdata); - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - - if (isempty(rvalue)) { - n->search_domains = ordered_set_free(n->search_domains); - n->route_domains = ordered_set_free(n->route_domains); - return 0; - } - - for (const char *p = rvalue;;) { - _cleanup_free_ char *w = NULL, *normalized = NULL; - const char *domain; - bool is_route; - - r = extract_first_word(&p, &w, NULL, 0); - if (r == -ENOMEM) - return log_oom(); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to extract search or route domain, ignoring: %s", rvalue); - return 0; - } - if (r == 0) - return 0; - - is_route = w[0] == '~'; - domain = is_route ? w + 1 : w; - - if (dns_name_is_root(domain) || streq(domain, "*")) { - /* If the root domain appears as is, or the special token "*" is found, we'll - * consider this as routing domain, unconditionally. */ - is_route = true; - domain = "."; /* make sure we don't allow empty strings, thus write the root - * domain as "." */ - } else { - r = dns_name_normalize(domain, 0, &normalized); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "'%s' is not a valid domain name, ignoring.", domain); - continue; - } - - domain = normalized; - - if (is_localhost(domain)) { - log_syntax(unit, LOG_WARNING, filename, line, 0, - "'localhost' domain may not be configured as search or route domain, ignoring assignment: %s", - domain); - continue; - } - } - - OrderedSet **set = is_route ? &n->route_domains : &n->search_domains; - r = ordered_set_put_strdup(set, domain); - if (r == -EEXIST) - continue; - if (r < 0) - return log_oom(); - } -} - int config_parse_timezone( const char *unit, const char *filename, @@ -1033,119 +956,6 @@ int config_parse_timezone( return free_and_strdup_warn(tz, rvalue); } -int config_parse_dns( - const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Network *n = ASSERT_PTR(userdata); - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - - if (isempty(rvalue)) { - for (unsigned i = 0; i < n->n_dns; i++) - in_addr_full_free(n->dns[i]); - n->dns = mfree(n->dns); - n->n_dns = 0; - return 0; - } - - for (const char *p = rvalue;;) { - _cleanup_(in_addr_full_freep) struct in_addr_full *dns = NULL; - _cleanup_free_ char *w = NULL; - struct in_addr_full **m; - - r = extract_first_word(&p, &w, NULL, 0); - if (r == -ENOMEM) - return log_oom(); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Invalid syntax, ignoring: %s", rvalue); - return 0; - } - if (r == 0) - return 0; - - r = in_addr_full_new_from_string(w, &dns); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to parse dns server address, ignoring: %s", w); - continue; - } - - if (IN_SET(dns->port, 53, 853)) - dns->port = 0; - - m = reallocarray(n->dns, n->n_dns + 1, sizeof(struct in_addr_full*)); - if (!m) - return log_oom(); - - m[n->n_dns++] = TAKE_PTR(dns); - n->dns = m; - } -} - -int config_parse_dnssec_negative_trust_anchors( - const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Set **nta = ASSERT_PTR(data); - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - - if (isempty(rvalue)) { - *nta = set_free_free(*nta); - return 0; - } - - for (const char *p = rvalue;;) { - _cleanup_free_ char *w = NULL; - - r = extract_first_word(&p, &w, NULL, 0); - if (r == -ENOMEM) - return log_oom(); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to extract negative trust anchor domain, ignoring: %s", rvalue); - return 0; - } - if (r == 0) - return 0; - - r = dns_name_is_valid(w); - if (r <= 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "%s is not a valid domain name, ignoring.", w); - continue; - } - - r = set_ensure_consume(nta, &dns_name_hash_ops, TAKE_PTR(w)); - if (r < 0) - return log_oom(); - } -} - int config_parse_ntp( const char *unit, const char *filename, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 807aa48bb6..5b30b8e056 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -20,6 +20,7 @@ #include "networkd-dhcp-common.h" #include "networkd-dhcp4.h" #include "networkd-dhcp6.h" +#include "networkd-dns.h" #include "networkd-ipv6ll.h" #include "networkd-lldp-rx.h" #include "networkd-ndisc.h" @@ -424,10 +425,7 @@ bool network_has_static_ipv6_configurations(Network *network); CONFIG_PARSER_PROTOTYPE(config_parse_stacked_netdev); CONFIG_PARSER_PROTOTYPE(config_parse_tunnel); -CONFIG_PARSER_PROTOTYPE(config_parse_domains); -CONFIG_PARSER_PROTOTYPE(config_parse_dns); CONFIG_PARSER_PROTOTYPE(config_parse_timezone); -CONFIG_PARSER_PROTOTYPE(config_parse_dnssec_negative_trust_anchors); CONFIG_PARSER_PROTOTYPE(config_parse_ntp); CONFIG_PARSER_PROTOTYPE(config_parse_required_for_online); CONFIG_PARSER_PROTOTYPE(config_parse_required_family_for_online); From 7a169cb40fcb49c390f959c922c153c5d53e61f2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 15 Apr 2024 15:47:12 +0900 Subject: [PATCH 3/9] network: introduce link_get_use_domains() No functional change, just refactoring. --- src/network/networkd-dhcp4.c | 2 +- src/network/networkd-dhcp6.c | 2 +- src/network/networkd-dns.c | 97 +++++++++++------------- src/network/networkd-dns.h | 6 +- src/network/networkd-json.c | 6 +- src/network/networkd-manager.c | 2 + src/network/networkd-ndisc.c | 2 +- src/network/networkd-network-gperf.gperf | 10 +-- src/network/networkd-network.c | 6 +- src/network/networkd-network.h | 5 +- src/network/networkd-state-file.c | 12 +-- 11 files changed, 77 insertions(+), 73 deletions(-) diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 4a0e26d172..89622e6cfc 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1540,7 +1540,7 @@ static int dhcp4_configure(Link *link) { return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set request flag for classless static route: %m"); } - if (link->network->dhcp_use_domains > 0) { + if (link_get_use_domains(link, NETWORK_CONFIG_SOURCE_DHCP4) > 0) { r = sd_dhcp_client_set_request_option(link->dhcp_client, SD_DHCP_OPTION_DOMAIN_SEARCH); if (r < 0) return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set request flag for domain search list: %m"); diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index cf643194d5..bf7d3c7e8e 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -639,7 +639,7 @@ static int dhcp6_configure(Link *link) { return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to request DNS servers: %m"); } - if (link->network->dhcp6_use_domains > 0) { + if (link_get_use_domains(link, NETWORK_CONFIG_SOURCE_DHCP6) > 0) { r = sd_dhcp6_client_set_request_option(client, SD_DHCP6_OPTION_DOMAIN); if (r < 0) return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to request domains: %m"); diff --git a/src/network/networkd-dns.c b/src/network/networkd-dns.c index 9fa330a452..eb01f4758e 100644 --- a/src/network/networkd-dns.c +++ b/src/network/networkd-dns.c @@ -3,10 +3,56 @@ #include "dns-domain.h" #include "hostname-util.h" #include "networkd-dns.h" +#include "networkd-manager.h" #include "networkd-network.h" #include "parse-util.h" #include "string-table.h" +UseDomains link_get_use_domains(Link *link, NetworkConfigSource proto) { + UseDomains n, c, m; + + assert(link); + assert(link->manager); + + if (!link->network) + return USE_DOMAINS_NO; + + switch (proto) { + case NETWORK_CONFIG_SOURCE_DHCP4: + n = link->network->dhcp_use_domains; + c = link->network->compat_dhcp_use_domains; + m = link->manager->dhcp_use_domains; + break; + case NETWORK_CONFIG_SOURCE_DHCP6: + n = link->network->dhcp6_use_domains; + c = link->network->compat_dhcp_use_domains; + m = link->manager->dhcp6_use_domains; + break; + case NETWORK_CONFIG_SOURCE_NDISC: + n = link->network->ndisc_use_domains; + c = _USE_DOMAINS_INVALID; + m = _USE_DOMAINS_INVALID; + break; + default: + assert_not_reached(); + } + + /* If per-network and per-protocol setting is specified, use it. */ + if (n >= 0) + return n; + + /* If compat setting is specified, use it. */ + if (c >= 0) + return c; + + /* If global per-protocol setting is specified, use it. */ + if (m >= 0) + return m; + + /* Otherwise, defaults to no. */ + return USE_DOMAINS_NO; +} + int config_parse_domains( const char *unit, const char *filename, @@ -248,57 +294,6 @@ int config_parse_dhcp_use_dns( return 0; } -int config_parse_dhcp_use_domains( - const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Network *network = userdata; - UseDomains d; - - assert(filename); - assert(lvalue); - assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); - assert(rvalue); - assert(data); - - d = use_domains_from_string(rvalue); - if (d < 0) { - log_syntax(unit, LOG_WARNING, filename, line, d, - "Failed to parse %s=%s, ignoring assignment: %m", lvalue, rvalue); - return 0; - } - - switch (ltype) { - case AF_INET: - network->dhcp_use_domains = d; - network->dhcp_use_domains_set = true; - break; - case AF_INET6: - network->dhcp6_use_domains = d; - network->dhcp6_use_domains_set = true; - break; - case AF_UNSPEC: - /* For backward compatibility. */ - if (!network->dhcp_use_domains_set) - network->dhcp_use_domains = d; - if (!network->dhcp6_use_domains_set) - network->dhcp6_use_domains = d; - break; - default: - assert_not_reached(); - } - - return 0; -} - static const char* const use_domains_table[_USE_DOMAINS_MAX] = { [USE_DOMAINS_NO] = "no", [USE_DOMAINS_ROUTE] = "route", diff --git a/src/network/networkd-dns.h b/src/network/networkd-dns.h index f458aa86c7..c1b3429b8b 100644 --- a/src/network/networkd-dns.h +++ b/src/network/networkd-dns.h @@ -3,6 +3,9 @@ #include "conf-parser.h" #include "macro.h" +#include "networkd-util.h" + +typedef struct Link Link; typedef enum UseDomains { USE_DOMAINS_NO, @@ -12,6 +15,8 @@ typedef enum UseDomains { _USE_DOMAINS_INVALID = -EINVAL, } UseDomains; +UseDomains link_get_use_domains(Link *link, NetworkConfigSource proto); + const char* use_domains_to_string(UseDomains p) _const_; UseDomains use_domains_from_string(const char *s) _pure_; @@ -19,5 +24,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_domains); CONFIG_PARSER_PROTOTYPE(config_parse_dns); CONFIG_PARSER_PROTOTYPE(config_parse_dnssec_negative_trust_anchors); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_dns); -CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_domains); CONFIG_PARSER_PROTOTYPE(config_parse_use_domains); diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index 9807653289..4fd75f4bfe 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -697,7 +697,7 @@ static int domains_append_json(Link *link, bool is_route, JsonVariant **v) { if (!link_domains) { if (link->dhcp_lease && - link->network->dhcp_use_domains == use_domains) { + link_get_use_domains(link, NETWORK_CONFIG_SOURCE_DHCP4) == use_domains) { r = sd_dhcp_lease_get_server_identifier(link->dhcp_lease, &s.in); if (r < 0) return r; @@ -717,7 +717,7 @@ static int domains_append_json(Link *link, bool is_route, JsonVariant **v) { } if (link->dhcp6_lease && - link->network->dhcp6_use_domains == use_domains) { + link_get_use_domains(link, NETWORK_CONFIG_SOURCE_DHCP6) == use_domains) { r = sd_dhcp6_lease_get_server_address(link->dhcp6_lease, &s.in6); if (r < 0) return r; @@ -730,7 +730,7 @@ static int domains_append_json(Link *link, bool is_route, JsonVariant **v) { } } - if (link->network->ndisc_use_domains == use_domains) { + if (link_get_use_domains(link, NETWORK_CONFIG_SOURCE_NDISC) == use_domains) { NDiscDNSSL *a; SET_FOREACH(a, link->ndisc_dnssl) { diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 8e8b27d78d..2d21c2bca5 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -599,6 +599,8 @@ int manager_new(Manager **ret, bool test_mode) { .manage_foreign_nexthops = true, .ethtool_fd = -EBADF, .persistent_storage_fd = persistent_storage_open(), + .dhcp_use_domains = _USE_DOMAINS_INVALID, + .dhcp6_use_domains = _USE_DOMAINS_INVALID, .dhcp_duid.type = DUID_TYPE_EN, .dhcp6_duid.type = DUID_TYPE_EN, .duid_product_uuid.type = DUID_TYPE_UUID, diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 9d7cdbb4a2..c7d7fc7efc 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -1501,7 +1501,7 @@ static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) { assert(link->network); assert(rt); - if (link->network->ndisc_use_domains == USE_DOMAINS_NO) + if (link_get_use_domains(link, NETWORK_CONFIG_SOURCE_NDISC) <= 0) return 0; r = sd_ndisc_router_get_sender_address(rt, &router); diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 5261482212..ef60797f2e 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -230,7 +230,7 @@ DHCPv4.UseSIP, config_parse_bool, DHCPv4.UseCaptivePortal, config_parse_bool, 0, offsetof(Network, dhcp_use_captive_portal) DHCPv4.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_use_mtu) DHCPv4.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_use_hostname) -DHCPv4.UseDomains, config_parse_dhcp_use_domains, AF_INET, 0 +DHCPv4.UseDomains, config_parse_use_domains, 0, offsetof(Network, dhcp_use_domains) DHCPv4.UseRoutes, config_parse_bool, 0, offsetof(Network, dhcp_use_routes) DHCPv4.UseGateway, config_parse_tristate, 0, offsetof(Network, dhcp_use_gateway) DHCPv4.QuickAck, config_parse_bool, 0, offsetof(Network, dhcp_quickack) @@ -273,7 +273,7 @@ DHCPv6.UseAddress, config_parse_bool, DHCPv6.UseDelegatedPrefix, config_parse_bool, 0, offsetof(Network, dhcp6_use_pd_prefix) DHCPv6.UseDNS, config_parse_dhcp_use_dns, AF_INET6, 0 DHCPv6.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp6_use_hostname) -DHCPv6.UseDomains, config_parse_dhcp_use_domains, AF_INET6, 0 +DHCPv6.UseDomains, config_parse_use_domains, 0, offsetof(Network, dhcp6_use_domains) DHCPv6.UseNTP, config_parse_dhcp_use_ntp, AF_INET6, 0 DHCPv6.UseCaptivePortal, config_parse_bool, 0, offsetof(Network, dhcp6_use_captive_portal) DHCPv6.MUDURL, config_parse_mud_url, 0, offsetof(Network, dhcp6_mudurl) @@ -592,8 +592,8 @@ DHCP.UseDNS, config_parse_dhcp_use_dns, DHCP.UseNTP, config_parse_dhcp_use_ntp, AF_UNSPEC, 0 DHCP.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_use_mtu) DHCP.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_use_hostname) -DHCP.UseDomains, config_parse_dhcp_use_domains, AF_UNSPEC, 0 -DHCP.UseDomainName, config_parse_dhcp_use_domains, AF_UNSPEC, 0 +DHCP.UseDomains, config_parse_use_domains, 0, offsetof(Network, compat_dhcp_use_domains) +DHCP.UseDomainName, config_parse_use_domains, 0, offsetof(Network, compat_dhcp_use_domains) DHCP.UseRoutes, config_parse_bool, 0, offsetof(Network, dhcp_use_routes) DHCP.Anonymize, config_parse_bool, 0, offsetof(Network, dhcp_anonymize) DHCP.SendHostname, config_parse_dhcp_send_hostname, AF_UNSPEC, 0 @@ -611,7 +611,7 @@ DHCP.UseTimezone, config_parse_bool, DHCP.ListenPort, config_parse_uint16, 0, offsetof(Network, dhcp_client_port) DHCP.RapidCommit, config_parse_bool, 0, offsetof(Network, dhcp6_use_rapid_commit) DHCP.ForceDHCPv6PDOtherInformation, config_parse_warn_compat, DISABLED_LEGACY, 0 -DHCPv4.UseDomainName, config_parse_dhcp_use_domains, AF_INET, 0 +DHCPv4.UseDomainName, config_parse_use_domains, 0, offsetof(Network, dhcp_use_domains) DHCPv4.CriticalConnection, config_parse_tristate, 0, offsetof(Network, dhcp_critical) DHCPv6.RouteMetric, config_parse_ndisc_route_metric, AF_INET6, 0 DHCPv6.ForceDHCPv6PDOtherInformation, config_parse_warn_compat, DISABLED_LEGACY, 0 diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 7020741aa1..f270142d55 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -380,6 +380,8 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .keep_configuration = manager->keep_configuration, + .compat_dhcp_use_domains = _USE_DOMAINS_INVALID, + .dhcp_duid.type = _DUID_TYPE_INVALID, .dhcp_critical = -1, .dhcp_use_ntp = true, @@ -388,7 +390,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp_use_captive_portal = true, .dhcp_use_dns = true, .dhcp_routes_to_dns = true, - .dhcp_use_domains = manager->dhcp_use_domains, + .dhcp_use_domains = _USE_DOMAINS_INVALID, .dhcp_use_hostname = true, .dhcp_use_routes = true, .dhcp_use_gateway = -1, @@ -405,7 +407,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp6_use_address = true, .dhcp6_use_pd_prefix = true, .dhcp6_use_dns = true, - .dhcp6_use_domains = manager->dhcp6_use_domains, + .dhcp6_use_domains = _USE_DOMAINS_INVALID, .dhcp6_use_hostname = true, .dhcp6_use_ntp = true, .dhcp6_use_captive_portal = true, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 5b30b8e056..6fc2eddf00 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -113,6 +113,9 @@ struct Network { bool default_route_on_device; AddressFamily ip_masquerade; + /* For backward compatibility, only applied to DHCPv4 and DHCPv6. */ + UseDomains compat_dhcp_use_domains; + /* DHCP Client Support */ AddressFamily dhcp; struct in_addr dhcp_request_address; @@ -164,7 +167,6 @@ struct Network { bool dhcp_send_release; bool dhcp_send_decline; UseDomains dhcp_use_domains; - bool dhcp_use_domains_set; Set *dhcp_deny_listed_ip; Set *dhcp_allow_listed_ip; Set *dhcp_request_options; @@ -186,7 +188,6 @@ struct Network { bool dhcp6_use_captive_portal; bool dhcp6_use_rapid_commit; UseDomains dhcp6_use_domains; - bool dhcp6_use_domains_set; uint32_t dhcp6_iaid; bool dhcp6_iaid_set; bool dhcp6_iaid_set_explicitly; diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index b2e6c50de5..182b985cac 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -224,7 +224,7 @@ static int link_put_domains(Link *link, bool is_route, OrderedSet **s) { if (r < 0) return r; - if (link->dhcp_lease && link->network->dhcp_use_domains == use_domains) { + if (link->dhcp_lease && link_get_use_domains(link, NETWORK_CONFIG_SOURCE_DHCP4) == use_domains) { const char *domainname; char **domains; @@ -243,7 +243,7 @@ static int link_put_domains(Link *link, bool is_route, OrderedSet **s) { } } - if (link->dhcp6_lease && link->network->dhcp6_use_domains == use_domains) { + if (link->dhcp6_lease && link_get_use_domains(link, NETWORK_CONFIG_SOURCE_DHCP6) == use_domains) { char **domains; r = sd_dhcp6_lease_get_domains(link->dhcp6_lease, &domains); @@ -254,7 +254,7 @@ static int link_put_domains(Link *link, bool is_route, OrderedSet **s) { } } - if (link->network->ndisc_use_domains == use_domains) { + if (link_get_use_domains(link, NETWORK_CONFIG_SOURCE_NDISC) == use_domains) { NDiscDNSSL *a; SET_FOREACH(a, link->ndisc_dnssl) { @@ -542,7 +542,7 @@ static void link_save_domains(Link *link, FILE *f, OrderedSet *static_domains, U if (use_domains == USE_DOMAINS_NO) return; - if (link->dhcp_lease && link->network->dhcp_use_domains == use_domains) { + if (link->dhcp_lease && link_get_use_domains(link, NETWORK_CONFIG_SOURCE_DHCP4) == use_domains) { const char *domainname; char **domains; @@ -552,14 +552,14 @@ static void link_save_domains(Link *link, FILE *f, OrderedSet *static_domains, U fputstrv(f, domains, NULL, &space); } - if (link->dhcp6_lease && link->network->dhcp6_use_domains == use_domains) { + if (link->dhcp6_lease && link_get_use_domains(link, NETWORK_CONFIG_SOURCE_DHCP6) == use_domains) { char **domains; if (sd_dhcp6_lease_get_domains(link->dhcp6_lease, &domains) >= 0) fputstrv(f, domains, NULL, &space); } - if (link->network->ndisc_use_domains == use_domains) { + if (link_get_use_domains(link, NETWORK_CONFIG_SOURCE_NDISC) == use_domains) { NDiscDNSSL *dd; SET_FOREACH(dd, link->ndisc_dnssl) From 9646ffe2cacb5dccf1fcb8bcc54bf0d315bd0000 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 15 Apr 2024 16:16:13 +0900 Subject: [PATCH 4/9] network: introduce link_get_use_dns() No functional change, just refactoring. --- src/network/networkd-dhcp-server.c | 2 +- src/network/networkd-dhcp4.c | 2 +- src/network/networkd-dhcp6.c | 2 +- src/network/networkd-dns.c | 88 ++++++++++-------------- src/network/networkd-dns.h | 1 + src/network/networkd-json.c | 6 +- src/network/networkd-ndisc.c | 2 +- src/network/networkd-network-gperf.gperf | 8 +-- src/network/networkd-network.c | 7 +- src/network/networkd-network.h | 9 ++- src/network/networkd-state-file.c | 12 ++-- 11 files changed, 63 insertions(+), 76 deletions(-) diff --git a/src/network/networkd-dhcp-server.c b/src/network/networkd-dhcp-server.c index b1953545ed..6b9dcd6fe6 100644 --- a/src/network/networkd-dhcp-server.c +++ b/src/network/networkd-dhcp-server.c @@ -342,7 +342,7 @@ static int link_push_uplink_to_dhcp_server( addresses[n_addresses++] = ia; } - use_dhcp_lease_data = link->network->dhcp_use_dns; + use_dhcp_lease_data = link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP4); break; case SD_DHCP_LEASE_NTP: { diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 89622e6cfc..e02b9257f8 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -728,7 +728,7 @@ static int dhcp4_request_routes_to_dns(Link *link) { assert(link->dhcp_lease); assert(link->network); - if (!link->network->dhcp_use_dns || + if (!link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP4) || !link->network->dhcp_routes_to_dns) return 0; diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index bf7d3c7e8e..426d2de235 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -633,7 +633,7 @@ static int dhcp6_configure(Link *link) { return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to set MUD URL: %m"); } - if (link->network->dhcp6_use_dns) { + if (link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP6)) { r = sd_dhcp6_client_set_request_option(client, SD_DHCP6_OPTION_DNS_SERVER); if (r < 0) return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to request DNS servers: %m"); diff --git a/src/network/networkd-dns.c b/src/network/networkd-dns.c index eb01f4758e..150ce62482 100644 --- a/src/network/networkd-dns.c +++ b/src/network/networkd-dns.c @@ -53,6 +53,43 @@ UseDomains link_get_use_domains(Link *link, NetworkConfigSource proto) { return USE_DOMAINS_NO; } +bool link_get_use_dns(Link *link, NetworkConfigSource proto) { + int n, c; + + assert(link); + + if (!link->network) + return false; + + switch (proto) { + case NETWORK_CONFIG_SOURCE_DHCP4: + n = link->network->dhcp_use_dns; + c = link->network->compat_dhcp_use_dns; + break; + case NETWORK_CONFIG_SOURCE_DHCP6: + n = link->network->dhcp6_use_dns; + c = link->network->compat_dhcp_use_dns; + break; + case NETWORK_CONFIG_SOURCE_NDISC: + n = link->network->ndisc_use_dns; + c = -1; + break; + default: + assert_not_reached(); + } + + /* If per-network and per-protocol setting is specified, use it. */ + if (n >= 0) + return n; + + /* If compat setting is specified, use it. */ + if (c >= 0) + return c; + + /* Otherwise, defaults to yes. */ + return true; +} + int config_parse_domains( const char *unit, const char *filename, @@ -243,57 +280,6 @@ int config_parse_dnssec_negative_trust_anchors( } } -int config_parse_dhcp_use_dns( - const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Network *network = userdata; - int r; - - assert(filename); - assert(lvalue); - assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); - assert(rvalue); - assert(data); - - r = parse_boolean(rvalue); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to parse UseDNS=%s, ignoring assignment: %m", rvalue); - return 0; - } - - switch (ltype) { - case AF_INET: - network->dhcp_use_dns = r; - network->dhcp_use_dns_set = true; - break; - case AF_INET6: - network->dhcp6_use_dns = r; - network->dhcp6_use_dns_set = true; - break; - case AF_UNSPEC: - /* For backward compatibility. */ - if (!network->dhcp_use_dns_set) - network->dhcp_use_dns = r; - if (!network->dhcp6_use_dns_set) - network->dhcp6_use_dns = r; - break; - default: - assert_not_reached(); - } - - return 0; -} - static const char* const use_domains_table[_USE_DOMAINS_MAX] = { [USE_DOMAINS_NO] = "no", [USE_DOMAINS_ROUTE] = "route", diff --git a/src/network/networkd-dns.h b/src/network/networkd-dns.h index c1b3429b8b..915cb32fb1 100644 --- a/src/network/networkd-dns.h +++ b/src/network/networkd-dns.h @@ -16,6 +16,7 @@ typedef enum UseDomains { } UseDomains; UseDomains link_get_use_domains(Link *link, NetworkConfigSource proto); +bool link_get_use_dns(Link *link, NetworkConfigSource proto); const char* use_domains_to_string(UseDomains p) _const_; UseDomains use_domains_from_string(const char *s) _pure_; diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index 4fd75f4bfe..d9eeaff122 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -448,7 +448,7 @@ static int dns_append_json(Link *link, JsonVariant **v) { return r; } - if (link->dhcp_lease && link->network->dhcp_use_dns) { + if (link->dhcp_lease && link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP4)) { const struct in_addr *dns; union in_addr_union s; int n_dns; @@ -469,7 +469,7 @@ static int dns_append_json(Link *link, JsonVariant **v) { } } - if (link->dhcp6_lease && link->network->dhcp6_use_dns) { + if (link->dhcp6_lease && link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP6)) { const struct in6_addr *dns; union in_addr_union s; int n_dns; @@ -490,7 +490,7 @@ static int dns_append_json(Link *link, JsonVariant **v) { } } - if (link->network->ndisc_use_dns) { + if (link_get_use_dns(link, NETWORK_CONFIG_SOURCE_NDISC)) { NDiscRDNSS *a; SET_FOREACH(a, link->ndisc_rdnss) { diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index c7d7fc7efc..92ff7c71f3 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -1409,7 +1409,7 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) { assert(link->network); assert(rt); - if (!link->network->ndisc_use_dns) + if (!link_get_use_dns(link, NETWORK_CONFIG_SOURCE_NDISC)) return 0; r = sd_ndisc_router_get_sender_address(rt, &router); diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index ef60797f2e..f5a6debc0a 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -222,7 +222,7 @@ NextHop.Blackhole, config_parse_nexthop_blackhole, NextHop.Group, config_parse_nexthop_group, 0, 0 DHCPv4.RequestAddress, config_parse_in_addr_non_null, AF_INET, offsetof(Network, dhcp_request_address) DHCPv4.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier) -DHCPv4.UseDNS, config_parse_dhcp_use_dns, AF_INET, 0 +DHCPv4.UseDNS, config_parse_tristate, 0, offsetof(Network, dhcp_use_dns) DHCPv4.RoutesToDNS, config_parse_bool, 0, offsetof(Network, dhcp_routes_to_dns) DHCPv4.UseNTP, config_parse_dhcp_use_ntp, AF_INET, 0 DHCPv4.RoutesToNTP, config_parse_bool, 0, offsetof(Network, dhcp_routes_to_ntp) @@ -271,7 +271,7 @@ DHCPv4.NFTSet, config_parse_nft_set, DHCPv4.RapidCommit, config_parse_tristate, 0, offsetof(Network, dhcp_use_rapid_commit) DHCPv6.UseAddress, config_parse_bool, 0, offsetof(Network, dhcp6_use_address) DHCPv6.UseDelegatedPrefix, config_parse_bool, 0, offsetof(Network, dhcp6_use_pd_prefix) -DHCPv6.UseDNS, config_parse_dhcp_use_dns, AF_INET6, 0 +DHCPv6.UseDNS, config_parse_tristate, 0, offsetof(Network, dhcp6_use_dns) DHCPv6.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp6_use_hostname) DHCPv6.UseDomains, config_parse_use_domains, 0, offsetof(Network, dhcp6_use_domains) DHCPv6.UseNTP, config_parse_dhcp_use_ntp, AF_INET6, 0 @@ -299,7 +299,7 @@ IPv6AcceptRA.UseRoutePrefix, config_parse_bool, IPv6AcceptRA.UseAutonomousPrefix, config_parse_bool, 0, offsetof(Network, ndisc_use_autonomous_prefix) IPv6AcceptRA.UseOnLinkPrefix, config_parse_bool, 0, offsetof(Network, ndisc_use_onlink_prefix) IPv6AcceptRA.UsePREF64, config_parse_bool, 0, offsetof(Network, ndisc_use_pref64) -IPv6AcceptRA.UseDNS, config_parse_bool, 0, offsetof(Network, ndisc_use_dns) +IPv6AcceptRA.UseDNS, config_parse_tristate, 0, offsetof(Network, ndisc_use_dns) IPv6AcceptRA.UseDomains, config_parse_use_domains, 0, offsetof(Network, ndisc_use_domains) IPv6AcceptRA.UseMTU, config_parse_bool, 0, offsetof(Network, ndisc_use_mtu) IPv6AcceptRA.UseHopLimit, config_parse_bool, 0, offsetof(Network, ndisc_use_hop_limit) @@ -588,7 +588,7 @@ IPv6PrefixDelegation.Domains, config_parse_radv_search_domains, IPv6PrefixDelegation.DNSLifetimeSec, config_parse_sec, 0, offsetof(Network, router_dns_lifetime_usec) DHCPv4.BlackList, config_parse_in_addr_prefixes, AF_INET, offsetof(Network, dhcp_deny_listed_ip) DHCP.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier) -DHCP.UseDNS, config_parse_dhcp_use_dns, AF_UNSPEC, 0 +DHCP.UseDNS, config_parse_tristate, 0, offsetof(Network, compat_dhcp_use_dns) DHCP.UseNTP, config_parse_dhcp_use_ntp, AF_UNSPEC, 0 DHCP.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_use_mtu) DHCP.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_use_hostname) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index f270142d55..979d770f68 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -381,6 +381,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .keep_configuration = manager->keep_configuration, .compat_dhcp_use_domains = _USE_DOMAINS_INVALID, + .compat_dhcp_use_dns = -1, .dhcp_duid.type = _DUID_TYPE_INVALID, .dhcp_critical = -1, @@ -388,7 +389,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp_routes_to_ntp = true, .dhcp_use_sip = true, .dhcp_use_captive_portal = true, - .dhcp_use_dns = true, + .dhcp_use_dns = -1, .dhcp_routes_to_dns = true, .dhcp_use_domains = _USE_DOMAINS_INVALID, .dhcp_use_hostname = true, @@ -406,7 +407,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp6_use_address = true, .dhcp6_use_pd_prefix = true, - .dhcp6_use_dns = true, + .dhcp6_use_dns = -1, .dhcp6_use_domains = _USE_DOMAINS_INVALID, .dhcp6_use_hostname = true, .dhcp6_use_ntp = true, @@ -480,7 +481,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .ndisc = -1, .ndisc_use_redirect = true, - .ndisc_use_dns = true, + .ndisc_use_dns = -1, .ndisc_use_gateway = true, .ndisc_use_captive_portal = true, .ndisc_use_route_prefix = true, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 6fc2eddf00..0f1621d831 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -115,6 +115,7 @@ struct Network { /* For backward compatibility, only applied to DHCPv4 and DHCPv6. */ UseDomains compat_dhcp_use_domains; + int compat_dhcp_use_dns; /* DHCP Client Support */ AddressFamily dhcp; @@ -147,8 +148,7 @@ struct Network { int dhcp_broadcast; int dhcp_ipv6_only_mode; int dhcp_use_rapid_commit; - bool dhcp_use_dns; - bool dhcp_use_dns_set; + int dhcp_use_dns; bool dhcp_routes_to_dns; bool dhcp_use_ntp; bool dhcp_use_ntp_set; @@ -180,8 +180,7 @@ struct Network { bool dhcp6_use_pd_prefix; bool dhcp6_send_hostname; bool dhcp6_send_hostname_set; - bool dhcp6_use_dns; - bool dhcp6_use_dns_set; + int dhcp6_use_dns; bool dhcp6_use_hostname; bool dhcp6_use_ntp; bool dhcp6_use_ntp_set; @@ -340,7 +339,7 @@ struct Network { /* NDisc support */ int ndisc; bool ndisc_use_redirect; - bool ndisc_use_dns; + int ndisc_use_dns; bool ndisc_use_gateway; bool ndisc_use_route_prefix; bool ndisc_use_autonomous_prefix; diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index 182b985cac..b217b9cc44 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -101,7 +101,7 @@ static int link_put_dns(Link *link, OrderedSet **s) { if (r < 0) return r; - if (link->dhcp_lease && link->network->dhcp_use_dns) { + if (link->dhcp_lease && link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP4)) { const struct in_addr *addresses; r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses); @@ -112,7 +112,7 @@ static int link_put_dns(Link *link, OrderedSet **s) { } } - if (link->dhcp6_lease && link->network->dhcp6_use_dns) { + if (link->dhcp6_lease && link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP6)) { const struct in6_addr *addresses; r = sd_dhcp6_lease_get_dns(link->dhcp6_lease, &addresses); @@ -123,7 +123,7 @@ static int link_put_dns(Link *link, OrderedSet **s) { } } - if (link->network->ndisc_use_dns) { + if (link_get_use_dns(link, NETWORK_CONFIG_SOURCE_NDISC)) { NDiscRDNSS *a; SET_FOREACH(a, link->ndisc_rdnss) { @@ -666,14 +666,14 @@ static int link_save(Link *link) { serialize_addresses(f, NULL, &space, NULL, link->dhcp_lease, - link->network->dhcp_use_dns, + link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP4), SD_DHCP_LEASE_DNS, link->dhcp6_lease, - link->network->dhcp6_use_dns, + link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP6), sd_dhcp6_lease_get_dns, NULL); - if (link->network->ndisc_use_dns) { + if (link_get_use_dns(link, NETWORK_CONFIG_SOURCE_NDISC)) { NDiscRDNSS *dd; SET_FOREACH(dd, link->ndisc_rdnss) From 8763e48342fc181a10fadccee43c71660b6daf3a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 16 Apr 2024 09:58:25 +0900 Subject: [PATCH 5/9] network: move NTP related conf parsers to networkd-ntp.[ch] No functional change, just refactoring. --- src/network/meson.build | 1 + src/network/networkd-dhcp-common.c | 51 ---------- src/network/networkd-dhcp-common.h | 1 - src/network/networkd-network-gperf.gperf | 1 + src/network/networkd-network.c | 61 ------------ src/network/networkd-network.h | 1 - src/network/networkd-ntp.c | 119 +++++++++++++++++++++++ src/network/networkd-ntp.h | 7 ++ 8 files changed, 128 insertions(+), 114 deletions(-) create mode 100644 src/network/networkd-ntp.c create mode 100644 src/network/networkd-ntp.h diff --git a/src/network/meson.build b/src/network/meson.build index 75a7dfdf5b..a983dff48b 100644 --- a/src/network/meson.build +++ b/src/network/meson.build @@ -66,6 +66,7 @@ sources = files( 'networkd-network-bus.c', 'networkd-network.c', 'networkd-nexthop.c', + 'networkd-ntp.c', 'networkd-queue.c', 'networkd-radv.c', 'networkd-route.c', diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index ec52ab93c4..9f0268d934 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -531,57 +531,6 @@ int config_parse_dhcp_send_hostname( return 0; } -int config_parse_dhcp_use_ntp( - const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Network *network = userdata; - int r; - - assert(filename); - assert(lvalue); - assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); - assert(rvalue); - assert(data); - - r = parse_boolean(rvalue); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to parse UseNTP=%s, ignoring assignment: %m", rvalue); - return 0; - } - - switch (ltype) { - case AF_INET: - network->dhcp_use_ntp = r; - network->dhcp_use_ntp_set = true; - break; - case AF_INET6: - network->dhcp6_use_ntp = r; - network->dhcp6_use_ntp_set = true; - break; - case AF_UNSPEC: - /* For backward compatibility. */ - if (!network->dhcp_use_ntp_set) - network->dhcp_use_ntp = r; - if (!network->dhcp6_use_ntp_set) - network->dhcp6_use_ntp = r; - break; - default: - assert_not_reached(); - } - - return 0; -} - int config_parse_dhcp_or_ra_route_table( const char *unit, const char *filename, diff --git a/src/network/networkd-dhcp-common.h b/src/network/networkd-dhcp-common.h index 79c18f998e..3390d7dcff 100644 --- a/src/network/networkd-dhcp-common.h +++ b/src/network/networkd-dhcp-common.h @@ -86,7 +86,6 @@ CONFIG_PARSER_PROTOTYPE(config_parse_dhcp); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_route_metric); CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_route_metric); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_send_hostname); -CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_ntp); CONFIG_PARSER_PROTOTYPE(config_parse_iaid); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_or_ra_route_table); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_user_or_vendor_class); diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index f5a6debc0a..0484d5a3fa 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -30,6 +30,7 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") #include "networkd-network.h" #include "networkd-neighbor.h" #include "networkd-nexthop.h" +#include "networkd-ntp.h" #include "networkd-radv.h" #include "networkd-route.h" #include "networkd-routing-policy-rule.h" diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 979d770f68..f62be4abf5 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -43,9 +43,6 @@ #include "strv.h" #include "tclass.h" -/* Let's assume that anything above this number is a user misconfiguration. */ -#define MAX_NTP_SERVERS 128U - static int network_resolve_netdev_one(Network *network, const char *name, NetDevKind kind, NetDev **ret) { const char *kind_string; NetDev *netdev; @@ -959,64 +956,6 @@ int config_parse_timezone( return free_and_strdup_warn(tz, rvalue); } -int config_parse_ntp( - const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - char ***l = ASSERT_PTR(data); - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - - if (isempty(rvalue)) { - *l = strv_free(*l); - return 0; - } - - for (const char *p = rvalue;;) { - _cleanup_free_ char *w = NULL; - - r = extract_first_word(&p, &w, NULL, 0); - if (r == -ENOMEM) - return log_oom(); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to extract NTP server name, ignoring: %s", rvalue); - return 0; - } - if (r == 0) - return 0; - - r = dns_name_is_valid_or_address(w); - if (r <= 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "%s is not a valid domain name or IP address, ignoring.", w); - continue; - } - - if (strv_length(*l) > MAX_NTP_SERVERS) { - log_syntax(unit, LOG_WARNING, filename, line, 0, - "More than %u NTP servers specified, ignoring \"%s\" and any subsequent entries.", - MAX_NTP_SERVERS, w); - return 0; - } - - r = strv_consume(l, TAKE_PTR(w)); - if (r < 0) - return log_oom(); - } -} - int config_parse_required_for_online( const char *unit, const char *filename, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 0f1621d831..6d0899aaf3 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -426,7 +426,6 @@ bool network_has_static_ipv6_configurations(Network *network); CONFIG_PARSER_PROTOTYPE(config_parse_stacked_netdev); CONFIG_PARSER_PROTOTYPE(config_parse_tunnel); CONFIG_PARSER_PROTOTYPE(config_parse_timezone); -CONFIG_PARSER_PROTOTYPE(config_parse_ntp); CONFIG_PARSER_PROTOTYPE(config_parse_required_for_online); CONFIG_PARSER_PROTOTYPE(config_parse_required_family_for_online); CONFIG_PARSER_PROTOTYPE(config_parse_keep_configuration); diff --git a/src/network/networkd-ntp.c b/src/network/networkd-ntp.c new file mode 100644 index 0000000000..38e0ee547a --- /dev/null +++ b/src/network/networkd-ntp.c @@ -0,0 +1,119 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "dns-domain.h" +#include "networkd-network.h" +#include "networkd-ntp.h" +#include "parse-util.h" +#include "strv.h" + +/* Let's assume that anything above this number is a user misconfiguration. */ +#define MAX_NTP_SERVERS 128U + +int config_parse_ntp( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + char ***l = ASSERT_PTR(data); + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + *l = strv_free(*l); + return 0; + } + + for (const char *p = rvalue;;) { + _cleanup_free_ char *w = NULL; + + r = extract_first_word(&p, &w, NULL, 0); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to extract NTP server name, ignoring: %s", rvalue); + return 0; + } + if (r == 0) + return 0; + + r = dns_name_is_valid_or_address(w); + if (r <= 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "%s is not a valid domain name or IP address, ignoring.", w); + continue; + } + + if (strv_length(*l) > MAX_NTP_SERVERS) { + log_syntax(unit, LOG_WARNING, filename, line, 0, + "More than %u NTP servers specified, ignoring \"%s\" and any subsequent entries.", + MAX_NTP_SERVERS, w); + return 0; + } + + r = strv_consume(l, TAKE_PTR(w)); + if (r < 0) + return log_oom(); + } +} + +int config_parse_dhcp_use_ntp( + const char* unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + Network *network = userdata; + int r; + + assert(filename); + assert(lvalue); + assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); + assert(rvalue); + assert(data); + + r = parse_boolean(rvalue); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to parse UseNTP=%s, ignoring assignment: %m", rvalue); + return 0; + } + + switch (ltype) { + case AF_INET: + network->dhcp_use_ntp = r; + network->dhcp_use_ntp_set = true; + break; + case AF_INET6: + network->dhcp6_use_ntp = r; + network->dhcp6_use_ntp_set = true; + break; + case AF_UNSPEC: + /* For backward compatibility. */ + if (!network->dhcp_use_ntp_set) + network->dhcp_use_ntp = r; + if (!network->dhcp6_use_ntp_set) + network->dhcp6_use_ntp = r; + break; + default: + assert_not_reached(); + } + + return 0; +} diff --git a/src/network/networkd-ntp.h b/src/network/networkd-ntp.h new file mode 100644 index 0000000000..bdc819fee8 --- /dev/null +++ b/src/network/networkd-ntp.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "conf-parser.h" + +CONFIG_PARSER_PROTOTYPE(config_parse_ntp); +CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_ntp); From d12fb2bc7b088f990e4ef0dc2f35a55adbc8f009 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 16 Apr 2024 10:13:14 +0900 Subject: [PATCH 6/9] network: introduce link_get_use_ntp() No functional change, just refactoring. --- src/network/networkd-dhcp-server.c | 3 +- src/network/networkd-dhcp4.c | 5 +- src/network/networkd-dhcp6.c | 3 +- src/network/networkd-json.c | 5 +- src/network/networkd-network-gperf.gperf | 6 +- src/network/networkd-network.c | 5 +- src/network/networkd-network.h | 7 +- src/network/networkd-ntp.c | 84 ++++++++++-------------- src/network/networkd-ntp.h | 6 +- src/network/networkd-state-file.c | 9 +-- 10 files changed, 62 insertions(+), 71 deletions(-) diff --git a/src/network/networkd-dhcp-server.c b/src/network/networkd-dhcp-server.c index 6b9dcd6fe6..c35102af74 100644 --- a/src/network/networkd-dhcp-server.c +++ b/src/network/networkd-dhcp-server.c @@ -18,6 +18,7 @@ #include "networkd-link.h" #include "networkd-manager.h" #include "networkd-network.h" +#include "networkd-ntp.h" #include "networkd-queue.h" #include "networkd-route-util.h" #include "parse-util.h" @@ -365,7 +366,7 @@ static int link_push_uplink_to_dhcp_server( addresses[n_addresses++] = ia.in; } - use_dhcp_lease_data = link->network->dhcp_use_ntp; + use_dhcp_lease_data = link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP4); break; } diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index e02b9257f8..cb470ec4e1 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -20,6 +20,7 @@ #include "networkd-manager.h" #include "networkd-network.h" #include "networkd-nexthop.h" +#include "networkd-ntp.h" #include "networkd-queue.h" #include "networkd-route.h" #include "networkd-setlink.h" @@ -749,7 +750,7 @@ static int dhcp4_request_routes_to_ntp(Link *link) { assert(link->dhcp_lease); assert(link->network); - if (!link->network->dhcp_use_ntp || + if (!link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP4) || !link->network->dhcp_routes_to_ntp) return 0; @@ -1546,7 +1547,7 @@ static int dhcp4_configure(Link *link) { return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set request flag for domain search list: %m"); } - if (link->network->dhcp_use_ntp) { + if (link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP4)) { r = sd_dhcp_client_set_request_option(link->dhcp_client, SD_DHCP_OPTION_NTP_SERVER); if (r < 0) return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set request flag for NTP server: %m"); diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 426d2de235..852987bd86 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -14,6 +14,7 @@ #include "networkd-dhcp6.h" #include "networkd-link.h" #include "networkd-manager.h" +#include "networkd-ntp.h" #include "networkd-queue.h" #include "networkd-route.h" #include "networkd-state-file.h" @@ -651,7 +652,7 @@ static int dhcp6_configure(Link *link) { return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to request captive portal: %m"); } - if (link->network->dhcp6_use_ntp) { + if (link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP6)) { r = sd_dhcp6_client_set_request_option(client, SD_DHCP6_OPTION_NTP_SERVER); if (r < 0) return log_link_debug_errno(link, r, "DHCPv6 CLIENT: Failed to request NTP servers: %m"); diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index d9eeaff122..fb9f492be4 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -17,6 +17,7 @@ #include "networkd-neighbor.h" #include "networkd-network.h" #include "networkd-nexthop.h" +#include "networkd-ntp.h" #include "networkd-route-util.h" #include "networkd-route.h" #include "networkd-routing-policy-rule.h" @@ -564,7 +565,7 @@ static int ntp_append_json(Link *link, JsonVariant **v) { } if (!link->ntp) { - if (link->dhcp_lease && link->network->dhcp_use_ntp) { + if (link->dhcp_lease && link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP4)) { const struct in_addr *ntp; union in_addr_union s; int n_ntp; @@ -585,7 +586,7 @@ static int ntp_append_json(Link *link, JsonVariant **v) { } } - if (link->dhcp6_lease && link->network->dhcp6_use_ntp) { + if (link->dhcp6_lease && link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP6)) { const struct in6_addr *ntp_addr; union in_addr_union s; char **ntp_fqdn; diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 0484d5a3fa..7084f82f9f 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -225,7 +225,7 @@ DHCPv4.RequestAddress, config_parse_in_addr_non_null, DHCPv4.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier) DHCPv4.UseDNS, config_parse_tristate, 0, offsetof(Network, dhcp_use_dns) DHCPv4.RoutesToDNS, config_parse_bool, 0, offsetof(Network, dhcp_routes_to_dns) -DHCPv4.UseNTP, config_parse_dhcp_use_ntp, AF_INET, 0 +DHCPv4.UseNTP, config_parse_tristate, 0, offsetof(Network, dhcp_use_ntp) DHCPv4.RoutesToNTP, config_parse_bool, 0, offsetof(Network, dhcp_routes_to_ntp) DHCPv4.UseSIP, config_parse_bool, 0, offsetof(Network, dhcp_use_sip) DHCPv4.UseCaptivePortal, config_parse_bool, 0, offsetof(Network, dhcp_use_captive_portal) @@ -275,7 +275,7 @@ DHCPv6.UseDelegatedPrefix, config_parse_bool, DHCPv6.UseDNS, config_parse_tristate, 0, offsetof(Network, dhcp6_use_dns) DHCPv6.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp6_use_hostname) DHCPv6.UseDomains, config_parse_use_domains, 0, offsetof(Network, dhcp6_use_domains) -DHCPv6.UseNTP, config_parse_dhcp_use_ntp, AF_INET6, 0 +DHCPv6.UseNTP, config_parse_tristate, 0, offsetof(Network, dhcp6_use_ntp) DHCPv6.UseCaptivePortal, config_parse_bool, 0, offsetof(Network, dhcp6_use_captive_portal) DHCPv6.MUDURL, config_parse_mud_url, 0, offsetof(Network, dhcp6_mudurl) DHCPv6.SendHostname, config_parse_dhcp_send_hostname, AF_INET6, 0 @@ -590,7 +590,7 @@ IPv6PrefixDelegation.DNSLifetimeSec, config_parse_sec, DHCPv4.BlackList, config_parse_in_addr_prefixes, AF_INET, offsetof(Network, dhcp_deny_listed_ip) DHCP.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier) DHCP.UseDNS, config_parse_tristate, 0, offsetof(Network, compat_dhcp_use_dns) -DHCP.UseNTP, config_parse_dhcp_use_ntp, AF_UNSPEC, 0 +DHCP.UseNTP, config_parse_tristate, 0, offsetof(Network, compat_dhcp_use_ntp) DHCP.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_use_mtu) DHCP.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_use_hostname) DHCP.UseDomains, config_parse_use_domains, 0, offsetof(Network, compat_dhcp_use_domains) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index f62be4abf5..8c52438092 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -379,10 +379,11 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .compat_dhcp_use_domains = _USE_DOMAINS_INVALID, .compat_dhcp_use_dns = -1, + .compat_dhcp_use_ntp = -1, .dhcp_duid.type = _DUID_TYPE_INVALID, .dhcp_critical = -1, - .dhcp_use_ntp = true, + .dhcp_use_ntp = -1, .dhcp_routes_to_ntp = true, .dhcp_use_sip = true, .dhcp_use_captive_portal = true, @@ -407,7 +408,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp6_use_dns = -1, .dhcp6_use_domains = _USE_DOMAINS_INVALID, .dhcp6_use_hostname = true, - .dhcp6_use_ntp = true, + .dhcp6_use_ntp = -1, .dhcp6_use_captive_portal = true, .dhcp6_use_rapid_commit = true, .dhcp6_send_hostname = true, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 6d0899aaf3..9d82df0005 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -116,6 +116,7 @@ struct Network { /* For backward compatibility, only applied to DHCPv4 and DHCPv6. */ UseDomains compat_dhcp_use_domains; int compat_dhcp_use_dns; + int compat_dhcp_use_ntp; /* DHCP Client Support */ AddressFamily dhcp; @@ -150,8 +151,7 @@ struct Network { int dhcp_use_rapid_commit; int dhcp_use_dns; bool dhcp_routes_to_dns; - bool dhcp_use_ntp; - bool dhcp_use_ntp_set; + int dhcp_use_ntp; bool dhcp_routes_to_ntp; bool dhcp_use_sip; bool dhcp_use_captive_portal; @@ -182,8 +182,7 @@ struct Network { bool dhcp6_send_hostname_set; int dhcp6_use_dns; bool dhcp6_use_hostname; - bool dhcp6_use_ntp; - bool dhcp6_use_ntp_set; + int dhcp6_use_ntp; bool dhcp6_use_captive_portal; bool dhcp6_use_rapid_commit; UseDomains dhcp6_use_domains; diff --git a/src/network/networkd-ntp.c b/src/network/networkd-ntp.c index 38e0ee547a..e764feacb9 100644 --- a/src/network/networkd-ntp.c +++ b/src/network/networkd-ntp.c @@ -9,6 +9,39 @@ /* Let's assume that anything above this number is a user misconfiguration. */ #define MAX_NTP_SERVERS 128U +bool link_get_use_ntp(Link *link, NetworkConfigSource proto) { + int n, c; + + assert(link); + + if (!link->network) + return false; + + switch (proto) { + case NETWORK_CONFIG_SOURCE_DHCP4: + n = link->network->dhcp_use_ntp; + c = link->network->compat_dhcp_use_ntp; + break; + case NETWORK_CONFIG_SOURCE_DHCP6: + n = link->network->dhcp6_use_ntp; + c = link->network->compat_dhcp_use_ntp; + break; + default: + assert_not_reached(); + } + + /* If per-network and per-protocol setting is specified, use it. */ + if (n >= 0) + return n; + + /* If compat setting is specified, use it. */ + if (c >= 0) + return c; + + /* Otherwise, defaults to yes. */ + return true; +} + int config_parse_ntp( const char *unit, const char *filename, @@ -66,54 +99,3 @@ int config_parse_ntp( return log_oom(); } } - -int config_parse_dhcp_use_ntp( - const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - Network *network = userdata; - int r; - - assert(filename); - assert(lvalue); - assert(IN_SET(ltype, AF_UNSPEC, AF_INET, AF_INET6)); - assert(rvalue); - assert(data); - - r = parse_boolean(rvalue); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to parse UseNTP=%s, ignoring assignment: %m", rvalue); - return 0; - } - - switch (ltype) { - case AF_INET: - network->dhcp_use_ntp = r; - network->dhcp_use_ntp_set = true; - break; - case AF_INET6: - network->dhcp6_use_ntp = r; - network->dhcp6_use_ntp_set = true; - break; - case AF_UNSPEC: - /* For backward compatibility. */ - if (!network->dhcp_use_ntp_set) - network->dhcp_use_ntp = r; - if (!network->dhcp6_use_ntp_set) - network->dhcp6_use_ntp = r; - break; - default: - assert_not_reached(); - } - - return 0; -} diff --git a/src/network/networkd-ntp.h b/src/network/networkd-ntp.h index bdc819fee8..44e7678486 100644 --- a/src/network/networkd-ntp.h +++ b/src/network/networkd-ntp.h @@ -2,6 +2,10 @@ #pragma once #include "conf-parser.h" +#include "networkd-util.h" + +typedef struct Link Link; + +bool link_get_use_ntp(Link *link, NetworkConfigSource proto); CONFIG_PARSER_PROTOTYPE(config_parse_ntp); -CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_ntp); diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index b217b9cc44..fbe4fee17d 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -15,6 +15,7 @@ #include "networkd-manager-bus.h" #include "networkd-manager.h" #include "networkd-network.h" +#include "networkd-ntp.h" #include "networkd-state-file.h" #include "ordered-set.h" #include "set.h" @@ -150,7 +151,7 @@ static int link_put_ntp(Link *link, OrderedSet **s) { if (r < 0) return r; - if (link->dhcp_lease && link->network->dhcp_use_ntp) { + if (link->dhcp_lease && link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP4)) { const struct in_addr *addresses; r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses); @@ -161,7 +162,7 @@ static int link_put_ntp(Link *link, OrderedSet **s) { } } - if (link->dhcp6_lease && link->network->dhcp6_use_ntp) { + if (link->dhcp6_lease && link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP6)) { const struct in6_addr *addresses; char **fqdn; @@ -693,10 +694,10 @@ static int link_save(Link *link) { serialize_addresses(f, "NTP", NULL, link->network->ntp, link->dhcp_lease, - link->network->dhcp_use_ntp, + link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP4), SD_DHCP_LEASE_NTP, link->dhcp6_lease, - link->network->dhcp6_use_ntp, + link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP6), sd_dhcp6_lease_get_ntp_addrs, sd_dhcp6_lease_get_ntp_fqdn); From 760c2724a3df2c07ad06ba52a9ad8cc42bfe78f9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 16 Apr 2024 11:10:04 +0900 Subject: [PATCH 7/9] nspawn: align tables --- src/nspawn/nspawn-settings.c | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/nspawn/nspawn-settings.c b/src/nspawn/nspawn-settings.c index 161b1c1c70..2be3964bfc 100644 --- a/src/nspawn/nspawn-settings.c +++ b/src/nspawn/nspawn-settings.c @@ -835,21 +835,21 @@ int config_parse_cpu_affinity( DEFINE_CONFIG_PARSE_ENUM(config_parse_resolv_conf, resolv_conf_mode, ResolvConfMode, "Failed to parse resolv.conf mode"); static const char *const resolv_conf_mode_table[_RESOLV_CONF_MODE_MAX] = { - [RESOLV_CONF_OFF] = "off", - [RESOLV_CONF_COPY_HOST] = "copy-host", - [RESOLV_CONF_COPY_STATIC] = "copy-static", - [RESOLV_CONF_COPY_UPLINK] = "copy-uplink", - [RESOLV_CONF_COPY_STUB] = "copy-stub", - [RESOLV_CONF_REPLACE_HOST] = "replace-host", + [RESOLV_CONF_OFF] = "off", + [RESOLV_CONF_COPY_HOST] = "copy-host", + [RESOLV_CONF_COPY_STATIC] = "copy-static", + [RESOLV_CONF_COPY_UPLINK] = "copy-uplink", + [RESOLV_CONF_COPY_STUB] = "copy-stub", + [RESOLV_CONF_REPLACE_HOST] = "replace-host", [RESOLV_CONF_REPLACE_STATIC] = "replace-static", [RESOLV_CONF_REPLACE_UPLINK] = "replace-uplink", - [RESOLV_CONF_REPLACE_STUB] = "replace-stub", - [RESOLV_CONF_BIND_HOST] = "bind-host", - [RESOLV_CONF_BIND_STATIC] = "bind-static", - [RESOLV_CONF_BIND_UPLINK] = "bind-uplink", - [RESOLV_CONF_BIND_STUB] = "bind-stub", - [RESOLV_CONF_DELETE] = "delete", - [RESOLV_CONF_AUTO] = "auto", + [RESOLV_CONF_REPLACE_STUB] = "replace-stub", + [RESOLV_CONF_BIND_HOST] = "bind-host", + [RESOLV_CONF_BIND_STATIC] = "bind-static", + [RESOLV_CONF_BIND_UPLINK] = "bind-uplink", + [RESOLV_CONF_BIND_STUB] = "bind-stub", + [RESOLV_CONF_DELETE] = "delete", + [RESOLV_CONF_AUTO] = "auto", }; DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(resolv_conf_mode, ResolvConfMode, RESOLV_CONF_AUTO); @@ -917,12 +917,12 @@ int config_parse_link_journal( DEFINE_CONFIG_PARSE_ENUM(config_parse_timezone, timezone_mode, TimezoneMode, "Failed to parse timezone mode"); static const char *const timezone_mode_table[_TIMEZONE_MODE_MAX] = { - [TIMEZONE_OFF] = "off", - [TIMEZONE_COPY] = "copy", - [TIMEZONE_BIND] = "bind", + [TIMEZONE_OFF] = "off", + [TIMEZONE_COPY] = "copy", + [TIMEZONE_BIND] = "bind", [TIMEZONE_SYMLINK] = "symlink", - [TIMEZONE_DELETE] = "delete", - [TIMEZONE_AUTO] = "auto", + [TIMEZONE_DELETE] = "delete", + [TIMEZONE_AUTO] = "auto", }; DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(timezone_mode, TimezoneMode, TIMEZONE_AUTO); @@ -930,10 +930,10 @@ DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(timezone_mode, TimezoneMode, TIMEZONE_AU DEFINE_CONFIG_PARSE_ENUM(config_parse_userns_ownership, user_namespace_ownership, UserNamespaceOwnership, "Failed to parse user namespace ownership mode"); static const char *const user_namespace_ownership_table[_USER_NAMESPACE_OWNERSHIP_MAX] = { - [USER_NAMESPACE_OWNERSHIP_OFF] = "off", + [USER_NAMESPACE_OWNERSHIP_OFF] = "off", [USER_NAMESPACE_OWNERSHIP_CHOWN] = "chown", - [USER_NAMESPACE_OWNERSHIP_MAP] = "map", - [USER_NAMESPACE_OWNERSHIP_AUTO] = "auto", + [USER_NAMESPACE_OWNERSHIP_MAP] = "map", + [USER_NAMESPACE_OWNERSHIP_AUTO] = "auto", }; DEFINE_STRING_TABLE_LOOKUP(user_namespace_ownership, UserNamespaceOwnership); From 6d06b76710c535cff2f3aacaff352a2bf5452287 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 16 Apr 2024 11:12:46 +0900 Subject: [PATCH 8/9] nspawn: rename config_parse_timezone() -> config_parse_timezone_mode() The parser does not parse timezone, but timezone mode. Let's rename the parser to more specific name. --- src/nspawn/nspawn-gperf.gperf | 2 +- src/nspawn/nspawn-settings.c | 2 +- src/nspawn/nspawn-settings.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/nspawn/nspawn-gperf.gperf b/src/nspawn/nspawn-gperf.gperf index 9e1210f876..123ef0c6c8 100644 --- a/src/nspawn/nspawn-gperf.gperf +++ b/src/nspawn/nspawn-gperf.gperf @@ -58,7 +58,7 @@ Exec.OOMScoreAdjust, config_parse_oom_score_adjust, 0, Exec.CPUAffinity, config_parse_cpu_affinity, 0, 0 Exec.ResolvConf, config_parse_resolv_conf, 0, offsetof(Settings, resolv_conf) Exec.LinkJournal, config_parse_link_journal, 0, 0 -Exec.Timezone, config_parse_timezone, 0, offsetof(Settings, timezone) +Exec.Timezone, config_parse_timezone_mode, 0, offsetof(Settings, timezone) Exec.SuppressSync, config_parse_tristate, 0, offsetof(Settings, suppress_sync) Files.ReadOnly, config_parse_tristate, 0, offsetof(Settings, read_only) Files.Volatile, config_parse_volatile_mode, 0, offsetof(Settings, volatile_mode) diff --git a/src/nspawn/nspawn-settings.c b/src/nspawn/nspawn-settings.c index 2be3964bfc..132a54338f 100644 --- a/src/nspawn/nspawn-settings.c +++ b/src/nspawn/nspawn-settings.c @@ -914,7 +914,7 @@ int config_parse_link_journal( return 0; } -DEFINE_CONFIG_PARSE_ENUM(config_parse_timezone, timezone_mode, TimezoneMode, "Failed to parse timezone mode"); +DEFINE_CONFIG_PARSE_ENUM(config_parse_timezone_mode, timezone_mode, TimezoneMode, "Failed to parse timezone mode"); static const char *const timezone_mode_table[_TIMEZONE_MODE_MAX] = { [TIMEZONE_OFF] = "off", diff --git a/src/nspawn/nspawn-settings.h b/src/nspawn/nspawn-settings.h index 8edf8a3552..0bcb285f86 100644 --- a/src/nspawn/nspawn-settings.h +++ b/src/nspawn/nspawn-settings.h @@ -268,7 +268,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_oom_score_adjust); CONFIG_PARSER_PROTOTYPE(config_parse_cpu_affinity); CONFIG_PARSER_PROTOTYPE(config_parse_resolv_conf); CONFIG_PARSER_PROTOTYPE(config_parse_link_journal); -CONFIG_PARSER_PROTOTYPE(config_parse_timezone); +CONFIG_PARSER_PROTOTYPE(config_parse_timezone_mode); CONFIG_PARSER_PROTOTYPE(config_parse_userns_chown); CONFIG_PARSER_PROTOTYPE(config_parse_userns_ownership); CONFIG_PARSER_PROTOTYPE(config_parse_bind_user); From f72e851fd33375841823195fef9a8fc44904645b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 16 Apr 2024 10:28:06 +0900 Subject: [PATCH 9/9] conf-parser: move config_parse_timezone() to conf-parser.[ch] Even though it is currently only used by networkd, the parser itself is quite generic. Let's move it to the shared library. --- src/network/networkd-network.c | 34 ---------------------------------- src/network/networkd-network.h | 1 - src/shared/conf-parser.c | 34 ++++++++++++++++++++++++++++++++++ src/shared/conf-parser.h | 1 + 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 8c52438092..15d5721866 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -923,40 +923,6 @@ int config_parse_stacked_netdev( return 0; } -int config_parse_timezone( - const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - - char **tz = ASSERT_PTR(data); - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - - if (isempty(rvalue)) { - *tz = mfree(*tz); - return 0; - } - - r = verify_timezone(rvalue, LOG_WARNING); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Timezone is not valid, ignoring assignment: %s", rvalue); - return 0; - } - - return free_and_strdup_warn(tz, rvalue); -} - int config_parse_required_for_online( const char *unit, const char *filename, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 9d82df0005..dd938e525a 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -424,7 +424,6 @@ bool network_has_static_ipv6_configurations(Network *network); CONFIG_PARSER_PROTOTYPE(config_parse_stacked_netdev); CONFIG_PARSER_PROTOTYPE(config_parse_tunnel); -CONFIG_PARSER_PROTOTYPE(config_parse_timezone); CONFIG_PARSER_PROTOTYPE(config_parse_required_for_online); CONFIG_PARSER_PROTOTYPE(config_parse_required_family_for_online); CONFIG_PARSER_PROTOTYPE(config_parse_keep_configuration); diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index e2d3b65f88..277f4ee42f 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -1979,3 +1979,37 @@ int config_parse_unsigned_bounded( DEFINE_CONFIG_PARSE(config_parse_percent, parse_percent, "Failed to parse percent value"); DEFINE_CONFIG_PARSE(config_parse_permyriad, parse_permyriad, "Failed to parse permyriad value"); DEFINE_CONFIG_PARSE_PTR(config_parse_sec_fix_0, parse_sec_fix_0, usec_t, "Failed to parse time value"); + +int config_parse_timezone( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + char **tz = ASSERT_PTR(data); + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + *tz = mfree(*tz); + return 0; + } + + r = verify_timezone(rvalue, LOG_WARNING); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Timezone is not valid, ignoring assignment: %s", rvalue); + return 0; + } + + return free_and_strdup_warn(tz, rvalue); +} diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index 254d6cb70b..35e203cb12 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -250,6 +250,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_percent); CONFIG_PARSER_PROTOTYPE(config_parse_permyriad); CONFIG_PARSER_PROTOTYPE(config_parse_pid); CONFIG_PARSER_PROTOTYPE(config_parse_sec_fix_0); +CONFIG_PARSER_PROTOTYPE(config_parse_timezone); typedef enum Disabled { DISABLED_CONFIGURATION,