summaryrefslogtreecommitdiff
path: root/src/network/networkd-radv.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-10-21 23:36:04 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-10-26 08:11:44 +0900
commit0f96a82311dbf089a52bbcb10487b6deb987915b (patch)
tree67e01dc6bf449e2b2e250815638bf4951eb2ac71 /src/network/networkd-radv.c
parent928112a487e9e9716fccbebd15dd5e402387810e (diff)
downloadsystemd-0f96a82311dbf089a52bbcb10487b6deb987915b.tar.gz
network: dhcp6pd: do not assign downstream prefix when RADV is requested but not configured yet
Diffstat (limited to 'src/network/networkd-radv.c')
-rw-r--r--src/network/networkd-radv.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c
index c3a4ca6a3a..a290b3730a 100644
--- a/src/network/networkd-radv.c
+++ b/src/network/networkd-radv.c
@@ -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,