#include "iovec-util.h"
#include "networkd-dhcp-common.h"
#include "networkd-dhcp-prefix-delegation.h"
+#include "networkd-ipv6ll.h"
#include "networkd-link.h"
#include "networkd-manager.h"
#include "networkd-network.h"
}
if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6) &&
+ !network_has_static_ipv6ll_address(network) &&
FLAGS_SET(network->dhcp, ADDRESS_FAMILY_IPV6)) {
log_warning("%s: DHCPv6 client is enabled but IPv6 link-local addressing is disabled. "
"Disabling DHCPv6 client.", network->filename);
return link->network->link_local & ADDRESS_FAMILY_IPV6;
}
+bool network_has_static_ipv6ll_address(const Network *network) {
+ assert(network);
+
+ Address *a;
+ ORDERED_HASHMAP_FOREACH(a, network->addresses_by_section) {
+ if (a->family != AF_INET6)
+ continue;
+ if (in6_addr_is_set(&a->in_addr_peer.in6))
+ continue;
+ if (in6_addr_is_link_local(&a->in_addr.in6))
+ return true;
+ }
+
+ return false;
+}
+
bool link_ipv6ll_enabled_harder(Link *link) {
assert(link);
if (!link->network)
return false;
- Address *a;
- ORDERED_HASHMAP_FOREACH(a, link->network->addresses_by_section) {
- if (a->family != AF_INET6)
- continue;
- if (in6_addr_is_set(&a->in_addr_peer.in6))
- continue;
- if (in6_addr_is_link_local(&a->in_addr.in6))
- return true;
- }
-
- return false;
+ return network_has_static_ipv6ll_address(link->network);
}
IPv6LinkLocalAddressGenMode link_get_ipv6ll_addrgen_mode(Link *link) {
bool link_ipv6ll_enabled(Link *link);
bool link_ipv6ll_enabled_harder(Link *link);
+bool network_has_static_ipv6ll_address(const Network *network);
IPv6LinkLocalAddressGenMode link_get_ipv6ll_addrgen_mode(Link *link);
int ipv6ll_addrgen_mode_fill_message(sd_netlink_message *message, IPv6LinkLocalAddressGenMode mode);
#include "networkd-address.h"
#include "networkd-address-generation.h"
#include "networkd-dhcp6.h"
+#include "networkd-ipv6ll.h"
#include "networkd-link.h"
#include "networkd-manager.h"
#include "networkd-ndisc.h"
void network_adjust_ndisc(Network *network) {
assert(network);
- if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6)) {
+ if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6) &&
+ !network_has_static_ipv6ll_address(network)) {
if (network->ndisc > 0)
log_warning("%s: IPv6AcceptRA= is enabled but IPv6 link-local addressing is disabled or not supported. "
"Disabling IPv6AcceptRA=.", network->filename);
#include "networkd-address.h"
#include "networkd-address-generation.h"
#include "networkd-dhcp-prefix-delegation.h"
+#include "networkd-ipv6ll.h"
#include "networkd-link.h"
#include "networkd-manager.h"
#include "networkd-network.h"
/* For backward compatibility. */
network->dhcp_pd = FLAGS_SET(network->router_prefix_delegation, RADV_PREFIX_DELEGATION_DHCP6);
- if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6)) {
+ if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6) &&
+ !network_has_static_ipv6ll_address(network)) {
if (network->router_prefix_delegation != RADV_PREFIX_DELEGATION_NONE)
log_warning("%s: IPv6PrefixDelegation= is enabled but IPv6 link-local addressing is disabled. "
"Disabling IPv6PrefixDelegation=.", network->filename);