]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: handle ENODATA better with DNR
authorRonan Pigott <ronan@rjp.ie>
Mon, 4 Nov 2024 23:12:00 +0000 (16:12 -0700)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 5 Nov 2024 20:01:55 +0000 (05:01 +0900)
It is normal for DHCP leases not to have DNR options. We need to be less
verbose and more forgiving in these cases. Also, if either DHCP does not
have DNR options, make sure to still consider any DHCPv6/RA options.

Fixes: c7c9e3c7c016 (network: adjust log message about DNR)
src/network/networkd-json.c
src/network/networkd-state-file.c

index 07d52c96c04b81c05bd86fa05a69530813fa6cde..fd2b709d9df0a997153c596fb1e16493341a29b8 100644 (file)
@@ -561,18 +561,16 @@ static int dnr_append_json(Link *link, sd_json_variant **v) {
                         return r;
 
                 n_dnr = sd_dhcp_lease_get_dnr(link->dhcp_lease, &dnr);
-                if (n_dnr < 0)
-                        return 0;
-
-                FOREACH_ARRAY(res, dnr, n_dnr) {
-                        r = dnr_append_json_one(link,
-                                                res,
-                                                NETWORK_CONFIG_SOURCE_DHCP4,
-                                                &s,
-                                                &array);
-                        if (r < 0)
-                                return r;
-                }
+                if (n_dnr > 0)
+                        FOREACH_ARRAY(res, dnr, n_dnr) {
+                                r = dnr_append_json_one(link,
+                                                        res,
+                                                        NETWORK_CONFIG_SOURCE_DHCP4,
+                                                        &s,
+                                                        &array);
+                                if (r < 0)
+                                        return r;
+                        }
         }
 
         if (link->dhcp6_lease && link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_DHCP6)) {
@@ -585,18 +583,16 @@ static int dnr_append_json(Link *link, sd_json_variant **v) {
                         return r;
 
                 n_dnr = sd_dhcp6_lease_get_dnr(link->dhcp6_lease, &dnr);
-                if (n_dnr < 0)
-                        return 0;
-
-                FOREACH_ARRAY(res, dnr, n_dnr) {
-                        r = dnr_append_json_one(link,
-                                                res,
-                                                NETWORK_CONFIG_SOURCE_DHCP6,
-                                                &s,
-                                                &array);
-                        if (r < 0)
-                                return r;
-                }
+                if (n_dnr > 0)
+                        FOREACH_ARRAY(res, dnr, n_dnr) {
+                                r = dnr_append_json_one(link,
+                                                        res,
+                                                        NETWORK_CONFIG_SOURCE_DHCP6,
+                                                        &s,
+                                                        &array);
+                                if (r < 0)
+                                        return r;
+                        }
         }
 
         if (link_get_use_dnr(link, NETWORK_CONFIG_SOURCE_NDISC)) {
index 0c9e530128a58221187a5c7ae28adb5679b96c79..da917dd8972417db74d7d469c1a8e082a26b2c12 100644 (file)
@@ -600,14 +600,16 @@ static void serialize_resolvers(
                 int r;
 
                 r = sd_dhcp_lease_get_dnr(lease, &resolvers);
-                if (r < 0)
-                        return (void) log_debug_errno(r, "Failed to get DNR from DHCP lease, ignoring: %m");
+                if (r < 0 && r != -ENODATA)
+                        log_warning_errno(r, "Failed to get DNR from DHCP lease, ignoring: %m");
 
-                r = dns_resolvers_to_dot_strv(resolvers, r, &names);
-                if (r < 0)
-                        return (void) log_warning_errno(r, "Failed to get DoT servers from DHCP DNR, ignoring: %m");
-                if (r > 0)
-                        fputstrv(f, names, NULL, space);
+                if (r > 0) {
+                        r = dns_resolvers_to_dot_strv(resolvers, r, &names);
+                        if (r < 0)
+                                return (void) log_warning_errno(r, "Failed to get DoT servers from DHCP DNR, ignoring: %m");
+                        if (r > 0)
+                                fputstrv(f, names, NULL, space);
+                }
         }
 
         if (lease6 && conditional6) {
@@ -616,14 +618,16 @@ static void serialize_resolvers(
                 int r;
 
                 r = sd_dhcp6_lease_get_dnr(lease6, &resolvers);
-                if (r < 0)
-                        return (void) log_debug_errno(r, "Failed to get DNR from DHCPv6 lease, ignoring: %m");
+                if (r < 0 && r != -ENODATA)
+                        log_warning_errno(r, "Failed to get DNR from DHCPv6 lease, ignoring: %m");
 
-                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: %m");
-                if (r > 0)
-                        fputstrv(f, names, NULL, space);
+                if (r > 0) {
+                        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: %m");
+                        if (r > 0)
+                                fputstrv(f, names, NULL, space);
+                }
         }
 
         if (lvalue)