diff options
Diffstat (limited to 'src/devices/nm-device.c')
-rw-r--r-- | src/devices/nm-device.c | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 866879c2fe..c8b0114afe 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2246,24 +2246,32 @@ carrier_changed (NMDevice *self, gboolean carrier) return; if (nm_device_is_master (self)) { - /* Bridge/bond/team carrier does not affect its own activation, - * but when carrier comes on, if there are slaves waiting, - * it will restart them. - */ - if (!carrier) - return; - - /* Force master to retry getting ip addresses when carrier - * is restored. */ - if (priv->state == NM_DEVICE_STATE_ACTIVATED) - nm_device_update_dynamic_ip_setup (self); - else { - if (nm_device_activate_ip4_state_in_wait (self)) - nm_device_activate_stage3_ip4_start (self); - if (nm_device_activate_ip6_state_in_wait (self)) - nm_device_activate_stage3_ip6_start (self); + if (carrier) { + /* Force master to retry getting ip addresses when carrier + * is restored. */ + if (priv->state == NM_DEVICE_STATE_ACTIVATED) + nm_device_update_dynamic_ip_setup (self); + else { + if (nm_device_activate_ip4_state_in_wait (self)) + nm_device_activate_stage3_ip4_start (self); + if (nm_device_activate_ip6_state_in_wait (self)) + nm_device_activate_stage3_ip6_start (self); + } + } else { + /* Put master device into DISCONNECTED state if there is + * no carrier. This would mean that all slaves are still + * enslaved. This is nessesary to be able to reconnect + * when carrier appears. + */ + if (priv->state == NM_DEVICE_STATE_DISCONNECTED) { + if ( priv->queued_state.id + && priv->queued_state.state >= NM_DEVICE_STATE_PREPARE) + queued_state_clear (self); + } else { + nm_device_queue_state (self, NM_DEVICE_STATE_DISCONNECTED, + NM_DEVICE_STATE_REASON_CARRIER); + } } - return; } else if (priv->is_enslaved && !carrier) { /* Slaves don't deactivate when they lose carrier; for @@ -3843,9 +3851,8 @@ nm_device_is_available (NMDevice *self, NMDeviceCheckDevAvailableFlags flags) gboolean nm_device_ignore_carrier_by_default (NMDevice *self) { - g_return_val_if_fail (NM_IS_DEVICE (self), FALSE); - - return FALSE; + /* master types ignore-carrier by default. */ + return nm_device_is_master (self); } gboolean |