]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: Serialize DHCPv6 DNR servers
authorRonan Pigott <ronan@rjp.ie>
Thu, 18 Jan 2024 02:27:21 +0000 (19:27 -0700)
committerRonan Pigott <ronan@rjp.ie>
Mon, 21 Oct 2024 16:10:19 +0000 (09:10 -0700)
This serializes DNR servers acquired by V6_DNR option, equivalent to the
V4_DNR option.

src/network/networkd-state-file.c

index 14d4572751a09e0e65e9f0f37c4355cf4baef9fd..e6c4ec64c01e12e659666e453f1da3610dc3506d 100644 (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,