From 9c402e3ae2607084ba17fcab5d76c9f1e085b59e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 2 Nov 2024 06:31:25 +0900 Subject: [PATCH] network: check if interface is initialized after enumeration completed We enumerate interfaces at first, then enumerate other configurations like addresses and so on. If we are running on a container, previously we started to configure the enumerated interfaces before enumerating other configurations. Let's configure interfaces after all configurations are enumerated. --- src/network/networkd-link.c | 10 +++++++++- src/network/networkd-link.h | 2 ++ src/network/networkd-manager.c | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index bc4374b42c..ea68b14a8c 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1636,7 +1636,7 @@ static int link_initialized(Link *link, sd_device *device) { return link_call_getlink(link, link_initialized_handler); } -static int link_check_initialized(Link *link) { +int link_check_initialized(Link *link) { _cleanup_(sd_device_unrefp) sd_device *device = NULL; int r; @@ -2836,6 +2836,10 @@ int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Man return 0; } + /* Do not enter initialized state if we are enumerating. */ + if (manager->enumerating) + return 0; + r = link_check_initialized(link); if (r < 0) { log_link_warning_errno(link, r, "Failed to check link is initialized: %m"); @@ -2858,6 +2862,10 @@ int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Man return 0; } + /* Do not configure interface if we are enumerating. */ + if (manager->enumerating) + return 0; + r = link_reconfigure_impl(link, /* force = */ false); if (r < 0) { log_link_warning_errno(link, r, "Failed to reconfigure interface: %m"); diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 5efe226084..1c5c9ec709 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -263,6 +263,8 @@ int link_reconfigure_impl(Link *link, bool force); int link_reconfigure(Link *link, bool force); int link_reconfigure_on_bus_method_reload(Link *link, sd_bus_message *message); +int link_check_initialized(Link *link); + int manager_udev_process_link(Manager *m, sd_device *device, sd_device_action_t action); int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Manager *m); diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 6dce901742..73e9156e22 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -756,6 +756,17 @@ int manager_start(Manager *m) { if (r < 0) return log_error_errno(r, "Failed to initialize speed meter: %m"); + HASHMAP_FOREACH(link, m->links_by_index) { + if (link->state != LINK_STATE_PENDING) + continue; + + r = link_check_initialized(link); + if (r < 0) { + log_link_warning_errno(link, r, "Failed to check if link is initialized: %m"); + link_enter_failed(link); + } + } + /* The dirty handler will deal with future serialization, but the first one must be done explicitly. */ -- 2.25.1