Zbigniew Jędrzejewski-Szmek 62fe94
From 78c958f82e929f015169ce1ed614d1e9c50928aa Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: Tom Gundersen <teg@jklm.no>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Thu, 4 Sep 2014 20:54:08 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] networkd: link - allow loopback links to be manage, but
Zbigniew Jędrzejewski-Szmek 62fe94
 ignore DHCP/IPv4LL
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/network/networkd-link.c | 72 ++++++++++++++++++++++++++++++++++++---------
Zbigniew Jędrzejewski-Szmek 62fe94
 1 file changed, 58 insertions(+), 14 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
Zbigniew Jędrzejewski-Szmek 62fe94
index bcd2e6da51..a88cf48d9d 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/network/networkd-link.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/network/networkd-link.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -35,6 +35,46 @@
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 #include "dhcp-lease-internal.h"
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+static bool link_dhcp6_enabled(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link->flags & IFF_LOOPBACK)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (!link->network)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return IN_SET(link->network->dhcp, DHCP_SUPPORT_V6, DHCP_SUPPORT_BOTH);
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+static bool link_dhcp4_enabled(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link->flags & IFF_LOOPBACK)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (!link->network)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return IN_SET(link->network->dhcp, DHCP_SUPPORT_V4, DHCP_SUPPORT_BOTH);
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+static bool link_dhcp4_server_enabled(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link->flags & IFF_LOOPBACK)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (!link->network)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return link->network->dhcp_server;
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+static bool link_ipv4ll_enabled(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link->flags & IFF_LOOPBACK)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (!link->network)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return false;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return link->network->ipv4ll;
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
 #define FLAG_STRING(string, flag, old, new) \
Zbigniew Jędrzejewski-Szmek 62fe94
         (((old ^ new) & flag) \
Zbigniew Jędrzejewski-Szmek 62fe94
                 ? ((old & flag) ? (" -" string) : (" +" string)) \
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -387,7 +427,7 @@ static int link_enter_configured(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(link->network);
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(link->state == LINK_STATE_SETTING_ROUTES);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (link->network->dhcp_server &&
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_dhcp4_server_enabled(link) &&
Zbigniew Jędrzejewski-Szmek 62fe94
             !sd_dhcp_server_is_running(link->dhcp_server)) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 struct in_addr pool_start;
Zbigniew Jędrzejewski-Szmek 62fe94
                 Address *address;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -454,13 +494,12 @@ void link_client_handler(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
         if (!link->static_configured)
Zbigniew Jędrzejewski-Szmek 62fe94
                 return;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (link->network->ipv4ll)
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_ipv4ll_enabled(link))
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (!link->ipv4ll_address ||
Zbigniew Jędrzejewski-Szmek 62fe94
                     !link->ipv4ll_route)
Zbigniew Jędrzejewski-Szmek 62fe94
                         return;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4))
Zbigniew Jędrzejewski-Szmek 62fe94
-                if (!link->dhcp4_configured)
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_dhcp4_enabled(link) && !link->dhcp4_configured)
Zbigniew Jędrzejewski-Szmek 62fe94
                         return;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         if (link->state != LINK_STATE_CONFIGURED)
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -904,7 +943,7 @@ static int link_acquire_conf(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(link->manager);
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(link->manager->event);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (link->network->ipv4ll) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_ipv4ll_enabled(link)) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 assert(link->ipv4ll);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 log_debug_link(link, "acquiring IPv4 link-local address");
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -917,7 +956,7 @@ static int link_acquire_conf(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 }
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_dhcp4_enabled(link)) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 assert(link->dhcp_client);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 log_debug_link(link, "acquiring DHCPv4 lease");
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -930,7 +969,7 @@ static int link_acquire_conf(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 }
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_dhcp6_enabled(link)) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 assert(link->icmp6_router_discovery);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 log_debug_link(link, "discovering IPv6 routers");
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1170,19 +1209,19 @@ static int link_configure(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(link->network);
Zbigniew Jędrzejewski-Szmek 62fe94
         assert(link->state == LINK_STATE_PENDING);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (link->network->ipv4ll) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_ipv4ll_enabled(link)) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 r = ipv4ll_configure(link);
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
                         return r;
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_dhcp4_enabled(link)) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 r = dhcp4_configure(link);
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
                         return r;
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (link->network->dhcp_server) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_dhcp4_server_enabled(link)) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
                         return r;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1192,7 +1231,7 @@ static int link_configure(Link *link) {
Zbigniew Jędrzejewski-Szmek 62fe94
                         return r;
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (link_dhcp6_enabled(link)) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 r = sd_icmp6_nd_new(&link->icmp6_router_discovery);
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
                         return r;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1251,9 +1290,14 @@ static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m,
Zbigniew Jędrzejewski-Szmek 62fe94
                 return r;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         if (link->flags & IFF_LOOPBACK) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                log_debug_link(link, "matching network ignored for loopback link");
Zbigniew Jędrzejewski-Szmek 62fe94
-                link_enter_unmanaged(link);
Zbigniew Jędrzejewski-Szmek 62fe94
-                return 1;
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (network->ipv4ll)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        log_debug_link(link, "ignoring IPv4LL for loopback link");
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (network->dhcp != DHCP_SUPPORT_NONE)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        log_debug_link(link, "ignoring DHCP clients for loopback link");
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (network->dhcp_server)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        log_debug_link(link, "ignoring DHCP server for loopback link");
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         r = network_apply(link->manager, network, link);