network: call link_acquire_conf() and link_enter_join_netdev() after MTU is set

Fixes #9831.
This commit is contained in:
Yu Watanabe 2018-08-13 16:12:08 +09:00
parent ee4931068e
commit 55dc8c4a82
1 changed files with 28 additions and 9 deletions

View File

@ -1279,6 +1279,8 @@ static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userd
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;
@ -1287,12 +1289,21 @@ static int set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userda
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;
}
@ -1305,7 +1316,7 @@ int link_set_mtu(Link *link, uint32_t mtu) {
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);
@ -1706,11 +1717,6 @@ static int link_acquire_conf(Link *link) {
assert(link);
if (link->setting_mtu) {
link->setting_mtu = false;
return 0;
}
r = link_acquire_ipv4_conf(link);
if (r < 0)
return r;
@ -2874,6 +2880,19 @@ static int link_configure(Link *link) {
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)
@ -3281,8 +3300,8 @@ static int link_carrier_lost(Link *link) {
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;