]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
wait-online: make manager_link_is_online() return 0 when in unmanaged state 22249/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 26 Jan 2022 07:48:08 +0000 (16:48 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 26 Jan 2022 13:41:47 +0000 (22:41 +0900)
Previously, even if a link is in unmanaged state, the function may
returns positive value. So, even if all managed links are in the configured
sate but do not satisfy the online criteria, e.g., IPv4 address state,
then wait-online finishes with positive value.

This makes the function always return 0 for unmanaged state. So, at
least one managed link must satisfies the online criteria.

This also adds more comments and debugging logs.

Fixes #22246.

src/network/wait-online/manager.c

index 2c6f263499c2599a402aa24d79fe18513498a503..6656813f39b2212395aea0b3d01b9a1d8f99511b 100644 (file)
@@ -45,13 +45,29 @@ static int manager_link_is_online(Manager *m, Link *l, LinkOperationalStateRange
          *       0: operstate is not enough
          *       1: online */
 
-        if (!l->state)
+        if (!l->state || streq(l->state, "pending"))
+                /* If no state string exists, networkd (and possibly also udevd) has not detected the
+                 * interface yet, that mean we cannot determine whether the interface is managed or
+                 * not. Hence, return negative value.
+                 * If the link is in pending state, then udevd has not processed the link, and networkd
+                 * has not tried to find .network file for the link. Hence, return negative value. */
                 return log_link_debug_errno(l, SYNTHETIC_ERRNO(EAGAIN),
-                                            "link has not yet been processed by udev");
+                                            "link has not yet been processed by udev: setup state is %s.",
+                                            strna(l->state));
+
+        if (streq(l->state, "unmanaged")) {
+                /* If the link is in unmanaged state, then ignore the interface unless the interface is
+                 * specified in '--interface/-i' option. */
+                if (!hashmap_contains(m->command_line_interfaces_by_name, l->ifname)) {
+                        log_link_debug(l, "link is not managed by networkd (yet?).");
+                        return 0;
+                }
 
-        if (STR_IN_SET(l->state, "configuring", "pending"))
+        } else if (!streq(l->state, "configured"))
+                /* If the link is in non-configured state, return negative value here. */
                 return log_link_debug_errno(l, SYNTHETIC_ERRNO(EAGAIN),
-                                            "link is being processed by networkd");
+                                            "link is being processed by networkd: setup state is %s.",
+                                            l->state);
 
         if (s.min < 0)
                 s.min = m->required_operstate.min >= 0 ? m->required_operstate.min
@@ -94,6 +110,7 @@ static int manager_link_is_online(Manager *m, Link *l, LinkOperationalStateRange
                 }
         }
 
+        log_link_debug(l, "link is confiured by networkd and online.");
         return 1;
 }