diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 47d4d08aee..560d8e97b6 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -221,7 +221,13 @@ static bool link_ipv6_enabled(Link *link) { return false; /* DHCPv6 client will not be started if no IPv6 link-local address is configured. */ - return link_ipv6ll_enabled(link) || network_has_static_ipv6_addresses(link->network); + if (link_ipv6ll_enabled(link)) + return true; + + if (network_has_static_ipv6_configurations(link->network)) + return true; + + return false; } static bool link_radv_enabled(Link *link) { diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 6a8766ce68..91326cea3b 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -662,15 +662,35 @@ int network_apply(Network *network, Link *link) { return 0; } -bool network_has_static_ipv6_addresses(Network *network) { +bool network_has_static_ipv6_configurations(Network *network) { Address *address; + Route *route; + FdbEntry *fdb; + Neighbor *neighbor; assert(network); - LIST_FOREACH(addresses, address, network->static_addresses) { + LIST_FOREACH(addresses, address, network->static_addresses) if (address->family == AF_INET6) return true; - } + + LIST_FOREACH(routes, route, network->static_routes) + if (route->family == AF_INET6) + return true; + + LIST_FOREACH(static_fdb_entries, fdb, network->static_fdb_entries) + if (fdb->family == AF_INET6) + return true; + + LIST_FOREACH(neighbors, neighbor, network->neighbors) + if (neighbor->family == AF_INET6) + return true; + + if (!LIST_IS_EMPTY(network->address_labels)) + return true; + + if (!LIST_IS_EMPTY(network->static_prefixes)) + return true; return false; } diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index f8894f86dd..bc760744e5 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -269,7 +269,7 @@ int network_get(Manager *manager, sd_device *device, const char *ifname, const s int network_apply(Network *network, Link *link); void network_apply_anonymize_if_set(Network *network); -bool network_has_static_ipv6_addresses(Network *network); +bool network_has_static_ipv6_configurations(Network *network); CONFIG_PARSER_PROTOTYPE(config_parse_stacked_netdev); CONFIG_PARSER_PROTOTYPE(config_parse_tunnel);