diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 9edf009c08..6229e20615 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -2086,9 +2086,11 @@ IPv6Token=prefixstable:2002:da8:1:: DHCPv6Client= - Takes a boolean, or the special value always. When true (the default), the DHCPv6 client will be started when the - RA has the managed or other information flag. If set to always, the DHCPv6 client will be started even if there is no - managed or other information flag in the RA. + Takes a boolean, or the special value always. When true or + always, the DHCPv6 client will be started when the RA has the managed or + other information flag. If set to always, the DHCPv6 client will also be + started in managed mode when neither managed nor other information flag is set in the RA. + Defaults to true. diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index 566dd5b2c4..c90179d112 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -1743,8 +1743,7 @@ int sd_dhcp6_client_start(sd_dhcp6_client *client) { } log_dhcp6_client(client, "Started in %s mode", - client->information_request? "Information request": - "Managed"); + client->information_request ? "Information request" : "Managed"); return client_start(client, state); } diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index f4bea08070..d2aa3db175 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -1163,13 +1163,17 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) { if (r < 0) return log_link_error_errno(link, r, "Failed to get RA flags: %m"); - if ((flags & (ND_RA_FLAG_MANAGED | ND_RA_FLAG_OTHER) && link->network->ipv6_accept_ra_start_dhcp6_client)) { + if ((flags & (ND_RA_FLAG_MANAGED | ND_RA_FLAG_OTHER) && + link->network->ipv6_accept_ra_start_dhcp6_client != IPV6_ACCEPT_RA_START_DHCP6_CLIENT_NO) || + link->network->ipv6_accept_ra_start_dhcp6_client == IPV6_ACCEPT_RA_START_DHCP6_CLIENT_ALWAYS) { - if (link->network->ipv6_accept_ra_start_dhcp6_client == IPV6_ACCEPT_RA_START_DHCP6_CLIENT_ALWAYS) - r = dhcp6_request_address(link, false); - else + if (flags & (ND_RA_FLAG_MANAGED | ND_RA_FLAG_OTHER)) /* (re)start DHCPv6 client in stateful or stateless mode according to RA flags */ r = dhcp6_request_address(link, !(flags & ND_RA_FLAG_MANAGED)); + else + /* When IPv6AcceptRA.DHCPv6Client=always, start dhcp6 client in managed mode + * even if router does not have M or O flag. */ + r = dhcp6_request_address(link, false); if (r < 0 && r != -EBUSY) return log_link_error_errno(link, r, "Could not acquire DHCPv6 lease on NDisc request: %m"); else