[systemd-commits] 4 commits - man/systemd-networkd-wait-online.service.xml src/libsystemd src/network TODO

Tom Gundersen tomegun at kemper.freedesktop.org
Sat Jan 31 06:27:58 PST 2015


 TODO                                         |    2 
 man/systemd-networkd-wait-online.service.xml |    8 ++
 src/libsystemd/sd-rtnl/sd-rtnl.c             |   20 +++--
 src/network/networkd-link.c                  |  107 +++++++++++++--------------
 src/network/networkd-wait-online-link.c      |    9 --
 src/network/networkd-wait-online-manager.c   |   20 ++++-
 src/network/networkd-wait-online.c           |   15 +++
 src/network/networkd-wait-online.h           |   12 ++-
 8 files changed, 117 insertions(+), 76 deletions(-)

New commits:
commit 2d9079c2173e95a06853ebea5ed6bbe4b7e3917a
Author: Tom Gundersen <teg at jklm.no>
Date:   Sat Jan 31 15:27:49 2015 +0100

    TODO

diff --git a/TODO b/TODO
index 3c5e0f7..e9615cc 100644
--- a/TODO
+++ b/TODO
@@ -34,7 +34,7 @@ External:
 
 Features:
 
-* network-wait-online should have the ability to ignore interfaces for checking whether we are online, with --ignore-interfaces= or so. Even better: if globbing would be supported.
+* network-wait-online should support globbing for interfaces.
 
 * network-wait-online should have a configurable timeout, maybe as --timeout-usec=
 

commit d4cdbea5550ae9defa1c731ffe091837d329fec7
Author: Tom Gundersen <teg at jklm.no>
Date:   Fri Jan 30 19:54:01 2015 +0100

    networkd: dhcp-server - start as soon as addresses have been set
    
    We would otherwise wait for the interface to be completely configured, which
    could take considerable time with IPv4LL. As a result nspawn was very slow
    at obtaining IP addresses.

diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 310eb6c..acdb486 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -443,7 +443,7 @@ static Address* link_find_dhcp_server_address(Link *link) {
         assert(link);
         assert(link->network);
 
-        /* The the first statically configured address if there is any */
+        /* The first statically configured address if there is any */
         LIST_FOREACH(addresses, address, link->network->static_addresses) {
 
                 if (address->family != AF_INET)
@@ -467,63 +467,10 @@ static Address* link_find_dhcp_server_address(Link *link) {
 }
 
 static int link_enter_configured(Link *link) {
-        int r;
-
         assert(link);
         assert(link->network);
         assert(link->state == LINK_STATE_SETTING_ROUTES);
 
-        if (link_dhcp4_server_enabled(link) &&
-            !sd_dhcp_server_is_running(link->dhcp_server)) {
-                struct in_addr pool_start;
-                Address *address;
-
-                address = link_find_dhcp_server_address(link);
-                if (!address) {
-                        log_link_warning(link,
-                                         "Failed to find suitable address for DHCPv4 server instance.");
-                        link_enter_failed(link);
-                        return 0;
-                }
-
-                log_link_debug(link, "offering DHCPv4 leases");
-
-                r = sd_dhcp_server_set_address(link->dhcp_server,
-                                               &address->in_addr.in,
-                                               address->prefixlen);
-                if (r < 0)
-                        return r;
-
-                /* offer 32 addresses starting from the address following the server address */
-                pool_start.s_addr = htobe32(be32toh(address->in_addr.in.s_addr) + 1);
-                r = sd_dhcp_server_set_lease_pool(link->dhcp_server,
-                                                  &pool_start, 32);
-                if (r < 0)
-                        return r;
-
-                /* TODO:
-                r = sd_dhcp_server_set_router(link->dhcp_server,
-                                              &main_address->in_addr.in);
-                if (r < 0)
-                        return r;
-
-                r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
-                                                 main_address->prefixlen);
-                if (r < 0)
-                        return r;
-                */
-
-                r = sd_dhcp_server_start(link->dhcp_server);
-                if (r < 0) {
-                        log_link_warning(link, "could not start DHCPv4 server "
-                                         "instance: %s", strerror(-r));
-
-                        link_enter_failed(link);
-
-                        return 0;
-                }
-        }
-
         log_link_info(link, "link configured");
 
         link->state = LINK_STATE_CONFIGURED;
@@ -683,6 +630,58 @@ static int link_enter_set_addresses(Link *link) {
                 link->link_messages ++;
         }
 
+        /* now that we can figure out a default address for the dhcp server,
+           start it */
+        if (link_dhcp4_server_enabled(link)) {
+                struct in_addr pool_start;
+                Address *address;
+
+                address = link_find_dhcp_server_address(link);
+                if (!address) {
+                        log_link_warning(link,
+                                         "Failed to find suitable address for DHCPv4 server instance.");
+                        link_enter_failed(link);
+                        return 0;
+                }
+
+                r = sd_dhcp_server_set_address(link->dhcp_server,
+                                               &address->in_addr.in,
+                                               address->prefixlen);
+                if (r < 0)
+                        return r;
+
+                /* offer 32 addresses starting from the address following the server address */
+                pool_start.s_addr = htobe32(be32toh(address->in_addr.in.s_addr) + 1);
+                r = sd_dhcp_server_set_lease_pool(link->dhcp_server,
+                                                  &pool_start, 32);
+                if (r < 0)
+                        return r;
+
+                /* TODO:
+                r = sd_dhcp_server_set_router(link->dhcp_server,
+                                              &main_address->in_addr.in);
+                if (r < 0)
+                        return r;
+
+                r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
+                                                 main_address->prefixlen);
+                if (r < 0)
+                        return r;
+                */
+
+                r = sd_dhcp_server_start(link->dhcp_server);
+                if (r < 0) {
+                        log_link_warning(link, "could not start DHCPv4 server "
+                                         "instance: %s", strerror(-r));
+
+                        link_enter_failed(link);
+
+                        return 0;
+                }
+
+                log_link_debug(link, "offering DHCPv4 leases");
+        }
+
         if (link->link_messages == 0) {
                 link_enter_set_routes(link);
         } else

commit 79b1f37d95f08fe7620b071eec51d2810ed077c9
Author: Tom Gundersen <teg at jklm.no>
Date:   Thu Jan 29 07:34:34 2015 +0100

    networkd-wait-online: allow specific devices to be ignored
    
    In addition to the loopback device, also explicitly configured devices to be ignored.
    
    Suggested by Charles Devereaux <systemd at guylhem.net>.

diff --git a/man/systemd-networkd-wait-online.service.xml b/man/systemd-networkd-wait-online.service.xml
index 3083588..0cb41a3 100644
--- a/man/systemd-networkd-wait-online.service.xml
+++ b/man/systemd-networkd-wait-online.service.xml
@@ -82,6 +82,14 @@
                                 used more than once to wait for multiple network
                                 interfaces.</para></listitem>
                         </varlistentry>
+                        <varlistentry>
+                                <term><option>--ignore=</option></term>
+                                <listitem><para>Network interfaces to be ignored when
+                                deciding if the system is online. By default only
+                                the loopback interface is ignored. This option may be used
+                                more than once to ignore multiple network interfaces.
+                                </para></listitem>
+                        </varlistentry>
                 </variablelist>
         </refsect1>
 
diff --git a/src/network/networkd-wait-online-link.c b/src/network/networkd-wait-online-link.c
index 268ab67..e091b20 100644
--- a/src/network/networkd-wait-online-link.c
+++ b/src/network/networkd-wait-online-link.c
@@ -134,12 +134,3 @@ int link_update_monitor(Link *l) {
 
         return 0;
 }
-
-bool link_relevant(Link *l) {
-        assert(l);
-
-        if (l->flags & IFF_LOOPBACK)
-                return false;
-
-        return true;
-}
diff --git a/src/network/networkd-wait-online-manager.c b/src/network/networkd-wait-online-manager.c
index 6f392fe..c66470c 100644
--- a/src/network/networkd-wait-online-manager.c
+++ b/src/network/networkd-wait-online-manager.c
@@ -31,6 +31,19 @@
 
 #include "util.h"
 
+bool manager_ignore_link(Manager *m, Link *link) {
+        assert(m);
+        assert(link);
+
+        if (link->flags & IFF_LOOPBACK)
+                return true;
+
+        if (strv_contains(m->ignore, link->ifname))
+                return true;
+
+        return false;
+}
+
 bool manager_all_configured(Manager *m) {
         Iterator i;
         Link *l;
@@ -49,8 +62,8 @@ bool manager_all_configured(Manager *m) {
         /* wait for all links networkd manages to be in admin state 'configured'
            and at least one link to gain a carrier */
         HASHMAP_FOREACH(l, m->links, i) {
-                if (!link_relevant(l)) {
-                        log_info("ignore irrelevant link: %s", l->ifname);
+                if (manager_ignore_link(m, l)) {
+                        log_info("ignoring: %s", l->ifname);
                         continue;
                 }
 
@@ -245,7 +258,7 @@ static int manager_network_monitor_listen(Manager *m) {
         return 0;
 }
 
-int manager_new(Manager **ret, char **interfaces) {
+int manager_new(Manager **ret, char **interfaces, char **ignore) {
         _cleanup_(manager_freep) Manager *m = NULL;
         int r;
 
@@ -256,6 +269,7 @@ int manager_new(Manager **ret, char **interfaces) {
                 return -ENOMEM;
 
         m->interfaces = interfaces;
+        m->ignore = ignore;
 
         r = sd_event_default(&m->event);
         if (r < 0)
diff --git a/src/network/networkd-wait-online.c b/src/network/networkd-wait-online.c
index 32a8d85..826ab92 100644
--- a/src/network/networkd-wait-online.c
+++ b/src/network/networkd-wait-online.c
@@ -29,6 +29,7 @@
 
 static bool arg_quiet = false;
 static char **arg_interfaces = NULL;
+static char **arg_ignore = NULL;
 
 static void help(void) {
         printf("%s [OPTIONS...]\n\n"
@@ -37,6 +38,7 @@ static void help(void) {
                "     --version              Print version string\n"
                "  -q --quiet                Do not show status information\n"
                "  -i --interface=INTERFACE  Block until at least these interfaces have appeared\n"
+               "     --ignore=INTERFACE     Don't take these interfaces into account\n"
                , program_invocation_short_name);
 }
 
@@ -44,6 +46,7 @@ static int parse_argv(int argc, char *argv[]) {
 
         enum {
                 ARG_VERSION = 0x100,
+                ARG_IGNORE,
         };
 
         static const struct option options[] = {
@@ -51,6 +54,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "version",         no_argument,       NULL, ARG_VERSION },
                 { "quiet",           no_argument,       NULL, 'q'         },
                 { "interface",       required_argument, NULL, 'i'         },
+                { "ignore",          required_argument, NULL, ARG_IGNORE  },
                 {}
         };
 
@@ -82,6 +86,12 @@ static int parse_argv(int argc, char *argv[]) {
 
                         break;
 
+                case ARG_IGNORE:
+                        if (strv_extend(&arg_ignore, optarg) < 0)
+                                return log_oom();
+
+                        break;
+
                 case '?':
                         return -EINVAL;
 
@@ -111,7 +121,7 @@ int main(int argc, char *argv[]) {
 
         assert_se(sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, -1) == 0);
 
-        r = manager_new(&m, arg_interfaces);
+        r = manager_new(&m, arg_interfaces, arg_ignore);
         if (r < 0) {
                 log_error_errno(r, "Could not create manager: %m");
                 goto finish;
@@ -135,5 +145,8 @@ int main(int argc, char *argv[]) {
 finish:
         sd_notify(false, "STATUS=All interfaces configured...");
 
+        strv_free(arg_interfaces);
+        strv_free(arg_ignore);
+
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
diff --git a/src/network/networkd-wait-online.h b/src/network/networkd-wait-online.h
index c57f902..eb78647 100644
--- a/src/network/networkd-wait-online.h
+++ b/src/network/networkd-wait-online.h
@@ -28,11 +28,16 @@
 #include "util.h"
 #include "hashmap.h"
 
-typedef struct Manager {
+typedef struct Manager Manager;
+
+#include "networkd-wait-online-link.h"
+
+struct Manager {
         Hashmap *links;
         Hashmap *links_by_name;
 
         char **interfaces;
+        char **ignore;
 
         sd_rtnl *rtnl;
         sd_event_source *rtnl_event_source;
@@ -41,11 +46,12 @@ typedef struct Manager {
         sd_event_source *network_monitor_event_source;
 
         sd_event *event;
-} Manager;
+};
 
 void manager_free(Manager *m);
-int manager_new(Manager **ret, char **interfaces);
+int manager_new(Manager **ret, char **interfaces, char **ignore);
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
 
 bool manager_all_configured(Manager *m);
+bool manager_ignore_link(Manager *m, Link *link);

commit 233ba5c3a0f73e01fe6149fd8c377826a83c2a0a
Author: Tom Gundersen <teg at jklm.no>
Date:   Thu Jan 29 07:26:58 2015 +0100

    sd-rtnl: don't fail event handler when callback fails
    
    As in sd-bus, simply log at debug level when a callback fails, but don't fail the event handler.
    Otherwise any error returned by any callback will disable the rtnl event handler. We should
    only do that on serious internal errors in sd-rtnl that we know cannot be recovered from.

diff --git a/src/libsystemd/sd-rtnl/sd-rtnl.c b/src/libsystemd/sd-rtnl/sd-rtnl.c
index 5778ea5..7f1ec30 100644
--- a/src/libsystemd/sd-rtnl/sd-rtnl.c
+++ b/src/libsystemd/sd-rtnl/sd-rtnl.c
@@ -379,9 +379,12 @@ static int process_timeout(sd_rtnl *rtnl) {
         hashmap_remove(rtnl->reply_callbacks, &c->serial);
 
         r = c->callback(rtnl, m, c->userdata);
+        if (r < 0)
+                log_debug_errno(r, "sd-rtnl: timedout callback failed: %m");
+
         free(c);
 
-        return r < 0 ? r : 1;
+        return 1;
 }
 
 static int process_reply(sd_rtnl *rtnl, sd_rtnl_message *m) {
@@ -404,9 +407,12 @@ static int process_reply(sd_rtnl *rtnl, sd_rtnl_message *m) {
                 prioq_remove(rtnl->reply_callbacks_prioq, c, &c->prioq_idx);
 
         r = c->callback(rtnl, m, c->userdata);
+        if (r < 0)
+                log_debug_errno(r, "sd-rtnl: callback failed: %m");
+
         free(c);
 
-        return r;
+        return 1;
 }
 
 static int process_match(sd_rtnl *rtnl, sd_rtnl_message *m) {
@@ -424,12 +430,16 @@ static int process_match(sd_rtnl *rtnl, sd_rtnl_message *m) {
         LIST_FOREACH(match_callbacks, c, rtnl->match_callbacks) {
                 if (type == c->type) {
                         r = c->callback(rtnl, m, c->userdata);
-                        if (r != 0)
-                                return r;
+                        if (r != 0) {
+                                if (r < 0)
+                                        log_debug_errno(r, "sd-rtnl: match callback failed: %m");
+
+                                break;
+                        }
                 }
         }
 
-        return 0;
+        return 1;
 }
 
 static int process_running(sd_rtnl *rtnl, sd_rtnl_message **ret) {



More information about the systemd-commits mailing list