summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2019-08-27 23:15:24 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-08-27 23:53:46 +0900
commitadfeee49c5386c44642361baf7234d40aac5082c (patch)
tree93c8d236dd45e22086cda43fec09d1693d5e5726
parentfef40ceb5dfbb76d4733e579846a380a224efd55 (diff)
downloadsystemd-adfeee49c5386c44642361baf7234d40aac5082c.tar.gz
network: enable ipv6 when the network has static ipv6 configurations
-rw-r--r--src/network/networkd-link.c8
-rw-r--r--src/network/networkd-network.c26
-rw-r--r--src/network/networkd-network.h2
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);