]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: dhcp6pd: also call dhcp6_pd_prepare() and dhcp6_pd_finalize() for upstream...
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 21 Oct 2021 08:54:06 +0000 (17:54 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 22 Oct 2021 06:58:38 +0000 (15:58 +0900)
As now the subnet prefix may be assigned to the upstream interface.

src/network/networkd-dhcp6.c

index b0ce0187f63f77eb8e656573c6f02e643c1e1695..fb13027337fc65442c7add7205a378f3086ee87a 100644 (file)
@@ -844,12 +844,17 @@ static int dhcp6_pd_prefix_acquired(Link *dhcp6_link) {
                 return log_link_warning_errno(dhcp6_link, r, "Failed to get timestamp of DHCPv6 lease: %m");
 
         HASHMAP_FOREACH(link, dhcp6_link->manager->links_by_index) {
-                if (link == dhcp6_link)
-                        continue;
-
                 r = dhcp6_pd_prepare(link);
-                if (r < 0)
+                if (r < 0) {
+                        /* When failed on the upstream interface (i.e., the case link == dhcp6_link),
+                         * immediately abort the assignment of the prefixes. As, the all assigned
+                         * prefixes will be dropped soon in link_enter_failed(), and it is meaningless
+                         * to continue the assignment. */
+                        if (link == dhcp6_link)
+                                return r;
+
                         link_enter_failed(link);
+                }
         }
 
         for (sd_dhcp6_lease_reset_pd_prefix_iter(dhcp6_link->dhcp6_lease);;) {
@@ -921,12 +926,13 @@ static int dhcp6_pd_prefix_acquired(Link *dhcp6_link) {
         }
 
         HASHMAP_FOREACH(link, dhcp6_link->manager->links_by_index) {
-                if (link == dhcp6_link)
-                        continue;
-
                 r = dhcp6_pd_finalize(link);
-                if (r < 0)
+                if (r < 0) {
+                        if (link == dhcp6_link)
+                                return r;
+
                         link_enter_failed(link);
+                }
         }
 
         return 0;