network: Serialize DHCPv6 DNR servers

This serializes DNR servers acquired by V6_DNR option, equivalent to the
V4_DNR option.
This commit is contained in:
Ronan Pigott
2024-01-17 19:27:21 -07:00
parent c691f9d984
commit 168ad243cc

View File

@@ -143,6 +143,25 @@ static int link_put_dns(Link *link, OrderedSet **s) {
}
}
if (link->dhcp6_lease && link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_DHCP6)) {
sd_dns_resolver *resolvers;
r = sd_dhcp6_lease_get_dnr(link->dhcp6_lease, &resolvers);
if (r >= 0 ) {
struct in_addr_full **dot_servers;
size_t n = 0;
CLEANUP_ARRAY(dot_servers, n, in_addr_full_array_free);
r = dns_resolvers_to_dot_addrs(resolvers, r, &dot_servers, &n);
if (r < 0)
return r;
r = ordered_set_put_dns_servers(s, link->ifindex, dot_servers, n);
if (r < 0)
return r;
}
}
if (link_get_use_dns(link, NETWORK_CONFIG_SOURCE_NDISC)) {
NDiscRDNSS *a;
@@ -546,7 +565,9 @@ static void serialize_resolvers(
const char *lvalue,
bool *space,
sd_dhcp_lease *lease,
bool conditional) {
bool conditional,
sd_dhcp6_lease *lease6,
bool conditional6) {
bool _space = false;
if (!space)
@@ -571,6 +592,22 @@ static void serialize_resolvers(
fputstrv(f, names, NULL, space);
}
if (lease6 && conditional6) {
sd_dns_resolver *resolvers;
_cleanup_strv_free_ char **names = NULL;
int r;
r = sd_dhcp6_lease_get_dnr(lease6, &resolvers);
if (r < 0)
return (void) log_warning_errno(r, "Failed to get DNR from DHCPv6 lease, ignoring.");
r = dns_resolvers_to_dot_strv(resolvers, r, &names);
if (r < 0)
return (void) log_warning_errno(r, "Failed to get DoT servers from DHCPv6 DNR, ignoring.");
if (r > 0)
fputstrv(f, names, NULL, space);
}
if (lvalue)
fputc('\n', f);
@@ -725,7 +762,9 @@ static int link_save(Link *link) {
* assumed. */
serialize_resolvers(f, NULL, &space,
link->dhcp_lease,
link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_DHCP4));
link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_DHCP4),
link->dhcp6_lease,
link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_DHCP6));
serialize_addresses(f, NULL, &space,
NULL,