return 0;
}
+static int link_configure_after_setting_mtu(Link *link);
+
static int set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
_cleanup_(link_unrefp) Link *link = userdata;
int r;
assert(link);
assert(link->ifname);
+ link->setting_mtu = false;
+
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
r = sd_netlink_message_get_errno(m);
- if (r < 0)
+ if (r < 0) {
log_link_warning_errno(link, r, "Could not set MTU: %m");
+ return 1;
+ }
+
+ log_link_debug(link, "Setting MTU done.");
+
+ if (link->state == LINK_STATE_PENDING)
+ (void) link_configure_after_setting_mtu(link);
return 1;
}
assert(link->manager);
assert(link->manager->rtnl);
- if (link->mtu == mtu)
+ if (link->mtu == mtu || link->setting_mtu)
return 0;
log_link_debug(link, "Setting MTU: %" PRIu32, mtu);
assert(link);
- if (link->setting_mtu) {
- link->setting_mtu = false;
- return 0;
- }
-
r = link_acquire_ipv4_conf(link);
if (r < 0)
return r;
return r;
}
+ return link_configure_after_setting_mtu(link);
+}
+
+static int link_configure_after_setting_mtu(Link *link) {
+ int r;
+
+ assert(link);
+ assert(link->network);
+ assert(link->state == LINK_STATE_PENDING);
+
+ if (link->setting_mtu)
+ return 0;
+
if (link_has_carrier(link) || link->network->configure_without_carrier) {
r = link_acquire_conf(link);
if (r < 0)
assert(link);
/* Some devices reset itself while setting the MTU. This causes the DHCP client fall into a loop.
- setting_mtu keep track whether the device got reset because of setting MTU and does not drop the
- configuration and stop the clients as well. */
+ * setting_mtu keep track whether the device got reset because of setting MTU and does not drop the
+ * configuration and stop the clients as well. */
if (link->setting_mtu)
return 0;