]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
wait-online: split out get_state_range()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 2 Feb 2024 17:34:07 +0000 (02:34 +0900)
committerMike Yuan <me@yhndnzj.com>
Thu, 8 Feb 2024 08:59:04 +0000 (16:59 +0800)
Follow-up for 2d708781620239c9d1f9828a39f8761acf6350b2.

After the conversion from FOREACH_POINTER() to FOREACH_ARGUMENT(),
the iterator is never set to POINTER_MAX.

src/network/wait-online/manager.c

index ab1e753d50a2d9d826022a221782288b0c704fa9..7838350c48f2ed13ff519d61b1fdda2805b92a8b 100644 (file)
@@ -52,13 +52,27 @@ static bool manager_ignore_link(Manager *m, Link *link) {
         return false;
 }
 
-static int manager_link_is_online(Manager *m, Link *l, const LinkOperationalStateRange *state_range) {
+static const LinkOperationalStateRange* get_state_range(Manager *m, Link *l, const LinkOperationalStateRange *from_cmdline) {
+        assert(m);
+        assert(l);
+
+        const LinkOperationalStateRange *range;
+        FOREACH_ARGUMENT(range, from_cmdline, &m->required_operstate, &l->required_operstate)
+                if (operational_state_range_is_valid(range))
+                        return range;
+
+        /* l->requred_operstate should be always valid. */
+        assert_not_reached();
+}
+
+static int manager_link_is_online(Manager *m, Link *l, const LinkOperationalStateRange *range) {
         AddressFamily required_family;
         bool needs_ipv4;
         bool needs_ipv6;
 
         assert(m);
         assert(l);
+        assert(range);
 
         /* This returns the following:
          * -EAGAIN       : not processed by udev
@@ -91,12 +105,6 @@ static int manager_link_is_online(Manager *m, Link *l, const LinkOperationalStat
                                             "link is being processed by networkd: setup state is %s.",
                                             l->state);
 
-        const LinkOperationalStateRange *range;
-        FOREACH_ARGUMENT(range, state_range, &m->required_operstate, &l->required_operstate)
-                if (operational_state_range_is_valid(range))
-                        break;
-        assert(range != POINTER_MAX);
-
         if (!operational_state_is_in_range(l->operational_state, range))
                 return log_link_debug_errno(l, SYNTHETIC_ERRNO(EADDRNOTAVAIL),
                                             "Operational state '%s' is not in range ['%s':'%s']",
@@ -134,7 +142,7 @@ bool manager_configured(Manager *m) {
         int r;
 
         if (!hashmap_isempty(m->command_line_interfaces_by_name)) {
-                LinkOperationalStateRange *range;
+                const LinkOperationalStateRange *range;
                 const char *ifname;
 
                 /* wait for all the links given on the command line to appear */
@@ -153,6 +161,8 @@ bool manager_configured(Manager *m) {
                                 continue;
                         }
 
+                        range = get_state_range(m, l, range);
+
                         r = manager_link_is_online(m, l, range);
                         if (r <= 0 && !m->any)
                                 return false;
@@ -168,12 +178,16 @@ bool manager_configured(Manager *m) {
         /* wait for all links networkd manages */
         bool has_online = false;
         HASHMAP_FOREACH(l, m->links_by_index) {
+                const LinkOperationalStateRange *range;
+
                 if (manager_ignore_link(m, l)) {
                         log_link_debug(l, "link is ignored");
                         continue;
                 }
 
-                r = manager_link_is_online(m, l, /* state_range = */ NULL);
+                range = get_state_range(m, l, /* from_cmdline = */ NULL);
+
+                r = manager_link_is_online(m, l, range);
                 /* Unlike the above loop, unmanaged interfaces are ignored here. Also, Configured but offline
                  * interfaces are ignored. See issue #29506. */
                 if (r < 0 && r != -EADDRNOTAVAIL && !m->any)