core: leave wake-on-LAN devices up over suspend/resume

Taking down a wake-on-LAN device before suspending will effectively
disable wake-on-LAN. So don't do that.

Based on a patch from Stanislaw Gruszka.

https://bugzilla.gnome.org/show_bug.cgi?id=712745
https://bugzilla.redhat.com/show_bug.cgi?id=826652
https://bugzilla.redhat.com/show_bug.cgi?id=1025009
This commit is contained in:
Dan Winship
2014-04-03 15:14:00 -04:00
parent ddb17bef81
commit 1218b7e0c7

View File

@@ -3589,27 +3589,56 @@ done:
g_clear_error (&error); g_clear_error (&error);
} }
static gboolean
device_is_wake_on_lan (NMDevice *device)
{
return nm_platform_link_get_wake_on_lan (nm_device_get_ip_ifindex (device));
}
static void static void
do_sleep_wake (NMManager *self) do_sleep_wake (NMManager *self, gboolean sleeping_changed)
{ {
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
gboolean suspending, waking_from_suspend;
GSList *iter; GSList *iter;
if (manager_sleeping (self)) { suspending = sleeping_changed && priv->sleeping;
nm_log_info (LOGD_SUSPEND, "sleeping or disabling..."); waking_from_suspend = sleeping_changed && !priv->sleeping;
/* Just deactivate and down all physical devices from the device list, if (manager_sleeping (self)) {
* to keep things fast the device list will get resynced when nm_log_info (LOGD_SUSPEND, suspending ? "sleeping..." : "disabling...");
* the manager wakes up.
/* FIXME: are there still hardware devices that need to be disabled around
* suspend/resume?
*/ */
for (iter = priv->devices; iter; iter = iter->next) { for (iter = priv->devices; iter; iter = iter->next) {
NMDevice *device = iter->data; NMDevice *device = iter->data;
if (!nm_device_is_software (device)) /* FIXME: shouldn't we be unmanaging software devices if !suspending? */
nm_device_set_unmanaged (device, NM_UNMANAGED_INTERNAL, TRUE, NM_DEVICE_STATE_REASON_SLEEPING); if (nm_device_is_software (device))
continue;
/* Wake-on-LAN devices will be taken down post-suspend rather than pre- */
if (suspending && device_is_wake_on_lan (device))
continue;
nm_device_set_unmanaged (device, NM_UNMANAGED_INTERNAL, TRUE, NM_DEVICE_STATE_REASON_SLEEPING);
} }
} else { } else {
nm_log_info (LOGD_SUSPEND, "waking up and re-enabling..."); nm_log_info (LOGD_SUSPEND, waking_from_suspend ? "waking up..." : "re-enabling...");
if (waking_from_suspend) {
/* Belatedly take down Wake-on-LAN devices; ideally we wouldn't have to do this
* but for now it's the only way to make sure we re-check their connectivity.
*/
for (iter = priv->devices; iter; iter = iter->next) {
NMDevice *device = iter->data;
if (nm_device_is_software (device))
continue;
if (device_is_wake_on_lan (device))
nm_device_set_unmanaged (device, NM_UNMANAGED_INTERNAL, TRUE, NM_DEVICE_STATE_REASON_SLEEPING);
}
}
/* Ensure rfkill state is up-to-date since we don't respond to state /* Ensure rfkill state is up-to-date since we don't respond to state
* changes during sleep. * changes during sleep.
@@ -3665,7 +3694,7 @@ _internal_sleep (NMManager *self, gboolean do_sleep)
priv->sleeping = do_sleep; priv->sleeping = do_sleep;
do_sleep_wake (self); do_sleep_wake (self, TRUE);
g_object_notify (G_OBJECT (self), NM_MANAGER_SLEEPING); g_object_notify (G_OBJECT (self), NM_MANAGER_SLEEPING);
} }
@@ -3805,7 +3834,7 @@ _internal_enable (NMManager *self, gboolean enable)
priv->net_enabled = enable; priv->net_enabled = enable;
do_sleep_wake (self); do_sleep_wake (self, FALSE);
g_object_notify (G_OBJECT (self), NM_MANAGER_NETWORKING_ENABLED); g_object_notify (G_OBJECT (self), NM_MANAGER_NETWORKING_ENABLED);
} }