summaryrefslogtreecommitdiff
path: root/src/devices/nm-device.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/nm-device.c')
-rw-r--r--src/devices/nm-device.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 0bdb7f6bac..20bf8bf8f1 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -395,6 +395,7 @@ typedef struct _NMDevicePrivate {
bool ipv6ll_handle:1; /* TRUE if NM handles the device's IPv6LL address */
bool ipv6ll_has:1;
bool ndisc_started:1;
+ bool device_link_changed_down:1;
/* Generic DHCP stuff */
char * dhcp_anycast_address;
@@ -3703,8 +3704,10 @@ device_link_changed (NMDevice *self)
gboolean was_up;
gboolean update_unmanaged_specs = FALSE;
gboolean got_hw_addr = FALSE, had_hw_addr;
+ gboolean seen_down = priv->device_link_changed_down;
priv->device_link_changed_id = 0;
+ priv->device_link_changed_down = FALSE;
ifindex = nm_device_get_ifindex (self);
if (ifindex <= 0)
@@ -3816,7 +3819,7 @@ device_link_changed (NMDevice *self)
device_recheck_slave_status (self, pllink);
- if (priv->up && !was_up) {
+ if (priv->up && (!was_up || seen_down)) {
/* the link was down and just came up. That happens for example, while changing MTU.
* We must restore IP configuration. */
if (priv->ip4_state == IP_DONE) {
@@ -3892,6 +3895,8 @@ link_changed_cb (NMPlatform *platform,
priv = NM_DEVICE_GET_PRIVATE (self);
if (ifindex == nm_device_get_ifindex (self)) {
+ if (!(info->n_ifi_flags & IFF_UP))
+ priv->device_link_changed_down = TRUE;
if (!priv->device_link_changed_id) {
priv->device_link_changed_id = g_idle_add ((GSourceFunc) device_link_changed, self);
_LOGD (LOGD_DEVICE, "queued link change for ifindex %d", ifindex);