summaryrefslogtreecommitdiff
path: root/src/network/networkd-link.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-10-26 11:08:17 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-10-31 09:35:05 +0900
commit40695457271dbc92b8556f017c30170a078fbae0 (patch)
treeb4b16ae8608d837c2240e7acc3fe9f8cef5604f3 /src/network/networkd-link.c
parent6625c39e70128d5aa8d3791c8232e33f624cfe49 (diff)
downloadsystemd-40695457271dbc92b8556f017c30170a078fbae0.tar.gz
network: try to reconfigure when some information is updated
When at least one of the name, MAC address, udev properties, and so on for an interface is updated, try to find a matching .network file, and reconfigure if a new .network file is assigned. Fixes #24975.
Diffstat (limited to 'src/network/networkd-link.c')
-rw-r--r--src/network/networkd-link.c61
1 files changed, 36 insertions, 25 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index d3dafb2458..f4c5b2def6 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1367,21 +1367,18 @@ static int link_initialized_and_synced(Link *link) {
return 0;
}
- /* This may get called either from the asynchronous netlink callback,
- * or directly from link_check_initialized() if running in a container. */
- if (!IN_SET(link->state, LINK_STATE_PENDING, LINK_STATE_INITIALIZED))
- return 0;
-
- log_link_debug(link, "Link state is up-to-date");
- link_set_state(link, LINK_STATE_INITIALIZED);
+ if (link->state == LINK_STATE_PENDING) {
+ log_link_debug(link, "Link state is up-to-date");
+ link_set_state(link, LINK_STATE_INITIALIZED);
- r = link_new_bound_by_list(link);
- if (r < 0)
- return r;
+ r = link_new_bound_by_list(link);
+ if (r < 0)
+ return r;
- r = link_handle_bound_by_list(link);
- if (r < 0)
- return r;
+ r = link_handle_bound_by_list(link);
+ if (r < 0)
+ return r;
+ }
return link_reconfigure_impl(link, /* force = */ false);
}
@@ -1414,14 +1411,10 @@ static int link_initialized(Link *link, sd_device *device) {
if (r < 0)
log_link_warning_errno(link, r, "Failed to manage SR-IOV PF and VF ports, ignoring: %m");
- /* Do not ignore unamanaged state case here. If an interface is renamed after being once
- * configured, and the corresponding .network file has Name= in [Match] section, then the
- * interface may be already in unmanaged state. See #20657. */
- if (!IN_SET(link->state, LINK_STATE_PENDING, LINK_STATE_UNMANAGED))
- return 0;
+ if (link->state != LINK_STATE_PENDING)
+ return link_reconfigure(link, /* force = */ false);
log_link_debug(link, "udev initialized link");
- link_set_state(link, LINK_STATE_INITIALIZED);
/* udev has initialized the link, but we don't know if we have yet
* processed the NEWLINK messages with the latest state. Do a GETLINK,
@@ -2063,7 +2056,7 @@ static int link_update_driver(Link *link, sd_netlink_message *message) {
link->dsa_master_ifindex = (int) dsa_master_ifindex;
}
- return 0;
+ return 1; /* needs reconfigure */
}
static int link_update_permanent_hardware_address_from_ethtool(Link *link, sd_netlink_message *message) {
@@ -2122,7 +2115,7 @@ static int link_update_permanent_hardware_address(Link *link, sd_netlink_message
if (link->permanent_hw_addr.length > 0)
log_link_debug(link, "Saved permanent hardware address: %s", HW_ADDR_TO_STR(&link->permanent_hw_addr));
- return 0;
+ return 1; /* needs reconfigure */
}
static int link_update_hardware_address(Link *link, sd_netlink_message *message) {
@@ -2205,7 +2198,7 @@ static int link_update_hardware_address(Link *link, sd_netlink_message *message)
return log_link_debug_errno(link, r, "Could not update MAC address for LLDP Tx: %m");
}
- return 0;
+ return 1; /* needs reconfigure */
}
static int link_update_mtu(Link *link, sd_netlink_message *message) {
@@ -2297,7 +2290,7 @@ static int link_update_alternative_names(Link *link, sd_netlink_message *message
return log_link_debug_errno(link, r, "Failed to manage link by its new alternative names: %m");
}
- return 0;
+ return 1; /* needs reconfigure */
}
static int link_update_name(Link *link, sd_netlink_message *message) {
@@ -2393,10 +2386,11 @@ static int link_update_name(Link *link, sd_netlink_message *message) {
if (r < 0)
return log_link_debug_errno(link, r, "Failed to update interface name in IPv4ACD client: %m");
- return 0;
+ return 1; /* needs reconfigure */
}
static int link_update(Link *link, sd_netlink_message *message) {
+ bool needs_reconfigure = false;
int r;
assert(link);
@@ -2405,10 +2399,12 @@ static int link_update(Link *link, sd_netlink_message *message) {
r = link_update_name(link, message);
if (r < 0)
return r;
+ needs_reconfigure = needs_reconfigure || r > 0;
r = link_update_alternative_names(link, message);
if (r < 0)
return r;
+ needs_reconfigure = needs_reconfigure || r > 0;
r = link_update_mtu(link, message);
if (r < 0)
@@ -2417,14 +2413,17 @@ static int link_update(Link *link, sd_netlink_message *message) {
r = link_update_driver(link, message);
if (r < 0)
return r;
+ needs_reconfigure = needs_reconfigure || r > 0;
r = link_update_permanent_hardware_address(link, message);
if (r < 0)
return r;
+ needs_reconfigure = needs_reconfigure || r > 0;
r = link_update_hardware_address(link, message);
if (r < 0)
return r;
+ needs_reconfigure = needs_reconfigure || r > 0;
r = link_update_master(link, message);
if (r < 0)
@@ -2434,7 +2433,11 @@ static int link_update(Link *link, sd_netlink_message *message) {
if (r < 0)
return r;
- return link_update_flags(link, message);
+ r = link_update_flags(link, message);
+ if (r < 0)
+ return r;
+
+ return needs_reconfigure;
}
static Link *link_drop_or_unref(Link *link) {
@@ -2623,6 +2626,14 @@ int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Man
link_enter_failed(link);
return 0;
}
+ if (r > 0) {
+ r = link_reconfigure_impl(link, /* force = */ false);
+ if (r < 0) {
+ log_link_warning_errno(link, r, "Failed to reconfigure interface: %m");
+ link_enter_failed(link);
+ return 0;
+ }
+ }
}
break;