chiark / gitweb /
sd-dhcp-lease: expose load/save functions
[elogind.git] / src / network / networkd-link.c
index bcd2e6da519a6ac12a73b94518275ffe97b43864..fcfbd3e12373f95a948780d60543f8698d12427f 100644 (file)
 
 #include "dhcp-lease-internal.h"
 
 
 #include "dhcp-lease-internal.h"
 
+static bool link_dhcp6_enabled(Link *link) {
+        if (link->flags & IFF_LOOPBACK)
+                return false;
+
+        if (!link->network)
+                return false;
+
+        return IN_SET(link->network->dhcp, DHCP_SUPPORT_V6, DHCP_SUPPORT_BOTH);
+}
+
+static bool link_dhcp4_enabled(Link *link) {
+        if (link->flags & IFF_LOOPBACK)
+                return false;
+
+        if (!link->network)
+                return false;
+
+        return IN_SET(link->network->dhcp, DHCP_SUPPORT_V4, DHCP_SUPPORT_BOTH);
+}
+
+static bool link_dhcp4_server_enabled(Link *link) {
+        if (link->flags & IFF_LOOPBACK)
+                return false;
+
+        if (!link->network)
+                return false;
+
+        return link->network->dhcp_server;
+}
+
+static bool link_ipv4ll_enabled(Link *link) {
+        if (link->flags & IFF_LOOPBACK)
+                return false;
+
+        if (!link->network)
+                return false;
+
+        return link->network->ipv4ll;
+}
+
 #define FLAG_STRING(string, flag, old, new) \
         (((old ^ new) & flag) \
                 ? ((old & flag) ? (" -" string) : (" +" string)) \
 #define FLAG_STRING(string, flag, old, new) \
         (((old ^ new) & flag) \
                 ? ((old & flag) ? (" -" string) : (" +" string)) \
@@ -166,7 +206,7 @@ static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
         if (r < 0)
                 return -ENOMEM;
 
         if (r < 0)
                 return -ENOMEM;
 
-        r = hashmap_ensure_allocated(&manager->links, NULL, NULL);
+        r = hashmap_ensure_allocated(&manager->links, NULL);
         if (r < 0)
                 return r;
 
         if (r < 0)
                 return r;
 
@@ -304,15 +344,6 @@ static int link_stop_clients(Link *link) {
                 }
         }
 
                 }
         }
 
-        if (link->dhcp_server) {
-                k = sd_dhcp_server_stop(link->dhcp_server);
-                if (k < 0) {
-                        log_warning_link(link, "Could not stop DHCPv4 server: %s",
-                                         strerror(-r));
-                        r = k;
-                }
-        }
-
         if(link->icmp6_router_discovery) {
 
                 if (link->dhcp6_client) {
         if(link->icmp6_router_discovery) {
 
                 if (link->dhcp6_client) {
@@ -387,7 +418,7 @@ static int link_enter_configured(Link *link) {
         assert(link->network);
         assert(link->state == LINK_STATE_SETTING_ROUTES);
 
         assert(link->network);
         assert(link->state == LINK_STATE_SETTING_ROUTES);
 
-        if (link->network->dhcp_server &&
+        if (link_dhcp4_server_enabled(link) &&
             !sd_dhcp_server_is_running(link->dhcp_server)) {
                 struct in_addr pool_start;
                 Address *address;
             !sd_dhcp_server_is_running(link->dhcp_server)) {
                 struct in_addr pool_start;
                 Address *address;
@@ -454,13 +485,12 @@ void link_client_handler(Link *link) {
         if (!link->static_configured)
                 return;
 
         if (!link->static_configured)
                 return;
 
-        if (link->network->ipv4ll)
+        if (link_ipv4ll_enabled(link))
                 if (!link->ipv4ll_address ||
                     !link->ipv4ll_route)
                         return;
 
                 if (!link->ipv4ll_address ||
                     !link->ipv4ll_route)
                         return;
 
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4))
-                if (!link->dhcp4_configured)
+        if (link_dhcp4_enabled(link) && !link->dhcp4_configured)
                         return;
 
         if (link->state != LINK_STATE_CONFIGURED)
                         return;
 
         if (link->state != LINK_STATE_CONFIGURED)
@@ -686,8 +716,6 @@ static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata,
                 return 1;
 
         r = sd_bus_message_get_errno(m);
                 return 1;
 
         r = sd_bus_message_get_errno(m);
-        if (r < 0)
-                r = -r;
         if (r > 0)
                 log_warning_link(link, "Could not set hostname: %s",
                                  strerror(r));
         if (r > 0)
                 log_warning_link(link, "Could not set hostname: %s",
                                  strerror(r));
@@ -872,7 +900,9 @@ static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) {
                 return;
         }
 
                 return;
         }
 
-        r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac);
+        r = sd_dhcp6_client_set_mac(link->dhcp6_client,
+                                    (const uint8_t *) &link->mac,
+                                    sizeof (link->mac), ARPHRD_ETHER);
         if (r < 0) {
                 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
                 return;
         if (r < 0) {
                 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
                 return;
@@ -904,7 +934,7 @@ static int link_acquire_conf(Link *link) {
         assert(link->manager);
         assert(link->manager->event);
 
         assert(link->manager);
         assert(link->manager->event);
 
-        if (link->network->ipv4ll) {
+        if (link_ipv4ll_enabled(link)) {
                 assert(link->ipv4ll);
 
                 log_debug_link(link, "acquiring IPv4 link-local address");
                 assert(link->ipv4ll);
 
                 log_debug_link(link, "acquiring IPv4 link-local address");
@@ -917,7 +947,7 @@ static int link_acquire_conf(Link *link) {
                 }
         }
 
                 }
         }
 
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
+        if (link_dhcp4_enabled(link)) {
                 assert(link->dhcp_client);
 
                 log_debug_link(link, "acquiring DHCPv4 lease");
                 assert(link->dhcp_client);
 
                 log_debug_link(link, "acquiring DHCPv4 lease");
@@ -930,7 +960,7 @@ static int link_acquire_conf(Link *link) {
                 }
         }
 
                 }
         }
 
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
+        if (link_dhcp6_enabled(link)) {
                 assert(link->icmp6_router_discovery);
 
                 log_debug_link(link, "discovering IPv6 routers");
                 assert(link->icmp6_router_discovery);
 
                 log_debug_link(link, "discovering IPv6 routers");
@@ -1170,19 +1200,19 @@ static int link_configure(Link *link) {
         assert(link->network);
         assert(link->state == LINK_STATE_PENDING);
 
         assert(link->network);
         assert(link->state == LINK_STATE_PENDING);
 
-        if (link->network->ipv4ll) {
+        if (link_ipv4ll_enabled(link)) {
                 r = ipv4ll_configure(link);
                 if (r < 0)
                         return r;
         }
 
                 r = ipv4ll_configure(link);
                 if (r < 0)
                         return r;
         }
 
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
+        if (link_dhcp4_enabled(link)) {
                 r = dhcp4_configure(link);
                 if (r < 0)
                         return r;
         }
 
                 r = dhcp4_configure(link);
                 if (r < 0)
                         return r;
         }
 
-        if (link->network->dhcp_server) {
+        if (link_dhcp4_server_enabled(link)) {
                 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
                 if (r < 0)
                         return r;
                 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
                 if (r < 0)
                         return r;
@@ -1192,7 +1222,7 @@ static int link_configure(Link *link) {
                         return r;
         }
 
                         return r;
         }
 
-        if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
+        if (link_dhcp6_enabled(link)) {
                 r = sd_icmp6_nd_new(&link->icmp6_router_discovery);
                 if (r < 0)
                         return r;
                 r = sd_icmp6_nd_new(&link->icmp6_router_discovery);
                 if (r < 0)
                         return r;
@@ -1251,9 +1281,14 @@ static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m,
                 return r;
 
         if (link->flags & IFF_LOOPBACK) {
                 return r;
 
         if (link->flags & IFF_LOOPBACK) {
-                log_debug_link(link, "matching network ignored for loopback link");
-                link_enter_unmanaged(link);
-                return 1;
+                if (network->ipv4ll)
+                        log_debug_link(link, "ignoring IPv4LL for loopback link");
+
+                if (network->dhcp != DHCP_SUPPORT_NONE)
+                        log_debug_link(link, "ignoring DHCP clients for loopback link");
+
+                if (network->dhcp_server)
+                        log_debug_link(link, "ignoring DHCP server for loopback link");
         }
 
         r = network_apply(link->manager, network, link);
         }
 
         r = network_apply(link->manager, network, link);
@@ -1433,12 +1468,10 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
         case RTM_NEWADDR:
                 if (!address_dropped)
                         log_debug_link(link, "added address: %s/%u (valid for %s)",
         case RTM_NEWADDR:
                 if (!address_dropped)
                         log_debug_link(link, "added address: %s/%u (valid for %s)",
-                                       buf, address->prefixlen,
-                                       strna(valid_str));
+                                       buf, address->prefixlen, valid_str);
                 else
                         log_debug_link(link, "updated address: %s/%u (valid for %s)",
                 else
                         log_debug_link(link, "updated address: %s/%u (valid for %s)",
-                                       buf, address->prefixlen,
-                                       strna(valid_str));
+                                       buf, address->prefixlen, valid_str);
 
                 LIST_PREPEND(addresses, link->addresses, address);
                 address = NULL;
 
                 LIST_PREPEND(addresses, link->addresses, address);
                 address = NULL;
@@ -1449,15 +1482,13 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
         case RTM_DELADDR:
                 if (address_dropped) {
                         log_debug_link(link, "removed address: %s/%u (valid for %s)",
         case RTM_DELADDR:
                 if (address_dropped) {
                         log_debug_link(link, "removed address: %s/%u (valid for %s)",
-                                       buf, address->prefixlen,
-                                       strna(valid_str));
+                                       buf, address->prefixlen, valid_str);
 
                         link_save(link);
                 } else
                         log_warning_link(link,
                                          "removing non-existent address: %s/%u (valid for %s)",
 
                         link_save(link);
                 } else
                         log_warning_link(link,
                                          "removing non-existent address: %s/%u (valid for %s)",
-                                         buf, address->prefixlen,
-                                         strna(valid_str));
+                                         buf, address->prefixlen, valid_str);
 
                 break;
         default:
 
                 break;
         default:
@@ -1609,7 +1640,9 @@ int link_update(Link *link, sd_rtnl_message *m) {
 
                         if (link->dhcp_client) {
                                 r = sd_dhcp_client_set_mac(link->dhcp_client,
 
                         if (link->dhcp_client) {
                                 r = sd_dhcp_client_set_mac(link->dhcp_client,
-                                                           &link->mac);
+                                                           (const uint8_t *) &link->mac,
+                                                           sizeof (link->mac),
+                                                           ARPHRD_ETHER);
                                 if (r < 0) {
                                         log_warning_link(link,
                                                          "Could not update MAC address in DHCP client: %s",
                                 if (r < 0) {
                                         log_warning_link(link,
                                                          "Could not update MAC address in DHCP client: %s",
@@ -1620,7 +1653,9 @@ int link_update(Link *link, sd_rtnl_message *m) {
 
                         if (link->dhcp6_client) {
                                 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
 
                         if (link->dhcp6_client) {
                                 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
-                                                            &link->mac);
+                                                            (const uint8_t *) &link->mac,
+                                                            sizeof (link->mac),
+                                                            ARPHRD_ETHER);
                                 if (r < 0) {
                                         log_warning_link(link,
                                                          "Could not update MAC address in DHCPv6 client: %s",
                                 if (r < 0) {
                                         log_warning_link(link,
                                                          "Could not update MAC address in DHCPv6 client: %s",
@@ -1741,6 +1776,8 @@ int link_save(Link *link) {
                 char **address, **domain;
                 bool space;
 
                 char **address, **domain;
                 bool space;
 
+                fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
+
                 fputs("DNS=", f);
                 space = false;
                 STRV_FOREACH(address, link->network->dns) {
                 fputs("DNS=", f);
                 space = false;
                 STRV_FOREACH(address, link->network->dns) {
@@ -1820,7 +1857,7 @@ int link_save(Link *link) {
         if (link->dhcp_lease) {
                 assert(link->network);
 
         if (link->dhcp_lease) {
                 assert(link->network);
 
-                r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
+                r = sd_dhcp_lease_save(link->dhcp_lease, link->lease_file);
                 if (r < 0)
                         goto fail;
 
                 if (r < 0)
                         goto fail;