From 22d37e5df6e8bc5bb3ab6f7eaa47aac13fd3a50d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 12 Oct 2020 16:52:33 +0900 Subject: [PATCH] network: introduce network_adjust_dhcp() --- src/network/networkd-dhcp-common.c | 32 ++++++++++++++++++++++++------ src/network/networkd-dhcp-common.h | 3 +++ src/network/networkd-network.c | 13 ++---------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index 46d27f8f544..a41bd348dc4 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -26,18 +26,38 @@ bool link_dhcp_enabled(Link *link, int family) { if (link->flags & IFF_LOOPBACK) return false; - if (!link->network) - return false; - - if (link->network->bond) - return false; - if (link->iftype == ARPHRD_CAN) return false; + if (!link->network) + return false; + return link->network->dhcp & (family == AF_INET ? ADDRESS_FAMILY_IPV4 : ADDRESS_FAMILY_IPV6); } +void network_adjust_dhcp(Network *network) { + assert(network); + assert(network->dhcp >= 0); + + if (network->dhcp == ADDRESS_FAMILY_NO) + return; + + /* Bonding slave does not support addressing. */ + if (network->bond) { + log_warning("%s: Cannot enable DHCP= when Bond= is specified, disabling DHCP=.", + network->filename); + network->dhcp = ADDRESS_FAMILY_NO; + return; + } + + if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6) && + 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); + SET_FLAG(network->dhcp, ADDRESS_FAMILY_IPV6, false); + } +} + DUID* link_get_duid(Link *link) { if (link->network->duid.type != _DUID_TYPE_INVALID) return &link->network->duid; diff --git a/src/network/networkd-dhcp-common.h b/src/network/networkd-dhcp-common.h index e3982a7ef16..fc84450e5eb 100644 --- a/src/network/networkd-dhcp-common.h +++ b/src/network/networkd-dhcp-common.h @@ -9,6 +9,7 @@ typedef struct Link Link; typedef struct Manager Manager; +typedef struct Network Network; typedef enum DHCPUseDomains { DHCP_USE_DOMAINS_NO, @@ -46,6 +47,8 @@ static inline bool link_dhcp6_enabled(Link *link) { return link_dhcp_enabled(link, AF_INET6); } +void network_adjust_dhcp(Network *network); + DUID* link_get_duid(Link *link); int link_configure_duid(Link *link); int manager_request_product_uuid(Manager *m, Link *link); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index a9ad8054ff8..6bfc4cb9ebe 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -16,6 +16,7 @@ #include "network-internal.h" #include "networkd-address-label.h" #include "networkd-address.h" +#include "networkd-dhcp-common.h" #include "networkd-fdb.h" #include "networkd-manager.h" #include "networkd-mdb.h" @@ -194,11 +195,6 @@ int network_verify(Network *network) { network->filename); network->link_local = ADDRESS_FAMILY_NO; } - if (network->dhcp != ADDRESS_FAMILY_NO) { - log_warning("%s: Cannot enable DHCP= when Bond= is specified, disabling DHCP=.", - network->filename); - network->dhcp = ADDRESS_FAMILY_NO; - } if (network->dhcp_server) { log_warning("%s: Cannot enable DHCPServer= when Bond= is specified, disabling DHCPServer=.", network->filename); @@ -219,12 +215,6 @@ int network_verify(Network *network) { network->link_local = network->bridge ? ADDRESS_FAMILY_NO : ADDRESS_FAMILY_IPV6; if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6)) { - if (FLAGS_SET(network->dhcp, ADDRESS_FAMILY_IPV6)) { - log_warning("%s: DHCPv6 client is enabled by the .network file but IPv6 link local addressing is disabled. " - "Disabling DHCPv6 client.", network->filename); - SET_FLAG(network->dhcp, ADDRESS_FAMILY_IPV6, false); - } - 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); @@ -244,6 +234,7 @@ int network_verify(Network *network) { network->ip_forward |= ADDRESS_FAMILY_IPV4; network_adjust_ipv6_accept_ra(network); + network_adjust_dhcp(network); if (network->mtu > 0 && network->dhcp_use_mtu) { log_warning("%s: MTUBytes= in [Link] section and UseMTU= in [DHCP] section are set. "