Skip to content

Commit

Permalink
mtu: skip if up, limit it to mtu of lower device
Browse files Browse the repository at this point in the history
- Use separate calls to set the mtu and the link up
- Do not allow to set higher mtu than on lower device.
- Do not set, when interface is already UP (->reload);
  it causes busy errors and breaks upper interfaces.
  • Loading branch information
mtomaschewski committed Feb 3, 2014
1 parent 6429480 commit ba06cfa
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion src/dbus-objects/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,7 @@ ni_objectmodel_netif_link_up(ni_dbus_object_t *object, const ni_dbus_method_t *m
unsigned int argc, const ni_dbus_variant_t *argv,
ni_dbus_message_t *reply, DBusError *error)
{
ni_netconfig_t *nc = ni_global_state_handle(0);
ni_netdev_t *dev;
ni_netdev_req_t *req = NULL;
dbus_bool_t ret = FALSE;
Expand All @@ -715,8 +716,37 @@ ni_objectmodel_netif_link_up(ni_dbus_object_t *object, const ni_dbus_method_t *m
req = ni_netdev_req_new();
if (!ni_objectmodel_unmarshal_netdev_request(req, &argv[0], error))
goto failed;
req->ifflags = NI_IFF_LINK_UP | NI_IFF_NETWORK_UP;

if (req->mtu) {
if (dev->link.lowerdev.index) {
ni_netdev_t *lower;

lower = ni_netdev_by_index(nc, dev->link.lowerdev.index);
if (lower && req->mtu > lower->link.mtu) {
ni_info("Lowering requested %s mtu %u to lower device mtu %u",
dev->name, req->mtu, lower->link.mtu);
req->mtu = lower->link.mtu;
}
}

/*
* MTU change on device-up interfaces quite often causes either
* error -16 (busy) or sets all upper interfaces LOWERLAYERDOWN.
*/
if (ni_netdev_device_is_up(dev)) {
ni_debug_objectmodel("Skipping MTU change on %s: device is up",
dev->name);
req->mtu = 0;
}

if (req->mtu != dev->link.mtu &&
ni_system_mtu_change(nc, dev, req->mtu) < 0) {
ni_info("Unable to set %s MTU to %u", dev->name, req->mtu);
}
req->mtu = 0;
}

req->ifflags = NI_IFF_LINK_UP | NI_IFF_NETWORK_UP;
if ((rv = ni_system_interface_link_change(dev, req)) < 0) {
ni_dbus_set_error_from_code(error, rv,
"failed to configure interface %s", dev->name);
Expand Down

0 comments on commit ba06cfa

Please sign in to comment.