]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce network_adjust_dhcp()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 12 Oct 2020 07:52:33 +0000 (16:52 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 14 Oct 2020 22:06:58 +0000 (07:06 +0900)
src/network/networkd-dhcp-common.c
src/network/networkd-dhcp-common.h
src/network/networkd-network.c

index 46d27f8f544c13dea8b612b28b3d59f43c745959..a41bd348dc4bfb04f1c24d6f1f3307e7b6c3b676 100644 (file)
@@ -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)
+        if (link->iftype == ARPHRD_CAN)
                 return false;
 
-        if (link->iftype == ARPHRD_CAN)
+        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;
index e3982a7ef1617bea4f352922c15718f523138754..fc84450e5eb5e8a2266f200fc6ac34164c3861d4 100644 (file)
@@ -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);
index a9ad8054ff84a8e0d210ff22675b68d103d0b557..6bfc4cb9ebef3fd336a95fdce8b540dd369c6f0b 100644 (file)
@@ -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. "