bridge/bond/team: device availability shouldn't depend on IFF_UP (bgo #746918)

The merge of lr/udev-unmanaged-fd731014 made all devices wait until
udev found them, but that makes these three device types fail activate
when created by NM itself.

Since their availability depended on IFF_UP, they could not be
activated (eg, 'nmcli con up team0') until they were IFF_UP.  But
when they are created by NM, although NM knows the ifindex the
platform ignores the interface until udev finds it.  Thus immediately
after creating the interface in _internal_activate_device() it
won't be known to the platform, so the nm_device_is_available()
check that controls whether the device moves to DISCONNECTED
will fail.  This prevents any activation and emits the message:

"Connection 'foo' is not available on the device %s at this time."

because the device is still in the UNAVAILABLE state.

danw asked why we care about IFF_UP for these devices, and I can't
remember why, and I don't think it makes sense to require now.

https://bugzilla.gnome.org/show_bug.cgi?id=746918
(cherry picked from commit 568a8d1da9)
This commit is contained in:
Dan Williams 2015-03-27 17:39:20 -05:00 committed by Lubomir Rintel
parent 2d4bd3818f
commit cf6cd7f28e
3 changed files with 3 additions and 9 deletions

View file

@ -70,9 +70,7 @@ get_generic_capabilities (NMDevice *dev)
static gboolean
is_available (NMDevice *dev, NMDeviceCheckDevAvailableFlags flags)
{
if (NM_DEVICE_GET_CLASS (dev)->is_up)
return NM_DEVICE_GET_CLASS (dev)->is_up (dev);
return FALSE;
return TRUE;
}
static gboolean

View file

@ -68,9 +68,7 @@ get_generic_capabilities (NMDevice *dev)
static gboolean
is_available (NMDevice *dev, NMDeviceCheckDevAvailableFlags flags)
{
if (NM_DEVICE_GET_CLASS (dev)->is_up)
return NM_DEVICE_GET_CLASS (dev)->is_up (dev);
return FALSE;
return TRUE;
}
static gboolean

View file

@ -79,9 +79,7 @@ get_generic_capabilities (NMDevice *device)
static gboolean
is_available (NMDevice *device, NMDeviceCheckDevAvailableFlags flags)
{
if (NM_DEVICE_GET_CLASS (device)->is_up)
return NM_DEVICE_GET_CLASS (device)->is_up (device);
return FALSE;
return TRUE;
}
static gboolean