diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-08-27 23:15:24 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-08-27 23:53:46 +0900 |
commit | adfeee49c5386c44642361baf7234d40aac5082c (patch) | |
tree | 93c8d236dd45e22086cda43fec09d1693d5e5726 /src | |
parent | fef40ceb5dfbb76d4733e579846a380a224efd55 (diff) | |
download | systemd-adfeee49c5386c44642361baf7234d40aac5082c.tar.gz |
network: enable ipv6 when the network has static ipv6 configurations
Diffstat (limited to 'src')
-rw-r--r-- | src/network/networkd-link.c | 8 | ||||
-rw-r--r-- | src/network/networkd-network.c | 26 | ||||
-rw-r--r-- | src/network/networkd-network.h | 2 |
3 files changed, 31 insertions, 5 deletions
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); |