]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: dhcp6pd: do not assign downstream prefix when RADV is requested but not...
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 21 Oct 2021 14:36:04 +0000 (23:36 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 25 Oct 2021 23:11:44 +0000 (08:11 +0900)
src/network/networkd-dhcp6.c
src/network/networkd-link.c
src/network/networkd-radv.c
src/network/networkd-radv.h

index 059313d68bc23aa0d8f156194c243d1014d75e9e..76f4833b4cc49d85e2c41aa4ea3ec3e439edde2b 100644 (file)
@@ -582,6 +582,9 @@ static int dhcp6_pd_distribute_prefix(
                 if (!link_dhcp6_pd_is_enabled(link))
                         continue;
 
+                if (link->network->dhcp6_pd_announce && !link->radv)
+                        continue;
+
                 if (link == dhcp6_link && !link->network->dhcp6_pd_assign)
                         continue;
 
@@ -608,6 +611,9 @@ static int dhcp6_pd_prepare(Link *link) {
         if (!link_dhcp6_pd_is_enabled(link))
                 return 0;
 
+        if (link->network->dhcp6_pd_announce && !link->radv)
+                return 0;
+
         link_mark_addresses(link, NETWORK_CONFIG_SOURCE_DHCP6PD, NULL);
         link_mark_routes(link, NETWORK_CONFIG_SOURCE_DHCP6PD, NULL);
 
@@ -623,6 +629,9 @@ static int dhcp6_pd_finalize(Link *link) {
         if (!link_dhcp6_pd_is_enabled(link))
                 return 0;
 
+        if (link->network->dhcp6_pd_announce && !link->radv)
+                return 0;
+
         if (link->dhcp6_pd_messages == 0) {
                 link->dhcp6_pd_configured = false;
 
index 3bc417e033ac580b3c81d3b91795d07fb92efdf6..c6851da6aab78912ae3755c5c45fa3dac0dc5f49 100644 (file)
@@ -597,16 +597,9 @@ static int link_acquire_dynamic_ipv6_conf(Link *link) {
 
         assert(link);
 
-        if (link->radv) {
-                assert(link->radv);
-                assert(in6_addr_is_link_local(&link->ipv6ll_address));
-
-                log_link_debug(link, "Starting IPv6 Router Advertisements");
-
-                r = sd_radv_start(link->radv);
-                if (r < 0)
-                        return log_link_warning_errno(link, r, "Could not start IPv6 Router Advertisement: %m");
-        }
+        r = radv_start(link);
+        if (r < 0)
+                return log_link_warning_errno(link, r, "Failed to start IPv6 Router Advertisement engine: %m");
 
         r = ndisc_start(link);
         if (r < 0)
@@ -616,10 +609,6 @@ static int link_acquire_dynamic_ipv6_conf(Link *link) {
         if (r < 0)
                 return log_link_warning_errno(link, r, "Failed to start DHCPv6 client: %m");
 
-        r = dhcp6_request_prefix_delegation(link);
-        if (r < 0)
-                return log_link_warning_errno(link, r, "Failed to request DHCPv6 prefix delegation: %m");
-
         return 0;
 }
 
@@ -662,6 +651,7 @@ static int link_acquire_dynamic_conf(Link *link) {
         int r;
 
         assert(link);
+        assert(link->network);
 
         r = link_acquire_dynamic_ipv4_conf(link);
         if (r < 0)
@@ -673,6 +663,16 @@ static int link_acquire_dynamic_conf(Link *link) {
                         return r;
         }
 
+        if (!link_radv_enabled(link) || !link->network->dhcp6_pd_announce) {
+                /* DHCPv6PD downstream does not require IPv6LL address. But may require RADV to be
+                 * configured, and RADV may not be configured yet here. Only acquire subnet prefix when
+                 * RADV is disabled, or the announcement of the prefix is disabled. Otherwise, the
+                 * below will be called in radv_start(). */
+                r = dhcp6_request_prefix_delegation(link);
+                if (r < 0)
+                        return log_link_warning_errno(link, r, "Failed to request DHCPv6 prefix delegation: %m");
+        }
+
         if (link->lldp_tx) {
                 r = sd_lldp_tx_start(link->lldp_tx);
                 if (r < 0)
index c3a4ca6a3ad15a867fcb49b62fc240d866514f91..a290b3730afc5b6fc4d76e4281011711cf7a0911 100644 (file)
@@ -9,6 +9,7 @@
 #include "dns-domain.h"
 #include "networkd-address-generation.h"
 #include "networkd-address.h"
+#include "networkd-dhcp6.h"
 #include "networkd-link.h"
 #include "networkd-manager.h"
 #include "networkd-network.h"
@@ -49,7 +50,7 @@ void network_adjust_radv(Network *network) {
         }
 }
 
-static bool link_radv_enabled(Link *link) {
+bool link_radv_enabled(Link *link) {
         assert(link);
 
         if (!link_ipv6ll_enabled(link))
@@ -596,7 +597,7 @@ int request_process_radv(Request *req) {
                 return log_link_warning_errno(link, r, "Failed to configure IPv6 Router Advertisement engine: %m");
 
         if (link_has_carrier(link)) {
-                r = sd_radv_start(link->radv);
+                r = radv_start(link);
                 if (r < 0)
                         return log_link_warning_errno(link, r, "Failed to start IPv6 Router Advertisement engine: %m");
         }
@@ -625,6 +626,34 @@ int link_request_radv(Link *link) {
         return 0;
 }
 
+int radv_start(Link *link) {
+        int r;
+
+        assert(link);
+        assert(link->network);
+
+        if (!link->radv)
+                return 0;
+
+        if (!link_has_carrier(link))
+                return 0;
+
+        if (in6_addr_is_null(&link->ipv6ll_address))
+                return 0;
+
+        if (sd_radv_is_running(link->radv))
+                return 0;
+
+        if (link->network->dhcp6_pd_announce) {
+                r = dhcp6_request_prefix_delegation(link);
+                if (r < 0)
+                        return log_link_debug_errno(link, r, "Failed to request DHCPv6 prefix delegation: %m");
+        }
+
+        log_link_debug(link, "Starting IPv6 Router Advertisements");
+        return sd_radv_start(link->radv);
+}
+
 int radv_add_prefix(
                 Link *link,
                 const struct in6_addr *prefix,
index 6fd27ef39ec99a53cbe0851dff63bd64307dcf9d..2d69a6fa27b88cf9818dce6fe686c33be533fe5b 100644 (file)
@@ -62,6 +62,8 @@ void network_adjust_radv(Network *network);
 
 int link_request_radv_addresses(Link *link);
 
+bool link_radv_enabled(Link *link);
+int radv_start(Link *link);
 int radv_update_mac(Link *link);
 int radv_add_prefix(Link *link, const struct in6_addr *prefix, uint8_t prefix_len,
                     usec_t lifetime_preferred_usec, usec_t lifetime_valid_usec);